diff --git a/.github/workflows/deploy-to-s3.yml b/.github/workflows/deploy-to-s3.yml index bad7e79..47035ec 100644 --- a/.github/workflows/deploy-to-s3.yml +++ b/.github/workflows/deploy-to-s3.yml @@ -23,5 +23,5 @@ jobs: role-to-assume: ${{ secrets.AWS_OIDC_RUNNER_ROLE }} - name: Sync to S3 run: | # Sync index and security txt, exclude hidden files; Sync assets and remove any that aren't in source - aws s3 sync . s3://pyscript.net/ --exclude ".*" --include ".well-known/security.txt" --include "index.html" + aws s3 sync . s3://pyscript.net/ --exclude ".*" --include ".well-known/security.txt" --include "index.html" --include "error.html" --include "mini-coi.js" --include "main.py" aws s3 sync --delete assets/ s3://pyscript.net/assets/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a48538 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_store \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f66495b --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# PyScript.net Website + +This is the static website hosted at +[https://pyscript.net](https://pyscript.net). It is the homepage for the open +source aspects of the wider PyScript project. + +## Developer setup + +1. Fork, then clone the site locally. +2. Start the site with: `python -m http.server` +3. View the local version of the site at: http://localhost:8000/ +4. Make your changes in a well named branch. +5. Check your work locally. +6. Submit your branch as a PR. + +## PyScript Elsewhere + +The source code for the [documentation](https://docs.pyscript.net/) for +PyScript is found [in this repository](https://github.com/pyscript/docs). + +The source code for [PyScript.com](https://pyscript.com/) (the commercial site +for hosting and developing PyScript applications) is an internal project of +[Anaconda](https://anaconda.com) who sponsor the PyScript project. diff --git a/assets/css/main.css b/assets/css/main.css index 4adbd85..a5fb369 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -33,7 +33,7 @@ a:visited { font-family: 'Hack Regular'; font-style: normal; font-weight: normal; - src: local('Hack Regular'), url('assets/fonts/Hack-Regular.woff') format('woff'); + src: local('Hack Regular'), url('/assets/fonts/Hack-Regular.woff') format('woff'); } @@ -126,11 +126,9 @@ a.examples-block { background: #1D1D22; border: 2px solid #FDA703; border-radius: 10px; - margin: 2rem auto; /* color: #fff; */ text-decoration: none; - max-width: 370px; - + width: 100%; align-items: center; border-radius: 10px; color: #fff; @@ -174,6 +172,223 @@ a.examples-block:hover { color: #1D1D22; } +.newsletter-section { + background: #1D1D22; + border-radius: 10px; + margin: 2rem auto 0; + max-width: 340px; + padding: 0; +} + +/* Main container classes */ +#newsletter-form-container { + background-color: #1D1D22; + border-radius: 10px; + padding: 1.5rem; + border: none; +} + +.newsletter-wrapper { + text-align: center; +} + +.newsletter-content { + margin-bottom: 1.5rem; +} + +.newsletter-content h4 { + color: #FDA703; + font-size: 1.5rem; + font-weight: 400; + margin-bottom: 0.25rem; +} + +.newsletter-content p { + color: #fff; + font-size: 1rem; + font-weight: 400; + margin-bottom: 1rem; +} + +/* Form elements */ +.newsletter-form { + margin: 0; +} + +.newsletter-field { + margin-bottom: 1rem; +} + +.newsletter-field input { + background-color: #fff; + border: none; + border-radius: 25px; + color: #666; + font-size: 1rem; + padding: 0.75rem 1rem; + width: 100%; +} + +/* Checkbox styling */ +.newsletter-checkbox { + margin: 0.5rem 0; + text-align: left; +} + +.newsletter-checkbox label { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.newsletter-checkbox input[type="checkbox"] { + margin: 0; + width: auto; +} + +.newsletter-checkbox .label-description p { + color: #fff; + font-size: 0.9rem; + margin: 0; +} + +/* Privacy section */ +.newsletter-privacy { + color: rgba(255, 255, 255, 0.5); + font-size: 0.85rem; + margin: 0.75rem 0; + line-height: 1.3; + text-align: left; +} + +.newsletter-privacy a { + color: #FDA703; + text-decoration: none; +} + +/* Submit button */ +.newsletter-submit { + text-align: center; + margin-top: 1rem; +} + +.newsletter-submit button.primary { + background-color: #000; + border-radius: 100px; + color: #fff; + display: inline-block; + font-weight: 700; + font-size: 0.9rem; + padding: 0.5rem 1.5rem; + text-decoration: none; + border: none; + cursor: pointer; +} + +.newsletter-submit button.primary:hover { + background-color: #FDA803; + color: #1D1D22; +} + +.loading-indicator { + width: 20px; + height: 20px; + border: 2px solid rgba(255, 255, 255, 0.3); + border-radius: 50%; + border-top-color: #fff; + animation: spin 0.8s linear infinite; + margin: 0 auto; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +/* Success state */ +.newsletter-success { + display: none; + text-align: center; + padding: 1rem; +} + +.newsletter-success h4 { + color: #FDA703; + font-size: 1.5rem; + font-weight: 400; + margin-bottom: 0.5rem; +} + +.newsletter-success p { + color: #fff; + font-size: 1rem; +} + +.social { + background: #1D1D22; + border-radius: 10px; + margin: 2rem auto 0; + max-width: 340px; + padding: 1rem; +} + +.social .profile { + display: flex; + position: relative; +} + +.social svg { + height: 25px; + position: absolute; + right: 0; + top: 0; + width: 25px; +} + +.social .avatar img { + border-radius: 400px; + max-width: 50px; +} + +.social .bio { + padding: 0 1rem; +} + +.social .bio h5 { + font-size: 1.25rem; +} + +.social .link { + color: #aaa; + font-size: 0.8rem; + text-decoration: none; +} + +.social .link:hover { + color: #FDA803; +} + +.social p { + font-size: .8rem; + margin: 1rem 0; +} + +.button.twitter { + background-color: #000; + border-radius: 100px; + color: #fff; + display: inline-block; + font-weight: 700; + padding: 0.5rem 1rem; + text-decoration: none; +} + +.button.twitter:hover { + background-color: #FDA803; + color: #1D1D22; +} + .disclaimer { background: #2D2E35; font-size: .8rem; @@ -185,7 +400,7 @@ a.examples-block:hover { display: grid; grid-gap: 30px; grid-template-columns: repeat(2,1fr); - margin-top: 1rem; + margin-top: 2rem; padding: 0; } @@ -194,7 +409,7 @@ a.examples-block:hover { background-color: #4C4F5A; border-radius: 10px; color: #fff; - /* cursor: pointer; */ + cursor: pointer; display: flex; padding: 1rem; position: relative; @@ -459,10 +674,11 @@ a.examples-block:hover { /* ---------------------------------- Terminal interface -----------------------------------*/ -.terminal { +.old-terminal { box-shadow: 1px 1px 40px rgb(0 0 0 / 30%); margin: 0 auto; max-width: 650px; + display: none; } .window-buttons { @@ -539,7 +755,7 @@ a.examples-block:hover { animation: blink 500ms linear infinite alternate; } */ -.terminal p { +.old-terminal p { font-family: 'Hack Regular', monospace; font-size: 1em; left: 10%; @@ -550,7 +766,7 @@ a.examples-block:hover { width: 0; } -.terminal span { +.old-terminal span { color: #fff; font-weight: bold; } @@ -666,7 +882,7 @@ a.examples-block:hover { Mobile layout -----------------------------------*/ @media all and (max-width: 700px) { - .terminal p { + .old-terminal p { font-size: .8rem; left: 3%; } @@ -698,68 +914,23 @@ a.examples-block:hover { .screen { overflow-x: scroll; } -} -.social { - background: #1D1D22; - border-radius: 10px; - margin: 2rem auto 0; - max-width: 340px; - padding: 1rem; -} - -.social .profile { - display: flex; - position: relative; -} - -.social svg { - height: 25px; - position: absolute; - right: 0; - top: 0; - width: 25px; -} - -.social .avatar img { - border-radius: 400px; - max-width: 50px; -} - -.social .bio { - padding: 0 1rem; -} - -.social .bio h5 { - font-size: 1.25rem; + .newsletter-section { + padding: 0 1rem; + } } -.social .link { - color: #aaa; - font-size: 0.8rem; - text-decoration: none; -} -.social .link:hover { - color: #FDA803; -} +/* ---------------------------------- + MicroPython Terminal +-----------------------------------*/ -.social p { - font-size: .8rem; - margin: 1rem 0; +.xterm { + padding-left: 1rem; + border-radius: 10px; + overflow-y: auto; } -.button.twitter { - background-color: #000; - border-radius: 100px; - color: #fff; - display: inline-block; - font-weight: 700; - padding: 0.5rem 1rem; - text-decoration: none; +.xterm .xterm-viewport { + border-radius: 10px; } - -.button.twitter:hover { - background-color: #FDA803; - color: #1D1D22; -} \ No newline at end of file diff --git a/assets/css/main.min.css b/assets/css/main.min.css new file mode 100644 index 0000000..c5476c4 --- /dev/null +++ b/assets/css/main.min.css @@ -0,0 +1 @@ +body,html{background-color:#2D2E35;color:#fff;font-family:'Roboto',sans-serif;font-size:16px;line-height:1.2;margin:0;padding:0}*{box-sizing:border-box;margin:0;padding:0}body{background:#2D2E35 url(https://assets.anaconda.com/production/Content/1650828148240.png?w=3240&auto=compress%2Cformat&fit=crop&dm=1650828161&s=c558dc55e0ed1f8419a892e842a5728f) repeat-x center bottom / 250px;background-attachment:fixed;overflow-x:hidden}a,a:visited{color:#FDA703}@font-face{font-family:'Hack Regular';font-style:normal;font-weight:400;src:local('Hack Regular'),url(/assets/fonts/Hack-Regular.woff) format('woff')}.site-header,.site-footer{margin:1rem 0}.site-footer{align-items:center;background:#2D2E35;border:1px solid rgb(255 255 255 / .1);border-radius:10px;color:rgb(255 255 255 / .8);display:flex;flex-direction:row;font-size:.8rem;justify-content:space-between;padding:.5rem}.site-footer .icon svg{display:block;fill:rgb(255 255 255 / .8);height:25px;margin-right:5px;width:25px}a.footer-button{align-items:center;color:rgb(255 255 255 / .8);display:flex;flex-direction:row;text-decoration:none}.logo{padding:1rem 2rem 1rem;text-align:center}.logo img{display:block;margin:0 auto;max-width:330px;width:100%}.subhead{font-size:2rem;font-weight:400}.main{padding-bottom:3rem}.content{margin:0 auto;max-width:800px;padding:1rem 1rem 2rem;width:100%}code{font-family:'Hack Regular'}::selection{background-color:#FDA703;color:#2C2E34}pre{font-family:'Hack Regular',monospace}a.examples-block{display:block;color:#fff;margin:0 auto;padding:1rem;background:#1D1D22;border:2px solid #FDA703;border-radius:10px;text-decoration:none;width:100%;align-items:center;border-radius:10px;color:#fff;display:flex;padding:1rem;position:relative;text-decoration:none}a.examples-block span{color:#FDA703}.examples-block p{font-size:.85rem}.examples-block .glyph{background-color:#FDA703}.examples-block .glyph svg{fill:#1D1D22}a.examples-block:hover .glyph{background-color:#1D1D22}.examples-block:hover .glyph svg{fill:#FDA703}a.examples-block:hover span{color:inherit}a.examples-block:hover{background:#FDA703;color:#1D1D22}.newsletter-section{background:#1D1D22;border-radius:10px;margin:2rem auto 0;max-width:340px;padding:0}#newsletter-form-container{background-color:#1D1D22;border-radius:10px;padding:1.5rem;border:none}.newsletter-wrapper{text-align:center}.newsletter-content{margin-bottom:1.5rem}.newsletter-content h4{color:#FDA703;font-size:1.5rem;font-weight:400;margin-bottom:.25rem}.newsletter-content p{color:#fff;font-size:1rem;font-weight:400;margin-bottom:1rem}.newsletter-form{margin:0}.newsletter-field{margin-bottom:1rem}.newsletter-field input{background-color:#fff;border:none;border-radius:25px;color:#666;font-size:1rem;padding:.75rem 1rem;width:100%}.newsletter-checkbox{margin:.5rem 0;text-align:left}.newsletter-checkbox label{display:flex;align-items:center;gap:.5rem}.newsletter-checkbox input[type="checkbox"]{margin:0;width:auto}.newsletter-checkbox .label-description p{color:#fff;font-size:.9rem;margin:0}.newsletter-privacy{color:rgb(255 255 255 / .5);font-size:.85rem;margin:.75rem 0;line-height:1.3;text-align:left}.newsletter-privacy a{color:#FDA703;text-decoration:none}.newsletter-submit{text-align:center;margin-top:1rem}.newsletter-submit button.primary{background-color:#000;border-radius:100px;color:#fff;display:inline-block;font-weight:700;font-size:.9rem;padding:.5rem 1.5rem;text-decoration:none;border:none;cursor:pointer}.newsletter-submit button.primary:hover{background-color:#FDA803;color:#1D1D22}.loading-indicator{width:20px;height:20px;border:2px solid rgb(255 255 255 / .3);border-radius:50%;border-top-color:#fff;animation:spin 0.8s linear infinite;margin:0 auto}@keyframes spin{to{transform:rotate(360deg)}}.newsletter-success{display:none;text-align:center;padding:1rem}.newsletter-success h4{color:#FDA703;font-size:1.5rem;font-weight:400;margin-bottom:.5rem}.newsletter-success p{color:#fff;font-size:1rem}.social{background:#1D1D22;border-radius:10px;margin:2rem auto 0;max-width:340px;padding:1rem}.social .profile{display:flex;position:relative}.social svg{height:25px;position:absolute;right:0;top:0;width:25px}.social .avatar img{border-radius:400px;max-width:50px}.social .bio{padding:0 1rem}.social .bio h5{font-size:1.25rem}.social .link{color:#aaa;font-size:.8rem;text-decoration:none}.social .link:hover{color:#FDA803}.social p{font-size:.8rem;margin:1rem 0}.button.twitter{background-color:#000;border-radius:100px;color:#fff;display:inline-block;font-weight:700;padding:.5rem 1rem;text-decoration:none}.button.twitter:hover{background-color:#FDA803;color:#1D1D22}.disclaimer{background:#2D2E35;font-size:.8rem;line-height:1.5;padding:1rem 2rem}.dialogs{display:grid;grid-gap:30px;grid-template-columns:repeat(2,1fr);margin-top:2rem;padding:0}.dialog{align-items:center;background-color:#4C4F5A;border-radius:10px;color:#fff;cursor:pointer;display:flex;padding:1rem;position:relative;text-decoration:none}.dialog:visited{color:inherit}.dialog:hover{background-color:#FDA703;color:#2C2E34}.dialog:hover a{color:#2C2E34}.dialog p{font-size:.85rem;line-height:1.5}.dialog ol{margin:0 1rem 0 1.5rem}.dialog li{padding:.5rem 1rem}.dialog li:last-of-type{border-bottom:0;border-radius:0 0 10px 10px}.dropdown .dropdown-content{background:#FEA703;border-radius:10px;box-shadow:0 8px 16px rgb(0 0 0 / .2);color:#2C2E34;font-size:16px;left:-50px;min-width:125%;opacity:0;position:absolute;top:77%;transition:0.35s ease-out;visibility:hidden;width:100%;z-index:9999}.dropdown .inner{padding:1rem}.dropdown-content .close{background-color:#2D2E35;border-radius:100%;display:inline-block;height:18px;padding:0;position:absolute;right:5px;top:5px;transition:0.15s ease-out;width:18px;z-index:10}.dropdown-content .close::before,.dropdown-content .close::after{background:#fff;content:'';height:60%;left:50%;position:absolute;top:50%;width:2px}.dropdown-content .close::before{transform:translate(-50%,-50%) rotate(45deg)}.dropdown-content .close::after{transform:translate(-50%,-50%) rotate(-45deg)}.dropdown-content .close:hover{background:#2D2E35}.file-download{cursor:pointer;display:block}.file-download svg{fill:#2C2E34;height:25px;margin-right:5px;width:20px}.file-download strong{font-size:1.1rem}.flex{align-items:center;display:flex}.dropdown:focus{background:#FEA703;border-bottom:1px solid #2C2E34;border-radius:10px 10px 0 0;color:#2C2E34}.dropdown:focus .dropdown-content{opacity:1;outline:none;transform:translateY(20px);visibility:visible}.dropdown-content p{padding:1rem 0}.dropdown-content a{color:#2C2E34;text-decoration:underline}.dropdown:focus{z-index:1}.glyph{background-color:#2C2E34;border-radius:10px;display:inline-block;margin-right:15px;padding:.5rem}.glyph svg{display:block;fill:#fff;height:30px;width:30px}.site-footer .glyph{padding:.4rem}.readme{background:#2C2E34;border-radius:10px;border:1px solid rgb(255 255 255 / .1);box-shadow:0 0 30px rgb(0 0 0 / .2);line-height:1.5;margin:3rem 0 0;padding:2rem}.readme code{background-color:#1D1E22;border-radius:6px;font-size:.85rem;padding:.3rem .5rem}.readme p{margin-top:0;margin-bottom:1rem}.readme ul,.readme ol{margin-top:0;margin-bottom:1rem;padding:1rem 0 1rem 2rem}.readme li{padding:.5rem 0}.readme pre{white-space:normal}.readme h1{font-size:3rem;font-weight:400}.readme h2{border-bottom:1px solid rgb(255 255 255 / .2);font-size:1.5rem;font-weight:400;line-height:1.25;margin-bottom:1rem;margin-top:2rem;padding-bottom:.3rem}.readme h3{font-weight:600;line-height:1.25;margin-bottom:1rem;margin-top:24px}.readme a{position:relative;text-decoration:none}.readme a:after{border:1px solid;bottom:-5px;content:'';display:inline-block;left:-100%;position:absolute;visibility:hidden;width:0}.readme a:hover:after{transition:width .12s ease-in;left:0;visibility:visible;width:100%}.old-terminal{box-shadow:1px 1px 40px rgb(0 0 0 / 30%);margin:0 auto;max-width:650px;display:none}.window-buttons{background-color:#ff3b47;border-radius:50%;border:1px solid #c03d44;display:inline-block;height:10px;left:6px;position:relative;top:6px;width:10px}.minimize{background-color:#ffc100;border-color:#9d802c;left:11px}.zoom{background-color:#00d742;border-color:#049931;left:16px}.menu{background-color:#1D1E22;border-top-left-radius:5px;border-top-right-radius:5px;box-sizing:border-box;height:25px;margin:0 auto}.screen{background-color:#1D1E22;border-bottom-left-radius:5px;border-bottom-right-radius:5px;box-sizing:border-box;margin:0 auto;overflow:hidden;padding:5rem 1rem}.pre{-webkit-overflow-scrolling:touch;background:#2D2E35;border-radius:10px;color:#fff;display:block;font-family:'Hack Regular',monospace;font-size:.75rem;line-height:1.5;max-width:100%;min-width:100px;overflow-x:scroll;padding:.5rem;white-space:nowrap}#typewriter{animation:hide 6.5s 1s;font-family:'Hack Regular',monospace;height:0;line-height:2.2;opacity:0;position:relative;left:-34%}.old-terminal p{font-family:'Hack Regular',monospace;font-size:1em;left:10%;overflow:hidden;position:relative;text-align:left;white-space:nowrap;width:0}.old-terminal span{color:#fff;font-weight:700}.line1{animation:type .5s 8s steps(80,end) forwards;color:#9CD9F0}.cursor1{animation:blink 1s 8s 2 forwards}.line2{animation:type .5s 10.25s steps(20,end) forwards;color:#888}.cursor2{animation:blink 1s 10.1s 2 forwards}.line3{animation:type .5s 12.2s steps(20,end) forwards;color:#FFAE57}.cursor3{animation:blink 1s 13s 2 forwards}.line4{animation:type .5s 14.85s steps(20,end) forwards;color:#9CD9F0}.cursor4{animation:blink 1s 15.5s 2 forwards}.line5{animation:type .5s 17.75s steps(20,end) forwards;color:#fff}.cursor5{animation:blink 1s 8.5s infinite}@keyframes blink{0%{opacity:0}40%{opacity:0}50%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes hide{0%{opacity:1}50%{opacity:1}90%{opacity:1}100%{height:0;opacity:0}}@keyframes type{to{width:40rem}}@keyframes slideIn{from{background-position:center 200%}to{background-position:center bottom}}@media all and (max-width:700px){.old-terminal p{font-size:.8rem;left:3%}#typewriter{left:-253px;top:-11px}.dialogs{grid-template-columns:repeat(1,1fr)}.logo img{max-width:240px}.subhead{font-size:1.25rem}.dropdown .dropdown-content{border-radius:0 0 10px 10px;left:0;min-width:95%;top:77%}.screen{overflow-x:scroll}.newsletter-section{padding:0 1rem}}.xterm{padding-left:1rem;border-radius:10px;overflow-y:auto}.xterm .xterm-viewport{border-radius:10px} diff --git a/assets/images/pyscript-logo-icon.svg b/assets/images/pyscript-logo-icon.svg new file mode 100644 index 0000000..36188b6 --- /dev/null +++ b/assets/images/pyscript-logo-icon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/images/pyscript-sticker-black.svg b/assets/images/pyscript-sticker-black.svg index 0e8722f..d924610 100644 --- a/assets/images/pyscript-sticker-black.svg +++ b/assets/images/pyscript-sticker-black.svg @@ -1,3269 +1,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/assets/js/mailerlite-script.js b/assets/js/mailerlite-script.js new file mode 100644 index 0000000..4e59f38 --- /dev/null +++ b/assets/js/mailerlite-script.js @@ -0,0 +1,80 @@ +// Newsletter form handling +class NewsletterForm { + constructor(containerId) { + this.container = document.getElementById(containerId); + this.init(); + } + + init() { + const form = this.container.querySelector('.newsletter-form'); + if (form) { + form.addEventListener('submit', this.handleSubmit.bind(this)); + } else { + console.error('Newsletter form not found'); + } + } + + async handleSubmit(event) { + event.preventDefault(); + const form = event.target; + const email = form.querySelector('input[type="email"]').value; + const checkbox = form.querySelector('input[type="checkbox"]'); + + if (!email || !checkbox.checked) { + alert('Please fill in all required fields'); + return; + } + + // Show loading spinner + const primaryButton = form.querySelector('button.primary'); + primaryButton.style.display = 'none'; + + const loadingButton = form.querySelector('button.loading'); + const loadingSpinner = loadingButton.querySelector('.loading-indicator'); + + loadingButton.style.display = 'inline-flex'; + loadingSpinner.style.display = 'block'; + + try { + const response = await fetch('https://assets.mailerlite.com/jsonp/1042482/forms/130941196381980229/subscribe', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + fields: { email }, + anticsrf: true + }) + }); + + if (response.ok) { + this.showSuccess(); + } else { + throw new Error('Subscription failed'); + } + } catch (error) { + console.error('Error:', error); + alert('Failed to subscribe. Please try again later.'); + + // Hide loading spinner and restore submit button + loadingButton.style.display = 'none'; + loadingSpinner.style.display = 'none'; + primaryButton.style.display = 'inline-flex'; + } + } + + showSuccess() { + const formBody = this.container.querySelector('.newsletter-body'); + const successBody = this.container.querySelector('.newsletter-success'); + + if (formBody && successBody) { + formBody.style.display = 'none'; + successBody.style.display = 'block'; + } + } +} + +// Initialize form when DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + new NewsletterForm('newsletter-form-container'); +}); diff --git a/assets/js/mailerlite-script.min.js b/assets/js/mailerlite-script.min.js new file mode 100644 index 0000000..581ba48 --- /dev/null +++ b/assets/js/mailerlite-script.min.js @@ -0,0 +1,6 @@ +class NewsletterForm{constructor(containerId){this.container=document.getElementById(containerId);this.init()} +init(){const form=this.container.querySelector('.newsletter-form');if(form){form.addEventListener('submit',this.handleSubmit.bind(this))}else{console.error('Newsletter form not found')}} +async handleSubmit(event){event.preventDefault();const form=event.target;const email=form.querySelector('input[type="email"]').value;const checkbox=form.querySelector('input[type="checkbox"]');if(!email||!checkbox.checked){alert('Please fill in all required fields');return} +const primaryButton=form.querySelector('button.primary');primaryButton.style.display='none';const loadingButton=form.querySelector('button.loading');const loadingSpinner=loadingButton.querySelector('.loading-indicator');loadingButton.style.display='inline-flex';loadingSpinner.style.display='block';try{const response=await fetch('https://assets.mailerlite.com/jsonp/1042482/forms/130941196381980229/subscribe',{method:'POST',headers:{'Content-Type':'application/json',},body:JSON.stringify({fields:{email},anticsrf:!0})});if(response.ok){this.showSuccess()}else{throw new Error('Subscription failed')}}catch(error){console.error('Error:',error);alert('Failed to subscribe. Please try again later.');loadingButton.style.display='none';loadingSpinner.style.display='none';primaryButton.style.display='inline-flex'}} +showSuccess(){const formBody=this.container.querySelector('.newsletter-body');const successBody=this.container.querySelector('.newsletter-success');if(formBody&&successBody){formBody.style.display='none';successBody.style.display='block'}}} +document.addEventListener('DOMContentLoaded',()=>{new NewsletterForm('newsletter-form-container')}) diff --git a/error.html b/error.html new file mode 100644 index 0000000..80bb77e --- /dev/null +++ b/error.html @@ -0,0 +1,141 @@ + + + + + + + PyScript | Not Found + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+ +
+
+
+                              Hmm... I can't seem to find that page.
+                            
+ +

Not Found|

+

The page that you looked for could not be found|

+
+
+
+ + + +
+ + + +
+
+

Examples

+

Click here for example projects

+
+ +
+ + + +
+ + + +
+ +
+ +
+

Documentation

+

Click here for PyScript documentation

+
+
+ + + + + + +
+ + +
+
+ + + diff --git a/index.html b/index.html index cb76ed8..95da198 100644 --- a/index.html +++ b/index.html @@ -4,33 +4,37 @@ - PyScript | Run Python in your HTML + PyScript is an open source platform for Python in the browser. - - + + - - + + - - - + + + - + - - - + + + + + + + @@ -39,16 +43,25 @@
-
+
+ + +
+ +
- - -
- - - -
-
-

Examples

-

Click here for example projects

-
-
- - -
+ + +
+ + + +
+
+

Try it out!

+

PyScript.com is free and easy.

+
+
+ - + - - + + +
+ +
- - + +
-
-

Install

-

Click here for instructions

-
- -
-
- + + + + + +
+ +
+
+

Community

+

Connect with other PyScript users.

+
+
+
+ + + + + + + + +
+ Env +
+ +ℹ️ - This is an **advanced feature** that is worth describing but usually it is not needed for most common use cases. + +Mostly due its terseness that plays nicely as attribute's suffix, among its commonly understood meaning, we consider an *env* an identifier that guarantee the used *interpreter* would always be the same and no other interpreters, even if they point at very same project, could interfere with globals, behavior, or what's not. + +In few words, every single *env* would spawn a new interpreter dedicated to such env, and global variables defined elsewhere will not affect this "_environment_" and vice-versa, an *env* cannot dictate what will happen to other interpreters. + +```html + + + + + + +``` + +ℹ️ - Please note if the interpreter takes 1 second to bootstrap, multiple *environments* will take *that* second multiplied by the number of different environments, which is why this feature is considered for **advanced** use cases only and it should be discouraged as generic practice. + +
+
+ + +## Bootstrapping core + +In order to have anything working at all in our pages, we need to at least bootstrap *@pyscript/core* functionalities, otherwise all examples and scripts mentioned in this document would just sit there ... sadly ignored by every browser: + +```html + + + + + + + + + + +``` + +As *core* exposes some utility/API, using the following method would also work: + +```html + +``` + +Please keep reading this document to understand how to use those utilities or how to have other *Pogramming Languages* enabled in your page via ` +``` + +Not only this is helpful to crawl the surrounding *DOM* or *HTML*, every script will also have a `target` property that will point either to the element reachable through the `target` attribute, or it lazily creates once a companion element that will be appended right after the currently executing *script*. + +Please read the [Terminology](#terminology) **target** dedicated details to know more. + +
+ + +
+ XWorker +
+ +With or without access to the `document`, every (*non experimental*) interpreter will have defined, at the global level, a reference to the `XWorker` "_class_" (it's just a *function*!), which goal is to enable off-loading heavy operations on a worker, without blocking the main / UI thread (the current page) and allowing such worker to even reach the `document` or anything else available on the very same main / UI thread. + +```html + +``` + +Please read the [XWorker](#xworker) dedicated section to know more. + +
+
+ + +## How Events Work + +Inspired by the current [HTML Standard](https://html.spec.whatwg.org/multipage/webappapis.html#event-handlers): + +> the event handler is exposed through a name, which is a string that always starts with "_on_" and is followed by the name of the event for which the handler is intended. + +We took a similar approach, replacing that `on` prefix with whatever *interpreter* or *custom type* is available on the page, plus a *dash* `-` to avoid clashing with standards: + +```html + + +``` + +If this example felt a bit verbose, be ensured custom types would work the same: + +```html + + +``` + +What is important to understand about *events* in PyScript is that the text within the attribute is executed just like any other inline or external content is, through the very same *interpreter*, with the notably extra feature that the `event` reference is made temporarily available as *global* by *core*. + +This really reflects how otherwise native Web inline events handlers work and we think it's a great feature to support ... *but*: + + * if your script runs *asynchronously* the `event` might be gone on the main / UI thread and by that time any of its `event.stopPropagation()` or `event.preventDefault()` goodness will be problematic, as too late to be executed + * if your *interpreter* is *experimental*, or incapable of running *synchronous* events, the `event` reference might be less useful + +ℹ️ - Please note that if your code runs via *XWorker*, hence in a different thread, there are different caveats and constraints to consider. Please read the [XWorker](#xworker) dedicated section to know more. + +#### The type-env attribute + +Just as the `env` attribute on a ` + + + + +``` + +As mentioned before, this will work with `py-env` too, or any custom type defined out there. + + +## XWorker + +Whenever computing relatively expensive stuff, such as a *matplot* image, or literally anything else that would take more than let's say 100ms to answer, running your *interpreter* of choice within a [Web Worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) is likely desirable, so that the main / UI thread won't block users' actions, listeners, or any other computation going on in these days highly dynamic pages. + +`@pyscript/core` adds a functionality called `XWorker` to all of the interpreters it offers, which works in each language the way `Worker` does in JavaScript. + +In each Interpreter, `XWorker` is a global reference, with a counter `xworker` (lower case) global reference within the worker code. + +In short, the `XWorker` global goal is to help, without much thinking, to run any desired interpreter out of a *Worker*, enabling extra features on the *worker*'s code side. + + +### Enabling XWorker + +We use the latest Web technologies to allow fast, non-blocking, yet synchronous like, operations from any non-experimental interpreter's worker, and the standard requires some special header to enable such technologies and, most importantly, the [SharedArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer). + +There is an exhaustive [section](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer#security_requirements) around this topic but the *TL;DR* version is: + + * to protect your page from undesired attacks, the `Cross-Origin-Opener-Policy` header should be present with the `same-origin` value + * to protect other sites from your pages' code, the `Cross-Origin-Embedder-Policy` header should be present with either the `credentialless` value (Chrome and Firefox browsers) or the `require-corp` one (Safari + other browsers) + * when the `Cross-Origin-Embedder-Policy` header is set with the `require-corp` value, the `Cross-Origin-Resource-Policy` header should also be available with [one of these options](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Resource-Policy): `same-site`, `same-origin` or `cross-origin` + +There are **alternative ways** to enable these headers for your site or local host, and [this script](https://github.com/gzuidhof/coi-serviceworker#readme) is just one of these, one that works with most free-hosting websites too. + + +### XWorker options + +Before showing any example, it's important to understand how the offered API differs from Web standard *workers*: + +| name | example | behavior | +| :-------- | :------------------------------------------------------- | :--------| +| async | `XWorker('./file.py', async=True)` | The worker code is evaluated via `runAsync` utility where, if the *interpreter* allows it, top level *await* would be possible, among other *PL* specific asynchronous features. | +| config | `XWorker('./file.py', config='./cfg.toml')` | The worker will load and parse the *JSON* or *TOML* file to configure itself. Please see [currently supported config values](https://docs.pyscript.net/latest/reference/elements/py-config.html#supported-configuration-values) as this is currently based on `` features. | +| type | `XWorker('./file.py', type='pyodide')` | Define the *interpreter* to use with this worker which is, by default, the same one used within the running code. Please read the [Terminology](#terminology) **interpreter** dedicated details to know more. | +| version | `XWorker('./file.py', type='pyodide', version='0.23.2')` | Allow the usage of a specific version where, if numeric, must be available through the project *CDN* used by *core* but if specified as fully qualified *URL*, allows usage of any interpreter's version: ` + + +``` + +```js +// worker.js +import coincident from 'https://unpkg.com/coincident'; + +console.log('asking for an input'); +// pauses in a non blocking way the worker until the answer has been received +console.log('input', coincident(self).input('what is 1 + 2 ?')); +console.log('input received'); +``` + +## API + +The module exports a utility/helper able to *Proxy* once a generic *worker* or *globalThis* / *self* context, adding an unobtrusive listener, providing orchestration out of the box for bootstrapped *workers* that use such module. + +#### Worker -> Main + +```js +import coincident from 'coincident'; +// or const coincident = require('coincident'); + +// on the main thread +const worker = new Worker('./any-worker.js'); +coincident(worker).enabler = async (...args) => { + // do something sync or async with received args + return {some: 'value'}; +}; + +// on the worker side +const result = coincident(self).enabler('one', {or_more: 'args'}); +console.log(result); +// {some: 'value'} +``` + +The second optional argument of the `coincident(context[, JSON])` helper can be any *JSON* like namespace able to `parse` and `stringify` data, such as [flatted](https://www.npmjs.com/package/flatted) or [@ungap/structured-clone/json](https://github.com/ungap/structured-clone/#tojson) (or use `coincident/structured`). + +**Additionally**, the exported function has a `coincident.tranfer(...buffers)` helper that if used as last argument of any worker demanded task will transfer buffers instead of cloning/copying these. + +#### Main -> Worker + +This module can also communicate from a *main* thread to a *worker*, but in this case the *main* thread needs to `await` for results because [Atomics.wait() cannot be used in main](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait). + +```html + +``` + +```js +// worker.js +import coincident from 'coincident'; + +// expose a specific function to the main thread +coincident(self).compute = (a, b) => (a + b); +``` + + +### coincident/structured + +This entry point exports the exact same module except it uses [@ungap/structured-clone/json](https://github.com/ungap/structured-clone/#tojson) `parse` and `stringify` functions, allowing more complex, or recursive, objects to be passed along as result to, or from, the *worker*. + +Please keep in mind not all complex types are supported by the polyfill but also any other export could use this version with ease: + +```js +import * as JSON from '@ungap/structured-clone/json'; +import coincident from 'coincident/uhtml'; + +// bootstrap in both main / workers like this +const {proxy, window, isWindowProxy} = coincident(self, JSON); + +// that's it: structured-clone enabled for responses! +``` + + +### coincident/window + +This entry point exports the same `coincident` module (using *JSON* as default) **but** the utility returns an obejct with 3 fields: + + * **proxy** it's the usual proxy utility to expose or invoke functions defined in the main counter-part. + * **window** it's the proxy that orchestrates access to the *main* world in *Workers*, including the ability to pass callbacks from the *Worker*, with the only caveat these will be inevitably executed asynchronously on the main thread, so that *Promise* or *thenable* work out of the box but *accessors* or defined callbacks will need to be awaited from the worker too. DOM listeners should be also handled with no issues but the `event` can't *preventDefault* or *stopPropagation* as the listener will be asynchronous too. All well known *Symbol* also cross boundaries so that `[...window.document.querySelectorAll('*')]` or any other *Symbol* based functionality should be preserved, as long as the `symbol` is known as runtime symbols can't cross paths in any meaningful way. In the *main* thread, this is just a reference to the `globalThis` object. + * **isWindowProxy** is an utility that helps introspecting window proxies, callbacks, classes, or main thread references in general. This returns always `false` in the *main* thread. + +While the initial utility/behavior is preserved on both sides via `proxy`, the *Worker* can seamlessly use `window` utility to operate on *DOM*, *localStorage*, or literally anything else, included *Promise* based operations, DOM listeners, and so on. + + +```html + + +``` + +```js +// The worker.js !!! +import coincident from 'coincident/window'; + +const {proxy, window, isWindowProxy} = coincident(self); +// the proxy can expose or answer to main proxy counter part + +// ... but here is the fun part ... +const {document} = window; +document.body.innerHTML = '

Hello World!

'; + +document.body.appendChild( + document.createElement('div') +).textContent = '😱'; + +const scoped = true; +document.body.addEventListener('click', event => { + console.log(event.type, 'running in a worker', scoped); +}); +``` + +See the [test/window.js](./test/window.js) file or reach `http://localhost:8080/test/window.html` locally to play around this feature. + +#### Extra features + +Beside providing some handy utility, the `window` (and other exports such as `uhtml`) allows *Workers*' listeners to synchronously invoke methods on the **event** on the main thread, before the proxied worker function gets a chance to get executed (remember, functions form the *worker* are inevitably async when executed from *main*). + +```js +document.body.addEventListener( + 'click', + event => console.log(event.type), + {invoke: ['preventDefault', 'stopImmediatePropagation']} +); +``` + +When options are passed, be sure these contains [all the details you need](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters) *plus* an `invoke` *string* or array of strings. + + +### coincident/uhtml + +This export includes [uhtml](https://github.com/WebReflection/uhtml#readme) to fully drive reactive UI from a Worker. + +The `uhtml` field is added to the returned object after `coincident(self)` call. + +```html + + +``` + +```js +// The worker.js !!! +import coincident from 'coincident/window'; + +const {proxy, window, uhtml} = coincident(self); + +// uhtml directly from the thread +const {render, html} = uhtml; + +const {document} = window; + +render(document.body, html` +

Hello uhtml!

+`); +``` + +See [test/uhtml.js](./test/uhtml.js) page or test it locally via `http://localhost:8080/test/uhtml.html` after `npm run server`. diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/channel.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/channel.js new file mode 100644 index 0000000..f1e6408 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/channel.js @@ -0,0 +1,2 @@ +'use strict'; +module.exports = '2f6fe6d4-8ba8-424a-83c5-8fadca1ea103'; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/fallback.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/fallback.js new file mode 100644 index 0000000..57cca73 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/fallback.js @@ -0,0 +1,10 @@ +'use strict'; +module.exports = buffer => ({ + value: new Promise(onmessage => { + let w = new Worker('data:application/javascript,' + encodeURIComponent( + 'onmessage=({data:b})=>(Atomics.wait(b,0),postMessage(0))' + )); + w.onmessage = onmessage; + w.postMessage(buffer); + }) +}); diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/global.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/global.js new file mode 100644 index 0000000..5eeb772 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/global.js @@ -0,0 +1,36 @@ +'use strict'; +const CHANNEL = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./channel.js')); +const $coincident = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./index.js')); +const main = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./global/main.js')); +const thread = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./global/thread.js')); + +const MAIN = CHANNEL + 'M'; +const THREAD = CHANNEL + 'T'; + +const proxies = new WeakMap; + +/** + * @typedef {object} Coincident + * @property {ProxyHandler} proxy + * @property {ProxyHandler} global + * @property {(value: any) => boolean} isGlobal + */ + +/** + * Create once a `Proxy` able to orchestrate synchronous `postMessage` out of the box. + * In workers, returns a `{proxy, global, isGlobal}` namespace to reach globals synchronously. + * @param {Worker | globalThis} self the context in which code should run + * @returns {ProxyHandler | Coincident} + */ +const coincident = (self, ...args) => { + const proxy = $coincident(self, ...args); + if (!proxies.has(proxy)) { + const util = self instanceof Worker ? main : thread; + proxies.set(proxy, util(proxy, MAIN, THREAD)); + } + return proxies.get(proxy); +} + +coincident.transfer = $coincident.transfer; + +module.exports = coincident; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/global/main.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/global/main.js new file mode 100644 index 0000000..34ecb71 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/global/main.js @@ -0,0 +1,170 @@ +'use strict'; +const { + defineProperty, + getOwnPropertyDescriptor, + getPrototypeOf, + isExtensible, + ownKeys, + preventExtensions, + set, + setPrototypeOf, + augment, + entry, + asEntry, + symbol +} = require('./utils.js'); + +const { + OBJECT, + FUNCTION, + NUMBER, + STRING, + SYMBOL, + UNDEFINED +} = require('./types.js'); + +const { + APPLY, + CONSTRUCT, + DEFINE_PROPERTY, + DELETE_PROPERTY, + GET, + GET_OWN_PROPERTY_DESCRIPTOR, + GET_PROTOTYPE_OF, + HAS, + IS_EXTENSIBLE, + OWN_KEYS, + PREVENT_EXTENSION, + SET, + SET_PROTOTYPE_OF, + DELETE +} = require('./traps.js'); + +let id = 0; +const ids = new Map; +const values = new Map; +const eventsHandler = new WeakMap; +const {addEventListener} = EventTarget.prototype; + +// this should never be on the way as it's extremely light and fast +// but it's necessary to allow "preventDefault" or other event invokes at distance +defineProperty(EventTarget.prototype, 'addEventListener', { + value(type, listener, ...options) { + if (options.at(0)?.invoke) { + if (!eventsHandler.has(this)) + eventsHandler.set(this, new Map); + eventsHandler.get(this).set(type, [].concat(options[0].invoke)); + delete options[0].invoke; + } + return addEventListener.call(this, type, listener, ...options); + } +}); + +const handleEvent = event => { + const {currentTarget, target, type} = event; + for (const method of eventsHandler.get(currentTarget || target)?.get(type) || []) + event[method](); +}; + +const result = asEntry((type, value) => { + if (!ids.has(value)) { + let sid; + // a bit apocalyptic scenario but if this main runs forever + // and the id does a whole int32 roundtrip we might have still + // some reference danglign around + while (values.has(sid = id++)); + ids.set(value, sid); + values.set(sid, value); + } + return entry(type, ids.get(value)); +}); + +module.exports = (thread, MAIN, THREAD) => { + const {[THREAD]: __thread__} = thread; + + const registry = new FinalizationRegistry(id => { + __thread__(DELETE, entry(STRING, id)); + }); + + const target = ([type, value]) => { + switch (type) { + case OBJECT: + return value == null ? globalThis : ( + typeof value === NUMBER ? values.get(value) : value + ); + case FUNCTION: + if (typeof value === STRING) { + if (!values.has(value)) { + const cb = function (...args) { + if (args.at(0) instanceof Event) handleEvent(...args); + return __thread__( + APPLY, + entry(FUNCTION, value), + result(this), + args.map(result) + ); + }; + const ref = new WeakRef(cb); + values.set(value, ref); + registry.register(cb, value, ref); + } + return values.get(value).deref(); + } + return values.get(value); + case SYMBOL: + return symbol(value); + } + return value; + }; + + const trapsHandler = { + [APPLY]: (target, thisArg, args) => result(target.apply(thisArg, args)), + [CONSTRUCT]: (target, args) => result(new target(...args)), + [DEFINE_PROPERTY]: (target, name, descriptor) => result(defineProperty(target, name, descriptor)), + [DELETE_PROPERTY]: (target, name) => result(delete target[name]), + [GET_PROTOTYPE_OF]: target => result(getPrototypeOf(target)), + [GET]: (target, name) => result(target[name]), + [GET_OWN_PROPERTY_DESCRIPTOR]: (target, name) => { + const descriptor = getOwnPropertyDescriptor(target, name); + return descriptor ? entry(OBJECT, augment(descriptor, result)) : entry(UNDEFINED, descriptor); + }, + [HAS]: (target, name) => result(name in target), + [IS_EXTENSIBLE]: target => result(isExtensible(target)), + [OWN_KEYS]: target => entry(OBJECT, ownKeys(target).map(result)), + [PREVENT_EXTENSION]: target => result(preventExtensions(target)), + [SET]: (target, name, value) => result(set(target, name, value)), + [SET_PROTOTYPE_OF]: (target, proto) => result(setPrototypeOf(target, proto)), + [DELETE](id) { + ids.delete(values.get(id)); + values.delete(id); + } + }; + + thread[MAIN] = (trap, entry, ...args) => { + switch (trap) { + case APPLY: + args[0] = target(args[0]); + args[1] = args[1].map(target); + break; + case CONSTRUCT: + args[0] = args[0].map(target); + break; + case DEFINE_PROPERTY: { + const [name, descriptor] = args; + args[0] = target(name); + const {get, set, value} = descriptor; + if (get) descriptor.get = target(get); + if (set) descriptor.set = target(set); + if (value) descriptor.value = target(value); + break; + } + default: + args = args.map(target); + break; + } + + return trapsHandler[trap](target(entry), ...args); + }; + + return thread; +}; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/global/thread.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/global/thread.js new file mode 100644 index 0000000..427a0c6 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/global/thread.js @@ -0,0 +1,145 @@ +'use strict'; +const { + augment, + entry, + asEntry, + symbol +} = require('./utils.js'); + +const { + OBJECT, + FUNCTION, + NUMBER, + STRING, + SYMBOL +} = require('./types.js'); + +const { + APPLY, + CONSTRUCT, + DEFINE_PROPERTY, + DELETE_PROPERTY, + GET, + GET_OWN_PROPERTY_DESCRIPTOR, + GET_PROTOTYPE_OF, + HAS, + IS_EXTENSIBLE, + OWN_KEYS, + PREVENT_EXTENSION, + SET, + SET_PROTOTYPE_OF, + DELETE +} = require('./traps.js'); + +const bound = target => typeof target === FUNCTION ? target() : target; + +const argument = asEntry( + (type, value) => { + if (__proxied__ in value) + return bound(value[__proxied__]); + if (type === FUNCTION) { + if (!values.has(value)) { + let sid; + // a bit apocalyptic scenario but if this thread runs forever + // and the id does a whole int32 roundtrip we might have still + // some reference danglign around + while (values.has(sid = String(id++))); + ids.set(value, sid); + values.set(sid, value); + } + return entry(type, ids.get(value)); + } + return entry(type, value); + } +); + +const __proxied__ = Symbol(); + +let id = 0; +const ids = new Map; +const values = new Map; + +module.exports = (main, MAIN, THREAD) => { + const {[MAIN]: __main__} = main; + + const proxies = new Map; + + const registry = new FinalizationRegistry(id => { + proxies.delete(id); + __main__(DELETE, argument(id)); + }); + + const register = (entry) => { + const [type, value] = entry; + if (!proxies.has(value)) { + const target = type === FUNCTION ? Bound.bind(entry) : entry; + const proxy = new Proxy(target, proxyHandler); + const ref = new WeakRef(proxy); + proxies.set(value, ref); + registry.register(proxy, value, ref); + } + return proxies.get(value).deref(); + }; + + const fromEntry = entry => { + const [type, value] = entry; + switch (type) { + case OBJECT: + return typeof value === NUMBER ? register(entry) : value; + case FUNCTION: + return typeof value === STRING ? values.get(value) : register(entry); + case SYMBOL: + return symbol(value); + } + return value; + }; + + const result = (TRAP, target, ...args) => fromEntry(__main__(TRAP, bound(target), ...args)); + + const proxyHandler = { + [APPLY]: (target, thisArg, args) => result(APPLY, target, argument(thisArg), args.map(argument)), + [CONSTRUCT]: (target, args) => result(CONSTRUCT, target, args.map(argument)), + [DEFINE_PROPERTY]: (target, name, descriptor) => { + const {get, set, value} = descriptor; + if (typeof get === FUNCTION) descriptor.get = argument(get); + if (typeof set === FUNCTION) descriptor.set = argument(set); + if (typeof value === FUNCTION) descriptor.value = argument(value); + return result(DEFINE_PROPERTY, target, argument(name), descriptor); + }, + [DELETE_PROPERTY]: (target, name) => result(DELETE_PROPERTY, target, argument(name)), + [GET_PROTOTYPE_OF]: target => result(GET_PROTOTYPE_OF, target), + [GET]: (target, name) => name === __proxied__ ? target : result(GET, target, argument(name)), + [GET_OWN_PROPERTY_DESCRIPTOR]: (target, name) => { + const descriptor = result(GET_OWN_PROPERTY_DESCRIPTOR, target, argument(name)); + return descriptor && augment(descriptor, fromEntry); + }, + [HAS]: (target, name) => name === __proxied__ || result(HAS, target, argument(name)), + [IS_EXTENSIBLE]: target => result(IS_EXTENSIBLE, target), + [OWN_KEYS]: target => result(OWN_KEYS, target).map(fromEntry), + [PREVENT_EXTENSION]: target => result(PREVENT_EXTENSION, target), + [SET]: (target, name, value) => result(SET, target, argument(name), argument(value)), + [SET_PROTOTYPE_OF]: (target, proto) => result(SET_PROTOTYPE_OF, target, argument(proto)), + }; + + main[THREAD] = (trap, entry, ctx, args) => { + switch (trap) { + case APPLY: + return fromEntry(entry).apply(fromEntry(ctx), args.map(fromEntry)); + case DELETE: { + const id = fromEntry(entry); + ids.delete(values.get(id)); + values.delete(id); + } + } + }; + + return { + proxy: main, + global: new Proxy([OBJECT, null], proxyHandler), + isGlobal: value => typeof value === OBJECT && !!value && __proxied__ in value + }; +}; + +function Bound() { + return this; +} diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/global/traps.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/global/traps.js new file mode 100644 index 0000000..cf91b42 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/global/traps.js @@ -0,0 +1,29 @@ +'use strict'; +const APPLY = 'apply'; +exports.APPLY = APPLY; +const CONSTRUCT = 'construct'; +exports.CONSTRUCT = CONSTRUCT; +const DEFINE_PROPERTY = 'defineProperty'; +exports.DEFINE_PROPERTY = DEFINE_PROPERTY; +const DELETE_PROPERTY = 'deleteProperty'; +exports.DELETE_PROPERTY = DELETE_PROPERTY; +const GET = 'get'; +exports.GET = GET; +const GET_OWN_PROPERTY_DESCRIPTOR = 'getOwnPropertyDescriptor'; +exports.GET_OWN_PROPERTY_DESCRIPTOR = GET_OWN_PROPERTY_DESCRIPTOR; +const GET_PROTOTYPE_OF = 'getPrototypeOf'; +exports.GET_PROTOTYPE_OF = GET_PROTOTYPE_OF; +const HAS = 'has'; +exports.HAS = HAS; +const IS_EXTENSIBLE = 'isExtensible'; +exports.IS_EXTENSIBLE = IS_EXTENSIBLE; +const OWN_KEYS = 'ownKeys'; +exports.OWN_KEYS = OWN_KEYS; +const PREVENT_EXTENSION = 'preventExtensions'; +exports.PREVENT_EXTENSION = PREVENT_EXTENSION; +const SET = 'set'; +exports.SET = SET; +const SET_PROTOTYPE_OF = 'setPrototypeOf'; +exports.SET_PROTOTYPE_OF = SET_PROTOTYPE_OF; +const DELETE = 'delete'; +exports.DELETE = DELETE; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/global/types.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/global/types.js new file mode 100644 index 0000000..3a3043b --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/global/types.js @@ -0,0 +1,19 @@ +'use strict'; +const OBJECT = 'object'; +exports.OBJECT = OBJECT; +const FUNCTION = 'function'; +exports.FUNCTION = FUNCTION; +const BOOLEAN = 'boolean'; +exports.BOOLEAN = BOOLEAN; +const NUMBER = 'number'; +exports.NUMBER = NUMBER; +const STRING = 'string'; +exports.STRING = STRING; +const UNDEFINED = 'undefined'; +exports.UNDEFINED = UNDEFINED; +const BIGINT = 'bigint'; +exports.BIGINT = BIGINT; +const SYMBOL = 'symbol'; +exports.SYMBOL = SYMBOL; +const NULL = 'null'; +exports.NULL = NULL; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/global/utils.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/global/utils.js new file mode 100644 index 0000000..0ea5017 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/global/utils.js @@ -0,0 +1,82 @@ +'use strict'; + +const { + OBJECT, + FUNCTION, + BOOLEAN, + NUMBER, + STRING, + UNDEFINED, + BIGINT, + SYMBOL, + NULL +} = require('./types.js'); + +const { + defineProperty, + getOwnPropertyDescriptor, + getPrototypeOf, + isExtensible, + ownKeys, + preventExtensions, + set, + setPrototypeOf +} = Reflect; + +exports.defineProperty = defineProperty; +exports.getOwnPropertyDescriptor = getOwnPropertyDescriptor; +exports.getPrototypeOf = getPrototypeOf; +exports.isExtensible = isExtensible; +exports.ownKeys = ownKeys; +exports.preventExtensions = preventExtensions; +exports.set = set; +exports.setPrototypeOf = setPrototypeOf; + +const augment = (descriptor, how) => { + const {get, set, value} = descriptor; + if (get) descriptor.get = how(get); + if (set) descriptor.set = how(set); + if (value) descriptor.value = how(value); + return descriptor; +}; +exports.augment = augment; + +const entry = (type, value) => [type, value]; +exports.entry = entry; + +const asEntry = transform => value => { + const type = typeof value; + switch (type) { + case OBJECT: + if (value == null) + return entry(NULL, value); + case FUNCTION: + return transform(type, value); + case BOOLEAN: + case NUMBER: + case STRING: + case UNDEFINED: + case BIGINT: + return entry(type, value); + case SYMBOL: { + if (symbols.has(value)) + return entry(type, symbols.get(value)); + } + } + throw new Error(`Unable to handle this ${type} type`); +}; +exports.asEntry = asEntry; + +const symbols = new Map( + ownKeys(Symbol) + .filter(s => typeof Symbol[s] === SYMBOL) + .map(s => [Symbol[s], s]) +); + +const symbol = value => { + for (const [symbol, name] of symbols) { + if (name === value) + return symbol; + } +}; +exports.symbol = symbol; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/index.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/index.js new file mode 100644 index 0000000..535b249 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/index.js @@ -0,0 +1,150 @@ +'use strict'; +/*! (c) Andrea Giammarchi - ISC */ + +const CHANNEL = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./channel.js')); +const waitAsyncFallback = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./fallback.js')); + +// just minifier friendly for Blob Workers' cases +const {Int32Array, Map, SharedArrayBuffer, Uint16Array} = globalThis; + +// common constants / utilities for repeated operations +const {BYTES_PER_ELEMENT: I32_BYTES} = Int32Array; +const {BYTES_PER_ELEMENT: UI16_BYTES} = Uint16Array; + +const {isArray} = Array; +const {notify, wait, waitAsync} = Atomics; +const {fromCharCode} = String; + +// automatically uses sync wait (worker -> main) +// or fallback to async wait (main -> worker) +const waitFor = (isAsync, sb) => isAsync ? + (waitAsync || waitAsyncFallback)(sb, 0) : + (wait(sb, 0), {value: {then: fn => fn()}}); + +// retain buffers to transfer +const buffers = new WeakSet; + +// retain either main threads or workers global context +const context = new WeakMap; + +// used to generate a unique `id` per each worker `postMessage` "transaction" +let uid = 0; + +/** + * Create once a `Proxy` able to orchestrate synchronous `postMessage` out of the box. + * @param {globalThis | Worker} self the context in which code should run + * @param {{parse: (serialized: string) => any, stringify: (serializable: any) => string}} [JSON] an optional `JSON` like interface to `parse` or `stringify` content + * @returns {ProxyHandler | ProxyHandler} + */ +const coincident = (self, {parse, stringify} = JSON) => { + // create a Proxy once for the given context (globalThis or Worker instance) + if (!context.has(self)) { + // ensure the CHANNEL and data are posted correctly + const post = (transfer, ...args) => self.postMessage({[CHANNEL]: args}, {transfer}); + + context.set(self, new Proxy(new Map, { + // there is very little point in checking prop in proxy for this very specific case + // and I don't want to orchestrate a whole roundtrip neither, as stuff would fail + // regardless if from Worker we access non existent Main callback, and vice-versa. + // This is here mostly to guarantee that if such check is performed, at least the + // get trap goes through and then it's up to developers guarantee they are accessing + // stuff that actually exists elsewhere. + has: (_, action) => typeof action === 'string' && !action.startsWith('_'), + + // worker related: get any utility that should be available on the main thread + get: (_, action) => action === 'then' ? null : ((...args) => { + // transaction id + const id = uid++; + + // first contact: just ask for how big the buffer should be + let sb = new Int32Array(new SharedArrayBuffer(I32_BYTES)); + + // if a transfer list has been passed, drop it from args + let transfer = []; + if (buffers.has(args.at(-1) || transfer)) + buffers.delete(transfer = args.pop()); + + // ask for invoke with arguments and wait for it + post(transfer, id, sb, action, args); + + // helps deciding how to wait for results + const isAsync = self instanceof Worker; + return waitFor(isAsync, sb).value.then(() => { + // commit transaction using the returned / needed buffer length + const length = sb[0]; + + // filter undefined results + if (!length) return; + + // calculate the needed ui16 bytes length to store the result string + const bytes = UI16_BYTES * length; + + // round up to the next amount of bytes divided by 4 to allow i32 operations + sb = new Int32Array(new SharedArrayBuffer(bytes + (bytes % I32_BYTES))); + + // ask for results and wait for it + post([], id, sb); + return waitFor(isAsync, sb).value.then( + // transform the shared buffer into a string and return it parsed + () => parse(fromCharCode(...new Uint16Array(sb.buffer).slice(0, length))) + ); + }); + }), + + // main thread related: react to any utility a worker is asking for + set(actions, action, callback) { + // lazy event listener and logic handling, triggered once by setters actions + if (!actions.size) { + // maps results by `id` as they are asked for + const results = new Map; + // add the event listener once (first defined setter, all others work the same) + self.addEventListener('message', async (event) => { + // grub the very same library CHANNEL; ignore otherwise + const details = event.data?.[CHANNEL]; + if (isArray(details)) { + // if early enough, avoid leaking data to other listeners + event.stopImmediatePropagation(); + const [id, sb, ...rest] = details; + // action available: it must be defined/known on the main thread + if (rest.length) { + const [action, args] = rest; + if (actions.has(action)) { + // await for result either sync or async and serialize it + const result = stringify(await actions.get(action)(...args)); + if (result) { + // store the result for "the very next" event listener call + results.set(id, result); + // communicate the required SharedArrayBuffer length out of the + // resulting serialized string + sb[0] = result.length; + } + } + // unknown action should be notified as missing on the main thread + else { + throw new Error(`Unsupported action: ${action}`); + } + } + // no action means: get results out of the well known `id` + else { + const result = results.get(id); + results.delete(id); + // populate the SaredArrayBuffer with utf-16 chars code + for (let ui16a = new Uint16Array(sb.buffer), i = 0; i < result.length; i++) + ui16a[i] = result.charCodeAt(i); + } + // release te worker waiting either the length or the result + notify(sb, 0); + } + }); + } + // store this action callback allowing the setter in the process + return !!actions.set(action, callback); + } + })); + } + return context.get(self); +}; + +coincident.transfer = (...args) => (buffers.add(args), args); + +module.exports = coincident; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/package.json b/tech-preview/pyscript.core/node_modules/coincident/cjs/package.json new file mode 100644 index 0000000..0292b99 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/package.json @@ -0,0 +1 @@ +{"type":"commonjs"} \ No newline at end of file diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/structured.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/structured.js new file mode 100644 index 0000000..f03292b --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/structured.js @@ -0,0 +1,14 @@ +'use strict'; +const JSON = require('@ungap/structured-clone/json'); +const $coincident = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./index.js')); + +/** + * Create once a `Proxy` able to orchestrate synchronous `postMessage` out of the box. + * @param {globalThis | Worker} self the context in which code should run + * @returns {ProxyHandler | ProxyHandler} + */ +const coincident = self => $coincident(self, JSON); + +coincident.transfer = $coincident.transfer; + +module.exports = coincident; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/uhtml.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/uhtml.js new file mode 100644 index 0000000..f8579e4 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/uhtml.js @@ -0,0 +1,19 @@ +'use strict'; +const $coincident = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./window.js')); +const init = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('uhtml/init')); + +/** + * Create once a `Proxy` able to orchestrate synchronous `postMessage` out of the box. + * In workers, returns a `{proxy, window, isWindowProxy}` namespace to reach main globals synchronously. + * @param {Worker | globalThis} self the context in which code should run + */ +const coincident = (self, ...args) => { + const utilities = $coincident(self, ...args); + if (!utilities.uhtml) + utilities.uhtml = init(utilities.window); + return utilities; +} + +coincident.transfer = $coincident.transfer; + +module.exports = coincident; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/window.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/window.js new file mode 100644 index 0000000..8e8ae5e --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/window.js @@ -0,0 +1,36 @@ +'use strict'; +const CHANNEL = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./channel.js')); +const $coincident = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./index.js')); +const main = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./window/main.js')); +const thread = (m => /* c8 ignore start */ m.__esModule ? m.default : m /* c8 ignore stop */)(require('./window/thread.js')); + +const MAIN = CHANNEL + 'M'; +const THREAD = CHANNEL + 'T'; + +const proxies = new WeakMap; + +/** + * @typedef {object} Coincident + * @property {ProxyHandler} proxy + * @property {ProxyHandler} window + * @property {(value: any) => boolean} isWindowProxy + */ + +/** + * Create once a `Proxy` able to orchestrate synchronous `postMessage` out of the box. + * In workers, returns a `{proxy, window, isWindowProxy}` namespace to reach main globals synchronously. + * @param {Worker | globalThis} self the context in which code should run + * @returns {ProxyHandler | Coincident} + */ +const coincident = (self, ...args) => { + const proxy = $coincident(self, ...args); + if (!proxies.has(proxy)) { + const util = self instanceof Worker ? main : thread; + proxies.set(proxy, util(proxy, MAIN, THREAD)); + } + return proxies.get(proxy); +} + +coincident.transfer = $coincident.transfer; + +module.exports = coincident; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/window/main.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/window/main.js new file mode 100644 index 0000000..512368a --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/window/main.js @@ -0,0 +1,184 @@ +'use strict'; +const { + TypedArray, + defineProperty, + getOwnPropertyDescriptor, + getPrototypeOf, + isExtensible, + ownKeys, + preventExtensions, + set, + setPrototypeOf, + augment, + entry, + asEntry, + symbol +} = require('./utils.js'); + +const { + OBJECT, + FUNCTION, + NUMBER, + STRING, + SYMBOL, + UNDEFINED +} = require('./types.js'); + +const { + APPLY, + CONSTRUCT, + DEFINE_PROPERTY, + DELETE_PROPERTY, + GET, + GET_OWN_PROPERTY_DESCRIPTOR, + GET_PROTOTYPE_OF, + HAS, + IS_EXTENSIBLE, + OWN_KEYS, + PREVENT_EXTENSION, + SET, + SET_PROTOTYPE_OF, + DELETE +} = require('./traps.js'); + +let id = 0; +const ids = new Map; +const values = new Map; +const eventsHandler = new WeakMap; + +// patch once main UI tread +if (globalThis.window === globalThis) { + const {addEventListener} = EventTarget.prototype; + // this should never be on the way as it's extremely light and fast + // but it's necessary to allow "preventDefault" or other event invokes at distance + defineProperty(EventTarget.prototype, 'addEventListener', { + value(type, listener, ...options) { + if (options.at(0)?.invoke) { + if (!eventsHandler.has(this)) + eventsHandler.set(this, new Map); + eventsHandler.get(this).set(type, [].concat(options[0].invoke)); + delete options[0].invoke; + } + return addEventListener.call(this, type, listener, ...options); + } + }); +} + +const handleEvent = event => { + const {currentTarget, target, type} = event; + for (const method of eventsHandler.get(currentTarget || target)?.get(type) || []) + event[method](); +}; + +const result = asEntry((type, value) => { + if (!ids.has(value)) { + let sid; + // a bit apocalyptic scenario but if this main runs forever + // and the id does a whole int32 roundtrip we might have still + // some reference danglign around + while (values.has(sid = id++)); + ids.set(value, sid); + values.set(sid, value); + } + return entry(type, ids.get(value)); +}); + +module.exports = (thread, MAIN, THREAD) => { + const {[THREAD]: __thread__} = thread; + + const registry = new FinalizationRegistry(id => { + __thread__(DELETE, entry(STRING, id)); + }); + + const target = ([type, value]) => { + switch (type) { + case OBJECT: + if (value == null) + return globalThis; + if (typeof value === NUMBER) + return values.get(value); + if (!(value instanceof TypedArray)) { + for (const key in value) + value[key] = target(value[key]); + } + return value; + case FUNCTION: + if (typeof value === STRING) { + if (!values.has(value)) { + const cb = function (...args) { + if (args.at(0) instanceof Event) handleEvent(...args); + return __thread__( + APPLY, + entry(FUNCTION, value), + result(this), + args.map(result) + ); + }; + const ref = new WeakRef(cb); + values.set(value, ref); + registry.register(cb, value, ref); + } + return values.get(value).deref(); + } + return values.get(value); + case SYMBOL: + return symbol(value); + } + return value; + }; + + const trapsHandler = { + [APPLY]: (target, thisArg, args) => result(target.apply(thisArg, args)), + [CONSTRUCT]: (target, args) => result(new target(...args)), + [DEFINE_PROPERTY]: (target, name, descriptor) => result(defineProperty(target, name, descriptor)), + [DELETE_PROPERTY]: (target, name) => result(delete target[name]), + [GET_PROTOTYPE_OF]: target => result(getPrototypeOf(target)), + [GET]: (target, name) => result(target[name]), + [GET_OWN_PROPERTY_DESCRIPTOR]: (target, name) => { + const descriptor = getOwnPropertyDescriptor(target, name); + return descriptor ? entry(OBJECT, augment(descriptor, result)) : entry(UNDEFINED, descriptor); + }, + [HAS]: (target, name) => result(name in target), + [IS_EXTENSIBLE]: target => result(isExtensible(target)), + [OWN_KEYS]: target => entry(OBJECT, ownKeys(target).map(result)), + [PREVENT_EXTENSION]: target => result(preventExtensions(target)), + [SET]: (target, name, value) => result(set(target, name, value)), + [SET_PROTOTYPE_OF]: (target, proto) => result(setPrototypeOf(target, proto)), + [DELETE](id) { + ids.delete(values.get(id)); + values.delete(id); + } + }; + + thread[MAIN] = (trap, entry, ...args) => { + switch (trap) { + case APPLY: + args[0] = target(args[0]); + args[1] = args[1].map(target); + break; + case CONSTRUCT: + args[0] = args[0].map(target); + break; + case DEFINE_PROPERTY: { + const [name, descriptor] = args; + args[0] = target(name); + const {get, set, value} = descriptor; + if (get) descriptor.get = target(get); + if (set) descriptor.set = target(set); + if (value) descriptor.value = target(value); + break; + } + default: + args = args.map(target); + break; + } + + return trapsHandler[trap](target(entry), ...args); + }; + + return { + proxy: thread, + window: globalThis, + isWindowProxy: () => false + }; +}; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/window/thread.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/window/thread.js new file mode 100644 index 0000000..0d66293 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/window/thread.js @@ -0,0 +1,178 @@ +'use strict'; +const { + TypedArray, + augment, + defineProperty, + entry, + asEntry, + symbol +} = require('./utils.js'); + +const { + OBJECT, + FUNCTION, + NUMBER, + STRING, + SYMBOL +} = require('./types.js'); + +const { + APPLY, + CONSTRUCT, + DEFINE_PROPERTY, + DELETE_PROPERTY, + GET, + GET_OWN_PROPERTY_DESCRIPTOR, + GET_PROTOTYPE_OF, + HAS, + IS_EXTENSIBLE, + OWN_KEYS, + PREVENT_EXTENSION, + SET, + SET_PROTOTYPE_OF, + DELETE +} = require('./traps.js'); + + +let id = 0; +const ids = new Map; +const values = new Map; + +const __proxied__ = Symbol(); + +const bound = target => typeof target === FUNCTION ? target() : target; + +const isWindowProxy = value => typeof value === OBJECT && !!value && __proxied__ in value; + +const isArray = 'isArray'; +const localArray = Array[isArray]; + +const argument = asEntry( + (type, value) => { + if (__proxied__ in value) + return bound(value[__proxied__]); + if (type === FUNCTION) { + if (!values.has(value)) { + let sid; + // a bit apocalyptic scenario but if this thread runs forever + // and the id does a whole int32 roundtrip we might have still + // some reference dangling around + while (values.has(sid = String(id++))); + ids.set(value, sid); + values.set(sid, value); + } + return entry(type, ids.get(value)); + } + if (!(value instanceof TypedArray)) { + for(const key in value) + value[key] = argument(value[key]); + } + return entry(type, value); + } +); + +module.exports = (main, MAIN, THREAD) => { + const { [MAIN]: __main__ } = main; + + const proxies = new Map; + + const registry = new FinalizationRegistry(id => { + proxies.delete(id); + __main__(DELETE, argument(id)); + }); + + const register = (entry) => { + const [type, value] = entry; + if (!proxies.has(value)) { + const target = type === FUNCTION ? Bound.bind(entry) : entry; + const proxy = new Proxy(target, proxyHandler); + const ref = new WeakRef(proxy); + proxies.set(value, ref); + registry.register(proxy, value, ref); + } + return proxies.get(value).deref(); + }; + + const fromEntry = entry => { + const [type, value] = entry; + switch (type) { + case OBJECT: + return typeof value === NUMBER ? register(entry) : value; + case FUNCTION: + return typeof value === STRING ? values.get(value) : register(entry); + case SYMBOL: + return symbol(value); + } + return value; + }; + + const result = (TRAP, target, ...args) => fromEntry(__main__(TRAP, bound(target), ...args)); + + const proxyHandler = { + [APPLY]: (target, thisArg, args) => result(APPLY, target, argument(thisArg), args.map(argument)), + [CONSTRUCT]: (target, args) => result(CONSTRUCT, target, args.map(argument)), + [DEFINE_PROPERTY]: (target, name, descriptor) => { + const { get, set, value } = descriptor; + if (typeof get === FUNCTION) descriptor.get = argument(get); + if (typeof set === FUNCTION) descriptor.set = argument(set); + if (typeof value === FUNCTION) descriptor.value = argument(value); + return result(DEFINE_PROPERTY, target, argument(name), descriptor); + }, + [DELETE_PROPERTY]: (target, name) => result(DELETE_PROPERTY, target, argument(name)), + [GET_PROTOTYPE_OF]: target => result(GET_PROTOTYPE_OF, target), + [GET]: (target, name) => name === __proxied__ ? target : result(GET, target, argument(name)), + [GET_OWN_PROPERTY_DESCRIPTOR]: (target, name) => { + const descriptor = result(GET_OWN_PROPERTY_DESCRIPTOR, target, argument(name)); + return descriptor && augment(descriptor, fromEntry); + }, + [HAS]: (target, name) => name === __proxied__ || result(HAS, target, argument(name)), + [IS_EXTENSIBLE]: target => result(IS_EXTENSIBLE, target), + [OWN_KEYS]: target => result(OWN_KEYS, target).map(fromEntry), + [PREVENT_EXTENSION]: target => result(PREVENT_EXTENSION, target), + [SET]: (target, name, value) => result(SET, target, argument(name), argument(value)), + [SET_PROTOTYPE_OF]: (target, proto) => result(SET_PROTOTYPE_OF, target, argument(proto)), + }; + + main[THREAD] = (trap, entry, ctx, args) => { + switch (trap) { + case APPLY: + return fromEntry(entry).apply(fromEntry(ctx), args.map(fromEntry)); + case DELETE: { + const id = fromEntry(entry); + ids.delete(values.get(id)); + values.delete(id); + } + } + }; + + const window = new Proxy([OBJECT, null], proxyHandler); + + // this is needed to avoid confusion when new Proxy([type, value]) + // passes through `isArray` check, as that would return always true + // by specs and there's no Proxy trap to avoid it. + const remoteArray = window.Array[isArray]; + defineProperty(Array, isArray, { + value: ref => isWindowProxy(ref) ? remoteArray(ref) : localArray(ref) + }); + + return { + window, + isWindowProxy, + proxy: main, + // TODO: remove this stuff ASAP + get global() { + console.warn('Deprecated: please access `window` field instead'); + return this.window; + }, + get isGlobal() { + return function (value) { + console.warn('Deprecated: please access `isWindowProxy` field instead'); + return this.isWindowProxy(value); + }.bind(this); + } + }; +}; + +function Bound() { + return this; +} diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/window/traps.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/window/traps.js new file mode 100644 index 0000000..cf91b42 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/window/traps.js @@ -0,0 +1,29 @@ +'use strict'; +const APPLY = 'apply'; +exports.APPLY = APPLY; +const CONSTRUCT = 'construct'; +exports.CONSTRUCT = CONSTRUCT; +const DEFINE_PROPERTY = 'defineProperty'; +exports.DEFINE_PROPERTY = DEFINE_PROPERTY; +const DELETE_PROPERTY = 'deleteProperty'; +exports.DELETE_PROPERTY = DELETE_PROPERTY; +const GET = 'get'; +exports.GET = GET; +const GET_OWN_PROPERTY_DESCRIPTOR = 'getOwnPropertyDescriptor'; +exports.GET_OWN_PROPERTY_DESCRIPTOR = GET_OWN_PROPERTY_DESCRIPTOR; +const GET_PROTOTYPE_OF = 'getPrototypeOf'; +exports.GET_PROTOTYPE_OF = GET_PROTOTYPE_OF; +const HAS = 'has'; +exports.HAS = HAS; +const IS_EXTENSIBLE = 'isExtensible'; +exports.IS_EXTENSIBLE = IS_EXTENSIBLE; +const OWN_KEYS = 'ownKeys'; +exports.OWN_KEYS = OWN_KEYS; +const PREVENT_EXTENSION = 'preventExtensions'; +exports.PREVENT_EXTENSION = PREVENT_EXTENSION; +const SET = 'set'; +exports.SET = SET; +const SET_PROTOTYPE_OF = 'setPrototypeOf'; +exports.SET_PROTOTYPE_OF = SET_PROTOTYPE_OF; +const DELETE = 'delete'; +exports.DELETE = DELETE; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/window/types.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/window/types.js new file mode 100644 index 0000000..3a3043b --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/window/types.js @@ -0,0 +1,19 @@ +'use strict'; +const OBJECT = 'object'; +exports.OBJECT = OBJECT; +const FUNCTION = 'function'; +exports.FUNCTION = FUNCTION; +const BOOLEAN = 'boolean'; +exports.BOOLEAN = BOOLEAN; +const NUMBER = 'number'; +exports.NUMBER = NUMBER; +const STRING = 'string'; +exports.STRING = STRING; +const UNDEFINED = 'undefined'; +exports.UNDEFINED = UNDEFINED; +const BIGINT = 'bigint'; +exports.BIGINT = BIGINT; +const SYMBOL = 'symbol'; +exports.SYMBOL = SYMBOL; +const NULL = 'null'; +exports.NULL = NULL; diff --git a/tech-preview/pyscript.core/node_modules/coincident/cjs/window/utils.js b/tech-preview/pyscript.core/node_modules/coincident/cjs/window/utils.js new file mode 100644 index 0000000..490ef68 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/cjs/window/utils.js @@ -0,0 +1,85 @@ +'use strict'; + +const { + OBJECT, + FUNCTION, + BOOLEAN, + NUMBER, + STRING, + UNDEFINED, + BIGINT, + SYMBOL, + NULL +} = require('./types.js'); + +const { + defineProperty, + getOwnPropertyDescriptor, + getPrototypeOf, + isExtensible, + ownKeys, + preventExtensions, + set, + setPrototypeOf +} = Reflect; + +const TypedArray = getPrototypeOf(Int8Array); +exports.TypedArray = TypedArray; + +exports.defineProperty = defineProperty; +exports.getOwnPropertyDescriptor = getOwnPropertyDescriptor; +exports.getPrototypeOf = getPrototypeOf; +exports.isExtensible = isExtensible; +exports.ownKeys = ownKeys; +exports.preventExtensions = preventExtensions; +exports.set = set; +exports.setPrototypeOf = setPrototypeOf; + +const augment = (descriptor, how) => { + const {get, set, value} = descriptor; + if (get) descriptor.get = how(get); + if (set) descriptor.set = how(set); + if (value) descriptor.value = how(value); + return descriptor; +}; +exports.augment = augment; + +const entry = (type, value) => [type, value]; +exports.entry = entry; + +const asEntry = transform => value => { + const type = typeof value; + switch (type) { + case OBJECT: + if (value == null) + return entry(NULL, value); + case FUNCTION: + return transform(type, value); + case BOOLEAN: + case NUMBER: + case STRING: + case UNDEFINED: + case BIGINT: + return entry(type, value); + case SYMBOL: { + if (symbols.has(value)) + return entry(type, symbols.get(value)); + } + } + throw new Error(`Unable to handle this ${type} type`); +}; +exports.asEntry = asEntry; + +const symbols = new Map( + ownKeys(Symbol) + .filter(s => typeof Symbol[s] === SYMBOL) + .map(s => [Symbol[s], s]) +); + +const symbol = value => { + for (const [symbol, name] of symbols) { + if (name === value) + return symbol; + } +}; +exports.symbol = symbol; diff --git a/tech-preview/pyscript.core/node_modules/coincident/es.js b/tech-preview/pyscript.core/node_modules/coincident/es.js new file mode 100644 index 0000000..b0c16af --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/es.js @@ -0,0 +1,2 @@ +var e="2f6fe6d4-8ba8-424a-83c5-8fadca1ea103",t=e=>({value:new Promise((t=>{let a=new Worker("data:application/javascript,"+encodeURIComponent("onmessage=({data:b})=>(Atomics.wait(b,0),postMessage(0))"));a.onmessage=t,a.postMessage(e)}))}) +/*! (c) Andrea Giammarchi - ISC */;const{Int32Array:a,Map:n,SharedArrayBuffer:s,Uint16Array:r}=globalThis,{BYTES_PER_ELEMENT:o}=a,{BYTES_PER_ELEMENT:i}=r,{isArray:c}=Array,{notify:f,wait:l,waitAsync:w}=Atomics,{fromCharCode:d}=String,g=(e,a)=>e?(w||t)(a,0):(l(a,0),{value:{then:e=>e()}}),p=new WeakSet,h=new WeakMap;let u=0;const E=(t,{parse:l,stringify:w}=JSON)=>{if(!h.has(t)){const E=(a,...n)=>t.postMessage({[e]:n},{transfer:a});h.set(t,new Proxy(new n,{has:(e,t)=>"string"==typeof t&&!t.startsWith("_"),get:(e,n)=>"then"===n?null:(...e)=>{const c=u++;let f=new a(new s(o)),w=[];p.has(e.at(-1)||w)&&p.delete(w=e.pop()),E(w,c,f,n,e);const h=t instanceof Worker;return g(h,f).value.then((()=>{const e=f[0];if(!e)return;const t=i*e;return f=new a(new s(t+t%o)),E([],c,f),g(h,f).value.then((()=>l(d(...new r(f.buffer).slice(0,e)))))}))},set(a,s,o){if(!a.size){const s=new n;t.addEventListener("message",(async t=>{const n=t.data?.[e];if(c(n)){t.stopImmediatePropagation();const[e,o,...i]=n;if(i.length){const[t,n]=i;if(!a.has(t))throw new Error(`Unsupported action: ${t}`);{const r=w(await a.get(t)(...n));r&&(s.set(e,r),o[0]=r.length)}}else{const t=s.get(e);s.delete(e);for(let e=new r(o.buffer),a=0;a(p.add(e),e);export{E as default}; diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/channel.js b/tech-preview/pyscript.core/node_modules/coincident/esm/channel.js new file mode 100644 index 0000000..e020cff --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/channel.js @@ -0,0 +1 @@ +export default '2f6fe6d4-8ba8-424a-83c5-8fadca1ea103'; diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/fallback.js b/tech-preview/pyscript.core/node_modules/coincident/esm/fallback.js new file mode 100644 index 0000000..a8d736d --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/fallback.js @@ -0,0 +1,9 @@ +export default buffer => ({ + value: new Promise(onmessage => { + let w = new Worker('data:application/javascript,' + encodeURIComponent( + 'onmessage=({data:b})=>(Atomics.wait(b,0),postMessage(0))' + )); + w.onmessage = onmessage; + w.postMessage(buffer); + }) +}); diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/index.js b/tech-preview/pyscript.core/node_modules/coincident/esm/index.js new file mode 100644 index 0000000..d4f963e --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/index.js @@ -0,0 +1,149 @@ +/*! (c) Andrea Giammarchi - ISC */ + +import CHANNEL from './channel.js'; +import waitAsyncFallback from './fallback.js'; + +// just minifier friendly for Blob Workers' cases +const {Int32Array, Map, SharedArrayBuffer, Uint16Array} = globalThis; + +// common constants / utilities for repeated operations +const {BYTES_PER_ELEMENT: I32_BYTES} = Int32Array; +const {BYTES_PER_ELEMENT: UI16_BYTES} = Uint16Array; + +const {isArray} = Array; +const {notify, wait, waitAsync} = Atomics; +const {fromCharCode} = String; + +// automatically uses sync wait (worker -> main) +// or fallback to async wait (main -> worker) +const waitFor = (isAsync, sb) => isAsync ? + (waitAsync || waitAsyncFallback)(sb, 0) : + (wait(sb, 0), {value: {then: fn => fn()}}); + +// retain buffers to transfer +const buffers = new WeakSet; + +// retain either main threads or workers global context +const context = new WeakMap; + +// used to generate a unique `id` per each worker `postMessage` "transaction" +let uid = 0; + +/** + * Create once a `Proxy` able to orchestrate synchronous `postMessage` out of the box. + * @param {globalThis | Worker} self the context in which code should run + * @param {{parse: (serialized: string) => any, stringify: (serializable: any) => string}} [JSON] an optional `JSON` like interface to `parse` or `stringify` content + * @returns {ProxyHandler | ProxyHandler} + */ +const coincident = (self, {parse, stringify} = JSON) => { + // create a Proxy once for the given context (globalThis or Worker instance) + if (!context.has(self)) { + // ensure the CHANNEL and data are posted correctly + const post = (transfer, ...args) => self.postMessage({[CHANNEL]: args}, {transfer}); + + context.set(self, new Proxy(new Map, { + // there is very little point in checking prop in proxy for this very specific case + // and I don't want to orchestrate a whole roundtrip neither, as stuff would fail + // regardless if from Worker we access non existent Main callback, and vice-versa. + // This is here mostly to guarantee that if such check is performed, at least the + // get trap goes through and then it's up to developers guarantee they are accessing + // stuff that actually exists elsewhere. + has: (_, action) => typeof action === 'string' && !action.startsWith('_'), + + // worker related: get any utility that should be available on the main thread + get: (_, action) => action === 'then' ? null : ((...args) => { + // transaction id + const id = uid++; + + // first contact: just ask for how big the buffer should be + let sb = new Int32Array(new SharedArrayBuffer(I32_BYTES)); + + // if a transfer list has been passed, drop it from args + let transfer = []; + if (buffers.has(args.at(-1) || transfer)) + buffers.delete(transfer = args.pop()); + + // ask for invoke with arguments and wait for it + post(transfer, id, sb, action, args); + + // helps deciding how to wait for results + const isAsync = self instanceof Worker; + return waitFor(isAsync, sb).value.then(() => { + // commit transaction using the returned / needed buffer length + const length = sb[0]; + + // filter undefined results + if (!length) return; + + // calculate the needed ui16 bytes length to store the result string + const bytes = UI16_BYTES * length; + + // round up to the next amount of bytes divided by 4 to allow i32 operations + sb = new Int32Array(new SharedArrayBuffer(bytes + (bytes % I32_BYTES))); + + // ask for results and wait for it + post([], id, sb); + return waitFor(isAsync, sb).value.then( + // transform the shared buffer into a string and return it parsed + () => parse(fromCharCode(...new Uint16Array(sb.buffer).slice(0, length))) + ); + }); + }), + + // main thread related: react to any utility a worker is asking for + set(actions, action, callback) { + // lazy event listener and logic handling, triggered once by setters actions + if (!actions.size) { + // maps results by `id` as they are asked for + const results = new Map; + // add the event listener once (first defined setter, all others work the same) + self.addEventListener('message', async (event) => { + // grub the very same library CHANNEL; ignore otherwise + const details = event.data?.[CHANNEL]; + if (isArray(details)) { + // if early enough, avoid leaking data to other listeners + event.stopImmediatePropagation(); + const [id, sb, ...rest] = details; + // action available: it must be defined/known on the main thread + if (rest.length) { + const [action, args] = rest; + if (actions.has(action)) { + // await for result either sync or async and serialize it + const result = stringify(await actions.get(action)(...args)); + if (result) { + // store the result for "the very next" event listener call + results.set(id, result); + // communicate the required SharedArrayBuffer length out of the + // resulting serialized string + sb[0] = result.length; + } + } + // unknown action should be notified as missing on the main thread + else { + throw new Error(`Unsupported action: ${action}`); + } + } + // no action means: get results out of the well known `id` + else { + const result = results.get(id); + results.delete(id); + // populate the SaredArrayBuffer with utf-16 chars code + for (let ui16a = new Uint16Array(sb.buffer), i = 0; i < result.length; i++) + ui16a[i] = result.charCodeAt(i); + } + // release te worker waiting either the length or the result + notify(sb, 0); + } + }); + } + // store this action callback allowing the setter in the process + return !!actions.set(action, callback); + } + })); + } + return context.get(self); +}; + +coincident.transfer = (...args) => (buffers.add(args), args); + +export default coincident; diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/structured.js b/tech-preview/pyscript.core/node_modules/coincident/esm/structured.js new file mode 100644 index 0000000..e11be16 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/structured.js @@ -0,0 +1,13 @@ +import * as JSON from '@ungap/structured-clone/json'; +import $coincident from './index.js'; + +/** + * Create once a `Proxy` able to orchestrate synchronous `postMessage` out of the box. + * @param {globalThis | Worker} self the context in which code should run + * @returns {ProxyHandler | ProxyHandler} + */ +const coincident = self => $coincident(self, JSON); + +coincident.transfer = $coincident.transfer; + +export default coincident; diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/uhtml.js b/tech-preview/pyscript.core/node_modules/coincident/esm/uhtml.js new file mode 100644 index 0000000..836e42d --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/uhtml.js @@ -0,0 +1,18 @@ +import $coincident from './window.js'; +import init from 'uhtml/init'; + +/** + * Create once a `Proxy` able to orchestrate synchronous `postMessage` out of the box. + * In workers, returns a `{proxy, window, isWindowProxy}` namespace to reach main globals synchronously. + * @param {Worker | globalThis} self the context in which code should run + */ +const coincident = (self, ...args) => { + const utilities = $coincident(self, ...args); + if (!utilities.uhtml) + utilities.uhtml = init(utilities.window); + return utilities; +} + +coincident.transfer = $coincident.transfer; + +export default coincident; diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/window.js b/tech-preview/pyscript.core/node_modules/coincident/esm/window.js new file mode 100644 index 0000000..fa7d94a --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/window.js @@ -0,0 +1,35 @@ +import CHANNEL from './channel.js'; +import $coincident from './index.js'; +import main from './window/main.js'; +import thread from './window/thread.js'; + +const MAIN = CHANNEL + 'M'; +const THREAD = CHANNEL + 'T'; + +const proxies = new WeakMap; + +/** + * @typedef {object} Coincident + * @property {ProxyHandler} proxy + * @property {ProxyHandler} window + * @property {(value: any) => boolean} isWindowProxy + */ + +/** + * Create once a `Proxy` able to orchestrate synchronous `postMessage` out of the box. + * In workers, returns a `{proxy, window, isWindowProxy}` namespace to reach main globals synchronously. + * @param {Worker | globalThis} self the context in which code should run + * @returns {ProxyHandler | Coincident} + */ +const coincident = (self, ...args) => { + const proxy = $coincident(self, ...args); + if (!proxies.has(proxy)) { + const util = self instanceof Worker ? main : thread; + proxies.set(proxy, util(proxy, MAIN, THREAD)); + } + return proxies.get(proxy); +} + +coincident.transfer = $coincident.transfer; + +export default coincident; diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/window/main.js b/tech-preview/pyscript.core/node_modules/coincident/esm/window/main.js new file mode 100644 index 0000000..2818247 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/window/main.js @@ -0,0 +1,184 @@ +import { + TypedArray, + defineProperty, + getOwnPropertyDescriptor, + getPrototypeOf, + isExtensible, + ownKeys, + preventExtensions, + set, + setPrototypeOf, + + augment, + entry, + asEntry, + symbol +} from './utils.js'; + +import { + OBJECT, + FUNCTION, + NUMBER, + STRING, + SYMBOL, + UNDEFINED +} from './types.js'; + +import { + APPLY, + CONSTRUCT, + DEFINE_PROPERTY, + DELETE_PROPERTY, + GET, + GET_OWN_PROPERTY_DESCRIPTOR, + GET_PROTOTYPE_OF, + HAS, + IS_EXTENSIBLE, + OWN_KEYS, + PREVENT_EXTENSION, + SET, + SET_PROTOTYPE_OF, + DELETE +} from './traps.js'; + +let id = 0; +const ids = new Map; +const values = new Map; +const eventsHandler = new WeakMap; + +// patch once main UI tread +if (globalThis.window === globalThis) { + const {addEventListener} = EventTarget.prototype; + // this should never be on the way as it's extremely light and fast + // but it's necessary to allow "preventDefault" or other event invokes at distance + defineProperty(EventTarget.prototype, 'addEventListener', { + value(type, listener, ...options) { + if (options.at(0)?.invoke) { + if (!eventsHandler.has(this)) + eventsHandler.set(this, new Map); + eventsHandler.get(this).set(type, [].concat(options[0].invoke)); + delete options[0].invoke; + } + return addEventListener.call(this, type, listener, ...options); + } + }); +} + +const handleEvent = event => { + const {currentTarget, target, type} = event; + for (const method of eventsHandler.get(currentTarget || target)?.get(type) || []) + event[method](); +}; + +const result = asEntry((type, value) => { + if (!ids.has(value)) { + let sid; + // a bit apocalyptic scenario but if this main runs forever + // and the id does a whole int32 roundtrip we might have still + // some reference danglign around + while (values.has(sid = id++)); + ids.set(value, sid); + values.set(sid, value); + } + return entry(type, ids.get(value)); +}); + +export default (thread, MAIN, THREAD) => { + const {[THREAD]: __thread__} = thread; + + const registry = new FinalizationRegistry(id => { + __thread__(DELETE, entry(STRING, id)); + }); + + const target = ([type, value]) => { + switch (type) { + case OBJECT: + if (value == null) + return globalThis; + if (typeof value === NUMBER) + return values.get(value); + if (!(value instanceof TypedArray)) { + for (const key in value) + value[key] = target(value[key]); + } + return value; + case FUNCTION: + if (typeof value === STRING) { + if (!values.has(value)) { + const cb = function (...args) { + if (args.at(0) instanceof Event) handleEvent(...args); + return __thread__( + APPLY, + entry(FUNCTION, value), + result(this), + args.map(result) + ); + }; + const ref = new WeakRef(cb); + values.set(value, ref); + registry.register(cb, value, ref); + } + return values.get(value).deref(); + } + return values.get(value); + case SYMBOL: + return symbol(value); + } + return value; + }; + + const trapsHandler = { + [APPLY]: (target, thisArg, args) => result(target.apply(thisArg, args)), + [CONSTRUCT]: (target, args) => result(new target(...args)), + [DEFINE_PROPERTY]: (target, name, descriptor) => result(defineProperty(target, name, descriptor)), + [DELETE_PROPERTY]: (target, name) => result(delete target[name]), + [GET_PROTOTYPE_OF]: target => result(getPrototypeOf(target)), + [GET]: (target, name) => result(target[name]), + [GET_OWN_PROPERTY_DESCRIPTOR]: (target, name) => { + const descriptor = getOwnPropertyDescriptor(target, name); + return descriptor ? entry(OBJECT, augment(descriptor, result)) : entry(UNDEFINED, descriptor); + }, + [HAS]: (target, name) => result(name in target), + [IS_EXTENSIBLE]: target => result(isExtensible(target)), + [OWN_KEYS]: target => entry(OBJECT, ownKeys(target).map(result)), + [PREVENT_EXTENSION]: target => result(preventExtensions(target)), + [SET]: (target, name, value) => result(set(target, name, value)), + [SET_PROTOTYPE_OF]: (target, proto) => result(setPrototypeOf(target, proto)), + [DELETE](id) { + ids.delete(values.get(id)); + values.delete(id); + } + }; + + thread[MAIN] = (trap, entry, ...args) => { + switch (trap) { + case APPLY: + args[0] = target(args[0]); + args[1] = args[1].map(target); + break; + case CONSTRUCT: + args[0] = args[0].map(target); + break; + case DEFINE_PROPERTY: { + const [name, descriptor] = args; + args[0] = target(name); + const {get, set, value} = descriptor; + if (get) descriptor.get = target(get); + if (set) descriptor.set = target(set); + if (value) descriptor.value = target(value); + break; + } + default: + args = args.map(target); + break; + } + + return trapsHandler[trap](target(entry), ...args); + }; + + return { + proxy: thread, + window: globalThis, + isWindowProxy: () => false + }; +}; diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/window/thread.js b/tech-preview/pyscript.core/node_modules/coincident/esm/window/thread.js new file mode 100644 index 0000000..2cd7d11 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/window/thread.js @@ -0,0 +1,177 @@ +import { + TypedArray, + augment, + defineProperty, + entry, + asEntry, + symbol +} from './utils.js'; + +import { + OBJECT, + FUNCTION, + NUMBER, + STRING, + SYMBOL +} from './types.js'; + +import { + APPLY, + CONSTRUCT, + DEFINE_PROPERTY, + DELETE_PROPERTY, + GET, + GET_OWN_PROPERTY_DESCRIPTOR, + GET_PROTOTYPE_OF, + HAS, + IS_EXTENSIBLE, + OWN_KEYS, + PREVENT_EXTENSION, + SET, + SET_PROTOTYPE_OF, + DELETE +} from './traps.js'; + + +let id = 0; +const ids = new Map; +const values = new Map; + +const __proxied__ = Symbol(); + +const bound = target => typeof target === FUNCTION ? target() : target; + +const isWindowProxy = value => typeof value === OBJECT && !!value && __proxied__ in value; + +const isArray = 'isArray'; +const localArray = Array[isArray]; + +const argument = asEntry( + (type, value) => { + if (__proxied__ in value) + return bound(value[__proxied__]); + if (type === FUNCTION) { + if (!values.has(value)) { + let sid; + // a bit apocalyptic scenario but if this thread runs forever + // and the id does a whole int32 roundtrip we might have still + // some reference dangling around + while (values.has(sid = String(id++))); + ids.set(value, sid); + values.set(sid, value); + } + return entry(type, ids.get(value)); + } + if (!(value instanceof TypedArray)) { + for(const key in value) + value[key] = argument(value[key]); + } + return entry(type, value); + } +); + +export default (main, MAIN, THREAD) => { + const { [MAIN]: __main__ } = main; + + const proxies = new Map; + + const registry = new FinalizationRegistry(id => { + proxies.delete(id); + __main__(DELETE, argument(id)); + }); + + const register = (entry) => { + const [type, value] = entry; + if (!proxies.has(value)) { + const target = type === FUNCTION ? Bound.bind(entry) : entry; + const proxy = new Proxy(target, proxyHandler); + const ref = new WeakRef(proxy); + proxies.set(value, ref); + registry.register(proxy, value, ref); + } + return proxies.get(value).deref(); + }; + + const fromEntry = entry => { + const [type, value] = entry; + switch (type) { + case OBJECT: + return typeof value === NUMBER ? register(entry) : value; + case FUNCTION: + return typeof value === STRING ? values.get(value) : register(entry); + case SYMBOL: + return symbol(value); + } + return value; + }; + + const result = (TRAP, target, ...args) => fromEntry(__main__(TRAP, bound(target), ...args)); + + const proxyHandler = { + [APPLY]: (target, thisArg, args) => result(APPLY, target, argument(thisArg), args.map(argument)), + [CONSTRUCT]: (target, args) => result(CONSTRUCT, target, args.map(argument)), + [DEFINE_PROPERTY]: (target, name, descriptor) => { + const { get, set, value } = descriptor; + if (typeof get === FUNCTION) descriptor.get = argument(get); + if (typeof set === FUNCTION) descriptor.set = argument(set); + if (typeof value === FUNCTION) descriptor.value = argument(value); + return result(DEFINE_PROPERTY, target, argument(name), descriptor); + }, + [DELETE_PROPERTY]: (target, name) => result(DELETE_PROPERTY, target, argument(name)), + [GET_PROTOTYPE_OF]: target => result(GET_PROTOTYPE_OF, target), + [GET]: (target, name) => name === __proxied__ ? target : result(GET, target, argument(name)), + [GET_OWN_PROPERTY_DESCRIPTOR]: (target, name) => { + const descriptor = result(GET_OWN_PROPERTY_DESCRIPTOR, target, argument(name)); + return descriptor && augment(descriptor, fromEntry); + }, + [HAS]: (target, name) => name === __proxied__ || result(HAS, target, argument(name)), + [IS_EXTENSIBLE]: target => result(IS_EXTENSIBLE, target), + [OWN_KEYS]: target => result(OWN_KEYS, target).map(fromEntry), + [PREVENT_EXTENSION]: target => result(PREVENT_EXTENSION, target), + [SET]: (target, name, value) => result(SET, target, argument(name), argument(value)), + [SET_PROTOTYPE_OF]: (target, proto) => result(SET_PROTOTYPE_OF, target, argument(proto)), + }; + + main[THREAD] = (trap, entry, ctx, args) => { + switch (trap) { + case APPLY: + return fromEntry(entry).apply(fromEntry(ctx), args.map(fromEntry)); + case DELETE: { + const id = fromEntry(entry); + ids.delete(values.get(id)); + values.delete(id); + } + } + }; + + const window = new Proxy([OBJECT, null], proxyHandler); + + // this is needed to avoid confusion when new Proxy([type, value]) + // passes through `isArray` check, as that would return always true + // by specs and there's no Proxy trap to avoid it. + const remoteArray = window.Array[isArray]; + defineProperty(Array, isArray, { + value: ref => isWindowProxy(ref) ? remoteArray(ref) : localArray(ref) + }); + + return { + window, + isWindowProxy, + proxy: main, + // TODO: remove this stuff ASAP + get global() { + console.warn('Deprecated: please access `window` field instead'); + return this.window; + }, + get isGlobal() { + return function (value) { + console.warn('Deprecated: please access `isWindowProxy` field instead'); + return this.isWindowProxy(value); + }.bind(this); + } + }; +}; + +function Bound() { + return this; +} diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/window/traps.js b/tech-preview/pyscript.core/node_modules/coincident/esm/window/traps.js new file mode 100644 index 0000000..69e0032 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/window/traps.js @@ -0,0 +1,14 @@ +export const APPLY = 'apply'; +export const CONSTRUCT = 'construct'; +export const DEFINE_PROPERTY = 'defineProperty'; +export const DELETE_PROPERTY = 'deleteProperty'; +export const GET = 'get'; +export const GET_OWN_PROPERTY_DESCRIPTOR = 'getOwnPropertyDescriptor'; +export const GET_PROTOTYPE_OF = 'getPrototypeOf'; +export const HAS = 'has'; +export const IS_EXTENSIBLE = 'isExtensible'; +export const OWN_KEYS = 'ownKeys'; +export const PREVENT_EXTENSION = 'preventExtensions'; +export const SET = 'set'; +export const SET_PROTOTYPE_OF = 'setPrototypeOf'; +export const DELETE = 'delete'; diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/window/types.js b/tech-preview/pyscript.core/node_modules/coincident/esm/window/types.js new file mode 100644 index 0000000..16a197e --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/window/types.js @@ -0,0 +1,9 @@ +export const OBJECT = 'object'; +export const FUNCTION = 'function'; +export const BOOLEAN = 'boolean'; +export const NUMBER = 'number'; +export const STRING = 'string'; +export const UNDEFINED = 'undefined'; +export const BIGINT = 'bigint'; +export const SYMBOL = 'symbol'; +export const NULL = 'null'; diff --git a/tech-preview/pyscript.core/node_modules/coincident/esm/window/utils.js b/tech-preview/pyscript.core/node_modules/coincident/esm/window/utils.js new file mode 100644 index 0000000..19bc3d5 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/esm/window/utils.js @@ -0,0 +1,81 @@ + +import { + OBJECT, + FUNCTION, + BOOLEAN, + NUMBER, + STRING, + UNDEFINED, + BIGINT, + SYMBOL, + NULL +} from './types.js'; + +const { + defineProperty, + getOwnPropertyDescriptor, + getPrototypeOf, + isExtensible, + ownKeys, + preventExtensions, + set, + setPrototypeOf +} = Reflect; + +export const TypedArray = getPrototypeOf(Int8Array); + +export { + defineProperty, + getOwnPropertyDescriptor, + getPrototypeOf, + isExtensible, + ownKeys, + preventExtensions, + set, + setPrototypeOf +}; + +export const augment = (descriptor, how) => { + const {get, set, value} = descriptor; + if (get) descriptor.get = how(get); + if (set) descriptor.set = how(set); + if (value) descriptor.value = how(value); + return descriptor; +}; + +export const entry = (type, value) => [type, value]; + +export const asEntry = transform => value => { + const type = typeof value; + switch (type) { + case OBJECT: + if (value == null) + return entry(NULL, value); + case FUNCTION: + return transform(type, value); + case BOOLEAN: + case NUMBER: + case STRING: + case UNDEFINED: + case BIGINT: + return entry(type, value); + case SYMBOL: { + if (symbols.has(value)) + return entry(type, symbols.get(value)); + } + } + throw new Error(`Unable to handle this ${type} type`); +}; + +const symbols = new Map( + ownKeys(Symbol) + .filter(s => typeof Symbol[s] === SYMBOL) + .map(s => [Symbol[s], s]) +); + +export const symbol = value => { + for (const [symbol, name] of symbols) { + if (name === value) + return symbol; + } +}; diff --git a/tech-preview/pyscript.core/node_modules/coincident/global.js b/tech-preview/pyscript.core/node_modules/coincident/global.js new file mode 100644 index 0000000..24072bf --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/global.js @@ -0,0 +1,2 @@ +var e="417f77a3-3f54-4e3f-95fa-50ee1cb1635d",t=e=>({value:new Promise((t=>{let n=new Worker("data:application/javascript,"+encodeURIComponent("onmessage=({data:b})=>(Atomics.wait(b,0),postMessage(0))"));n.onmessage=t,n.postMessage(e)}))}) +/*! (c) Andrea Giammarchi - ISC */;const{Int32Array:n,Map:r,SharedArrayBuffer:s,Uint16Array:a}=globalThis,{BYTES_PER_ELEMENT:o}=n,{BYTES_PER_ELEMENT:i}=a,{isArray:c}=Array,{notify:l,wait:f,waitAsync:p}=Atomics,{fromCharCode:u}=String,g=(e,n)=>e?(p||t)(n,0):(f(n,0),{value:{then:e=>e()}}),y=new WeakSet,w=new WeakMap;let h=0;const d=(t,{parse:f,stringify:p}=JSON)=>{if(!w.has(t)){const d=(n,...r)=>t.postMessage({[e]:r},{transfer:n});w.set(t,new Proxy(new r,{get:(e,r)=>"then"===r?null:(...e)=>{const c=h++;let l=new n(new s(o)),p=[];y.has(e.at(-1)||p)&&y.delete(p=e.pop()),d(p,c,l,r,e);const w=t instanceof Worker;return g(w,l).value.then((()=>{const e=l[0];if(!e)return;const t=i*e;return l=new n(new s(t+t%o)),d([],c,l),g(w,l).value.then((()=>f(u(...new a(l.buffer).slice(0,e)))))}))},set(n,s,o){if(!n.size){const s=new r;t.addEventListener("message",(async t=>{const r=t.data?.[e];if(c(r)){t.stopImmediatePropagation();const[e,o,...i]=r;if(i.length){const[t,r]=i;if(!n.has(t))throw new Error(`Unsupported action: ${t}`);{const a=p(await n.get(t)(...r));a&&(s.set(e,a),o[0]=a.length)}}else{const t=s.get(e);s.delete(e);for(let e=new a(o.buffer),n=0;n(y.add(e),e);const m="object",v="function",b="number",E="string",M="undefined",P="symbol",{defineProperty:k,getOwnPropertyDescriptor:S,getPrototypeOf:T,isExtensible:x,ownKeys:A,preventExtensions:W,set:R,setPrototypeOf:O}=Reflect,L=(e,t)=>{const{get:n,set:r,value:s}=e;return n&&(e.get=t(n)),r&&(e.set=t(r)),s&&(e.value=t(s)),e},C=(e,t)=>[e,t],U=e=>t=>{const n=typeof t;switch(n){case m:if(null==t)return C("null",t);case v:return e(n,t);case"boolean":case b:case E:case M:case"bigint":return C(n,t);case P:if(_.has(t))return C(n,_.get(t))}throw new Error(`Unable to handle this ${n} type`)},_=new Map(A(Symbol).filter((e=>typeof Symbol[e]===P)).map((e=>[Symbol[e],e]))),z=e=>{for(const[t,n]of _)if(n===e)return t},B="apply",I="construct",N="defineProperty",j="deleteProperty",D="get",F="getOwnPropertyDescriptor",K="getPrototypeOf",Y="has",$="isExtensible",G="ownKeys",J="preventExtensions",q="set",H="setPrototypeOf",Q="delete";let V=0;const X=new Map,Z=new Map,ee=new WeakMap,{addEventListener:te}=EventTarget.prototype;k(EventTarget.prototype,"addEventListener",{value(e,t,...n){return n.at(0)?.invoke&&(ee.has(this)||ee.set(this,new Map),ee.get(this).set(e,[].concat(n[0].invoke)),delete n[0].invoke),te.call(this,e,t,...n)}});const ne=U(((e,t)=>{if(!X.has(t)){let e;for(;Z.has(e=V++););X.set(t,e),Z.set(e,t)}return C(e,X.get(t))}));var re=(e,t,n)=>{const{[n]:r}=e,s=new FinalizationRegistry((e=>{r(Q,C(E,e))})),a=([e,t])=>{switch(e){case m:return null==t?globalThis:typeof t===b?Z.get(t):t;case v:if(typeof t===E){if(!Z.has(t)){const e=function(...e){return e.at(0)instanceof Event&&(e=>{const{currentTarget:t,target:n,type:r}=e;for(const s of ee.get(t||n)?.get(r)||[])e[s]()})(...e),r(B,C(v,t),ne(this),e.map(ne))},n=new WeakRef(e);Z.set(t,n),s.register(e,t,n)}return Z.get(t).deref()}return Z.get(t);case P:return z(t)}return t},o={[B]:(e,t,n)=>ne(e.apply(t,n)),[I]:(e,t)=>ne(new e(...t)),[N]:(e,t,n)=>ne(k(e,t,n)),[j]:(e,t)=>ne(delete e[t]),[K]:e=>ne(T(e)),[D]:(e,t)=>ne(e[t]),[F]:(e,t)=>{const n=S(e,t);return n?C(m,L(n,ne)):C(M,n)},[Y]:(e,t)=>ne(t in e),[$]:e=>ne(x(e)),[G]:e=>C(m,A(e).map(ne)),[J]:e=>ne(W(e)),[q]:(e,t,n)=>ne(R(e,t,n)),[H]:(e,t)=>ne(O(e,t)),[Q](e){X.delete(Z.get(e)),Z.delete(e)}};return e[t]=(e,t,...n)=>{switch(e){case B:n[0]=a(n[0]),n[1]=n[1].map(a);break;case I:n[0]=n[0].map(a);break;case N:{const[e,t]=n;n[0]=a(e);const{get:r,set:s,value:o}=t;r&&(t.get=a(r)),s&&(t.set=a(s)),o&&(t.value=a(o));break}default:n=n.map(a)}return o[e](a(t),...n)},e};const se=e=>typeof e===v?e():e,ae=U(((e,t)=>{if(oe in t)return se(t[oe]);if(e===v){if(!le.has(t)){let e;for(;le.has(e=String(ie++)););ce.set(t,e),le.set(e,t)}return C(e,ce.get(t))}return C(e,t)})),oe=Symbol();let ie=0;const ce=new Map,le=new Map;var fe=(e,t,n)=>{const{[t]:r}=e,s=new Map,a=new FinalizationRegistry((e=>{s.delete(e),r(Q,ae(e))})),o=e=>{const[t,n]=e;if(!s.has(n)){const r=t===v?pe.bind(e):e,o=new Proxy(r,l),i=new WeakRef(o);s.set(n,i),a.register(o,n,i)}return s.get(n).deref()},i=e=>{const[t,n]=e;switch(t){case m:return typeof n===b?o(e):n;case v:return typeof n===E?le.get(n):o(e);case P:return z(n)}return n},c=(e,t,...n)=>i(r(e,se(t),...n)),l={[B]:(e,t,n)=>c(B,e,ae(t),n.map(ae)),[I]:(e,t)=>c(I,e,t.map(ae)),[N]:(e,t,n)=>{const{get:r,set:s,value:a}=n;return typeof r===v&&(n.get=ae(r)),typeof s===v&&(n.set=ae(s)),typeof a===v&&(n.value=ae(a)),c(N,e,ae(t),n)},[j]:(e,t)=>c(j,e,ae(t)),[K]:e=>c(K,e),[D]:(e,t)=>t===oe?e:c(D,e,ae(t)),[F]:(e,t)=>{const n=c(F,e,ae(t));return n&&L(n,i)},[Y]:(e,t)=>t===oe||c(Y,e,ae(t)),[$]:e=>c($,e),[G]:e=>c(G,e).map(i),[J]:e=>c(J,e),[q]:(e,t,n)=>c(q,e,ae(t),ae(n)),[H]:(e,t)=>c(H,e,ae(t))};return e[n]=(e,t,n,r)=>{switch(e){case B:return i(t).apply(i(n),r.map(i));case Q:{const e=i(t);ce.delete(le.get(e)),le.delete(e)}}},{proxy:e,global:new Proxy([m,null],l),isGlobal:e=>typeof e===m&&!!e&&oe in e}};function pe(){return this}const ue=e+"M",ge=e+"T",ye=new WeakMap,we=(e,...t)=>{const n=d(e,...t);if(!ye.has(n)){const t=e instanceof Worker?re:fe;ye.set(n,t(n,ue,ge))}return ye.get(n)};we.transfer=d.transfer;export{we as default}; diff --git a/tech-preview/pyscript.core/node_modules/coincident/package.json b/tech-preview/pyscript.core/node_modules/coincident/package.json new file mode 100644 index 0000000..360affe --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/package.json @@ -0,0 +1,64 @@ +{ + "name": "coincident", + "version": "0.8.3", + "description": "An Atomics based Proxy to simplify, and synchronize, Worker related tasks", + "main": "./cjs/index.js", + "scripts": { + "build": "node rollup/channel.cjs && npm run cjs && npm run rollup:es && npm run rollup:global && npm run rollup:structured && npm run rollup:uhtml && npm run test", + "cjs": "ascjs --no-default esm cjs", + "rollup:es": "rollup --config rollup/es.config.js", + "rollup:global": "rollup --config rollup/global.config.js", + "rollup:structured": "rollup --config rollup/structured.config.js", + "rollup:uhtml": "rollup --config rollup/uhtml.config.js", + "test": "c8 node test/index.js", + "server": "npx static-handler --cors --coop --coep --corp .", + "size": "cat es.js | brotli | wc -c; cat structured.js | brotli | wc -c; cat global.js | brotli | wc -c; cat uhtml.js | brotli | wc -c", + "coverage": "mkdir -p ./coverage; c8 report --reporter=text-lcov > ./coverage/lcov.info" + }, + "keywords": [ + "Atomics", + "Worker", + "sync", + "synchronize" + ], + "author": "Andrea Giammarchi", + "license": "ISC", + "devDependencies": { + "@rollup/plugin-node-resolve": "^15.1.0", + "@rollup/plugin-terser": "^0.4.3", + "ascjs": "^5.0.1", + "c8": "^8.0.0", + "rollup": "^3.25.3", + "static-handler": "^0.4.2", + "uhtml": "^3.2.1" + }, + "module": "./esm/index.js", + "type": "module", + "exports": { + ".": { + "import": "./esm/index.js", + "default": "./cjs/index.js" + }, + "./global": { + "import": "./esm/window.js", + "default": "./cjs/window.js" + }, + "./window": { + "import": "./esm/window.js", + "default": "./cjs/window.js" + }, + "./structured": { + "import": "./esm/structured.js", + "default": "./cjs/structured.js" + }, + "./uhtml": { + "import": "./esm/uhtml.js", + "default": "./cjs/uhtml.js" + }, + "./package.json": "./package.json" + }, + "unpkg": "es.js", + "dependencies": { + "@ungap/structured-clone": "^1.2.0" + } +} diff --git a/tech-preview/pyscript.core/node_modules/coincident/structured.js b/tech-preview/pyscript.core/node_modules/coincident/structured.js new file mode 100644 index 0000000..a85ee7e --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/structured.js @@ -0,0 +1,2 @@ +const e="object"==typeof self?self:globalThis,t=t=>((t,n)=>{const r=(e,n)=>(t.set(n,e),e),s=a=>{if(t.has(a))return t.get(a);const[o,c]=n[a];switch(o){case 0:case-1:return r(c,a);case 1:{const e=r([],a);for(const t of c)e.push(s(t));return e}case 2:{const e=r({},a);for(const[t,n]of c)e[s(t)]=s(n);return e}case 3:return r(new Date(c),a);case 4:{const{source:e,flags:t}=c;return r(new RegExp(e,t),a)}case 5:{const e=r(new Map,a);for(const[t,n]of c)e.set(s(t),s(n));return e}case 6:{const e=r(new Set,a);for(const t of c)e.add(s(t));return e}case 7:{const{name:t,message:n}=c;return r(new e[t](n),a)}case 8:return r(BigInt(c),a);case"BigInt":return r(Object(BigInt(c)),a)}return r(new e[o](c),a)};return s})(new Map,t)(0),n="",{toString:r}={},{keys:s}=Object,a=e=>{const t=typeof e;if("object"!==t||!e)return[0,t];const s=r.call(e).slice(8,-1);switch(s){case"Array":return[1,n];case"Object":return[2,n];case"Date":return[3,n];case"RegExp":return[4,n];case"Map":return[5,n];case"Set":return[6,n]}return s.includes("Array")?[1,s]:s.includes("Error")?[7,s]:[2,s]},o=([e,t])=>0===e&&("function"===t||"symbol"===t),c=(e,{json:t,lossy:n}={})=>{const r=[];return((e,t,n,r)=>{const c=(e,t)=>{const s=r.push(e)-1;return n.set(t,s),s},u=r=>{if(n.has(r))return n.get(r);let[i,f]=a(r);switch(i){case 0:{let t=r;switch(f){case"bigint":i=8,t=r.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+f);t=null;break;case"undefined":return c([-1],r)}return c([i,t],r)}case 1:{if(f)return c([f,[...r]],r);const e=[],t=c([i,e],r);for(const t of r)e.push(u(t));return t}case 2:{if(f)switch(f){case"BigInt":return c([f,r.toString()],r);case"Boolean":case"Number":case"String":return c([f,r.valueOf()],r)}if(t&&"toJSON"in r)return u(r.toJSON());const n=[],l=c([i,n],r);for(const t of s(r))!e&&o(a(r[t]))||n.push([u(t),u(r[t])]);return l}case 3:return c([i,r.toISOString()],r);case 4:{const{source:e,flags:t}=r;return c([i,{source:e,flags:t}],r)}case 5:{const t=[],n=c([i,t],r);for(const[n,s]of r)(e||!o(a(n))&&!o(a(s)))&&t.push([u(n),u(s)]);return n}case 6:{const t=[],n=c([i,t],r);for(const n of r)!e&&o(a(n))||t.push(u(n));return n}}const{message:l}=r;return c([i,{name:f,message:l}],r)};return u})(!(t||n),!!t,new Map,r)(e),r},{parse:u,stringify:i}=JSON,f={json:!0,lossy:!0};var l=Object.freeze({__proto__:null,parse:e=>t(u(e)),stringify:e=>i(c(e,f))}),g="2f6fe6d4-8ba8-424a-83c5-8fadca1ea103",p=e=>({value:new Promise((t=>{let n=new Worker("data:application/javascript,"+encodeURIComponent("onmessage=({data:b})=>(Atomics.wait(b,0),postMessage(0))"));n.onmessage=t,n.postMessage(e)}))}) +/*! (c) Andrea Giammarchi - ISC */;const{Int32Array:w,Map:h,SharedArrayBuffer:d,Uint16Array:y}=globalThis,{BYTES_PER_ELEMENT:b}=w,{BYTES_PER_ELEMENT:m}=y,{isArray:S}=Array,{notify:E,wait:A,waitAsync:M}=Atomics,{fromCharCode:O}=String,j=(e,t)=>e?(M||p)(t,0):(A(t,0),{value:{then:e=>e()}}),_=new WeakSet,v=new WeakMap;let B=0;const I=(e,{parse:t,stringify:n}=JSON)=>{if(!v.has(e)){const r=(t,...n)=>e.postMessage({[g]:n},{transfer:t});v.set(e,new Proxy(new h,{has:(e,t)=>"string"==typeof t&&!t.startsWith("_"),get:(n,s)=>"then"===s?null:(...n)=>{const a=B++;let o=new w(new d(b)),c=[];_.has(n.at(-1)||c)&&_.delete(c=n.pop()),r(c,a,o,s,n);const u=e instanceof Worker;return j(u,o).value.then((()=>{const e=o[0];if(!e)return;const n=m*e;return o=new w(new d(n+n%b)),r([],a,o),j(u,o).value.then((()=>t(O(...new y(o.buffer).slice(0,e)))))}))},set(t,r,s){if(!t.size){const r=new h;e.addEventListener("message",(async e=>{const s=e.data?.[g];if(S(s)){e.stopImmediatePropagation();const[a,o,...c]=s;if(c.length){const[e,s]=c;if(!t.has(e))throw new Error(`Unsupported action: ${e}`);{const c=n(await t.get(e)(...s));c&&(r.set(a,c),o[0]=c.length)}}else{const e=r.get(a);r.delete(a);for(let t=new y(o.buffer),n=0;nI(e,l);k.transfer=I.transfer=(...e)=>(_.add(e),e);export{k as default}; diff --git a/tech-preview/pyscript.core/node_modules/coincident/uhtml.js b/tech-preview/pyscript.core/node_modules/coincident/uhtml.js new file mode 100644 index 0000000..8050622 --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/uhtml.js @@ -0,0 +1,3 @@ +var e="2f6fe6d4-8ba8-424a-83c5-8fadca1ea103",t=e=>({value:new Promise((t=>{let n=new Worker("data:application/javascript,"+encodeURIComponent("onmessage=({data:b})=>(Atomics.wait(b,0),postMessage(0))"));n.onmessage=t,n.postMessage(e)}))}) +/*! (c) Andrea Giammarchi - ISC */;const{Int32Array:n,Map:r,SharedArrayBuffer:s,Uint16Array:o}=globalThis,{BYTES_PER_ELEMENT:a}=n,{BYTES_PER_ELEMENT:i}=o,{isArray:l}=Array,{notify:c,wait:u,waitAsync:f}=Atomics,{fromCharCode:p}=String,d=(e,n)=>e?(f||t)(n,0):(u(n,0),{value:{then:e=>e()}}),h=new WeakSet,g=new WeakMap;let w=0;const y=(t,{parse:u,stringify:f}=JSON)=>{if(!g.has(t)){const y=(n,...r)=>t.postMessage({[e]:r},{transfer:n});g.set(t,new Proxy(new r,{has:(e,t)=>"string"==typeof t&&!t.startsWith("_"),get:(e,r)=>"then"===r?null:(...e)=>{const l=w++;let c=new n(new s(a)),f=[];h.has(e.at(-1)||f)&&h.delete(f=e.pop()),y(f,l,c,r,e);const g=t instanceof Worker;return d(g,c).value.then((()=>{const e=c[0];if(!e)return;const t=i*e;return c=new n(new s(t+t%a)),y([],l,c),d(g,c).value.then((()=>u(p(...new o(c.buffer).slice(0,e)))))}))},set(n,s,a){if(!n.size){const s=new r;t.addEventListener("message",(async t=>{const r=t.data?.[e];if(l(r)){t.stopImmediatePropagation();const[e,a,...i]=r;if(i.length){const[t,r]=i;if(!n.has(t))throw new Error(`Unsupported action: ${t}`);{const o=f(await n.get(t)(...r));o&&(s.set(e,o),a[0]=o.length)}}else{const t=s.get(e);s.delete(e);for(let e=new o(a.buffer),n=0;n(h.add(e),e);const m="object",b="function",v="number",x="string",E="undefined",k="symbol",{defineProperty:A,getOwnPropertyDescriptor:M,getPrototypeOf:N,isExtensible:T,ownKeys:C,preventExtensions:P,set:S,setPrototypeOf:O}=Reflect,$=N(Int8Array),W=(e,t)=>{const{get:n,set:r,value:s}=e;return n&&(e.get=t(n)),r&&(e.set=t(r)),s&&(e.value=t(s)),e},L=(e,t)=>[e,t],R=e=>t=>{const n=typeof t;switch(n){case m:if(null==t)return L("null",t);case b:return e(n,t);case"boolean":case v:case x:case E:case"bigint":return L(n,t);case k:if(_.has(t))return L(n,_.get(t))}throw new Error(`Unable to handle this ${n} type`)},_=new Map(C(Symbol).filter((e=>typeof Symbol[e]===k)).map((e=>[Symbol[e],e]))),B=e=>{for(const[t,n]of _)if(n===e)return t},D="apply",j="construct",z="defineProperty",I="deleteProperty",U="get",F="getOwnPropertyDescriptor",H="getPrototypeOf",K="has",Y="isExtensible",G="ownKeys",J="preventExtensions",q="set",Q="setPrototypeOf",V="delete";let X=0;const Z=new Map,ee=new Map,te=new WeakMap;if(globalThis.window===globalThis){const{addEventListener:e}=EventTarget.prototype;A(EventTarget.prototype,"addEventListener",{value(t,n,...r){return r.at(0)?.invoke&&(te.has(this)||te.set(this,new Map),te.get(this).set(t,[].concat(r[0].invoke)),delete r[0].invoke),e.call(this,t,n,...r)}})}const ne=R(((e,t)=>{if(!Z.has(t)){let e;for(;ee.has(e=X++););Z.set(t,e),ee.set(e,t)}return L(e,Z.get(t))}));var re=(e,t,n)=>{const{[n]:r}=e,s=new FinalizationRegistry((e=>{r(V,L(x,e))})),o=([e,t])=>{switch(e){case m:if(null==t)return globalThis;if(typeof t===v)return ee.get(t);if(!(t instanceof $))for(const e in t)t[e]=o(t[e]);return t;case b:if(typeof t===x){if(!ee.has(t)){const e=function(...e){return e.at(0)instanceof Event&&(e=>{const{currentTarget:t,target:n,type:r}=e;for(const s of te.get(t||n)?.get(r)||[])e[s]()})(...e),r(D,L(b,t),ne(this),e.map(ne))},n=new WeakRef(e);ee.set(t,n),s.register(e,t,n)}return ee.get(t).deref()}return ee.get(t);case k:return B(t)}return t},a={[D]:(e,t,n)=>ne(e.apply(t,n)),[j]:(e,t)=>ne(new e(...t)),[z]:(e,t,n)=>ne(A(e,t,n)),[I]:(e,t)=>ne(delete e[t]),[H]:e=>ne(N(e)),[U]:(e,t)=>ne(e[t]),[F]:(e,t)=>{const n=M(e,t);return n?L(m,W(n,ne)):L(E,n)},[K]:(e,t)=>ne(t in e),[Y]:e=>ne(T(e)),[G]:e=>L(m,C(e).map(ne)),[J]:e=>ne(P(e)),[q]:(e,t,n)=>ne(S(e,t,n)),[Q]:(e,t)=>ne(O(e,t)),[V](e){Z.delete(ee.get(e)),ee.delete(e)}};return e[t]=(e,t,...n)=>{switch(e){case D:n[0]=o(n[0]),n[1]=n[1].map(o);break;case j:n[0]=n[0].map(o);break;case z:{const[e,t]=n;n[0]=o(e);const{get:r,set:s,value:a}=t;r&&(t.get=o(r)),s&&(t.set=o(s)),a&&(t.value=o(a));break}default:n=n.map(o)}return a[e](o(t),...n)},{proxy:e,window:globalThis,isWindowProxy:()=>!1}};let se=0;const oe=new Map,ae=new Map,ie=Symbol(),le=e=>typeof e===b?e():e,ce=e=>typeof e===m&&!!e&&ie in e,ue="isArray",fe=Array[ue],pe=R(((e,t)=>{if(ie in t)return le(t[ie]);if(e===b){if(!ae.has(t)){let e;for(;ae.has(e=String(se++)););oe.set(t,e),ae.set(e,t)}return L(e,oe.get(t))}if(!(t instanceof $))for(const e in t)t[e]=pe(t[e]);return L(e,t)}));var de=(e,t,n)=>{const{[t]:r}=e,s=new Map,o=new FinalizationRegistry((e=>{s.delete(e),r(V,pe(e))})),a=e=>{const[t,n]=e;if(!s.has(n)){const r=t===b?he.bind(e):e,a=new Proxy(r,c),i=new WeakRef(a);s.set(n,i),o.register(a,n,i)}return s.get(n).deref()},i=e=>{const[t,n]=e;switch(t){case m:return typeof n===v?a(e):n;case b:return typeof n===x?ae.get(n):a(e);case k:return B(n)}return n},l=(e,t,...n)=>i(r(e,le(t),...n)),c={[D]:(e,t,n)=>l(D,e,pe(t),n.map(pe)),[j]:(e,t)=>l(j,e,t.map(pe)),[z]:(e,t,n)=>{const{get:r,set:s,value:o}=n;return typeof r===b&&(n.get=pe(r)),typeof s===b&&(n.set=pe(s)),typeof o===b&&(n.value=pe(o)),l(z,e,pe(t),n)},[I]:(e,t)=>l(I,e,pe(t)),[H]:e=>l(H,e),[U]:(e,t)=>t===ie?e:l(U,e,pe(t)),[F]:(e,t)=>{const n=l(F,e,pe(t));return n&&W(n,i)},[K]:(e,t)=>t===ie||l(K,e,pe(t)),[Y]:e=>l(Y,e),[G]:e=>l(G,e).map(i),[J]:e=>l(J,e),[q]:(e,t,n)=>l(q,e,pe(t),pe(n)),[Q]:(e,t)=>l(Q,e,pe(t))};e[n]=(e,t,n,r)=>{switch(e){case D:return i(t).apply(i(n),r.map(i));case V:{const e=i(t);oe.delete(ae.get(e)),ae.delete(e)}}};const u=new Proxy([m,null],c),f=u.Array[ue];return A(Array,ue,{value:e=>ce(e)?f(e):fe(e)}),{window:u,isWindowProxy:ce,proxy:e,get global(){return console.warn("Deprecated: please access `window` field instead"),this.window},get isGlobal(){return function(e){return console.warn("Deprecated: please access `isWindowProxy` field instead"),this.isWindowProxy(e)}.bind(this)}}};function he(){return this}const ge=e+"M",we=e+"T",ye=new WeakMap,me=(e,...t)=>{const n=y(e,...t);if(!ye.has(n)){const t=e instanceof Worker?re:de;ye.set(n,t(n,ge,we))}return ye.get(n)};me.transfer=y.transfer;class be extends WeakMap{set(e,t){return super.set(e,t),t}} +/*! (c) Andrea Giammarchi - ISC */const ve=/^(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)$/i,xe=/<([a-z]+[a-z0-9:._-]*)([^>]*?)(\/?)>/g,Ee=/([^\s\\>"'=]+)\s*=\s*(['"]?)\x01/g,ke=/[\x01\x02]/g;var Ae=({document:e})=>{const{isArray:t,prototype:n}=Array,{indexOf:r}=n,{createDocumentFragment:s,createElement:o,createElementNS:a,createTextNode:i,createTreeWalker:l,importNode:c}=new Proxy({},{get:(t,n)=>e[n].bind(e)});let u;const f=(e,t)=>t?(e=>{u||(u=a("http://www.w3.org/2000/svg","svg")),u.innerHTML=e;const t=s();return t.append(...u.childNodes),t})(e):(e=>{const t=o("template");return t.innerHTML=e,t.content})(e),p=(t,n)=>111===t.nodeType?1/n<0?n?(({firstChild:t,lastChild:n})=>{const r=e.createRange();return r.setStartAfter(t),r.setEndAfter(n),r.deleteContents(),t})(t):t.lastChild:n?t.valueOf():t.firstChild:t,d=e=>null==e?e:e.valueOf(),h=(e,n)=>{let r,s,o=n.slice(2);return!(n in e)&&(s=n.toLowerCase())in e&&(o=s.slice(2)),n=>{const s=t(n)?n:[n,!1];r!==s[0]&&(r&&e.removeEventListener(o,r,s[1]),(r=s[0])&&e.addEventListener(o,r,s[1]))}},g=({childNodes:e},t)=>e[t],w=(e,t,n)=>((e,t,n,r,s)=>{const o=n.length;let a=t.length,i=o,l=0,c=0,u=null;for(;ls-c){const o=r(t[l],0);for(;c{switch(n[0]){case"?":return((e,t,n)=>r=>{const s=!!d(r);n!==s&&((n=s)?e.setAttribute(t,""):e.removeAttribute(t))})(t,n.slice(1),!1);case".":return((e,t)=>"dataset"===t?(({dataset:e})=>t=>{for(const n in t){const r=t[n];null==r?delete e[n]:e[n]=r}})(e):n=>{e[t]=n})(t,n.slice(1));case"@":return h(t,"on"+n.slice(1));case"o":if("n"===n[1])return h(t,n)}switch(n){case"ref":return(e=>{let t;return n=>{t!==n&&(t=n,"function"==typeof n?n(e):n.current=e)}})(t);case"aria":return(e=>t=>{for(const n in t){const r="role"===n?n:`aria-${n}`,s=t[n];null==s?e.removeAttribute(r):e.setAttribute(r,s)}})(t)}return((t,n)=>{let r,s=!0;const o=e.createAttributeNS(null,n);return e=>{const n=d(e);r!==n&&(null==(r=n)?s||(t.removeAttributeNode(o),s=!0):(o.value=n,s&&(t.setAttributeNodeNS(o),s=!1)))}})(t,n)};function m(e){const{type:n,path:r}=e,s=r.reduceRight(g,this);return"node"===n?(e=>{let n,r,s=[];const o=a=>{switch(typeof a){case"string":case"number":case"boolean":n!==a&&(n=a,r||(r=i("")),r.data=a,s=w(e,s,[r]));break;case"object":case"undefined":if(null==a){n!=a&&(n=a,s=w(e,s,[]));break}if(t(a)){n=a,0===a.length?s=w(e,s,[]):"object"==typeof a[0]?s=w(e,s,a):o(String(a));break}if(n!==a)if("ELEMENT_NODE"in a)n=a,s=w(e,s,11===a.nodeType?[...a.childNodes]:[a]);else{const e=a.valueOf();e!==a&&o(e)}break;case"function":o(a(e))}};return o})(s):"attr"===n?y(s,e.name):(e=>{let t;return n=>{const r=d(n);t!=r&&(t=r,e.textContent=null==r?"":r)}})(s)}const b=e=>{const t=[];let{parentNode:n}=e;for(;n;)t.push(r.call(n.childNodes,e)),e=n,({parentNode:n}=e);return t},v="isµ",x=new be,E=/^(?:textarea|script|style|title|plaintext|xmp)$/,k=(e,t)=>{const n="svg"===e,r=((e,t,n)=>{let r=0;return e.join("").trim().replace(xe,((e,t,r,s)=>{let o=t+r.replace(Ee,"=$2$1").trimEnd();return s.length&&(o+=n||ve.test(t)?" /":">"})).replace(ke,(e=>""===e?"\x3c!--"+t+r+++"--\x3e":t+r++))})(t,v,n),s=f(r,n),o=l(s,129),a=[],i=t.length-1;let c=0,u=`${v}${c}`;for(;c{const{content:n,nodes:r}=x.get(t)||x.set(t,k(e,t)),s=c(n,!0);return{content:s,updates:r.map(m,s)}},M=(e,{type:t,template:n,values:r})=>{const s=N(e,r);let{entry:o}=e;o&&o.template===n&&o.type===t||(e.entry=o=((e,t)=>{const{content:n,updates:r}=A(e,t);return{type:e,template:t,content:n,updates:r,wire:null}})(t,n));const{content:a,updates:i,wire:l}=o;for(let e=0;e{const{firstChild:t,lastChild:n}=e;if(t===n)return n||e;const{childNodes:r}=e,s=[...r];return{ELEMENT_NODE:1,nodeType:111,firstChild:t,lastChild:n,valueOf:()=>(r.length!==s.length&&e.append(...s),e)}})(a))},N=({stack:e},n)=>{const{length:r}=n;for(let s=0;s{const t=new be;return Object.assign(((t,...n)=>new T(e,t,n)),{for(n,r){const s=t.get(n)||t.set(n,new MapSet);return s.get(r)||s.set(r,(t=>(n,...r)=>M(t,{type:e,template:n,values:r}))({stack:[],entry:null,wire:null}))},node:(t,...n)=>M({stack:[],entry:null,wire:null},new T(e,t,n)).valueOf()})},P=new be,S=C("html"),O=C("svg");return{Hole:T,render:(e,t)=>{const n="function"==typeof t?t():t,r=P.get(e)||P.set(e,{stack:[],entry:null,wire:null}),s=n instanceof T?M(r,n):n;return s!==r.wire&&(r.wire=s,e.replaceChildren(s.valueOf())),e},html:S,svg:O}};const Me=(e,...t)=>{const n=me(e,...t);return n.uhtml||(n.uhtml=Ae(n.window)),n};Me.transfer=me.transfer;export{Me as default}; diff --git a/tech-preview/pyscript.core/node_modules/coincident/window.js b/tech-preview/pyscript.core/node_modules/coincident/window.js new file mode 100644 index 0000000..61d361d --- /dev/null +++ b/tech-preview/pyscript.core/node_modules/coincident/window.js @@ -0,0 +1,2 @@ +var e="2f6fe6d4-8ba8-424a-83c5-8fadca1ea103",t=e=>({value:new Promise((t=>{let n=new Worker("data:application/javascript,"+encodeURIComponent("onmessage=({data:b})=>(Atomics.wait(b,0),postMessage(0))"));n.onmessage=t,n.postMessage(e)}))}) +/*! (c) Andrea Giammarchi - ISC */;const{Int32Array:n,Map:r,SharedArrayBuffer:s,Uint16Array:a}=globalThis,{BYTES_PER_ELEMENT:o}=n,{BYTES_PER_ELEMENT:i}=a,{isArray:c}=Array,{notify:l,wait:f,waitAsync:p}=Atomics,{fromCharCode:u}=String,w=(e,n)=>e?(p||t)(n,0):(f(n,0),{value:{then:e=>e()}}),g=new WeakSet,y=new WeakMap;let d=0;const h=(t,{parse:f,stringify:p}=JSON)=>{if(!y.has(t)){const h=(n,...r)=>t.postMessage({[e]:r},{transfer:n});y.set(t,new Proxy(new r,{has:(e,t)=>"string"==typeof t&&!t.startsWith("_"),get:(e,r)=>"then"===r?null:(...e)=>{const c=d++;let l=new n(new s(o)),p=[];g.has(e.at(-1)||p)&&g.delete(p=e.pop()),h(p,c,l,r,e);const y=t instanceof Worker;return w(y,l).value.then((()=>{const e=l[0];if(!e)return;const t=i*e;return l=new n(new s(t+t%o)),h([],c,l),w(y,l).value.then((()=>f(u(...new a(l.buffer).slice(0,e)))))}))},set(n,s,o){if(!n.size){const s=new r;t.addEventListener("message",(async t=>{const r=t.data?.[e];if(c(r)){t.stopImmediatePropagation();const[e,o,...i]=r;if(i.length){const[t,r]=i;if(!n.has(t))throw new Error(`Unsupported action: ${t}`);{const a=p(await n.get(t)(...r));a&&(s.set(e,a),o[0]=a.length)}}else{const t=s.get(e);s.delete(e);for(let e=new a(o.buffer),n=0;n(g.add(e),e);const b="object",v="function",m="number",E="string",P="undefined",M="symbol",{defineProperty:k,getOwnPropertyDescriptor:x,getPrototypeOf:A,isExtensible:W,ownKeys:T,preventExtensions:S,set:R,setPrototypeOf:O}=Reflect,L=A(Int8Array),_=(e,t)=>{const{get:n,set:r,value:s}=e;return n&&(e.get=t(n)),r&&(e.set=t(r)),s&&(e.value=t(s)),e},C=(e,t)=>[e,t],D=e=>t=>{const n=typeof t;switch(n){case b:if(null==t)return C("null",t);case v:return e(n,t);case"boolean":case m:case E:case P:case"bigint":return C(n,t);case M:if(I.has(t))return C(n,I.get(t))}throw new Error(`Unable to handle this ${n} type`)},I=new Map(T(Symbol).filter((e=>typeof Symbol[e]===M)).map((e=>[Symbol[e],e]))),U=e=>{for(const[t,n]of I)if(n===e)return t},z="apply",B="construct",N="defineProperty",j="deleteProperty",F="get",K="getOwnPropertyDescriptor",Y="getPrototypeOf",$="has",G="isExtensible",J="ownKeys",q="preventExtensions",H="set",Q="setPrototypeOf",V="delete";let X=0;const Z=new Map,ee=new Map,te=new WeakMap;if(globalThis.window===globalThis){const{addEventListener:e}=EventTarget.prototype;k(EventTarget.prototype,"addEventListener",{value(t,n,...r){return r.at(0)?.invoke&&(te.has(this)||te.set(this,new Map),te.get(this).set(t,[].concat(r[0].invoke)),delete r[0].invoke),e.call(this,t,n,...r)}})}const ne=D(((e,t)=>{if(!Z.has(t)){let e;for(;ee.has(e=X++););Z.set(t,e),ee.set(e,t)}return C(e,Z.get(t))}));var re=(e,t,n)=>{const{[n]:r}=e,s=new FinalizationRegistry((e=>{r(V,C(E,e))})),a=([e,t])=>{switch(e){case b:if(null==t)return globalThis;if(typeof t===m)return ee.get(t);if(!(t instanceof L))for(const e in t)t[e]=a(t[e]);return t;case v:if(typeof t===E){if(!ee.has(t)){const e=function(...e){return e.at(0)instanceof Event&&(e=>{const{currentTarget:t,target:n,type:r}=e;for(const s of te.get(t||n)?.get(r)||[])e[s]()})(...e),r(z,C(v,t),ne(this),e.map(ne))},n=new WeakRef(e);ee.set(t,n),s.register(e,t,n)}return ee.get(t).deref()}return ee.get(t);case M:return U(t)}return t},o={[z]:(e,t,n)=>ne(e.apply(t,n)),[B]:(e,t)=>ne(new e(...t)),[N]:(e,t,n)=>ne(k(e,t,n)),[j]:(e,t)=>ne(delete e[t]),[Y]:e=>ne(A(e)),[F]:(e,t)=>ne(e[t]),[K]:(e,t)=>{const n=x(e,t);return n?C(b,_(n,ne)):C(P,n)},[$]:(e,t)=>ne(t in e),[G]:e=>ne(W(e)),[J]:e=>C(b,T(e).map(ne)),[q]:e=>ne(S(e)),[H]:(e,t,n)=>ne(R(e,t,n)),[Q]:(e,t)=>ne(O(e,t)),[V](e){Z.delete(ee.get(e)),ee.delete(e)}};return e[t]=(e,t,...n)=>{switch(e){case z:n[0]=a(n[0]),n[1]=n[1].map(a);break;case B:n[0]=n[0].map(a);break;case N:{const[e,t]=n;n[0]=a(e);const{get:r,set:s,value:o}=t;r&&(t.get=a(r)),s&&(t.set=a(s)),o&&(t.value=a(o));break}default:n=n.map(a)}return o[e](a(t),...n)},{proxy:e,window:globalThis,isWindowProxy:()=>!1}};let se=0;const ae=new Map,oe=new Map,ie=Symbol(),ce=e=>typeof e===v?e():e,le=e=>typeof e===b&&!!e&&ie in e,fe="isArray",pe=Array[fe],ue=D(((e,t)=>{if(ie in t)return ce(t[ie]);if(e===v){if(!oe.has(t)){let e;for(;oe.has(e=String(se++)););ae.set(t,e),oe.set(e,t)}return C(e,ae.get(t))}if(!(t instanceof L))for(const e in t)t[e]=ue(t[e]);return C(e,t)}));var we=(e,t,n)=>{const{[t]:r}=e,s=new Map,a=new FinalizationRegistry((e=>{s.delete(e),r(V,ue(e))})),o=e=>{const[t,n]=e;if(!s.has(n)){const r=t===v?ge.bind(e):e,o=new Proxy(r,l),i=new WeakRef(o);s.set(n,i),a.register(o,n,i)}return s.get(n).deref()},i=e=>{const[t,n]=e;switch(t){case b:return typeof n===m?o(e):n;case v:return typeof n===E?oe.get(n):o(e);case M:return U(n)}return n},c=(e,t,...n)=>i(r(e,ce(t),...n)),l={[z]:(e,t,n)=>c(z,e,ue(t),n.map(ue)),[B]:(e,t)=>c(B,e,t.map(ue)),[N]:(e,t,n)=>{const{get:r,set:s,value:a}=n;return typeof r===v&&(n.get=ue(r)),typeof s===v&&(n.set=ue(s)),typeof a===v&&(n.value=ue(a)),c(N,e,ue(t),n)},[j]:(e,t)=>c(j,e,ue(t)),[Y]:e=>c(Y,e),[F]:(e,t)=>t===ie?e:c(F,e,ue(t)),[K]:(e,t)=>{const n=c(K,e,ue(t));return n&&_(n,i)},[$]:(e,t)=>t===ie||c($,e,ue(t)),[G]:e=>c(G,e),[J]:e=>c(J,e).map(i),[q]:e=>c(q,e),[H]:(e,t,n)=>c(H,e,ue(t),ue(n)),[Q]:(e,t)=>c(Q,e,ue(t))};e[n]=(e,t,n,r)=>{switch(e){case z:return i(t).apply(i(n),r.map(i));case V:{const e=i(t);ae.delete(oe.get(e)),oe.delete(e)}}};const f=new Proxy([b,null],l),p=f.Array[fe];return k(Array,fe,{value:e=>le(e)?p(e):pe(e)}),{window:f,isWindowProxy:le,proxy:e,get global(){return console.warn("Deprecated: please access `window` field instead"),this.window},get isGlobal(){return function(e){return console.warn("Deprecated: please access `isWindowProxy` field instead"),this.isWindowProxy(e)}.bind(this)}}};function ge(){return this}const ye=e+"M",de=e+"T",he=new WeakMap,be=(e,...t)=>{const n=h(e,...t);if(!he.has(n)){const t=e instanceof Worker?re:we;he.set(n,t(n,ye,de))}return he.get(n)};be.transfer=h.transfer;export{be as default}; diff --git a/tech-preview/pyscript.core/package-lock.json b/tech-preview/pyscript.core/package-lock.json new file mode 100644 index 0000000..acb2b3f --- /dev/null +++ b/tech-preview/pyscript.core/package-lock.json @@ -0,0 +1,3558 @@ +{ + "name": "@pyscript/core", + "version": "0.0.5", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@pyscript/core", + "version": "0.0.5", + "license": "MIT", + "dependencies": { + "@ungap/structured-clone": "^1.2.0", + "@ungap/with-resolvers": "^0.1.0", + "basic-devtools": "^0.1.6", + "coincident": "^0.8.3" + }, + "devDependencies": { + "@node-loader/import-maps": "^1.1.0", + "@rollup/plugin-node-resolve": "^15.1.0", + "@rollup/plugin-terser": "^0.4.3", + "ascjs": "^5.0.1", + "c8": "^8.0.0", + "eslint": "^8.43.0", + "linkedom": "^0.14.26", + "rollup": "^3.25.3", + "static-handler": "^0.4.2", + "typescript": "^5.1.3" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@node-loader/import-maps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@node-loader/import-maps/-/import-maps-1.1.0.tgz", + "integrity": "sha512-RPB+7vBVhk9xF/eiSGSxEnL6hGQ0a1ua9hvl/MxXDmu7F+Nv+gMwA7AJ0S5TmcgulHAp9/IxobGoFiOxkX7xWQ==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz", + "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", + "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", + "dev": true, + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.x || ^3.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@ungap/with-resolvers": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@ungap/with-resolvers/-/with-resolvers-0.1.0.tgz", + "integrity": "sha512-g7f0IkJdPW2xhY7H4iE72DAsIyfuwEFc6JWc2tYFwKDMWWAF699vGjrM348cwQuOXgHpe1gWFe+Eiyjx/ewvvw==" + }, + "node_modules/acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/ascjs": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ascjs/-/ascjs-5.0.1.tgz", + "integrity": "sha512-1d/QdICzpywXiP53/Zz3fMdaC0/BB1ybLf+fK+QrqY8iyXNnWUHUrpmrowueXeswo+O+meJWm43TJSg2ClP3Sg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.12.5" + }, + "bin": { + "ascjs": "bin.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/basic-devtools": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/basic-devtools/-/basic-devtools-0.1.6.tgz", + "integrity": "sha512-g9zJ63GmdUesS3/Fwv0B5SYX6nR56TQXmGr+wE5PRTNCnGQMYWhUx/nZB/mMWnQJVLPPAp89oxDNlasdtNkW5Q==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-8.0.0.tgz", + "integrity": "sha512-XHA5vSfCLglAc0Xt8eLBZMv19lgiBSjnb1FLAQgnwkuhJYEonpilhEB4Ea3jPAbm0FhD6VVJrc0z73jPe7JyGQ==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/coincident": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/coincident/-/coincident-0.8.3.tgz", + "integrity": "sha512-F3tMajIF5YvnCWeaaMnHUskcTDAXbMi6as74OvwfSirVT/gc+V3KR40E0qCANZRyX26wKrhJtGqx9owyf3iSSA==", + "dependencies": { + "@ungap/structured-clone": "^1.2.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.43.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/linkedom": { + "version": "0.14.26", + "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.14.26.tgz", + "integrity": "sha512-mK6TrydfFA7phrnp+1j57ycBwFI5bGSW6YXlw9acHoqF+mP/y+FooEYYyniOt5Ot57FSKB3iwmnuQ1UUyNLm5A==", + "dev": true, + "dependencies": { + "css-select": "^5.1.0", + "cssom": "^0.5.0", + "html-escaper": "^3.0.3", + "htmlparser2": "^8.0.1", + "uhyphen": "^0.2.0" + } + }, + "node_modules/linkedom/node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.25.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.3.tgz", + "integrity": "sha512-ZT279hx8gszBj9uy5FfhoG4bZx8c+0A1sbqtr7Q3KNWIizpTdDEPZbV2xcbvHsnFp4MavCQYZyzApJ+virB8Yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/smob": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", + "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/static-handler": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/static-handler/-/static-handler-0.4.2.tgz", + "integrity": "sha512-Szbk521mneb5npxg3SEyoufsHr2osAzxMy71W2zFCzLB8wLhHYvKUDCMkLY6imi+fIqkpfas3rzXGBQf99aeEA==", + "dev": true, + "dependencies": { + "mime-types": "^2.1.35" + }, + "bin": { + "static-handler": "static-handler.cjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terser": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz", + "integrity": "sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uhyphen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", + "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "dev": true + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@eslint/js": { + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@node-loader/import-maps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@node-loader/import-maps/-/import-maps-1.1.0.tgz", + "integrity": "sha512-RPB+7vBVhk9xF/eiSGSxEnL6hGQ0a1ua9hvl/MxXDmu7F+Nv+gMwA7AJ0S5TmcgulHAp9/IxobGoFiOxkX7xWQ==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz", + "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + } + }, + "@rollup/plugin-terser": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz", + "integrity": "sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==", + "dev": true, + "requires": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + } + }, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "@ungap/with-resolvers": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@ungap/with-resolvers/-/with-resolvers-0.1.0.tgz", + "integrity": "sha512-g7f0IkJdPW2xhY7H4iE72DAsIyfuwEFc6JWc2tYFwKDMWWAF699vGjrM348cwQuOXgHpe1gWFe+Eiyjx/ewvvw==" + }, + "acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "ascjs": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ascjs/-/ascjs-5.0.1.tgz", + "integrity": "sha512-1d/QdICzpywXiP53/Zz3fMdaC0/BB1ybLf+fK+QrqY8iyXNnWUHUrpmrowueXeswo+O+meJWm43TJSg2ClP3Sg==", + "dev": true, + "requires": { + "@babel/parser": "^7.12.5" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "basic-devtools": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/basic-devtools/-/basic-devtools-0.1.6.tgz", + "integrity": "sha512-g9zJ63GmdUesS3/Fwv0B5SYX6nR56TQXmGr+wE5PRTNCnGQMYWhUx/nZB/mMWnQJVLPPAp89oxDNlasdtNkW5Q==" + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, + "c8": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-8.0.0.tgz", + "integrity": "sha512-XHA5vSfCLglAc0Xt8eLBZMv19lgiBSjnb1FLAQgnwkuhJYEonpilhEB4Ea3jPAbm0FhD6VVJrc0z73jPe7JyGQ==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "coincident": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/coincident/-/coincident-0.8.3.tgz", + "integrity": "sha512-F3tMajIF5YvnCWeaaMnHUskcTDAXbMi6as74OvwfSirVT/gc+V3KR40E0qCANZRyX26wKrhJtGqx9owyf3iSSA==", + "requires": { + "@ungap/structured-clone": "^1.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.43.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + } + }, + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true + }, + "espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "linkedom": { + "version": "0.14.26", + "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.14.26.tgz", + "integrity": "sha512-mK6TrydfFA7phrnp+1j57ycBwFI5bGSW6YXlw9acHoqF+mP/y+FooEYYyniOt5Ot57FSKB3iwmnuQ1UUyNLm5A==", + "dev": true, + "requires": { + "css-select": "^5.1.0", + "cssom": "^0.5.0", + "html-escaper": "^3.0.3", + "htmlparser2": "^8.0.1", + "uhyphen": "^0.2.0" + }, + "dependencies": { + "html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "dev": true + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.25.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.3.tgz", + "integrity": "sha512-ZT279hx8gszBj9uy5FfhoG4bZx8c+0A1sbqtr7Q3KNWIizpTdDEPZbV2xcbvHsnFp4MavCQYZyzApJ+virB8Yw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "smob": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", + "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "static-handler": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/static-handler/-/static-handler-0.4.2.tgz", + "integrity": "sha512-Szbk521mneb5npxg3SEyoufsHr2osAzxMy71W2zFCzLB8wLhHYvKUDCMkLY6imi+fIqkpfas3rzXGBQf99aeEA==", + "dev": true, + "requires": { + "mime-types": "^2.1.35" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "terser": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz", + "integrity": "sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "dev": true + }, + "uhyphen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", + "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/tech-preview/pyscript.core/package.json b/tech-preview/pyscript.core/package.json new file mode 100644 index 0000000..db9246d --- /dev/null +++ b/tech-preview/pyscript.core/package.json @@ -0,0 +1,69 @@ +{ + "name": "@pyscript/core", + "version": "0.0.5", + "description": "PyScript Next core", + "main": "./cjs/index.js", + "types": "./types/index.d.ts", + "scripts": { + "server": "npx static-handler --cors --coep --coop --corp .", + "build": "npm run rollup:xworker && npm run rollup:core && npm run rollup:pyscript && eslint esm/ && npm run ts && npm run cjs && npm run test", + "cjs": "ascjs --no-default esm cjs", + "rollup:core": "rollup --config rollup/core.config.js", + "rollup:pyscript": "rollup --config rollup/pyscript.config.js", + "rollup:xworker": "rollup --config rollup/xworker.config.js", + "test": "c8 --100 node --experimental-loader @node-loader/import-maps test/index.js ", + "test:html": "npm run test && c8 report -r html", + "coverage": "mkdir -p ./coverage; c8 report --reporter=text-lcov > ./coverage/lcov.info", + "size": "npm run size:module && npm run size:worker", + "size:module": "echo module is $(cat core.js | brotli | wc -c) bytes once compressed", + "size:worker": "echo worker is $(cat esm/worker/xworker.js | brotli | wc -c) bytes once compressed", + "ts": "tsc -p ." + }, + "keywords": [ + "py-script", + "pyscript", + "next" + ], + "author": "Anaconda Inc.", + "license": "MIT", + "devDependencies": { + "@node-loader/import-maps": "^1.1.0", + "@rollup/plugin-node-resolve": "^15.1.0", + "@rollup/plugin-terser": "^0.4.3", + "ascjs": "^5.0.1", + "c8": "^8.0.0", + "eslint": "^8.43.0", + "linkedom": "^0.14.26", + "rollup": "^3.25.3", + "static-handler": "^0.4.2", + "typescript": "^5.1.3" + }, + "module": "./esm/index.js", + "type": "module", + "exports": { + ".": { + "types": "./types/esm/index.d.ts", + "import": "./esm/index.js", + "default": "./cjs/index.js" + }, + "./py": { + "import": "./pyscript.js", + "default": "./cjs/custom/pyscript.js" + }, + "./py-script": { + "import": "./esm/custom/pyscript.js", + "default": "./cjs/custom/pyscript.js" + }, + "./package.json": "./package.json" + }, + "unpkg": "core.js", + "dependencies": { + "@ungap/structured-clone": "^1.2.0", + "@ungap/with-resolvers": "^0.1.0", + "basic-devtools": "^0.1.6", + "coincident": "^0.8.3" + }, + "worker": { + "blob": "sha256-CaHDEAEttvghrbLR/GVAofT+zQZyy0Ri9tkpVTNBbiE=" + } +} diff --git a/tech-preview/pyscript.core/pyscript.js b/tech-preview/pyscript.core/pyscript.js new file mode 100644 index 0000000..2271d50 --- /dev/null +++ b/tech-preview/pyscript.core/pyscript.js @@ -0,0 +1,2 @@ +Promise.withResolvers||(Promise.withResolvers=function(){var e,t,r=new this((function(r,n){e=r,t=n}));return{resolve:e,reject:t,promise:r}});const e=(e,t=document)=>t.querySelector(e),t=(e,t=document)=>[...t.querySelectorAll(e)],r=(e,t=document)=>{const r=(new XPathEvaluator).createExpression(e).evaluate(t,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE),n=[];for(let e=0,{snapshotLength:t}=r;e((e,t)=>{const r=(t,r)=>(e.set(r,t),t),s=o=>{if(e.has(o))return e.get(o);const[a,i]=t[o];switch(a){case 0:case-1:return r(i,o);case 1:{const e=r([],o);for(const t of i)e.push(s(t));return e}case 2:{const e=r({},o);for(const[t,r]of i)e[s(t)]=s(r);return e}case 3:return r(new Date(i),o);case 4:{const{source:e,flags:t}=i;return r(new RegExp(e,t),o)}case 5:{const e=r(new Map,o);for(const[t,r]of i)e.set(s(t),s(r));return e}case 6:{const e=r(new Set,o);for(const t of i)e.add(s(t));return e}case 7:{const{name:e,message:t}=i;return r(new n[e](t),o)}case 8:return r(BigInt(i),o);case"BigInt":return r(Object(BigInt(i)),o)}return r(new n[a](i),o)};return s})(new Map,e)(0),o="",{toString:a}={},{keys:i}=Object,c=e=>{const t=typeof e;if("object"!==t||!e)return[0,t];const r=a.call(e).slice(8,-1);switch(r){case"Array":return[1,o];case"Object":return[2,o];case"Date":return[3,o];case"RegExp":return[4,o];case"Map":return[5,o];case"Set":return[6,o]}return r.includes("Array")?[1,r]:r.includes("Error")?[7,r]:[2,r]},l=([e,t])=>0===e&&("function"===t||"symbol"===t),u=(e,{json:t,lossy:r}={})=>{const n=[];return((e,t,r,n)=>{const s=(e,t)=>{const s=n.push(e)-1;return r.set(t,s),s},o=n=>{if(r.has(n))return r.get(n);let[a,u]=c(n);switch(a){case 0:{let t=n;switch(u){case"bigint":a=8,t=n.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+u);t=null;break;case"undefined":return s([-1],n)}return s([a,t],n)}case 1:{if(u)return s([u,[...n]],n);const e=[],t=s([a,e],n);for(const t of n)e.push(o(t));return t}case 2:{if(u)switch(u){case"BigInt":return s([u,n.toString()],n);case"Boolean":case"Number":case"String":return s([u,n.valueOf()],n)}if(t&&"toJSON"in n)return o(n.toJSON());const r=[],f=s([a,r],n);for(const t of i(n))!e&&l(c(n[t]))||r.push([o(t),o(n[t])]);return f}case 3:return s([a,n.toISOString()],n);case 4:{const{source:e,flags:t}=n;return s([a,{source:e,flags:t}],n)}case 5:{const t=[],r=s([a,t],n);for(const[r,s]of n)(e||!l(c(r))&&!l(c(s)))&&t.push([o(r),o(s)]);return r}case 6:{const t=[],r=s([a,t],n);for(const r of n)!e&&l(c(r))||t.push(o(r));return r}}const{message:f}=n;return s([a,{name:u,message:f}],n)};return o})(!(t||r),!!t,new Map,n)(e),n},{parse:f,stringify:p}=JSON,d={json:!0,lossy:!0};var h=Object.freeze({__proto__:null,parse:e=>s(f(e)),stringify:e=>p(u(e,d))}),w="2f6fe6d4-8ba8-424a-83c5-8fadca1ea103",y=e=>({value:new Promise((t=>{let r=new Worker("data:application/javascript,"+encodeURIComponent("onmessage=({data:b})=>(Atomics.wait(b,0),postMessage(0))"));r.onmessage=t,r.postMessage(e)}))}) +/*! (c) Andrea Giammarchi - ISC */;const{Int32Array:g,Map:m,SharedArrayBuffer:b,Uint16Array:v}=globalThis,{BYTES_PER_ELEMENT:A}=g,{BYTES_PER_ELEMENT:k}=v,{isArray:E}=Array,{notify:$,wait:j,waitAsync:P}=Atomics,{fromCharCode:R}=String,S=(e,t)=>e?(P||y)(t,0):(j(t,0),{value:{then:e=>e()}}),x=new WeakSet,M=new WeakMap;let W=0;const _=(e,{parse:t,stringify:r}=JSON)=>{if(!M.has(e)){const n=(t,...r)=>e.postMessage({[w]:r},{transfer:t});M.set(e,new Proxy(new m,{has:(e,t)=>"string"==typeof t&&!t.startsWith("_"),get:(r,s)=>"then"===s?null:(...r)=>{const o=W++;let a=new g(new b(A)),i=[];x.has(r.at(-1)||i)&&x.delete(i=r.pop()),n(i,o,a,s,r);const c=e instanceof Worker;return S(c,a).value.then((()=>{const e=a[0];if(!e)return;const r=k*e;return a=new g(new b(r+r%A)),n([],o,a),S(c,a).value.then((()=>t(R(...new v(a.buffer).slice(0,e)))))}))},set(t,n,s){if(!t.size){const n=new m;e.addEventListener("message",(async e=>{const s=e.data?.[w];if(E(s)){e.stopImmediatePropagation();const[o,a,...i]=s;if(i.length){const[e,s]=i;if(!t.has(e))throw new Error(`Unsupported action: ${e}`);{const i=r(await t.get(e)(...s));i&&(n.set(o,i),a[0]=i.length)}}else{const e=n.get(o);n.delete(o);for(let t=new v(a.buffer),r=0;r(x.add(e),e);const O="object",T="function",B="number",F="string",I="undefined",L="symbol",{defineProperty:C,getOwnPropertyDescriptor:G,getPrototypeOf:U,isExtensible:N,ownKeys:q,preventExtensions:z,set:D,setPrototypeOf:J}=Reflect,Y=U(Int8Array),H=(e,t)=>{const{get:r,set:n,value:s}=e;return r&&(e.get=t(r)),n&&(e.set=t(n)),s&&(e.value=t(s)),e},X=(e,t)=>[e,t],K=e=>t=>{const r=typeof t;switch(r){case O:if(null==t)return X("null",t);case T:return e(r,t);case"boolean":case B:case F:case I:case"bigint":return X(r,t);case L:if(Q.has(t))return X(r,Q.get(t))}throw new Error(`Unable to handle this ${r} type`)},Q=new Map(q(Symbol).filter((e=>typeof Symbol[e]===L)).map((e=>[Symbol[e],e]))),V=e=>{for(const[t,r]of Q)if(r===e)return t},Z="apply",ee="construct",te="defineProperty",re="deleteProperty",ne="get",se="getOwnPropertyDescriptor",oe="getPrototypeOf",ae="has",ie="isExtensible",ce="ownKeys",le="preventExtensions",ue="set",fe="setPrototypeOf",pe="delete";let de=0;const he=new Map,we=new Map,ye=new WeakMap;if(globalThis.window===globalThis){const{addEventListener:e}=EventTarget.prototype;C(EventTarget.prototype,"addEventListener",{value(t,r,...n){return n.at(0)?.invoke&&(ye.has(this)||ye.set(this,new Map),ye.get(this).set(t,[].concat(n[0].invoke)),delete n[0].invoke),e.call(this,t,r,...n)}})}const ge=K(((e,t)=>{if(!he.has(t)){let e;for(;we.has(e=de++););he.set(t,e),we.set(e,t)}return X(e,he.get(t))}));var me=(e,t,r)=>{const{[r]:n}=e,s=new FinalizationRegistry((e=>{n(pe,X(F,e))})),o=([e,t])=>{switch(e){case O:if(null==t)return globalThis;if(typeof t===B)return we.get(t);if(!(t instanceof Y))for(const e in t)t[e]=o(t[e]);return t;case T:if(typeof t===F){if(!we.has(t)){const e=function(...e){return e.at(0)instanceof Event&&(e=>{const{currentTarget:t,target:r,type:n}=e;for(const s of ye.get(t||r)?.get(n)||[])e[s]()})(...e),n(Z,X(T,t),ge(this),e.map(ge))},r=new WeakRef(e);we.set(t,r),s.register(e,t,r)}return we.get(t).deref()}return we.get(t);case L:return V(t)}return t},a={[Z]:(e,t,r)=>ge(e.apply(t,r)),[ee]:(e,t)=>ge(new e(...t)),[te]:(e,t,r)=>ge(C(e,t,r)),[re]:(e,t)=>ge(delete e[t]),[oe]:e=>ge(U(e)),[ne]:(e,t)=>ge(e[t]),[se]:(e,t)=>{const r=G(e,t);return r?X(O,H(r,ge)):X(I,r)},[ae]:(e,t)=>ge(t in e),[ie]:e=>ge(N(e)),[ce]:e=>X(O,q(e).map(ge)),[le]:e=>ge(z(e)),[ue]:(e,t,r)=>ge(D(e,t,r)),[fe]:(e,t)=>ge(J(e,t)),[pe](e){he.delete(we.get(e)),we.delete(e)}};return e[t]=(e,t,...r)=>{switch(e){case Z:r[0]=o(r[0]),r[1]=r[1].map(o);break;case ee:r[0]=r[0].map(o);break;case te:{const[e,t]=r;r[0]=o(e);const{get:n,set:s,value:a}=t;n&&(t.get=o(n)),s&&(t.set=o(s)),a&&(t.value=o(a));break}default:r=r.map(o)}return a[e](o(t),...r)},{proxy:e,window:globalThis,isWindowProxy:()=>!1}};let be=0;const ve=new Map,Ae=new Map,ke=Symbol(),Ee=e=>typeof e===T?e():e,$e=e=>typeof e===O&&!!e&&ke in e,je="isArray",Pe=Array[je],Re=K(((e,t)=>{if(ke in t)return Ee(t[ke]);if(e===T){if(!Ae.has(t)){let e;for(;Ae.has(e=String(be++)););ve.set(t,e),Ae.set(e,t)}return X(e,ve.get(t))}if(!(t instanceof Y))for(const e in t)t[e]=Re(t[e]);return X(e,t)}));var Se=(e,t,r)=>{const{[t]:n}=e,s=new Map,o=new FinalizationRegistry((e=>{s.delete(e),n(pe,Re(e))})),a=e=>{const[t,r]=e;if(!s.has(r)){const n=t===T?xe.bind(e):e,a=new Proxy(n,l),i=new WeakRef(a);s.set(r,i),o.register(a,r,i)}return s.get(r).deref()},i=e=>{const[t,r]=e;switch(t){case O:return typeof r===B?a(e):r;case T:return typeof r===F?Ae.get(r):a(e);case L:return V(r)}return r},c=(e,t,...r)=>i(n(e,Ee(t),...r)),l={[Z]:(e,t,r)=>c(Z,e,Re(t),r.map(Re)),[ee]:(e,t)=>c(ee,e,t.map(Re)),[te]:(e,t,r)=>{const{get:n,set:s,value:o}=r;return typeof n===T&&(r.get=Re(n)),typeof s===T&&(r.set=Re(s)),typeof o===T&&(r.value=Re(o)),c(te,e,Re(t),r)},[re]:(e,t)=>c(re,e,Re(t)),[oe]:e=>c(oe,e),[ne]:(e,t)=>t===ke?e:c(ne,e,Re(t)),[se]:(e,t)=>{const r=c(se,e,Re(t));return r&&H(r,i)},[ae]:(e,t)=>t===ke||c(ae,e,Re(t)),[ie]:e=>c(ie,e),[ce]:e=>c(ce,e).map(i),[le]:e=>c(le,e),[ue]:(e,t,r)=>c(ue,e,Re(t),Re(r)),[fe]:(e,t)=>c(fe,e,Re(t))};e[r]=(e,t,r,n)=>{switch(e){case Z:return i(t).apply(i(r),n.map(i));case pe:{const e=i(t);ve.delete(Ae.get(e)),Ae.delete(e)}}};const u=new Proxy([O,null],l),f=u.Array[je];return C(Array,je,{value:e=>$e(e)?f(e):Pe(e)}),{window:u,isWindowProxy:$e,proxy:e,get global(){return console.warn("Deprecated: please access `window` field instead"),this.window},get isGlobal(){return function(e){return console.warn("Deprecated: please access `isWindowProxy` field instead"),this.isWindowProxy(e)}.bind(this)}}};function xe(){return this}const Me=w+"M",We=w+"T",_e=new WeakMap,Oe=(e,...t)=>{const r=_(e,...t);if(!_e.has(r)){const t=e instanceof Worker?me:Se;_e.set(r,t(r,Me,We))}return _e.get(r)};Oe.transfer=_.transfer;const{isArray:Te}=Array,{assign:Be,create:Fe,defineProperties:Ie,defineProperty:Le}=Object,{all:Ce,resolve:Ge}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),Ue=(e,t=location.href)=>new URL(e,t).href,Ne=e=>e.arrayBuffer(),qe=e=>e.json(),ze=e=>e.text(),De=[["beforeRun","codeBeforeRunWorker"],["beforeRunAsync","codeBeforeRunWorkerAsync"],["afterRun","codeAfterRunWorker"],["afterRunAsync","codeAfterRunWorkerAsync"]];class Je{constructor(e,t){this.interpreter=e,this.onWorkerReady=t.onWorkerReady;for(const[e,r]of De)this[e]=t[r]?.()}get stringHooks(){const e={};for(const[t]of De)this[t]&&(e[t]=this[t]);return e}}var Ye=(...e)=>function(t,r){const n=new Worker(URL.createObjectURL(new Blob(['const e="object"==typeof self?self:globalThis,t=t=>((t,r)=>{const n=(e,r)=>(t.set(r,e),e),s=o=>{if(t.has(o))return t.get(o);const[a,i]=r[o];switch(a){case 0:case-1:return n(i,o);case 1:{const e=n([],o);for(const t of i)e.push(s(t));return e}case 2:{const e=n({},o);for(const[t,r]of i)e[s(t)]=s(r);return e}case 3:return n(new Date(i),o);case 4:{const{source:e,flags:t}=i;return n(new RegExp(e,t),o)}case 5:{const e=n(new Map,o);for(const[t,r]of i)e.set(s(t),s(r));return e}case 6:{const e=n(new Set,o);for(const t of i)e.add(s(t));return e}case 7:{const{name:t,message:r}=i;return n(new e[t](r),o)}case 8:return n(BigInt(i),o);case"BigInt":return n(Object(BigInt(i)),o)}return n(new e[a](i),o)};return s})(new Map,t)(0),r="",{toString:n}={},{keys:s}=Object,o=e=>{const t=typeof e;if("object"!==t||!e)return[0,t];const s=n.call(e).slice(8,-1);switch(s){case"Array":return[1,r];case"Object":return[2,r];case"Date":return[3,r];case"RegExp":return[4,r];case"Map":return[5,r];case"Set":return[6,r]}return s.includes("Array")?[1,s]:s.includes("Error")?[7,s]:[2,s]},a=([e,t])=>0===e&&("function"===t||"symbol"===t),i=(e,{json:t,lossy:r}={})=>{const n=[];return((e,t,r,n)=>{const i=(e,t)=>{const s=n.push(e)-1;return r.set(t,s),s},c=n=>{if(r.has(n))return r.get(n);let[l,u]=o(n);switch(l){case 0:{let t=n;switch(u){case"bigint":l=8,t=n.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+u);t=null;break;case"undefined":return i([-1],n)}return i([l,t],n)}case 1:{if(u)return i([u,[...n]],n);const e=[],t=i([l,e],n);for(const t of n)e.push(c(t));return t}case 2:{if(u)switch(u){case"BigInt":return i([u,n.toString()],n);case"Boolean":case"Number":case"String":return i([u,n.valueOf()],n)}if(t&&"toJSON"in n)return c(n.toJSON());const r=[],f=i([l,r],n);for(const t of s(n))!e&&a(o(n[t]))||r.push([c(t),c(n[t])]);return f}case 3:return i([l,n.toISOString()],n);case 4:{const{source:e,flags:t}=n;return i([l,{source:e,flags:t}],n)}case 5:{const t=[],r=i([l,t],n);for(const[r,s]of n)(e||!a(o(r))&&!a(o(s)))&&t.push([c(r),c(s)]);return r}case 6:{const t=[],r=i([l,t],n);for(const r of n)!e&&a(o(r))||t.push(c(r));return r}}const{message:f}=n;return i([l,{name:u,message:f}],n)};return c})(!(t||r),!!t,new Map,n)(e),n},{parse:c,stringify:l}=JSON,u={json:!0,lossy:!0};var f=Object.freeze({__proto__:null,parse:e=>t(c(e)),stringify:e=>l(i(e,u))}),p="2f6fe6d4-8ba8-424a-83c5-8fadca1ea103",d=e=>({value:new Promise((t=>{let r=new Worker("data:application/javascript,"+encodeURIComponent("onmessage=({data:b})=>(Atomics.wait(b,0),postMessage(0))"));r.onmessage=t,r.postMessage(e)}))})\n/*! (c) Andrea Giammarchi - ISC */;const{Int32Array:w,Map:y,SharedArrayBuffer:h,Uint16Array:g}=globalThis,{BYTES_PER_ELEMENT:m}=w,{BYTES_PER_ELEMENT:b}=g,{isArray:v}=Array,{notify:P,wait:E,waitAsync:S}=Atomics,{fromCharCode:j}=String,A=(e,t)=>e?(S||d)(t,0):(E(t,0),{value:{then:e=>e()}}),M=new WeakSet,k=new WeakMap;let x=0;const _=(e,{parse:t,stringify:r}=JSON)=>{if(!k.has(e)){const n=(t,...r)=>e.postMessage({[p]:r},{transfer:t});k.set(e,new Proxy(new y,{has:(e,t)=>"string"==typeof t&&!t.startsWith("_"),get:(r,s)=>"then"===s?null:(...r)=>{const o=x++;let a=new w(new h(m)),i=[];M.has(r.at(-1)||i)&&M.delete(i=r.pop()),n(i,o,a,s,r);const c=e instanceof Worker;return A(c,a).value.then((()=>{const e=a[0];if(!e)return;const r=b*e;return a=new w(new h(r+r%m)),n([],o,a),A(c,a).value.then((()=>t(j(...new g(a.buffer).slice(0,e)))))}))},set(t,n,s){if(!t.size){const n=new y;e.addEventListener("message",(async e=>{const s=e.data?.[p];if(v(s)){e.stopImmediatePropagation();const[o,a,...i]=s;if(i.length){const[e,s]=i;if(!t.has(e))throw new Error(`Unsupported action: ${e}`);{const i=r(await t.get(e)(...s));i&&(n.set(o,i),a[0]=i.length)}}else{const e=n.get(o);n.delete(o);for(let t=new g(a.buffer),r=0;r(M.add(e),e);const $="object",O="function",W="number",R="string",T="undefined",F="symbol",{defineProperty:B,getOwnPropertyDescriptor:I,getPrototypeOf:G,isExtensible:L,ownKeys:U,preventExtensions:N,set:z,setPrototypeOf:D}=Reflect,J=G(Int8Array),C=(e,t)=>{const{get:r,set:n,value:s}=e;return r&&(e.get=t(r)),n&&(e.set=t(n)),s&&(e.value=t(s)),e},q=(e,t)=>[e,t],K=e=>t=>{const r=typeof t;switch(r){case $:if(null==t)return q("null",t);case O:return e(r,t);case"boolean":case W:case R:case T:case"bigint":return q(r,t);case F:if(Y.has(t))return q(r,Y.get(t))}throw new Error(`Unable to handle this ${r} type`)},Y=new Map(U(Symbol).filter((e=>typeof Symbol[e]===F)).map((e=>[Symbol[e],e]))),V=e=>{for(const[t,r]of Y)if(r===e)return t},H="apply",Q="construct",X="defineProperty",Z="deleteProperty",ee="get",te="getOwnPropertyDescriptor",re="getPrototypeOf",ne="has",se="isExtensible",oe="ownKeys",ae="preventExtensions",ie="set",ce="setPrototypeOf",le="delete";let ue=0;const fe=new Map,pe=new Map,de=new WeakMap;if(globalThis.window===globalThis){const{addEventListener:e}=EventTarget.prototype;B(EventTarget.prototype,"addEventListener",{value(t,r,...n){return n.at(0)?.invoke&&(de.has(this)||de.set(this,new Map),de.get(this).set(t,[].concat(n[0].invoke)),delete n[0].invoke),e.call(this,t,r,...n)}})}const we=K(((e,t)=>{if(!fe.has(t)){let e;for(;pe.has(e=ue++););fe.set(t,e),pe.set(e,t)}return q(e,fe.get(t))}));var ye=(e,t,r)=>{const{[r]:n}=e,s=new FinalizationRegistry((e=>{n(le,q(R,e))})),o=([e,t])=>{switch(e){case $:if(null==t)return globalThis;if(typeof t===W)return pe.get(t);if(!(t instanceof J))for(const e in t)t[e]=o(t[e]);return t;case O:if(typeof t===R){if(!pe.has(t)){const e=function(...e){return e.at(0)instanceof Event&&(e=>{const{currentTarget:t,target:r,type:n}=e;for(const s of de.get(t||r)?.get(n)||[])e[s]()})(...e),n(H,q(O,t),we(this),e.map(we))},r=new WeakRef(e);pe.set(t,r),s.register(e,t,r)}return pe.get(t).deref()}return pe.get(t);case F:return V(t)}return t},a={[H]:(e,t,r)=>we(e.apply(t,r)),[Q]:(e,t)=>we(new e(...t)),[X]:(e,t,r)=>we(B(e,t,r)),[Z]:(e,t)=>we(delete e[t]),[re]:e=>we(G(e)),[ee]:(e,t)=>we(e[t]),[te]:(e,t)=>{const r=I(e,t);return r?q($,C(r,we)):q(T,r)},[ne]:(e,t)=>we(t in e),[se]:e=>we(L(e)),[oe]:e=>q($,U(e).map(we)),[ae]:e=>we(N(e)),[ie]:(e,t,r)=>we(z(e,t,r)),[ce]:(e,t)=>we(D(e,t)),[le](e){fe.delete(pe.get(e)),pe.delete(e)}};return e[t]=(e,t,...r)=>{switch(e){case H:r[0]=o(r[0]),r[1]=r[1].map(o);break;case Q:r[0]=r[0].map(o);break;case X:{const[e,t]=r;r[0]=o(e);const{get:n,set:s,value:a}=t;n&&(t.get=o(n)),s&&(t.set=o(s)),a&&(t.value=o(a));break}default:r=r.map(o)}return a[e](o(t),...r)},{proxy:e,window:globalThis,isWindowProxy:()=>!1}};let he=0;const ge=new Map,me=new Map,be=Symbol(),ve=e=>typeof e===O?e():e,Pe=e=>typeof e===$&&!!e&&be in e,Ee="isArray",Se=Array[Ee],je=K(((e,t)=>{if(be in t)return ve(t[be]);if(e===O){if(!me.has(t)){let e;for(;me.has(e=String(he++)););ge.set(t,e),me.set(e,t)}return q(e,ge.get(t))}if(!(t instanceof J))for(const e in t)t[e]=je(t[e]);return q(e,t)}));var Ae=(e,t,r)=>{const{[t]:n}=e,s=new Map,o=new FinalizationRegistry((e=>{s.delete(e),n(le,je(e))})),a=e=>{const[t,r]=e;if(!s.has(r)){const n=t===O?Me.bind(e):e,a=new Proxy(n,l),i=new WeakRef(a);s.set(r,i),o.register(a,r,i)}return s.get(r).deref()},i=e=>{const[t,r]=e;switch(t){case $:return typeof r===W?a(e):r;case O:return typeof r===R?me.get(r):a(e);case F:return V(r)}return r},c=(e,t,...r)=>i(n(e,ve(t),...r)),l={[H]:(e,t,r)=>c(H,e,je(t),r.map(je)),[Q]:(e,t)=>c(Q,e,t.map(je)),[X]:(e,t,r)=>{const{get:n,set:s,value:o}=r;return typeof n===O&&(r.get=je(n)),typeof s===O&&(r.set=je(s)),typeof o===O&&(r.value=je(o)),c(X,e,je(t),r)},[Z]:(e,t)=>c(Z,e,je(t)),[re]:e=>c(re,e),[ee]:(e,t)=>t===be?e:c(ee,e,je(t)),[te]:(e,t)=>{const r=c(te,e,je(t));return r&&C(r,i)},[ne]:(e,t)=>t===be||c(ne,e,je(t)),[se]:e=>c(se,e),[oe]:e=>c(oe,e).map(i),[ae]:e=>c(ae,e),[ie]:(e,t,r)=>c(ie,e,je(t),je(r)),[ce]:(e,t)=>c(ce,e,je(t))};e[r]=(e,t,r,n)=>{switch(e){case H:return i(t).apply(i(r),n.map(i));case le:{const e=i(t);ge.delete(me.get(e)),me.delete(e)}}};const u=new Proxy([$,null],l),f=u.Array[Ee];return B(Array,Ee,{value:e=>Pe(e)?f(e):Se(e)}),{window:u,isWindowProxy:Pe,proxy:e,get global(){return console.warn("Deprecated: please access `window` field instead"),this.window},get isGlobal(){return function(e){return console.warn("Deprecated: please access `isWindowProxy` field instead"),this.isWindowProxy(e)}.bind(this)}}};function Me(){return this}const ke=p+"M",xe=p+"T",_e=new WeakMap,$e=(e,...t)=>{const r=_(e,...t);if(!_e.has(r)){const t=e instanceof Worker?ye:Ae;_e.set(r,t(r,ke,xe))}return _e.get(r)};$e.transfer=_.transfer;const{isArray:Oe}=Array,{assign:We,create:Re,defineProperties:Te,defineProperty:Fe}=Object,{all:Be,resolve:Ie}=new Proxy(Promise,{get:(e,t)=>e[t].bind(e)}),Ge=(e,t=location.href)=>new URL(e,t).href;Promise.withResolvers||(Promise.withResolvers=function(){var e,t,r=new this((function(r,n){e=r,t=n}));return{resolve:e,reject:t,promise:r}});const Le=e=>e.arrayBuffer(),Ue=e=>e.json(),Ne=e=>e.text(),ze=e=>e.replace(/^[^\\r\\n]+$/,(e=>e.trim())),De=new WeakMap,Je=e=>{const t=e||console,r={stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>r.stderr(...e),stdout:(...e)=>r.stdout(...e),async get(e){const t=await e;return De.set(t,r),t}}},Ce=e=>{const t=e.split("/");return t.pop(),t.join("/")},qe=(e,t)=>{const r=[];for(const n of t.split("/"))r.push(n),n&&e.mkdir(r.join("/"))},Ke=(e,t)=>{const r=[];for(const e of t.split("/"))switch(e){case"":case".":break;case"..":r.pop();break;default:r.push(e)}return[e.cwd()].concat(r).join("/").replace(/^\\/+/,"/")},Ye=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,""))).filter((e=>""!==e&&"."!==e)).join("/");return e[0].startsWith("/")?`/${t}`:t},Ve=new WeakMap,He=(e,t,r)=>Be((e=>{for(const{files:t,to_file:r,from:n=""}of e){if(void 0!==t&&void 0!==r)throw new Error("Cannot use \'to_file\' and \'files\' parameters together!");if(void 0===t&&void 0===r&&n.endsWith("/"))throw new Error(`Couldn\'t determine the filename from the path ${n}, please supply \'to_file\' parameter.`)}return e.flatMap((({from:e="",to_folder:t=".",to_file:r,files:n})=>{if(Oe(n))return n.map((r=>({url:Ye([e,r]),path:Ye([t,r])})));const s=r||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:Ye([t,s])}]}))})(r).map((({url:n,path:s})=>((e,t)=>fetch(Ge(t,Ve.get(e))))(r,n).then(Le).then((r=>e.writeFile(t,s,r)))))),Qe=(e,t)=>e.runPython(ze(t)),Xe=(e,t,r)=>{e.globals.set(t,r)},Ze=(e,t)=>{e.globals.delete(t)},et=({FS:e},t,r)=>((e,t,r)=>{const{parentPath:n,name:s}=e.analyzePath(t,!0);return e.mkdirTree(n),e.writeFile([n,s].join("/"),new Uint8Array(r),{canOwn:!0})})(e,t,r);var tt={type:"micropython",module:(e="1.20.0-268")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,r){const{stderr:n,stdout:s,get:o}=Je();r=r.replace(/\\.m?js$/,".wasm");const a=await o(e({stderr:n,stdout:s,url:r}));return t.fetch&&await He(this,a,t.fetch),a},setGlobal:Xe,deleteGlobal:Ze,run:Qe,async runAsync(...e){return this.run(...e)},writeFile:et};var rt={type:"pyodide",module:(e="0.23.2")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,r){const{stderr:n,stdout:s,get:o}=Je(),a=r.slice(0,r.lastIndexOf("/")),i=await o(e({stderr:n,stdout:s,indexURL:a}));if(t.fetch&&await He(this,i,t.fetch),t.packages){await i.loadPackage("micropip");const e=await i.pyimport("micropip");await e.install(t.packages),e.destroy()}return i},setGlobal:Xe,deleteGlobal:Ze,run:Qe,runAsync:(e,t)=>e.runPythonAsync(ze(t)),writeFile:et};const nt="ruby-wasm-wasi";var st={type:nt,experimental:!0,module:(e="2.0.0")=>`https://cdn.jsdelivr.net/npm/ruby-3_2-wasm-wasi@${e}/dist/browser.esm.js`,async engine({DefaultRubyVM:e},t,r){const n=await fetch(`${r.slice(0,r.lastIndexOf("/"))}/ruby.wasm`),s=await WebAssembly.compile(await n.arrayBuffer()),{vm:o}=await e(s);return t.fetch&&await He(this,o,t.fetch),o},setGlobal(e,t,r){const n=`__pyscript_ruby_wasm_wasi_${t}`;globalThis[n]=r,this.run(e,`require "js";$${t}=JS::eval("return ${n}")`)},deleteGlobal(e,t){const r=`__pyscript_ruby_wasm_wasi_${t}`;this.run(e,`$${t}=nil`),delete globalThis[r]},run:(e,t)=>e.eval(ze(t)),runAsync:(e,t)=>e.evalAsync(ze(t)),writeFile:()=>{throw new Error(`writeFile is not supported in ${nt}`)}};var ot={type:"wasmoon",module:(e="1.15.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},r){const{stderr:n,stdout:s,get:o}=Je(),a=await o((new e).createEngine());return a.global.getTable(t.Base,(e=>{a.global.setField(e,"print",s),a.global.setField(e,"printErr",n)})),r.fetch&&await He(this,a,r.fetch),a},setGlobal(e,t,r){e.global.set(t,r)},deleteGlobal(e,t){e.global.set(t,void 0)},run:(e,t)=>e.doStringSync(ze(t)),runAsync:(e,t)=>e.doString(ze(t)),writeFile:({cmodule:{module:{FS:e}}},t,r)=>((e,t,r)=>(t=Ke(e,t),qe(e,Ce(t)),e.writeFile(t,new Uint8Array(r),{canOwn:!0})))(e,t,r)};const at=new Map,it=new Map,ct=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[r,...n]=t.split("@"),s=at.get(r),o=/^https?:\\/\\//i.test(n)?n.join("@"):s.module(...n);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:r,module:n,engine:s}=e.get(t);return(e,o)=>n.then((n=>{it.set(t,e);const a=e?.fetch;return a&&Ve.set(a,o),s(n,e,r)}))}}),lt=e=>{for(const t of[].concat(e.type))at.set(t,e)};for(const e of[tt,rt,st,ot])lt(e);const ut=async e=>(await import("https://cdn.jsdelivr.net/npm/basic-toml@0.3.1/es.js")).parse(e);try{new SharedArrayBuffer(4)}catch(e){throw new Error(["Unable to use SharedArrayBuffer due insecure environment.","Please read requirements in MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer#security_requirements"].join("\\n"))}let ft,pt,dt;const wt=(e,t)=>{addEventListener(e,t||(async t=>{await ft,dt=t,pt(`xworker.on${e}(xworker.event);`,mt)}),!!t&&{once:!0})},{proxy:yt,window:ht,isWindowProxy:gt}=$e(self,f),mt={sync:yt,window:ht,isWindowProxy:gt,onerror(){},onmessage(){},onmessageerror(){},postMessage:postMessage.bind(self),get event(){const e=dt;if(!e)throw new Error("Unauthorized event access");return dt=void 0,e}};wt("message",(({data:{options:e,code:t,hooks:r}})=>{ft=(async()=>{const{type:n,version:s,config:o,async:a}=e,i=await((e,t)=>{let r={};if(t)if(t.endsWith(".json"))r=fetch(t).then(Ue);else if(t.endsWith(".toml"))r=fetch(t).then(Ne).then(ut);else{try{r=JSON.parse(t)}catch(e){r=ut(t)}t=Ge("./config.txt")}return Ie(r).then((r=>ct[e](r,t)))})(((e,t="")=>`${e}@${t}`.replace(/@$/,""))(n,s),o),c=Re(at.get(n)),l="run"+(a?"Async":"");if(r){const{beforeRun:e,beforeRunAsync:t,afterRun:n,afterRunAsync:s}=r,o=n||s,a=e||t;if(o){const e=c[l].bind(c);c[l]=(t,r)=>e(t,`${r}\\n${o}`)}if(a){const e=c[l].bind(c);c[l]=(t,r)=>e(t,`${a}\\n${r}`)}}return c.setGlobal(i,"xworker",mt),pt=c[l].bind(c,i),pt(t),i})(),wt("error"),wt("message"),wt("messageerror")}));\n'],{type:"application/javascript"})),{type:"module"}),{postMessage:s}=n,o=this instanceof Je;if(e.length){const[t,n]=e;(r=Be({},r||{type:t,version:n})).type||(r.type=t)}r?.config&&(r.config=Ue(r.config));const a=fetch(t).then(ze).then((e=>{const t=o?this.stringHooks:void 0;s.call(n,{options:r,code:e,hooks:t})}));return Ie(n,{postMessage:{value:(e,...t)=>a.then((()=>s.call(n,e,...t)))},sync:{value:Oe(n,h).proxy}}),o&&this.onWorkerReady?.(this.interpreter,n),n};const He=e=>e.replace(/^[^\r\n]+$/,(e=>e.trim())),Xe=new WeakMap,Ke=e=>{const t=e||console,r={stderr:(t.stderr||console.error).bind(t),stdout:(t.stdout||console.log).bind(t)};return{stderr:(...e)=>r.stderr(...e),stdout:(...e)=>r.stdout(...e),async get(e){const t=await e;return Xe.set(t,r),t}}},Qe=e=>{const t=e.split("/");return t.pop(),t.join("/")},Ve=(e,t)=>{const r=[];for(const n of t.split("/"))r.push(n),n&&e.mkdir(r.join("/"))},Ze=(e,t)=>{const r=[];for(const e of t.split("/"))switch(e){case"":case".":break;case"..":r.pop();break;default:r.push(e)}return[e.cwd()].concat(r).join("/").replace(/^\/+/,"/")},et=e=>{const t=e.map((e=>e.trim().replace(/(^[/]*|[/]*$)/g,""))).filter((e=>""!==e&&"."!==e)).join("/");return e[0].startsWith("/")?`/${t}`:t},tt=new WeakMap,rt=(e,t,r)=>Ce((e=>{for(const{files:t,to_file:r,from:n=""}of e){if(void 0!==t&&void 0!==r)throw new Error("Cannot use 'to_file' and 'files' parameters together!");if(void 0===t&&void 0===r&&n.endsWith("/"))throw new Error(`Couldn't determine the filename from the path ${n}, please supply 'to_file' parameter.`)}return e.flatMap((({from:e="",to_folder:t=".",to_file:r,files:n})=>{if(Te(n))return n.map((r=>({url:et([e,r]),path:et([t,r])})));const s=r||e.slice(1+e.lastIndexOf("/"));return[{url:e,path:et([t,s])}]}))})(r).map((({url:n,path:s})=>((e,t)=>fetch(Ue(t,tt.get(e))))(r,n).then(Ne).then((r=>e.writeFile(t,s,r)))))),nt=(e,t)=>e.runPython(He(t)),st=(e,t,r)=>{e.globals.set(t,r)},ot=(e,t)=>{e.globals.delete(t)},at=({FS:e},t,r)=>((e,t,r)=>{const{parentPath:n,name:s}=e.analyzePath(t,!0);return e.mkdirTree(n),e.writeFile([n,s].join("/"),new Uint8Array(r),{canOwn:!0})})(e,t,r);var it={type:"micropython",module:(e="1.20.0-268")=>`https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@${e}/micropython.mjs`,async engine({loadMicroPython:e},t,r){const{stderr:n,stdout:s,get:o}=Ke();r=r.replace(/\.m?js$/,".wasm");const a=await o(e({stderr:n,stdout:s,url:r}));return t.fetch&&await rt(this,a,t.fetch),a},setGlobal:st,deleteGlobal:ot,run:nt,async runAsync(...e){return this.run(...e)},writeFile:at};var ct={type:"pyodide",module:(e="0.23.2")=>`https://cdn.jsdelivr.net/pyodide/v${e}/full/pyodide.mjs`,async engine({loadPyodide:e},t,r){const{stderr:n,stdout:s,get:o}=Ke(),a=r.slice(0,r.lastIndexOf("/")),i=await o(e({stderr:n,stdout:s,indexURL:a}));if(t.fetch&&await rt(this,i,t.fetch),t.packages){await i.loadPackage("micropip");const e=await i.pyimport("micropip");await e.install(t.packages),e.destroy()}return i},setGlobal:st,deleteGlobal:ot,run:nt,runAsync:(e,t)=>e.runPythonAsync(He(t)),writeFile:at};const lt="ruby-wasm-wasi";var ut={type:lt,experimental:!0,module:(e="2.0.0")=>`https://cdn.jsdelivr.net/npm/ruby-3_2-wasm-wasi@${e}/dist/browser.esm.js`,async engine({DefaultRubyVM:e},t,r){const n=await fetch(`${r.slice(0,r.lastIndexOf("/"))}/ruby.wasm`),s=await WebAssembly.compile(await n.arrayBuffer()),{vm:o}=await e(s);return t.fetch&&await rt(this,o,t.fetch),o},setGlobal(e,t,r){const n=`__pyscript_ruby_wasm_wasi_${t}`;globalThis[n]=r,this.run(e,`require "js";$${t}=JS::eval("return ${n}")`)},deleteGlobal(e,t){const r=`__pyscript_ruby_wasm_wasi_${t}`;this.run(e,`$${t}=nil`),delete globalThis[r]},run:(e,t)=>e.eval(He(t)),runAsync:(e,t)=>e.evalAsync(He(t)),writeFile:()=>{throw new Error(`writeFile is not supported in ${lt}`)}};var ft={type:"wasmoon",module:(e="1.15.0")=>`https://cdn.jsdelivr.net/npm/wasmoon@${e}/+esm`,async engine({LuaFactory:e,LuaLibraries:t},r){const{stderr:n,stdout:s,get:o}=Ke(),a=await o((new e).createEngine());return a.global.getTable(t.Base,(e=>{a.global.setField(e,"print",s),a.global.setField(e,"printErr",n)})),r.fetch&&await rt(this,a,r.fetch),a},setGlobal(e,t,r){e.global.set(t,r)},deleteGlobal(e,t){e.global.set(t,void 0)},run:(e,t)=>e.doStringSync(He(t)),runAsync:(e,t)=>e.doString(He(t)),writeFile:({cmodule:{module:{FS:e}}},t,r)=>((e,t,r)=>(t=Ze(e,t),Ve(e,Qe(t)),e.writeFile(t,new Uint8Array(r),{canOwn:!0})))(e,t,r)};const pt=new Map,dt=new Map,ht=[],wt=[],yt=new Proxy(new Map,{get(e,t){if(!e.has(t)){const[r,...n]=t.split("@"),s=pt.get(r),o=/^https?:\/\//i.test(n)?n.join("@"):s.module(...n);e.set(t,{url:o,module:import(o),engine:s.engine.bind(s)})}const{url:r,module:n,engine:s}=e.get(t);return(e,o)=>n.then((n=>{dt.set(t,e);const a=e?.fetch;return a&&tt.set(a,o),s(n,e,r)}))}}),gt=e=>{for(const t of[].concat(e.type))pt.set(t,e),ht.push(`script[type="${t}"]`),wt.push(`${t}-`)};for(const e of[it,ct,ut,ft])gt(e);const mt=async e=>(await import("https://cdn.jsdelivr.net/npm/basic-toml@0.3.1/es.js")).parse(e),bt=(e,t)=>{let r={};if(t)if(t.endsWith(".json"))r=fetch(t).then(qe);else if(t.endsWith(".toml"))r=fetch(t).then(ze).then(mt);else{try{r=JSON.parse(t)}catch(e){r=mt(t)}t=Ue("./config.txt")}return Ge(r).then((r=>yt[e](r,t)))},vt=(e,t="")=>`${e}@${t}`.replace(/@$/,""),At=(t,r)=>{const n=(e=>{let t=e;for(;t.parentNode;)t=t.parentNode;return t})(t);return n.getElementById(r)||e(r,n)},kt=new WeakMap,Et={get(){let e=kt.get(this);return e||(e=document.createElement(`${this.type}-script`),kt.set(this,e),St(this)),e},set(e){"string"==typeof e?kt.set(this,At(this,e)):(kt.set(this,e),St(this))}},$t=new WeakMap,jt=new Map,Pt=(e,t)=>{const r=e?.value;return r?t+r:""},Rt=(e,t,r,n,s)=>{if(!jt.has(t)){const o={interpreter:bt(r,s),queue:Ge(),XWorker:Ye(e,n)};jt.set(t,o),jt.has(e)||jt.set(e,o)}return jt.get(t)},St=async e=>{if($t.has(e)){const{target:t}=e;t&&(e.closest("head")?document.body.append(t):e.after(t))}else{const{attributes:{async:t,config:r,env:n,target:s,version:o},src:a,type:i}=e,c=o?.value,l=vt(i,c),u=Pt(s,"");let f=Pt(r,"|");const p=Pt(n,"")||`${l}${f}`;f=f.slice(1),f&&(f=Ue(f));const d=Rt(i,p,l,c,f);$t.set(Le(e,"target",Et),d),u&&kt.set(e,At(e,u));const h=a?fetch(a).then(ze):e.textContent;d.queue=d.queue.then((()=>(async(e,t,r,n)=>{const s=pt.get(e.type);s.experimental&&console.warn(`The ${e.type} interpreter is experimental`);const[o,a]=await Ce([$t.get(e).interpreter,t]);try{return Le(document,"currentScript",{configurable:!0,get:()=>e}),s.setGlobal(o,"XWorker",r),s[n?"runAsync":"run"](o,a)}finally{delete document.currentScript,s.deleteGlobal(o,"XWorker")}})(e,h,d.XWorker,!!t)))}};Le(globalThis,"pyscript",{value:{env:new Proxy(Fe(null),{get:(e,t)=>xt(t)})}});const xt=async e=>{if(jt.has(e)){const{interpreter:t,queue:r}=jt.get(e);return(await Ce([t,r]))[0]}const t=jt.size?`Available interpreters are: ${[...jt.keys()].map((e=>`"${e}"`)).join(", ")}.`:"There are no interpreters in this page.";throw new Error(`The interpreter "${e}" was not found. ${t}`)},Mt=async e=>{const{type:t,currentTarget:n}=e;for(let{name:s,value:o,ownerElement:a}of r(`./@*[${wt.map((e=>`name()="${e}${t}"`)).join(" or ")}]`,n)){s=s.slice(0,-(t.length+1));const r=await xt(a.getAttribute(`${s}-env`)||s),n=pt.get(s);try{n.setGlobal(r,"event",e),n.run(r,o)}finally{n.deleteGlobal(r,"event")}}},Wt=e=>{for(let{name:t,ownerElement:n}of r(`.//@*[${wt.map((e=>`starts-with(name(),"${e}")`)).join(" or ")}]`,e))t=t.slice(t.lastIndexOf("-")+1),"env"!==t&&n.addEventListener(t,Mt)},_t=[],Ot=new Map,Tt=new Map,Bt=e=>{for(const t of _t)if(e.matches(t)){const r=Ot.get(t),{resolve:n}=Tt.get(r),{options:s,known:o}=Ft.get(r);if(!o.has(e)){o.add(e);const{interpreter:t,version:a,config:i,env:c,onInterpreterReady:l}=s,u=vt(t,a),f=c||`${u}${i?`|${i}`:""}`,{interpreter:p,XWorker:d}=Rt(t,f,u,a,i);p.then((o=>{const a=Fe(pt.get(t)),{onBeforeRun:i,onBeforeRunAsync:c,onAfterRun:f,onAfterRunAsync:p}=s,h=new Je(o,s),w=function(...e){return d.apply(h,e)};for(const[t,[r,n]]of[["run",[i,f]]]){const s=a[t];a[t]=function(t,o){r&&r.call(this,y,e);const a=s.call(this,t,o);return n&&n.call(this,y,e),a}}for(const[t,[r,n]]of[["runAsync",[c,p]]]){const s=a[t];a[t]=async function(t,o){r&&await r.call(this,y,e);const a=await s.call(this,t,o);return n&&await n.call(this,y,e),a}}a.setGlobal(o,"XWorker",w);const y={type:r,interpreter:o,XWorker:w,io:Xe.get(o),config:structuredClone(dt.get(u)),run:a.run.bind(a,o),runAsync:a.runAsync.bind(a,o)};n(y),l?.(y,e)}))}}},Ft=new Map,It=e=>(Tt.has(e)||Tt.set(e,Promise.withResolvers()),Tt.get(e).promise),Lt=ht.join(","),Ct=new MutationObserver((e=>{for(const{type:r,target:n,attributeName:s,addedNodes:o}of e)if("attributes"!==r){for(const e of o)if(1===e.nodeType)if(Wt(e),e.matches(Lt))St(e);else{if(t(Lt,e).forEach(St),!_t.length)continue;Bt(e),t(_t.join(","),e).forEach(Bt)}}else{const e=s.lastIndexOf("-")+1;if(e){const t=s.slice(0,e);for(const r of wt)if(t===r){const t=s.slice(e);if("env"!==t){const e=n.hasAttribute(s)?"add":"remove";n[`${e}EventListener`](t,Mt)}break}}}})),Gt=e=>(Ct.observe(e,{childList:!0,subtree:!0,attributes:!0}),e),{attachShadow:Ut}=Element.prototype;Be(Element.prototype,{attachShadow(e){return Gt(Ut.call(this,e))}}),Wt(Gt(document)),t(Lt,document).forEach(St);const Nt="PY0001",qt="PY0401",zt="PY0403",Dt="PY0404",Jt="PY0500",Yt="PY0503";class Ht extends Error{constructor(e,t="",r="text"){super(`(${e}): ${t}`),this.errorCode=e,this.messageType=r,this.name="UserError"}}class Xt extends Ht{constructor(e,t){super(e,t),this.name="FetchError"}}async function Kt(e,t){let r;try{r=await fetch(e,t)}catch(t){const r=t;let n;throw n=e.startsWith("http")?`Fetching from URL ${e} failed with error '${r.message}'. Are your filename and path correct?`:'PyScript: Access to local files\n (using [[fetch]] configurations in <py-config>)\n is not available when directly opening a HTML file;\n you must use a webserver to serve the additional files.\n See this reference\n on starting a simple webserver with Python.\n ',new Xt(Nt,n)}if(!r.ok){const t=`Fetching from URL ${e} failed with error ${r.status} (${r.statusText}). Are your filename and path correct?`;switch(r.status){case 404:throw new Xt(Dt,t);case 401:throw new Xt(qt,t);case 403:throw new Xt(zt,t);case 500:throw new Xt(Jt,t);case 503:throw new Xt(Yt,t);default:throw new Xt(Nt,t)}}return r}document.head.appendChild(document.createElement("style")).textContent="\n py-script, py-config {\n display: none;\n }\n",(async()=>{let r=0;const n=(e="py")=>`${e}-${r++}`;let s,o=e("py-config");o?s=o.getAttribute("src")||o.textContent:(o=e('script[type="py"]'),s=o?.getAttribute("config")),/^https?:\/\//.test(s)&&(s=await Kt(s).then(ze));const a=e=>"SCRIPT"===e.tagName,i=e=>{Le(document,"currentScript",{configurable:!0,get:()=>e})},c=()=>{delete document.currentScript},l=async e=>{if(e.hasAttribute("src"))try{return(await Kt(e.getAttribute("src"))).then(ze)}catch(e){throw alert(e.message),e}return e.textContent},u=(e,t,r,n)=>{a(t)&&r(t);for(const r of Qt[n])r(e,t)},f=e=>`\n # this code is just for demo purpose but the basics work\n def _display(what, target="${a(e)?e.target.id:e.id}", append=True):\n from js import document\n element = document.getElementById(target)\n element.textContent = what\n display = _display\n `;((e,r)=>{if(pt.has(e)||Ft.has(e))throw new Error(`",\n}\n\n\n# these are set by _set_version_info\n__version__ = None\nversion_info = None\n\n\ndef _set_version_info(version_from_interpreter: str):\n """Sets the __version__ and version_info properties from provided JSON data\n Args:\n version_from_interpreter (str): A "dotted" representation of the version:\n YYYY.MM.m(m).releaselevel\n Year, Month, and Minor should be integers; releaselevel can be any string\n """\n global __version__\n global version_info\n\n __version__ = version_from_interpreter\n\n version_parts = version_from_interpreter.split(".")\n year = int(version_parts[0])\n month = int(version_parts[1])\n minor = int(version_parts[2])\n if len(version_parts) > 3:\n releaselevel = version_parts[3]\n else:\n releaselevel = ""\n\n VersionInfo = namedtuple("version_info", ("year", "month", "minor", "releaselevel"))\n version_info = VersionInfo(year, month, minor, releaselevel)\n\n # we ALSO set PyScript.__version__ and version_info for backwards\n # compatibility. Should be killed eventually.\n PyScript.__version__ = __version__\n PyScript.version_info = version_info\n\n\nclass HTML:\n """\n Wrap a string so that display() can render it as plain HTML\n """\n\n def __init__(self, html):\n self._html = html\n\n def _repr_html_(self):\n return self._html\n\n\ndef eval_formatter(obj, print_method):\n """\n Evaluates a formatter method.\n """\n if print_method == "__repr__":\n return repr(obj)\n elif hasattr(obj, print_method):\n if print_method == "savefig":\n buf = io.BytesIO()\n obj.savefig(buf, format="png")\n buf.seek(0)\n return base64.b64encode(buf.read()).decode("utf-8")\n return getattr(obj, print_method)()\n elif print_method == "_repr_mimebundle_":\n return {}, {}\n return None\n\n\ndef format_mime(obj):\n """\n Formats object using _repr_x_ methods.\n """\n if isinstance(obj, str):\n return html.escape(obj), "text/plain"\n\n mimebundle = eval_formatter(obj, "_repr_mimebundle_")\n if isinstance(mimebundle, tuple):\n format_dict, _ = mimebundle\n else:\n format_dict = mimebundle\n\n output, not_available = None, []\n for method, mime_type in reversed(MIME_METHODS.items()):\n if mime_type in format_dict:\n output = format_dict[mime_type]\n else:\n output = eval_formatter(obj, method)\n\n if output is None:\n continue\n elif mime_type not in MIME_RENDERERS:\n not_available.append(mime_type)\n continue\n break\n if output is None:\n if not_available:\n js.console.warn(\n f"Rendered object requested unavailable MIME renderers: {not_available}"\n )\n output = repr(output)\n mime_type = "text/plain"\n elif isinstance(output, tuple):\n output, meta = output\n else:\n meta = {}\n return MIME_RENDERERS[mime_type](output, meta), mime_type\n\n\ndef run_until_complete(f):\n _ = loop.run_until_complete(f)\n\n\ndef write(element_id, value, append=False, exec_id=0):\n """Writes value to the element with id "element_id"""\n Element(element_id).write(value=value, append=append)\n js.console.warn(\n dedent(\n """PyScript Deprecation Warning: PyScript.write is\n marked as deprecated and will be removed sometime soon. Please, use\n Element().write instead."""\n )\n )\n\n\ndef set_current_display_target(target_id):\n get_current_display_target._id = target_id\n\n\ndef get_current_display_target():\n return get_current_display_target._id\n\n\nget_current_display_target._id = None\n\n\ndef display(*values, target=None, append=True):\n default_target = get_current_display_target()\n if default_target is None and target is None:\n raise Exception(\n "Implicit target not allowed here. Please use display(..., target=...)"\n )\n if target is not None:\n for v in values:\n Element(target).write(v, append=append)\n else:\n for v in values:\n Element(default_target).write(v, append=append)\n\n\nclass Element:\n def __init__(self, element_id, element=None):\n self._id = element_id\n self._element = element\n\n @property\n def id(self):\n return self._id\n\n @property\n def element(self):\n """Return the dom element"""\n if not self._element:\n self._element = js.document.querySelector(f"#{self._id}")\n return self._element\n\n @property\n def value(self):\n return self.element.value\n\n @property\n def innerHtml(self):\n return self.element.innerHTML\n\n def write(self, value, append=False):\n html, mime_type = format_mime(value)\n if html == "\\n":\n return\n\n if append:\n child = js.document.createElement("div")\n self.element.appendChild(child)\n\n if append and self.element.children:\n out_element = self.element.children[-1]\n else:\n out_element = self.element\n\n if mime_type in ("application/javascript", "text/html"):\n script_element = js.document.createRange().createContextualFragment(html)\n out_element.appendChild(script_element)\n else:\n out_element.innerHTML = html\n\n def clear(self):\n if hasattr(self.element, "value"):\n self.element.value = ""\n else:\n self.write("", append=False)\n\n def select(self, query, from_content=False):\n el = self.element\n\n if from_content:\n el = el.content\n\n _el = el.querySelector(query)\n if _el:\n return Element(_el.id, _el)\n else:\n js.console.warn(f"WARNING: can\'t find element matching query {query}")\n\n def clone(self, new_id=None, to=None):\n if new_id is None:\n new_id = self.element.id\n\n clone = self.element.cloneNode(True)\n clone.id = new_id\n\n if to:\n to.element.appendChild(clone)\n # Inject it into the DOM\n to.element.after(clone)\n else:\n # Inject it into the DOM\n self.element.after(clone)\n\n return Element(clone.id, clone)\n\n def remove_class(self, classname):\n if isinstance(classname, list):\n for cl in classname:\n self.remove_class(cl)\n else:\n self.element.classList.remove(classname)\n\n def add_class(self, classname):\n if isinstance(classname, list):\n for cl in classname:\n self.element.classList.add(cl)\n else:\n self.element.classList.add(classname)\n\n\ndef add_classes(element, class_list):\n for klass in class_list.split(" "):\n element.classList.add(klass)\n\n\ndef create(what, id_=None, classes=""):\n element = js.document.createElement(what)\n if id_:\n element.id = id_\n add_classes(element, classes)\n return Element(id_, element)\n\n\nclass PyWidgetTheme:\n def __init__(self, main_style_classes):\n self.main_style_classes = main_style_classes\n\n def theme_it(self, widget):\n for klass in self.main_style_classes.split(" "):\n widget.classList.add(klass)\n\n\nclass PyItemTemplate(Element):\n label_fields = None\n\n def __init__(self, data, labels=None, state_key=None, parent=None):\n self.data = data\n\n self.register_parent(parent)\n\n if not labels:\n labels = list(self.data.keys())\n self.labels = labels\n\n self.state_key = state_key\n\n super().__init__(self._id)\n\n def register_parent(self, parent):\n self._parent = parent\n if parent:\n self._id = f"{self._parent._id}-c-{len(self._parent._children)}"\n self.data["id"] = self._id\n else:\n self._id = None\n\n def create(self):\n new_child = create("div", self._id, "py-li-element")\n new_child._element.innerHTML = dedent(\n f"""\n \n """\n )\n return new_child\n\n def on_click(self, evt):\n pass\n\n def pre_append(self):\n pass\n\n def post_append(self):\n self.element.click = self.on_click\n self.element.onclick = self.on_click\n\n self._post_append()\n\n def _post_append(self):\n pass\n\n def strike(self, value, extra=None):\n if value:\n self.add_class("line-through")\n else:\n self.remove_class("line-through")\n\n def render_content(self):\n return " - ".join([self.data[f] for f in self.labels])\n\n\nclass PyListTemplate:\n theme = PyWidgetTheme("py-li-element")\n item_class = PyItemTemplate\n\n def __init__(self, parent):\n self.parent = parent\n self._children = []\n self._id = self.parent.id\n\n @property\n def children(self):\n return self._children\n\n @property\n def data(self):\n return [c.data for c in self._children]\n\n def render_children(self):\n binds = {}\n for i, c in enumerate(self._children):\n txt = c.element.innerHTML\n rnd = str(time.time()).replace(".", "")[-5:]\n new_id = f"{c.element.id}-{i}-{rnd}"\n binds[new_id] = c.element.id\n txt = txt.replace(">", f" id=\'{new_id}\'>")\n print(txt)\n\n def foo(evt):\n evtEl = evt.srcElement\n srcEl = Element(binds[evtEl.id])\n srcEl.element.onclick()\n evtEl.classList = srcEl.element.classList\n\n for new_id in binds:\n Element(new_id).element.onclick = foo\n\n def connect(self):\n self.md = main_div = js.document.createElement("div")\n main_div.id = self._id + "-list-tasks-container"\n\n if self.theme:\n self.theme.theme_it(main_div)\n\n self.parent.appendChild(main_div)\n\n def add(self, *args, **kws):\n if not isinstance(args[0], self.item_class):\n child = self.item_class(*args, **kws)\n else:\n child = args[0]\n child.register_parent(self)\n return self._add(child)\n\n def _add(self, child_elem):\n self.pre_child_append(child_elem)\n child_elem.pre_append()\n self._children.append(child_elem)\n self.md.appendChild(child_elem.create().element)\n child_elem.post_append()\n self.child_appended(child_elem)\n return child_elem\n\n def pre_child_append(self, child):\n pass\n\n def child_appended(self, child):\n """Overwrite me to define logic"""\n pass\n\n\nclass TopLevelAsyncFinder(ast.NodeVisitor):\n def is_source_top_level_await(self, source):\n self.async_found = False\n node = ast.parse(source)\n self.generic_visit(node)\n return self.async_found\n\n def visit_Await(self, node):\n self.async_found = True\n\n def visit_AsyncFor(self, node):\n self.async_found = True\n\n def visit_AsyncWith(self, node):\n self.async_found = True\n\n def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef):\n pass # Do not visit children of async function defs\n\n\ndef uses_top_level_await(source: str) -> bool:\n return TopLevelAsyncFinder().is_source_top_level_await(source)\n\n\nclass Plugin:\n def __init__(self, name=None):\n if not name:\n name = self.__class__.__name__\n\n self.name = name\n self._custom_elements = []\n self.app = None\n\n def init(self, app):\n self.app = app\n\n def register_custom_element(self, tag):\n """\n Decorator to register a new custom element as part of a Plugin and associate\n tag to it. Internally, it delegates the registration to the PyScript internal\n [JS] plugin manager, who actually creates the JS custom element that can be\n attached to the page and instantiate an instance of the class passing the custom\n element to the plugin constructor.\n\n Exammple:\n >> plugin = Plugin("PyTutorial")\n >> @plugin.register_custom_element("py-tutor")\n >> class PyTutor:\n >> def __init__(self, element):\n >> self.element = element\n """\n # TODO: Ideally would be better to use the logger.\n js.console.info(f"Defining new custom element {tag}")\n\n def wrapper(class_):\n # TODO: this is very pyodide specific but will have to do\n # until we have JS interface that works across interpreters\n define_custom_element(tag, create_proxy(class_)) # noqa: F821\n\n self._custom_elements.append(tag)\n return create_proxy(wrapper)\n\n\nclass DeprecatedGlobal:\n """\n Proxy for globals which are deprecated.\n\n The intendend usage is as follows:\n\n # in the global namespace\n Element = pyscript.DeprecatedGlobal(\'Element\', pyscript.Element, "...")\n console = pyscript.DeprecatedGlobal(\'console\', js.console, "...")\n ...\n\n The proxy forwards __getattr__ and __call__ to the underlying object, and\n emit a warning on the first usage.\n\n This way users see a warning only if they actually access the top-level\n name.\n """\n\n def __init__(self, name, obj, message):\n self.__name = name\n self.__obj = obj\n self.__message = message\n self.__warning_already_shown = False\n\n def __repr__(self):\n return f""\n\n def _show_warning(self, message):\n """\n NOTE: this is overridden by unit tests\n """\n # this showWarning is implemented in js and injected into this\n # namespace by main.ts\n showWarning(message, "html") # noqa: F821\n\n def _show_warning_maybe(self):\n if self.__warning_already_shown:\n return\n self._show_warning(self.__message)\n self.__warning_already_shown = True\n\n def __getattr__(self, attr):\n self._show_warning_maybe()\n return getattr(self.__obj, attr)\n\n def __call__(self, *args, **kwargs):\n self._show_warning_maybe()\n return self.__obj(*args, **kwargs)\n\n def __iter__(self):\n self._show_warning_maybe()\n return iter(self.__obj)\n\n def __getitem__(self, key):\n self._show_warning_maybe()\n return self.__obj[key]\n\n def __setitem__(self, key, value):\n self._show_warning_maybe()\n self.__obj[key] = value\n\n\nclass PyScript:\n """\n This class is deprecated since 2022.12.1.\n\n All its old functionalities are available as module-level functions. This\n class should be killed eventually.\n """\n\n loop = loop\n\n @staticmethod\n def run_until_complete(f):\n run_until_complete(f)\n\n @staticmethod\n def write(element_id, value, append=False, exec_id=0):\n write(element_id, value, append, exec_id)\n\n\ndef _install_deprecated_globals_2022_12_1(ns):\n """\n Install into the given namespace all the globals which have been\n deprecated since the 2022.12.1 release. Eventually they should be killed.\n """\n\n def deprecate(name, obj, instead):\n message = f"Direct usage of {name} is deprecated. " + instead\n ns[name] = DeprecatedGlobal(name, obj, message)\n\n # function/classes defined in pyscript.py ===> pyscript.XXX\n pyscript_names = [\n "PyItemTemplate",\n "PyListTemplate",\n "PyWidgetTheme",\n "add_classes",\n "create",\n "loop",\n ]\n for name in pyscript_names:\n deprecate(\n name, globals()[name], f"Please use pyscript.{name} instead."\n )\n\n # stdlib modules ===> import XXX\n stdlib_names = [\n "asyncio",\n "base64",\n "io",\n "sys",\n "time",\n "datetime",\n "pyodide",\n "micropip",\n ]\n for name in stdlib_names:\n obj = __import__(name)\n deprecate(name, obj, f"Please use import {name} instead.")\n\n # special case\n deprecate(\n "dedent", dedent, "Please use from textwrap import dedent instead."\n )\n\n # these are names that used to leak in the globals but they are just\n # implementation details. People should not use them.\n private_names = [\n "eval_formatter",\n "format_mime",\n "identity",\n "render_image",\n "MIME_RENDERERS",\n "MIME_METHODS",\n ]\n for name in private_names:\n obj = globals()[name]\n message = (\n f"{name} is deprecated. "\n "This is a private implementation detail of pyscript. "\n "You should not use it."\n )\n ns[name] = DeprecatedGlobal(name, obj, message)\n\n # these names are available as js.XXX\n for name in ["document", "console"]:\n obj = getattr(js, name)\n deprecate(name, obj, f"Please use js.{name} instead.")\n\n # PyScript is special, use a different message\n message = (\n "The PyScript object is deprecated. "\n "Please use pyscript instead."\n )\n ns["PyScript"] = DeprecatedGlobal("PyScript", PyScript, message)\n'; + + const logger = getLogger("pyscript/main"); + /* High-level overview of the lifecycle of a PyScript App: + + 1. pyscript.js is loaded by the browser. PyScriptApp().main() is called + + 2. loadConfig(): search for py-config and compute the config for the app + + 3. (it used to be "show the splashscreen", but now it's a plugin) + + 4. loadInterpreter(): start downloading the actual interpreter (e.g. pyodide.js) + + --- wait until (4) has finished --- + + 5. now the pyodide src is available. Initialize the engine + + 6. setup the environment, install packages + + 6.5: call the Plugin.afterSetup() hook + + 7. connect the py-script web component. This causes the execution of all the + user scripts + + 8. initialize the rest of web components such as py-button, py-repl, etc. + + More concretely: + + - Points 1-4 are implemented sequentially in PyScriptApp.main(). + + - PyScriptApp.loadInterpreter adds a + + + + + diff --git a/tech-preview/pyscript.core/test/b.py b/tech-preview/pyscript.core/test/b.py new file mode 100644 index 0000000..188f852 --- /dev/null +++ b/tech-preview/pyscript.core/test/b.py @@ -0,0 +1 @@ +x = "hello from B" diff --git a/tech-preview/pyscript.core/test/config.json b/tech-preview/pyscript.core/test/config.json new file mode 100644 index 0000000..f094183 --- /dev/null +++ b/tech-preview/pyscript.core/test/config.json @@ -0,0 +1,3 @@ +{ + "packages": ["matplotlib"] +} diff --git a/tech-preview/pyscript.core/test/config.toml b/tech-preview/pyscript.core/test/config.toml new file mode 100644 index 0000000..70403d5 --- /dev/null +++ b/tech-preview/pyscript.core/test/config.toml @@ -0,0 +1,3 @@ +packages = [ + "matplotlib" +] diff --git a/tech-preview/pyscript.core/test/counter.js b/tech-preview/pyscript.core/test/counter.js new file mode 100644 index 0000000..f1dcf64 --- /dev/null +++ b/tech-preview/pyscript.core/test/counter.js @@ -0,0 +1,8 @@ +const div = document.body.appendChild(document.createElement("div")); +div.style.cssText = "position:fixed;top:0;left:0"; + +let i = 0; +(function counter() { + div.textContent = ++i; + requestAnimationFrame(counter); +})(); diff --git a/tech-preview/pyscript.core/test/doc-intro.html b/tech-preview/pyscript.core/test/doc-intro.html new file mode 100644 index 0000000..6403418 --- /dev/null +++ b/tech-preview/pyscript.core/test/doc-intro.html @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tech-preview/pyscript.core/test/env.html b/tech-preview/pyscript.core/test/env.html new file mode 100644 index 0000000..ac941c5 --- /dev/null +++ b/tech-preview/pyscript.core/test/env.html @@ -0,0 +1,36 @@ + + + + + + python + + + + + +
+ +
+ +
+ +
+ + diff --git a/tech-preview/pyscript.core/test/fetch.html b/tech-preview/pyscript.core/test/fetch.html new file mode 100644 index 0000000..bb9623d --- /dev/null +++ b/tech-preview/pyscript.core/test/fetch.html @@ -0,0 +1,17 @@ + + + + + + python + + + + + + diff --git a/tech-preview/pyscript.core/test/fetch.toml b/tech-preview/pyscript.core/test/fetch.toml new file mode 100644 index 0000000..7cbcde7 --- /dev/null +++ b/tech-preview/pyscript.core/test/fetch.toml @@ -0,0 +1,2 @@ +[[fetch]] +files = ["./a.py", "./b.py"] diff --git a/tech-preview/pyscript.core/test/icon.svg b/tech-preview/pyscript.core/test/icon.svg new file mode 100644 index 0000000..11c0e4d --- /dev/null +++ b/tech-preview/pyscript.core/test/icon.svg @@ -0,0 +1,2 @@ + + diff --git a/tech-preview/pyscript.core/test/index.html b/tech-preview/pyscript.core/test/index.html new file mode 100644 index 0000000..9ef45e5 --- /dev/null +++ b/tech-preview/pyscript.core/test/index.html @@ -0,0 +1,17 @@ + + + + + + python + + + + + + + diff --git a/tech-preview/pyscript.core/test/index.js b/tech-preview/pyscript.core/test/index.js new file mode 100644 index 0000000..0511fc3 --- /dev/null +++ b/tech-preview/pyscript.core/test/index.js @@ -0,0 +1,209 @@ +const assert = require("./assert.js"); +require("./_utils.js"); + +const { fetch } = globalThis; + +const tick = (ms = 10) => new Promise(($) => setTimeout($, ms)); + +const clear = (python) => { + for (const [key, value] of Object.entries(python)) { + if (typeof value === "object") python[key] = null; + else python[key] = ""; + } +}; + +const patchFetch = (callback) => { + Object.defineProperty(globalThis, "fetch", { + configurable: true, + get() { + try { + return callback; + } finally { + globalThis.fetch = fetch; + } + }, + }); +}; + +const { parseHTML } = require("linkedom"); +const { document, window } = parseHTML("..."); + +globalThis.document = document; +globalThis.Element = window.Element; +globalThis.MutationObserver = window.MutationObserver; +globalThis.XPathResult = {}; +globalThis.XPathEvaluator = + window.XPathEvaluator || + class XPathEvaluator { + createExpression() { + return { evaluate: () => [] }; + } + }; + +require("../cjs"); + +(async () => { + // shared 3rd party mocks + const { + python: pyodide, + setTarget, + loadPyodide, + } = await import("./mocked/pyodide.mjs"); + const { python: micropython } = await import("./mocked/micropython.mjs"); + + // shared helpers + const div = document.createElement("div"); + const shadowRoot = div.attachShadow({ mode: "open" }); + const content = ` + import sys + import js + js.document.currentScript.target.textContent = sys.version + `; + + const { URL } = globalThis; + globalThis.URL = function (href) { + return { href }; + }; + globalThis.location = { href: "" }; + + // all tests + for (const test of [ + async function versionedRuntime() { + document.head.innerHTML = ``; + await tick(); + assert(pyodide.content, content); + assert(pyodide.target.tagName, "PYODIDE-SCRIPT"); + }, + + async function basicExpectations() { + document.head.innerHTML = ``; + await tick(); + assert(pyodide.content, content); + assert(pyodide.target.tagName, "PYODIDE-SCRIPT"); + }, + + async function foreignRuntime() { + document.head.innerHTML = ``; + await tick(); + assert(pyodide.content, content); + assert(pyodide.target.tagName, "PYODIDE-SCRIPT"); + }, + + async function basicMicroPython() { + document.head.innerHTML = ``; + await tick(); + assert(micropython.content, content); + assert(micropython.target.tagName, "MICROPYTHON-SCRIPT"); + const script = document.head.firstElementChild; + document.body.appendChild(script); + await tick(); + assert(script.nextSibling, micropython.target); + micropython.target = null; + }, + + async function exernalResourceInShadowRoot() { + patchFetch(() => + Promise.resolve({ text: () => Promise.resolve("OK") }), + ); + shadowRoot.innerHTML = ` + + + `.trim(); + await tick(); + assert(pyodide.content, "OK"); + assert(pyodide.target.tagName, "MY-PLUGIN"); + }, + + async function explicitTargetNode() { + setTarget(div); + shadowRoot.innerHTML = ` + + + `.trim(); + await tick(); + assert(pyodide.target, div); + }, + + async function explicitTargetAsString() { + setTarget("my-plugin"); + shadowRoot.innerHTML = ` + + + `.trim(); + await tick(); + assert(pyodide.target.tagName, "MY-PLUGIN"); + }, + + async function jsonConfig() { + const packages = {}; + patchFetch(() => Promise.resolve({ json: () => ({ packages }) })); + shadowRoot.innerHTML = ``; + await tick(); + assert(pyodide.packages, packages); + }, + + async function tomlConfig() { + const jsonPackages = JSON.stringify({ + packages: { a: Math.random() }, + }); + patchFetch(() => + Promise.resolve({ text: () => Promise.resolve(jsonPackages) }), + ); + shadowRoot.innerHTML = ``; + // there are more promises in here let's increase the tick delay to avoid flaky tests + await tick(20); + assert( + JSON.stringify({ packages: pyodide.packages }), + jsonPackages, + ); + }, + + async function fetchConfig() { + const jsonPackages = JSON.stringify({ + fetch: [ + { files: ["./a.py", "./b.py"] }, + { from: "utils" }, + { from: "/utils", files: ["c.py"] }, + ], + }); + patchFetch(() => + Promise.resolve({ + arrayBuffer: () => Promise.resolve([]), + text: () => Promise.resolve(jsonPackages), + }), + ); + shadowRoot.innerHTML = ` + + `; + await tick(10); + }, + + async function testDefaultRuntime() { + const pyodide = await pyscript.env.pyodide; + const keys = Object.keys(loadPyodide()).join(","); + assert(Object.keys(pyodide).join(","), keys); + + const unique = await pyscript.env.unique; + assert(Object.keys(unique).join(","), keys); + }, + + async function pyEvents() { + shadowRoot.innerHTML = ` + + + `; + await tick(20); + }, + ]) { + await test(); + clear(pyodide); + clear(micropython); + } + + globalThis.URL = URL; +})(); diff --git a/tech-preview/pyscript.core/test/isolated.html b/tech-preview/pyscript.core/test/isolated.html new file mode 100644 index 0000000..f52b9e2 --- /dev/null +++ b/tech-preview/pyscript.core/test/isolated.html @@ -0,0 +1,24 @@ + + + + + + python + + + + + + + + diff --git a/tech-preview/pyscript.core/test/manifest.json b/tech-preview/pyscript.core/test/manifest.json new file mode 100644 index 0000000..f2112c1 --- /dev/null +++ b/tech-preview/pyscript.core/test/manifest.json @@ -0,0 +1,17 @@ +{ + "background_color": "#ffffff", + "description": "PythonScript", + "display": "standalone", + "name": "PythonScript", + "orientation": "any", + "short_name": "PythonScript", + "start_url": "./", + "theme_color": "#ffffff", + "icons": [ + { + "src": "icon.svg", + "sizes": "144x144", + "type": "image/svg+xml" + } + ] +} diff --git a/tech-preview/pyscript.core/test/many.html b/tech-preview/pyscript.core/test/many.html new file mode 100644 index 0000000..103a49e --- /dev/null +++ b/tech-preview/pyscript.core/test/many.html @@ -0,0 +1,65 @@ + + + + + + python + + + + + + + + + + diff --git a/tech-preview/pyscript.core/test/matplot.html b/tech-preview/pyscript.core/test/matplot.html new file mode 100644 index 0000000..4c6a87b --- /dev/null +++ b/tech-preview/pyscript.core/test/matplot.html @@ -0,0 +1,59 @@ + + + + + + python + + + + + + + + diff --git a/tech-preview/pyscript.core/test/matplot.json.html b/tech-preview/pyscript.core/test/matplot.json.html new file mode 100644 index 0000000..500e54f --- /dev/null +++ b/tech-preview/pyscript.core/test/matplot.json.html @@ -0,0 +1,59 @@ + + + + + + python + + + + + + + + diff --git a/tech-preview/pyscript.core/test/matplot.py b/tech-preview/pyscript.core/test/matplot.py new file mode 100644 index 0000000..a6dc58f --- /dev/null +++ b/tech-preview/pyscript.core/test/matplot.py @@ -0,0 +1,60 @@ +import js +import matplotlib + +try: + js.document +except AttributeError: + matplotlib.use("agg") + +import base64 +import io + +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np + +# First create the x and y coordinates of the points. +n_angles = 36 +n_radii = 8 +min_radius = 0.25 +radii = np.linspace(min_radius, 0.95, n_radii) + +angles = np.linspace(0, 2 * np.pi, n_angles, endpoint=False) +angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1) +angles[:, 1::2] += np.pi / n_angles + +x = (radii * np.cos(angles)).flatten() +y = (radii * np.sin(angles)).flatten() +z = (np.cos(radii) * np.cos(3 * angles)).flatten() + +# Create the Triangulation; no triangles so Delaunay triangulation created. +triang = tri.Triangulation(x, y) + +# Mask off unwanted triangles. +triang.set_mask( + np.hypot(x[triang.triangles].mean(axis=1), y[triang.triangles].mean(axis=1)) + < min_radius +) + +fig1, ax1 = plt.subplots() +ax1.set_aspect("equal") +tpc = ax1.tripcolor(triang, z, shading="flat") +fig1.colorbar(tpc) +ax1.set_title("tripcolor of Delaunay triangulation, flat shading") + +buf = io.BytesIO() +plt.savefig(buf, format="png") +buf.seek(0) + +# how it was (including main thread counter part) +# js.xworker.postMessage( +# "data:image/png;base64," + base64.b64encode(buf.read()).decode("UTF-8") +# ) + +# how it is now via structured coincident/window +document = xworker.window.document +img = document.createElement("img") +img.style.transform = "scale(.5)" +img.src = "data:image/png;base64," + base64.b64encode(buf.read()).decode("UTF-8") + +document.body.append(img) diff --git a/tech-preview/pyscript.core/test/matplot.worker.html b/tech-preview/pyscript.core/test/matplot.worker.html new file mode 100644 index 0000000..006afb9 --- /dev/null +++ b/tech-preview/pyscript.core/test/matplot.worker.html @@ -0,0 +1,28 @@ + + + + + + python + + + + + + +
+ + diff --git a/tech-preview/pyscript.core/test/micropython.html b/tech-preview/pyscript.core/test/micropython.html new file mode 100644 index 0000000..205001f --- /dev/null +++ b/tech-preview/pyscript.core/test/micropython.html @@ -0,0 +1,18 @@ + + + + + + python + + + + + + + + diff --git a/tech-preview/pyscript.core/test/mocked/micropython.mjs b/tech-preview/pyscript.core/test/mocked/micropython.mjs new file mode 100644 index 0000000..763d5e2 --- /dev/null +++ b/tech-preview/pyscript.core/test/mocked/micropython.mjs @@ -0,0 +1,17 @@ +export const python = { content: "", target: null }; +export const loadMicroPython = () => ({ + runPython(content) { + if (document.currentScript?.target) { + python.content = content; + python.target = document.currentScript.target; + } + }, + globals: { + set(name, value) { + globalThis[name] = value; + }, + delete(name) { + delete globalThis[name]; + }, + }, +}); diff --git a/tech-preview/pyscript.core/test/mocked/pyodide.mjs b/tech-preview/pyscript.core/test/mocked/pyodide.mjs new file mode 100644 index 0000000..65772ef --- /dev/null +++ b/tech-preview/pyscript.core/test/mocked/pyodide.mjs @@ -0,0 +1,48 @@ +import { basename, dirname } from "node:path"; + +let target; +export const setTarget = (value) => { + target = value; +}; +export const python = { content: "", target: null, packages: null }; +export const loadPyodide = () => ({ + loadPackage() {}, + pyimport() { + return { + install(packages) { + python.packages = packages; + }, + destroy() {}, + }; + }, + runPython(content) { + python.content = content; + if (target) { + document.currentScript.target = target; + target = void 0; + } + python.target = document.currentScript.target; + }, + globals: { + set(name, value) { + globalThis[name] = value; + }, + delete(name) { + delete globalThis[name]; + }, + }, + FS: { + mkdirTree() {}, + writeFile() {}, + analyzePath: (path) => ({ + parentPath: dirname(path), + name: basename(path), + }), + }, + _module: { + PATH: { dirname }, + PATH_FS: { + resolve: (path) => path, + }, + }, +}); diff --git a/tech-preview/pyscript.core/test/mocked/toml.mjs b/tech-preview/pyscript.core/test/mocked/toml.mjs new file mode 100644 index 0000000..c2904a0 --- /dev/null +++ b/tech-preview/pyscript.core/test/mocked/toml.mjs @@ -0,0 +1 @@ +export const parse = (text) => JSON.parse(text); diff --git a/tech-preview/pyscript.core/test/no-sw.html b/tech-preview/pyscript.core/test/no-sw.html new file mode 100644 index 0000000..7469373 --- /dev/null +++ b/tech-preview/pyscript.core/test/no-sw.html @@ -0,0 +1,18 @@ + + + + + + python + + + + + + + + diff --git a/tech-preview/pyscript.core/test/order.html b/tech-preview/pyscript.core/test/order.html new file mode 100644 index 0000000..1d49c61 --- /dev/null +++ b/tech-preview/pyscript.core/test/order.html @@ -0,0 +1,37 @@ + + + + + + python + + + + + + + + + +
+# console should show this order too
+A
+B
+A
+C
+D
+ + diff --git a/tech-preview/pyscript.core/test/order.js b/tech-preview/pyscript.core/test/order.js new file mode 100644 index 0000000..eff441e --- /dev/null +++ b/tech-preview/pyscript.core/test/order.js @@ -0,0 +1,11 @@ +const { readFileSync } = require("fs"); + +require("http") + .createServer((req, res) => { + const content = readFileSync(__dirname + req.url); + res.setHeader("Access-Control-Allow-Origin", "*"); + setTimeout(() => { + res.end(content); + }, 1000); + }) + .listen(7357); diff --git a/tech-preview/pyscript.core/test/package.json b/tech-preview/pyscript.core/test/package.json new file mode 100644 index 0000000..1cd945a --- /dev/null +++ b/tech-preview/pyscript.core/test/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/tech-preview/pyscript.core/test/plugins/index.html b/tech-preview/pyscript.core/test/plugins/index.html new file mode 100644 index 0000000..363cab1 --- /dev/null +++ b/tech-preview/pyscript.core/test/plugins/index.html @@ -0,0 +1,46 @@ + + + + + + Plugins + + + + + + + def test_click(event): + print(event.type) + + print('Hello Console!') + + + diff --git a/tech-preview/pyscript.core/test/plugins/lua.html b/tech-preview/pyscript.core/test/plugins/lua.html new file mode 100644 index 0000000..69e0177 --- /dev/null +++ b/tech-preview/pyscript.core/test/plugins/lua.html @@ -0,0 +1,36 @@ + + + + + + Plugins + + + + + + + print('Hello Console!') + + + diff --git a/tech-preview/pyscript.core/test/plugins/py-script.html b/tech-preview/pyscript.core/test/plugins/py-script.html new file mode 100644 index 0000000..0fde315 --- /dev/null +++ b/tech-preview/pyscript.core/test/plugins/py-script.html @@ -0,0 +1,62 @@ + + + + + + PyScript Next + + + + +
+ + Something something about something ... +
+ + [[fetch]] + from = "../" + to_folder = "./" + files = ["a.py", "b.py"] + + + + + import js + import a, b + print('Hello Console!') + js.console.log(a.x, b.x) + 'Hello Web!' + + + # note the target is this element itself + display('second <py-script>') + + + # note this is late to the party simply because + # pyodide needs to be bootstrapped in the Worker too + XWorker('../a.py') + 'OK' + + + + + + + diff --git a/tech-preview/pyscript.core/test/print-a.py b/tech-preview/pyscript.core/test/print-a.py new file mode 100644 index 0000000..c853ae9 --- /dev/null +++ b/tech-preview/pyscript.core/test/print-a.py @@ -0,0 +1 @@ +print("A") diff --git a/tech-preview/pyscript.core/test/py-events.html b/tech-preview/pyscript.core/test/py-events.html new file mode 100644 index 0000000..8947444 --- /dev/null +++ b/tech-preview/pyscript.core/test/py-events.html @@ -0,0 +1,38 @@ + + + + + + python events + + + + + + + + + + + + diff --git a/tech-preview/pyscript.core/test/pyscript.html b/tech-preview/pyscript.core/test/pyscript.html new file mode 100644 index 0000000..84c5ccc --- /dev/null +++ b/tech-preview/pyscript.core/test/pyscript.html @@ -0,0 +1,19 @@ + + + + + + py-script + + + + py-script + + + + import sys + display(sys.version, target="target") + +
+ + diff --git a/tech-preview/pyscript.core/test/remote.html b/tech-preview/pyscript.core/test/remote.html new file mode 100644 index 0000000..a4a3167 --- /dev/null +++ b/tech-preview/pyscript.core/test/remote.html @@ -0,0 +1,21 @@ + + + + + + python + + + + + + + + diff --git a/tech-preview/pyscript.core/test/ruby.html b/tech-preview/pyscript.core/test/ruby.html new file mode 100644 index 0000000..14a6bdc --- /dev/null +++ b/tech-preview/pyscript.core/test/ruby.html @@ -0,0 +1,31 @@ + + + + + + Ruby + + + + + + + + + diff --git a/tech-preview/pyscript.core/test/shadow-dom.html b/tech-preview/pyscript.core/test/shadow-dom.html new file mode 100644 index 0000000..0c35120 --- /dev/null +++ b/tech-preview/pyscript.core/test/shadow-dom.html @@ -0,0 +1,38 @@ + + + + + + python + + + + + + + + + + + diff --git a/tech-preview/pyscript.core/test/style.css b/tech-preview/pyscript.core/test/style.css new file mode 100644 index 0000000..69b2e77 --- /dev/null +++ b/tech-preview/pyscript.core/test/style.css @@ -0,0 +1,9 @@ +html { + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", + Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", + sans-serif; +} + +:root python-script { + display: block; +} diff --git a/tech-preview/pyscript.core/test/table.html b/tech-preview/pyscript.core/test/table.html new file mode 100644 index 0000000..5479c6e --- /dev/null +++ b/tech-preview/pyscript.core/test/table.html @@ -0,0 +1,34 @@ + + + + + + python + + + + + + + + + + +
check edge cases
+ + diff --git a/tech-preview/pyscript.core/test/test.html b/tech-preview/pyscript.core/test/test.html new file mode 100644 index 0000000..e9e0b2e --- /dev/null +++ b/tech-preview/pyscript.core/test/test.html @@ -0,0 +1,52 @@ + + + + + + python + + + + + + + + + + + + + + + + + + diff --git a/tech-preview/pyscript.core/test/three.py b/tech-preview/pyscript.core/test/three.py new file mode 100644 index 0000000..feb8fd7 --- /dev/null +++ b/tech-preview/pyscript.core/test/three.py @@ -0,0 +1,3 @@ +import js + +js.document.currentScript.target.textContent = 1 + 2 diff --git a/tech-preview/pyscript.core/test/wasmoon.html b/tech-preview/pyscript.core/test/wasmoon.html new file mode 100644 index 0000000..a2ea615 --- /dev/null +++ b/tech-preview/pyscript.core/test/wasmoon.html @@ -0,0 +1,38 @@ + + + + + + lua + + + + + + + + + diff --git a/tech-preview/pyscript.core/test/worker/index.html b/tech-preview/pyscript.core/test/worker/index.html new file mode 100644 index 0000000..eb5d882 --- /dev/null +++ b/tech-preview/pyscript.core/test/worker/index.html @@ -0,0 +1,62 @@ + + + + + + python workers + + + +
See console ➡️
+ + + + + + + + + + + + + diff --git a/tech-preview/pyscript.core/test/worker/input.html b/tech-preview/pyscript.core/test/worker/input.html new file mode 100644 index 0000000..ebfb9b2 --- /dev/null +++ b/tech-preview/pyscript.core/test/worker/input.html @@ -0,0 +1,51 @@ + + + + + + python workers + + + + + + + + + diff --git a/tech-preview/pyscript.core/test/worker/input.lua b/tech-preview/pyscript.core/test/worker/input.lua new file mode 100644 index 0000000..a341e2d --- /dev/null +++ b/tech-preview/pyscript.core/test/worker/input.lua @@ -0,0 +1,2 @@ +print('What is 2 + 3?') +print('Answer: ' .. xworker.sync.input('What is 2 + 3?')) diff --git a/tech-preview/pyscript.core/test/worker/input.py b/tech-preview/pyscript.core/test/worker/input.py new file mode 100644 index 0000000..48555da --- /dev/null +++ b/tech-preview/pyscript.core/test/worker/input.py @@ -0,0 +1,2 @@ +print("What is 2 + 3?") +print("Answer: " + xworker.sync.input("What is 2 + 3?")) diff --git a/tech-preview/pyscript.core/test/worker/input.rb b/tech-preview/pyscript.core/test/worker/input.rb new file mode 100644 index 0000000..b5f8d21 --- /dev/null +++ b/tech-preview/pyscript.core/test/worker/input.rb @@ -0,0 +1,6 @@ +require "js" + +xworker = JS::eval("return xworker") + +puts "What is 2 + 3?" +puts xworker.sync.input("What is 2 + 3?") diff --git a/tech-preview/pyscript.core/test/worker/worker.lua b/tech-preview/pyscript.core/test/worker/worker.lua new file mode 100644 index 0000000..0f89e38 --- /dev/null +++ b/tech-preview/pyscript.core/test/worker/worker.lua @@ -0,0 +1,6 @@ +function on_message(event) + print(event.data) + xworker.postMessage('Lua: Hello MicroPython 👋') +end + +xworker.onmessage = on_message diff --git a/tech-preview/pyscript.core/test/worker/worker.py b/tech-preview/pyscript.core/test/worker/worker.py new file mode 100644 index 0000000..a1ee276 --- /dev/null +++ b/tech-preview/pyscript.core/test/worker/worker.py @@ -0,0 +1,10 @@ +import re + + +def on_message(event): + print(event.data) + foreign = re.search("^[^:]+", event.data).group(0) + xworker.postMessage("Python: Hello " + foreign + " 👋") + + +xworker.onmessage = on_message diff --git a/tech-preview/pyscript.core/test/worker/worker.rb b/tech-preview/pyscript.core/test/worker/worker.rb new file mode 100644 index 0000000..ad348ad --- /dev/null +++ b/tech-preview/pyscript.core/test/worker/worker.rb @@ -0,0 +1,10 @@ +require "js" + +xworker = JS::eval("return xworker") + +def on_message(event) + puts event[:data] + xworker.postMessage('Ruby: Hello MicroPython 👋') +end + +xworker.onmessage = on_message diff --git a/tech-preview/pyscript.core/tsconfig.json b/tech-preview/pyscript.core/tsconfig.json new file mode 100644 index 0000000..093567d --- /dev/null +++ b/tech-preview/pyscript.core/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "module": "ES2022", + "target": "ES2022", + "moduleResolution": "Classic", + "allowJs": true, + "declaration": true, + "emitDeclarationOnly": true, + "declarationDir": "types" + }, + "include": ["esm/index.js"] +}