diff --git a/.DS_Store b/.DS_Store index bf4f94f08..23e40cb48 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index 3eb582d1b..80e26dffc 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -115,7 +115,7 @@ jobs: continue-on-error: true - name: Run Prettiers - run: npx prettier --tab-width 4 --print-width 100 --trailing-comma es5 --ignore-path "$(CURDIR)/node_modules/*" --write JS/ + run: npx prettier --tab-width 4 --print-width 100 --trailing-comma es5 --ignore-path "$(CURDIR)/.prettierignore" --write JS/ - name: Commit changes uses: stefanzweifel/git-auto-commit-action@v4 with: diff --git a/.github/workflows/webassembly-pr-build.yml b/.github/workflows/webassembly-pr-build.yml new file mode 100644 index 000000000..be20e565f --- /dev/null +++ b/.github/workflows/webassembly-pr-build.yml @@ -0,0 +1,101 @@ +name: Webassembly PR Build + +on: + pull_request_target: + types: + - opened + - reopened + - synchronize + paths: + - 'JS/**' + +jobs: + changes: + runs-on: ubuntu-latest + permissions: + pull-requests: read + outputs: + wasm: ${{ steps.filter.outputs.wasm }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: | + wasm: + - 'JS/**' + + wasm: + needs: changes + if: ${{ needs.changes.outputs.wasm == 'true' }} + permissions: + contents: write + pull-requests: write + + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: '18' + + - name: Setup Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + + - name: Cache wasmjs-engine + uses: actions/cache@v2 + with: + path: ./JS/wasm/crates/wasmjs-engine/target + key: wasmjs-engine + restore-keys: | + wasmjs-engine + + - name: Check if wasmjs-engine is cached + id: wasmjs-engine-hit + run: | + echo "cache-hit=$(test -d ./JS/wasm/crates/wasmjs-engine/target && echo true || echo false)" >> $GITHUB_OUTPUT + + - name: Build wasmjs-engine + if: steps.wasmjs-engine-hit.outputs.cache-hit != 'true' + working-directory: ./JS/wasm/crates/wasmjs-engine + run: | + npm install -g @go-task/cli + task build + + - name: Cache wasmjs-runtime + uses: actions/cache@v2 + with: + path: ./JS/wasm/crates/wasmjs-runtime/target + key: wasmjs-runtime + restore-keys: | + wasmjs-runtime + + - name: Check if wasmjs-runtime is cached + id: wasmjs-runtime-hit + run: | + echo "cache-hit=$(test -d ./JS/wasm/crates/wasmjs-runtime/target && echo true || echo false)" >> $GITHUB_OUTPUT + + - name: Build wasmjs-runtime + if: steps.wasmjs-runtime-hit.outputs.cache-hit != 'true' + working-directory: ./JS/wasm/crates/wasmjs-runtime + run: | + cargo build --release + + - name: Build ec-wasmjs-hono + working-directory: ./JS/wasm/examples/ec-wasmjs-hono + run: | + npm install + npm run build + + - name: Run ec-wasmjs-hono + working-directory: ./JS/wasm/crates/wasmjs-runtime + run: | + ./target/release/wasmjs-runtime run ../../examples/ec-wasmjs-hono/bin \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..1f2c2b602 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +**/node_modules +JS/wasm/* \ No newline at end of file diff --git a/JS/.DS_Store b/JS/.DS_Store index c3843fb64..8b74a4062 100644 Binary files a/JS/.DS_Store and b/JS/.DS_Store differ diff --git a/JS/edgechains/examples/.DS_Store b/JS/edgechains/examples/.DS_Store index f1c480e87..997543fa0 100644 Binary files a/JS/edgechains/examples/.DS_Store and b/JS/edgechains/examples/.DS_Store differ diff --git a/JS/edgechains/examples/.env.example b/JS/edgechains/examples/.env.example deleted file mode 100644 index 5092d9c6c..000000000 --- a/JS/edgechains/examples/.env.example +++ /dev/null @@ -1,6 +0,0 @@ -OPEN_AI_API_KEY= -OPEN_AI_ORG_ID= -CHAT_COMPLETION_ENDPOINT= -OPEN_AI_MODEL= -OPEN_AI_ROLE= -OPEN_AI_TEMP= diff --git a/JS/edgechains/examples/.gitignore b/JS/edgechains/examples/.gitignore deleted file mode 100644 index 97aca2ea1..000000000 --- a/JS/edgechains/examples/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.env -node_modules \ No newline at end of file diff --git a/JS/edgechains/examples/.nyc_output/3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2.json b/JS/edgechains/examples/.nyc_output/3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2.json deleted file mode 100644 index aa707ed12..000000000 --- a/JS/edgechains/examples/.nyc_output/3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2.json +++ /dev/null @@ -1 +0,0 @@ -{"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.module.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.module.ts","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":7,"column":1}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":28}},"2":{"start":{"line":3,"column":34},"end":{"line":3,"column":125}},"3":{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},"4":{"start":{"line":4,"column":79},"end":{"line":4,"column":131}},"5":{"start":{"line":5,"column":9},"end":{"line":5,"column":150}},"6":{"start":{"line":5,"column":22},"end":{"line":5,"column":43}},"7":{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},"8":{"start":{"line":5,"column":81},"end":{"line":5,"column":150}},"9":{"start":{"line":6,"column":4},"end":{"line":6,"column":66}},"10":{"start":{"line":8,"column":0},"end":{"line":8,"column":62}},"11":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}},"12":{"start":{"line":10,"column":17},"end":{"line":10,"column":42}},"13":{"start":{"line":11,"column":25},"end":{"line":11,"column":52}},"14":{"start":{"line":12,"column":22},"end":{"line":12,"column":46}},"15":{"start":{"line":13,"column":16},"end":{"line":14,"column":1}},"16":{"start":{"line":15,"column":0},"end":{"line":15,"column":30}},"17":{"start":{"line":16,"column":0},"end":{"line":22,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":46},"end":{"line":2,"column":47}},"loc":{"start":{"line":2,"column":87},"end":{"line":7,"column":1}},"line":2}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":17},"end":{"line":7,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":18},"end":{"line":2,"column":22}},{"start":{"line":2,"column":26},"end":{"line":2,"column":41}},{"start":{"line":2,"column":46},"end":{"line":7,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":34},"end":{"line":3,"column":125}},"type":"cond-expr","locations":[{"start":{"line":3,"column":42},"end":{"line":3,"column":48}},{"start":{"line":3,"column":51},"end":{"line":3,"column":125}}],"line":3},"2":{"loc":{"start":{"line":3,"column":51},"end":{"line":3,"column":125}},"type":"cond-expr","locations":[{"start":{"line":3,"column":67},"end":{"line":3,"column":118}},{"start":{"line":3,"column":121},"end":{"line":3,"column":125}}],"line":3},"3":{"loc":{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},"type":"if","locations":[{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},{"start":{"line":4,"column":4},"end":{"line":5,"column":150}}],"line":4},"4":{"loc":{"start":{"line":4,"column":8},"end":{"line":4,"column":77}},"type":"binary-expr","locations":[{"start":{"line":4,"column":8},"end":{"line":4,"column":35}},{"start":{"line":4,"column":39},"end":{"line":4,"column":77}}],"line":4},"5":{"loc":{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},"type":"if","locations":[{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},{"start":{"line":5,"column":58},"end":{"line":5,"column":150}}],"line":5},"6":{"loc":{"start":{"line":5,"column":85},"end":{"line":5,"column":149}},"type":"binary-expr","locations":[{"start":{"line":5,"column":86},"end":{"line":5,"column":143}},{"start":{"line":5,"column":148},"end":{"line":5,"column":149}}],"line":5},"7":{"loc":{"start":{"line":5,"column":86},"end":{"line":5,"column":143}},"type":"cond-expr","locations":[{"start":{"line":5,"column":94},"end":{"line":5,"column":98}},{"start":{"line":5,"column":101},"end":{"line":5,"column":143}}],"line":5},"8":{"loc":{"start":{"line":5,"column":101},"end":{"line":5,"column":143}},"type":"cond-expr","locations":[{"start":{"line":5,"column":109},"end":{"line":5,"column":126}},{"start":{"line":5,"column":129},"end":{"line":5,"column":143}}],"line":5},"9":{"loc":{"start":{"line":6,"column":11},"end":{"line":6,"column":62}},"type":"binary-expr","locations":[{"start":{"line":6,"column":11},"end":{"line":6,"column":16}},{"start":{"line":6,"column":20},"end":{"line":6,"column":21}},{"start":{"line":6,"column":25},"end":{"line":6,"column":62}}],"line":6}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":1,"11":1,"12":1,"13":1,"14":0,"15":0,"16":0,"17":0},"f":{"0":0},"b":{"0":[1,1,1],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0,0]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.module.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,qDAAiD;AACjD,+CAA2C;AAOpC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IALrB,IAAA,eAAM,EAAC;QACJ,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,CAAC,8BAAa,CAAC;QAC5B,SAAS,EAAE,CAAC,wBAAU,CAAC;KAC1B,CAAC;GACW,SAAS,CAAG","sourcesContent":["import { Module } from '@nestjs/common';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\n\n@Module({\n imports: [],\n controllers: [AppController],\n providers: [AppService],\n})\nexport class AppModule {}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"31bc805d66d2437fc7f813ab87f850d20c15e826","contentHash":"6ef9e88084a704b7ea6ccf14b1082dabd5ecd104d0bed32ad75f75fe097a2a3b"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":7,"column":1}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":28}},"2":{"start":{"line":3,"column":34},"end":{"line":3,"column":125}},"3":{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},"4":{"start":{"line":4,"column":79},"end":{"line":4,"column":131}},"5":{"start":{"line":5,"column":9},"end":{"line":5,"column":150}},"6":{"start":{"line":5,"column":22},"end":{"line":5,"column":43}},"7":{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},"8":{"start":{"line":5,"column":81},"end":{"line":5,"column":150}},"9":{"start":{"line":6,"column":4},"end":{"line":6,"column":66}},"10":{"start":{"line":8,"column":17},"end":{"line":10,"column":1}},"11":{"start":{"line":9,"column":4},"end":{"line":9,"column":109}},"12":{"start":{"line":9,"column":79},"end":{"line":9,"column":109}},"13":{"start":{"line":11,"column":14},"end":{"line":13,"column":1}},"14":{"start":{"line":12,"column":4},"end":{"line":12,"column":73}},"15":{"start":{"line":12,"column":36},"end":{"line":12,"column":71}},"16":{"start":{"line":14,"column":0},"end":{"line":14,"column":62}},"17":{"start":{"line":15,"column":0},"end":{"line":15,"column":31}},"18":{"start":{"line":16,"column":17},"end":{"line":16,"column":42}},"19":{"start":{"line":17,"column":22},"end":{"line":17,"column":46}},"20":{"start":{"line":18,"column":22},"end":{"line":18,"column":58}},"21":{"start":{"line":19,"column":24},"end":{"line":19,"column":65}},"22":{"start":{"line":20,"column":20},"end":{"line":42,"column":1}},"23":{"start":{"line":22,"column":8},"end":{"line":22,"column":37}},"24":{"start":{"line":25,"column":8},"end":{"line":25,"column":42}},"25":{"start":{"line":28,"column":27},"end":{"line":36,"column":9}},"26":{"start":{"line":37,"column":8},"end":{"line":37,"column":69}},"27":{"start":{"line":40,"column":8},"end":{"line":40,"column":49}},"28":{"start":{"line":43,"column":0},"end":{"line":43,"column":38}},"29":{"start":{"line":44,"column":0},"end":{"line":49,"column":46}},"30":{"start":{"line":50,"column":0},"end":{"line":58,"column":48}},"31":{"start":{"line":59,"column":0},"end":{"line":65,"column":51}},"32":{"start":{"line":66,"column":0},"end":{"line":69,"column":18}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":46},"end":{"line":2,"column":47}},"loc":{"start":{"line":2,"column":87},"end":{"line":7,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":46},"end":{"line":8,"column":47}},"loc":{"start":{"line":8,"column":62},"end":{"line":10,"column":1}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":11,"column":40},"end":{"line":11,"column":41}},"loc":{"start":{"line":11,"column":73},"end":{"line":13,"column":1}},"line":11},"3":{"name":"(anonymous_3)","decl":{"start":{"line":12,"column":11},"end":{"line":12,"column":12}},"loc":{"start":{"line":12,"column":34},"end":{"line":12,"column":73}},"line":12},"4":{"name":"(anonymous_4)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":5}},"loc":{"start":{"line":21,"column":28},"end":{"line":23,"column":5}},"line":21},"5":{"name":"(anonymous_5)","decl":{"start":{"line":24,"column":4},"end":{"line":24,"column":5}},"loc":{"start":{"line":24,"column":15},"end":{"line":26,"column":5}},"line":24},"6":{"name":"(anonymous_6)","decl":{"start":{"line":27,"column":4},"end":{"line":27,"column":5}},"loc":{"start":{"line":27,"column":30},"end":{"line":38,"column":5}},"line":27},"7":{"name":"(anonymous_7)","decl":{"start":{"line":39,"column":4},"end":{"line":39,"column":5}},"loc":{"start":{"line":39,"column":20},"end":{"line":41,"column":5}},"line":39}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":17},"end":{"line":7,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":18},"end":{"line":2,"column":22}},{"start":{"line":2,"column":26},"end":{"line":2,"column":41}},{"start":{"line":2,"column":46},"end":{"line":7,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":34},"end":{"line":3,"column":125}},"type":"cond-expr","locations":[{"start":{"line":3,"column":42},"end":{"line":3,"column":48}},{"start":{"line":3,"column":51},"end":{"line":3,"column":125}}],"line":3},"2":{"loc":{"start":{"line":3,"column":51},"end":{"line":3,"column":125}},"type":"cond-expr","locations":[{"start":{"line":3,"column":67},"end":{"line":3,"column":118}},{"start":{"line":3,"column":121},"end":{"line":3,"column":125}}],"line":3},"3":{"loc":{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},"type":"if","locations":[{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},{"start":{"line":4,"column":4},"end":{"line":5,"column":150}}],"line":4},"4":{"loc":{"start":{"line":4,"column":8},"end":{"line":4,"column":77}},"type":"binary-expr","locations":[{"start":{"line":4,"column":8},"end":{"line":4,"column":35}},{"start":{"line":4,"column":39},"end":{"line":4,"column":77}}],"line":4},"5":{"loc":{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},"type":"if","locations":[{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},{"start":{"line":5,"column":58},"end":{"line":5,"column":150}}],"line":5},"6":{"loc":{"start":{"line":5,"column":85},"end":{"line":5,"column":149}},"type":"binary-expr","locations":[{"start":{"line":5,"column":86},"end":{"line":5,"column":143}},{"start":{"line":5,"column":148},"end":{"line":5,"column":149}}],"line":5},"7":{"loc":{"start":{"line":5,"column":86},"end":{"line":5,"column":143}},"type":"cond-expr","locations":[{"start":{"line":5,"column":94},"end":{"line":5,"column":98}},{"start":{"line":5,"column":101},"end":{"line":5,"column":143}}],"line":5},"8":{"loc":{"start":{"line":5,"column":101},"end":{"line":5,"column":143}},"type":"cond-expr","locations":[{"start":{"line":5,"column":109},"end":{"line":5,"column":126}},{"start":{"line":5,"column":129},"end":{"line":5,"column":143}}],"line":5},"9":{"loc":{"start":{"line":6,"column":11},"end":{"line":6,"column":62}},"type":"binary-expr","locations":[{"start":{"line":6,"column":11},"end":{"line":6,"column":16}},{"start":{"line":6,"column":20},"end":{"line":6,"column":21}},{"start":{"line":6,"column":25},"end":{"line":6,"column":62}}],"line":6},"10":{"loc":{"start":{"line":8,"column":17},"end":{"line":10,"column":1}},"type":"binary-expr","locations":[{"start":{"line":8,"column":18},"end":{"line":8,"column":22}},{"start":{"line":8,"column":26},"end":{"line":8,"column":41}},{"start":{"line":8,"column":46},"end":{"line":10,"column":1}}],"line":8},"11":{"loc":{"start":{"line":9,"column":4},"end":{"line":9,"column":109}},"type":"if","locations":[{"start":{"line":9,"column":4},"end":{"line":9,"column":109}},{"start":{"line":9,"column":4},"end":{"line":9,"column":109}}],"line":9},"12":{"loc":{"start":{"line":9,"column":8},"end":{"line":9,"column":77}},"type":"binary-expr","locations":[{"start":{"line":9,"column":8},"end":{"line":9,"column":35}},{"start":{"line":9,"column":39},"end":{"line":9,"column":77}}],"line":9},"13":{"loc":{"start":{"line":11,"column":14},"end":{"line":13,"column":1}},"type":"binary-expr","locations":[{"start":{"line":11,"column":15},"end":{"line":11,"column":19}},{"start":{"line":11,"column":23},"end":{"line":11,"column":35}},{"start":{"line":11,"column":40},"end":{"line":13,"column":1}}],"line":11}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":1,"11":0,"12":0,"13":1,"14":0,"15":0,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[1,1,1],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0,0],"10":[1,1,1],"11":[0,0],"12":[0,0],"13":[1,1,1]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA8E;AAC9E,+CAA2C;AAC3C,2DAAmE;AACnE,kEAA4D;AAGrD,IAAM,aAAa,GAAnB,MAAM,aAAa;IACtB,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAGvD,QAAQ;QACJ,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC;IAID,UAAU,CAAU,MAAW,EAAU,KAAU;QAC/C,MAAM,UAAU,GAAG;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SAC3B,CAAC;QACF,OAAO,IAAA,oCAAsB,EAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAID,aAAa;QACT,OAAO,IAAA,0BAAU,GAAE,CAAC;IACxB,CAAC;CACJ,CAAA;AA5BY,sCAAa;AAItB;IADC,IAAA,YAAG,GAAE;;;;6CAGL;AAID;IAFC,IAAA,aAAI,EAAC,wBAAwB,CAAC;IAC9B,IAAA,iBAAQ,EAAC,GAAG,CAAC;IACF,WAAA,IAAA,cAAK,GAAE,CAAA;IAAe,WAAA,IAAA,aAAI,GAAE,CAAA;;;;+CAWvC;AAID;IAFC,IAAA,aAAI,EAAC,oBAAoB,CAAC;IAC1B,IAAA,iBAAQ,EAAC,GAAG,CAAC;;;;kDAGb;wBA3BQ,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAEgC,wBAAU;GAD1C,aAAa,CA4BzB","sourcesContent":["import { Body, Controller, Get, HttpCode, Post, Query } from '@nestjs/common';\nimport { AppService } from './app.service';\nimport { hydeSearchAdaEmbedding } from './hydeExample/hydeExample';\nimport { getContent } from './testGeneration/TestGenerator';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get()\n getHello(): string {\n return this.appService.getHello();\n }\n\n @Post('/hyde-search/query-rrf')\n @HttpCode(200)\n hydeSearch(@Query() params: any, @Body() query: any) {\n const arkRequest = {\n topK: params.topK,\n metadataTable: query.metadataTable,\n query: query.query,\n textWeight: query.textWeight,\n similarityWeight: query.similarityWeight,\n dateWeight: query.dateWeight,\n orderRRF: query.orderRRF,\n };\n return hydeSearchAdaEmbedding(arkRequest);\n }\n\n @Post('/testcase/generate')\n @HttpCode(200)\n testGenerator(){\n return getContent();\n }\n}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1a5ce167997a50c174fd420328ea5e0e5fdf4223","contentHash":"60c622de341191246fb3bc97e28447514ac3a0dc9a9b7d795257328f31d30415"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":7,"column":1}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":28}},"2":{"start":{"line":3,"column":34},"end":{"line":3,"column":125}},"3":{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},"4":{"start":{"line":4,"column":79},"end":{"line":4,"column":131}},"5":{"start":{"line":5,"column":9},"end":{"line":5,"column":150}},"6":{"start":{"line":5,"column":22},"end":{"line":5,"column":43}},"7":{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},"8":{"start":{"line":5,"column":81},"end":{"line":5,"column":150}},"9":{"start":{"line":6,"column":4},"end":{"line":6,"column":66}},"10":{"start":{"line":8,"column":0},"end":{"line":8,"column":62}},"11":{"start":{"line":9,"column":0},"end":{"line":9,"column":28}},"12":{"start":{"line":10,"column":17},"end":{"line":10,"column":42}},"13":{"start":{"line":11,"column":17},"end":{"line":15,"column":1}},"14":{"start":{"line":13,"column":8},"end":{"line":13,"column":30}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":32}},"16":{"start":{"line":17,"column":0},"end":{"line":19,"column":15}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":46},"end":{"line":2,"column":47}},"loc":{"start":{"line":2,"column":87},"end":{"line":7,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":15},"end":{"line":14,"column":5}},"line":12}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":17},"end":{"line":7,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":18},"end":{"line":2,"column":22}},{"start":{"line":2,"column":26},"end":{"line":2,"column":41}},{"start":{"line":2,"column":46},"end":{"line":7,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":34},"end":{"line":3,"column":125}},"type":"cond-expr","locations":[{"start":{"line":3,"column":42},"end":{"line":3,"column":48}},{"start":{"line":3,"column":51},"end":{"line":3,"column":125}}],"line":3},"2":{"loc":{"start":{"line":3,"column":51},"end":{"line":3,"column":125}},"type":"cond-expr","locations":[{"start":{"line":3,"column":67},"end":{"line":3,"column":118}},{"start":{"line":3,"column":121},"end":{"line":3,"column":125}}],"line":3},"3":{"loc":{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},"type":"if","locations":[{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},{"start":{"line":4,"column":4},"end":{"line":5,"column":150}}],"line":4},"4":{"loc":{"start":{"line":4,"column":8},"end":{"line":4,"column":77}},"type":"binary-expr","locations":[{"start":{"line":4,"column":8},"end":{"line":4,"column":35}},{"start":{"line":4,"column":39},"end":{"line":4,"column":77}}],"line":4},"5":{"loc":{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},"type":"if","locations":[{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},{"start":{"line":5,"column":58},"end":{"line":5,"column":150}}],"line":5},"6":{"loc":{"start":{"line":5,"column":85},"end":{"line":5,"column":149}},"type":"binary-expr","locations":[{"start":{"line":5,"column":86},"end":{"line":5,"column":143}},{"start":{"line":5,"column":148},"end":{"line":5,"column":149}}],"line":5},"7":{"loc":{"start":{"line":5,"column":86},"end":{"line":5,"column":143}},"type":"cond-expr","locations":[{"start":{"line":5,"column":94},"end":{"line":5,"column":98}},{"start":{"line":5,"column":101},"end":{"line":5,"column":143}}],"line":5},"8":{"loc":{"start":{"line":5,"column":101},"end":{"line":5,"column":143}},"type":"cond-expr","locations":[{"start":{"line":5,"column":109},"end":{"line":5,"column":126}},{"start":{"line":5,"column":129},"end":{"line":5,"column":143}}],"line":5},"9":{"loc":{"start":{"line":6,"column":11},"end":{"line":6,"column":62}},"type":"binary-expr","locations":[{"start":{"line":6,"column":11},"end":{"line":6,"column":16}},{"start":{"line":6,"column":20},"end":{"line":6,"column":21}},{"start":{"line":6,"column":25},"end":{"line":6,"column":62}}],"line":6}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":1,"10":1,"11":1,"12":1,"13":1,"14":0,"15":1,"16":1},"f":{"0":1,"1":0},"b":{"0":[1,1,1],"1":[1,0],"2":[0,0],"3":[1,0],"4":[1,1],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[1,0,0]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAGrC,IAAM,UAAU,GAAhB,MAAM,UAAU;IACnB,QAAQ;QACJ,OAAO,cAAc,CAAC;IAC1B,CAAC;CACJ,CAAA;AAJY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;GACA,UAAU,CAItB","sourcesContent":["import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n getHello(): string {\n return 'Hello World!';\n }\n}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"566f7e0e02a3826477ba399747eb71c34a48f47a","contentHash":"e87935e42f8cae19393dbfc6c7e81b698365ed339fcadfc6669f322dba61450f"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":40}},"2":{"start":{"line":4,"column":23},"end":{"line":4,"column":56}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":28}},"4":{"start":{"line":6,"column":25},"end":{"line":6,"column":57}},"5":{"start":{"line":7,"column":25},"end":{"line":7,"column":57}},"6":{"start":{"line":9,"column":0},"end":{"line":13,"column":60}},"7":{"start":{"line":10,"column":4},"end":{"line":10,"column":48}},"8":{"start":{"line":11,"column":4},"end":{"line":11,"column":40}},"9":{"start":{"line":12,"column":4},"end":{"line":12,"column":40}},"10":{"start":{"line":14,"column":21},"end":{"line":14,"column":191}},"11":{"start":{"line":16,"column":4},"end":{"line":76,"column":5}},"12":{"start":{"line":17,"column":22},"end":{"line":17,"column":37}},"13":{"start":{"line":18,"column":26},"end":{"line":18,"column":36}},"14":{"start":{"line":19,"column":22},"end":{"line":19,"column":38}},"15":{"start":{"line":20,"column":21},"end":{"line":20,"column":44}},"16":{"start":{"line":21,"column":24},"end":{"line":21,"column":52}},"17":{"start":{"line":22,"column":27},"end":{"line":22,"column":88}},"18":{"start":{"line":23,"column":25},"end":{"line":23,"column":83}},"19":{"start":{"line":24,"column":29},"end":{"line":24,"column":67}},"20":{"start":{"line":25,"column":31},"end":{"line":25,"column":63}},"21":{"start":{"line":26,"column":25},"end":{"line":30,"column":35}},"22":{"start":{"line":31,"column":23},"end":{"line":31,"column":52}},"23":{"start":{"line":32,"column":28},"end":{"line":32,"column":60}},"24":{"start":{"line":33,"column":30},"end":{"line":33,"column":53}},"25":{"start":{"line":34,"column":36},"end":{"line":37,"column":11}},"26":{"start":{"line":35,"column":30},"end":{"line":35,"column":65}},"27":{"start":{"line":36,"column":12},"end":{"line":36,"column":29}},"28":{"start":{"line":38,"column":25},"end":{"line":38,"column":158}},"29":{"start":{"line":39,"column":28},"end":{"line":39,"column":52}},"30":{"start":{"line":40,"column":30},"end":{"line":40,"column":32}},"31":{"start":{"line":41,"column":8},"end":{"line":43,"column":9}},"32":{"start":{"line":42,"column":12},"end":{"line":42,"column":121}},"33":{"start":{"line":44,"column":8},"end":{"line":46,"column":9}},"34":{"start":{"line":45,"column":12},"end":{"line":45,"column":40}},"35":{"start":{"line":47,"column":28},"end":{"line":47,"column":55}},"36":{"start":{"line":48,"column":30},"end":{"line":48,"column":41}},"37":{"start":{"line":49,"column":32},"end":{"line":49,"column":74}},"38":{"start":{"line":50,"column":8},"end":{"line":54,"column":36}},"39":{"start":{"line":55,"column":34},"end":{"line":55,"column":63}},"40":{"start":{"line":56,"column":30},"end":{"line":56,"column":70}},"41":{"start":{"line":57,"column":8},"end":{"line":60,"column":36}},"42":{"start":{"line":61,"column":32},"end":{"line":61,"column":61}},"43":{"start":{"line":62,"column":29},"end":{"line":65,"column":9}},"44":{"start":{"line":66,"column":28},"end":{"line":66,"column":70}},"45":{"start":{"line":67,"column":25},"end":{"line":70,"column":9}},"46":{"start":{"line":71,"column":8},"end":{"line":71,"column":24}},"47":{"start":{"line":74,"column":8},"end":{"line":74,"column":29}},"48":{"start":{"line":75,"column":8},"end":{"line":75,"column":20}},"49":{"start":{"line":78,"column":0},"end":{"line":78,"column":56}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":9,"column":1},"end":{"line":9,"column":2}},"loc":{"start":{"line":9,"column":35},"end":{"line":13,"column":1}},"line":9},"1":{"name":"hydeSearchAdaEmbedding","decl":{"start":{"line":15,"column":15},"end":{"line":15,"column":37}},"loc":{"start":{"line":15,"column":50},"end":{"line":77,"column":1}},"line":15},"2":{"name":"(anonymous_2)","decl":{"start":{"line":34,"column":66},"end":{"line":34,"column":67}},"loc":{"start":{"line":34,"column":82},"end":{"line":37,"column":9}},"line":34}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":3},"end":{"line":13,"column":58}},"type":"binary-expr","locations":[{"start":{"line":13,"column":3},"end":{"line":13,"column":25}},{"start":{"line":13,"column":30},"end":{"line":13,"column":57}}],"line":13},"1":{"loc":{"start":{"line":44,"column":8},"end":{"line":46,"column":9}},"type":"if","locations":[{"start":{"line":44,"column":8},"end":{"line":46,"column":9}},{"start":{"line":44,"column":8},"end":{"line":46,"column":9}}],"line":44}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1},"f":{"0":1,"1":0,"2":0},"b":{"0":[1,1],"1":[0,0]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts"],"names":[],"mappings":";;;AAAA,yDAAiD;AACjD,6BAA6B;AAC7B,0DAAuD;AACvD,0DAAuD;AAEvD,IAAK,sBAIJ;AAJD,WAAK,sBAAsB;IACvB,2CAAiB,CAAA;IACjB,mCAAS,CAAA;IACT,mCAAS,CAAA;AACb,CAAC,EAJI,sBAAsB,KAAtB,sBAAsB,QAI1B;AAED,MAAM,YAAY,GAAG,IAAI,+BAAc,CACnC,4CAA4C,EAC5C,qDAAqD,EACrD,EAAE,EACF,eAAe,EACf,MAAM,EACN,GAAG,CACN,CAAC;AAEK,KAAK,UAAU,sBAAsB,CAAC,UAAsB;IAC/D,IAAI;QAEA,MAAM,KAAK,GAAG,eAAe,CAAC;QAC9B,MAAM,SAAS,GAAG,UAAU,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAGrC,MAAM,OAAO,GAAG,IAAI,sBAAO,EAAE,CAAC;QAE9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mCAAmC,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAE5E,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAG5D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;QAGxD,IAAI,UAAU,GAAG,MAAM,OAAO;aACzB,SAAS,CAAC,gBAAgB,EAAE,cAAc,CAAC;aAC3C,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;aACrB,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;aACzB,YAAY,CAAC,QAAQ,CAAC,CAAC;QAG5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAG7C,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAGrD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAG9C,MAAM,mBAAmB,GAAwB,OAAO,CAAC,GAAG,CACxD,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO,SAAS,CAAC;QACrB,CAAC,CAAC,CACL,CAAC;QAGF,MAAM,QAAQ,GAAG,IAAI,+BAAc,CAC/B,MAAM,mBAAmB,EACzB,sBAAsB,CAAC,EAAE,EACzB,IAAI,EACJ,EAAE,EACF,KAAK,EACL,SAAS,EACT,UAAU,EACV,EAAE,CACL,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAG7C,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;YAClC,aAAa,CAAC,IAAI,CACd,GAAG,UAAU,CAAC,QAAQ,YAAY,UAAU,CAAC,KAAK,eAAe,UAAU,CAAC,QAAQ,IAAI,CAC3F,CAAC;SACL;QAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE;YACtC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;SAC/B;QAED,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,WAAW,CAAC;QAGlC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC;QAEnE,UAAU,GAAG,MAAM,OAAO;aACrB,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC;aAC1C,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC;aAChC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC1C,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAGxD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC;QAE/D,UAAU,GAAG,MAAM,OAAO;aACrB,SAAS,CAAC,cAAc,EAAE,aAAa,CAAC;aACxC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;aACzB,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAEtD,MAAM,YAAY,GAAG;YACjB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE;YAC9C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE;SAC7C,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAE/D,MAAM,QAAQ,GAAG;YACb,cAAc,EAAE,WAAW;YAC3B,WAAW,EAAE,WAAW;SAC3B,CAAC;QAEF,OAAO,QAAQ,CAAC;KACnB;IAAC,OAAO,KAAK,EAAE;QAEZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,MAAM,KAAK,CAAC;KACf;AACL,CAAC;AA9GD,wDA8GC","sourcesContent":["import { Jsonnet } from '@hanazuki/node-jsonnet';\nimport * as path from 'path';\nimport { OpenAiEndpoint } from '../lib/OpenAiEndpoint';\nimport { PostgresClient } from '../lib/PostgresClient';\nimport { ArkRequest } from '../types/ArkRequest';\nenum PostgresDistanceMetric {\n COSINE = 'COSINE',\n IP = 'IP',\n L2 = 'L2',\n}\n\nconst gpt3endpoint = new OpenAiEndpoint(\n 'https://api.openai.com/v1/chat/completions',\n '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',\n '',\n 'gpt-3.5-turbo',\n 'user',\n 0.7\n);\n\nexport async function hydeSearchAdaEmbedding(arkRequest: ArkRequest) {\n try {\n // Get required params from API...\n const table = 'ada_hyde_prod';\n const namespace = '360_docs';\n const query = arkRequest.query;\n const topK = Number(arkRequest.topK);\n\n //\n const jsonnet = new Jsonnet();\n\n const promptPath = path.join(process.cwd(), './src/hydeExample/prompts.jsonnet');\n const hydePath = path.join(process.cwd(), './src/hydeExample/hyde.jsonnet');\n // Load Jsonnet to extract args..\n const promptLoader = await jsonnet.evaluateFile(promptPath);\n\n // Getting ${summary} basePrompt\n const promptTemplate = JSON.parse(promptLoader).summary;\n\n // Getting the updated promptTemplate with query\n let hydeLoader = await jsonnet\n .extString('promptTemplate', promptTemplate)\n .extString('time', '')\n .extString('query', query)\n .evaluateFile(hydePath);\n\n // Get concatenated prompt\n const prompt = JSON.parse(hydeLoader).prompt;\n\n // Block and get the response from GPT3\n const gptResponse = await gpt3endpoint.gptFn(prompt);\n\n // Chain 1 ==> Get Gpt3Response & split\n const gpt3Responses = gptResponse.split('\\n');\n\n // Chain 2 ==> Get Embeddings from OpenAI using Each Response\n const embeddingsListChain: Promise = Promise.all(\n gpt3Responses.map(async (resp) => {\n const embedding = await gpt3endpoint.embeddings(resp);\n return embedding;\n })\n );\n\n // Chain 5 ==> Query via EmbeddingChain\n const dbClient = new PostgresClient(\n await embeddingsListChain,\n PostgresDistanceMetric.IP,\n topK,\n 20,\n table,\n namespace,\n arkRequest,\n 15\n );\n const queryResult = await dbClient.dbQuery();\n\n // Chain 6 ==> Create Prompt using Embeddings\n const retrievedDocs: string[] = [];\n\n for (const embeddings of queryResult) {\n retrievedDocs.push(\n `${embeddings.raw_text}\\n score:${embeddings.score}\\n filename:${embeddings.filename}\\n`\n );\n }\n\n if (retrievedDocs.join('').length > 4096) {\n retrievedDocs.length = 4096;\n }\n\n const currentTime = new Date().toLocaleString();\n const formattedTime = currentTime;\n\n // System prompt\n const ansPromptSystem = JSON.parse(promptLoader).ans_prompt_system;\n\n hydeLoader = await jsonnet\n .extString(promptTemplate, ansPromptSystem)\n .extString('time', formattedTime)\n .extString('qeury', retrievedDocs.join(''))\n .evaluateFile(hydePath);\n\n const finalPromptSystem = JSON.parse(hydeLoader).prompt;\n\n // User prompt\n const ansPromptUser = JSON.parse(promptLoader).ans_prompt_user;\n\n hydeLoader = await jsonnet\n .extString(promptTemplate, ansPromptUser)\n .extString('qeury', query)\n .evaluateFile(hydePath);\n const finalPromptUser = JSON.parse(hydeLoader).prompt;\n\n const chatMessages = [\n { role: 'system', content: finalPromptSystem },\n { role: 'user', content: finalPromptUser },\n ];\n\n const finalAnswer = await gpt3endpoint.gptFnChat(chatMessages);\n\n const response = {\n wordEmbeddings: queryResult,\n finalAnswer: finalAnswer,\n };\n\n return response;\n } catch (error) {\n // Handle errors here\n console.error(error);\n throw error;\n }\n}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ef44be5395af2338366d467cfd2e87b40cc05abb","contentHash":"b58a305117fb51c4514152aed10ec1fa07921fa65f150418d303cf3461f783d4"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":32}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":23}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":29}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":27}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":27}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":25}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":37}},"9":{"start":{"line":15,"column":25},"end":{"line":45,"column":10}},"10":{"start":{"line":32,"column":12},"end":{"line":32,"column":41}},"11":{"start":{"line":35,"column":12},"end":{"line":44,"column":13}},"12":{"start":{"line":36,"column":16},"end":{"line":36,"column":89}},"13":{"start":{"line":37,"column":16},"end":{"line":37,"column":67}},"14":{"start":{"line":39,"column":17},"end":{"line":44,"column":13}},"15":{"start":{"line":40,"column":16},"end":{"line":40,"column":68}},"16":{"start":{"line":43,"column":16},"end":{"line":43,"column":70}},"17":{"start":{"line":46,"column":8},"end":{"line":46,"column":43}},"18":{"start":{"line":49,"column":25},"end":{"line":73,"column":10}},"19":{"start":{"line":60,"column":12},"end":{"line":60,"column":51}},"20":{"start":{"line":63,"column":12},"end":{"line":72,"column":13}},"21":{"start":{"line":64,"column":16},"end":{"line":64,"column":89}},"22":{"start":{"line":65,"column":16},"end":{"line":65,"column":67}},"23":{"start":{"line":67,"column":17},"end":{"line":72,"column":13}},"24":{"start":{"line":68,"column":16},"end":{"line":68,"column":68}},"25":{"start":{"line":71,"column":16},"end":{"line":71,"column":70}},"26":{"start":{"line":74,"column":8},"end":{"line":74,"column":24}},"27":{"start":{"line":77,"column":25},"end":{"line":102,"column":10}},"28":{"start":{"line":89,"column":12},"end":{"line":89,"column":41}},"29":{"start":{"line":92,"column":12},"end":{"line":101,"column":13}},"30":{"start":{"line":93,"column":16},"end":{"line":93,"column":89}},"31":{"start":{"line":94,"column":16},"end":{"line":94,"column":67}},"32":{"start":{"line":96,"column":17},"end":{"line":101,"column":13}},"33":{"start":{"line":97,"column":16},"end":{"line":97,"column":68}},"34":{"start":{"line":100,"column":16},"end":{"line":100,"column":70}},"35":{"start":{"line":103,"column":8},"end":{"line":103,"column":43}},"36":{"start":{"line":106,"column":25},"end":{"line":136,"column":10}},"37":{"start":{"line":123,"column":12},"end":{"line":123,"column":41}},"38":{"start":{"line":126,"column":12},"end":{"line":135,"column":13}},"39":{"start":{"line":127,"column":16},"end":{"line":127,"column":89}},"40":{"start":{"line":128,"column":16},"end":{"line":128,"column":67}},"41":{"start":{"line":130,"column":17},"end":{"line":135,"column":13}},"42":{"start":{"line":131,"column":16},"end":{"line":131,"column":68}},"43":{"start":{"line":134,"column":16},"end":{"line":134,"column":70}},"44":{"start":{"line":137,"column":8},"end":{"line":137,"column":43}},"45":{"start":{"line":140,"column":0},"end":{"line":140,"column":40}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":61},"end":{"line":13,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":4},"end":{"line":14,"column":5}},"loc":{"start":{"line":14,"column":24},"end":{"line":47,"column":5}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":31,"column":18},"end":{"line":31,"column":19}},"loc":{"start":{"line":31,"column":38},"end":{"line":33,"column":9}},"line":31},"3":{"name":"(anonymous_3)","decl":{"start":{"line":34,"column":19},"end":{"line":34,"column":20}},"loc":{"start":{"line":34,"column":36},"end":{"line":45,"column":9}},"line":34},"4":{"name":"(anonymous_4)","decl":{"start":{"line":48,"column":4},"end":{"line":48,"column":5}},"loc":{"start":{"line":48,"column":27},"end":{"line":75,"column":5}},"line":48},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":18},"end":{"line":59,"column":19}},"loc":{"start":{"line":59,"column":38},"end":{"line":61,"column":9}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":62,"column":19},"end":{"line":62,"column":20}},"loc":{"start":{"line":62,"column":36},"end":{"line":73,"column":9}},"line":62},"7":{"name":"(anonymous_7)","decl":{"start":{"line":76,"column":4},"end":{"line":76,"column":5}},"loc":{"start":{"line":76,"column":34},"end":{"line":104,"column":5}},"line":76},"8":{"name":"(anonymous_8)","decl":{"start":{"line":88,"column":18},"end":{"line":88,"column":19}},"loc":{"start":{"line":88,"column":38},"end":{"line":90,"column":9}},"line":88},"9":{"name":"(anonymous_9)","decl":{"start":{"line":91,"column":19},"end":{"line":91,"column":20}},"loc":{"start":{"line":91,"column":36},"end":{"line":102,"column":9}},"line":91},"10":{"name":"(anonymous_10)","decl":{"start":{"line":105,"column":4},"end":{"line":105,"column":5}},"loc":{"start":{"line":105,"column":37},"end":{"line":138,"column":5}},"line":105},"11":{"name":"(anonymous_11)","decl":{"start":{"line":122,"column":18},"end":{"line":122,"column":19}},"loc":{"start":{"line":122,"column":38},"end":{"line":124,"column":9}},"line":122},"12":{"name":"(anonymous_12)","decl":{"start":{"line":125,"column":19},"end":{"line":125,"column":20}},"loc":{"start":{"line":125,"column":36},"end":{"line":136,"column":9}},"line":125}},"branchMap":{"0":{"loc":{"start":{"line":35,"column":12},"end":{"line":44,"column":13}},"type":"if","locations":[{"start":{"line":35,"column":12},"end":{"line":44,"column":13}},{"start":{"line":35,"column":12},"end":{"line":44,"column":13}}],"line":35},"1":{"loc":{"start":{"line":39,"column":17},"end":{"line":44,"column":13}},"type":"if","locations":[{"start":{"line":39,"column":17},"end":{"line":44,"column":13}},{"start":{"line":39,"column":17},"end":{"line":44,"column":13}}],"line":39},"2":{"loc":{"start":{"line":63,"column":12},"end":{"line":72,"column":13}},"type":"if","locations":[{"start":{"line":63,"column":12},"end":{"line":72,"column":13}},{"start":{"line":63,"column":12},"end":{"line":72,"column":13}}],"line":63},"3":{"loc":{"start":{"line":67,"column":17},"end":{"line":72,"column":13}},"type":"if","locations":[{"start":{"line":67,"column":17},"end":{"line":72,"column":13}},{"start":{"line":67,"column":17},"end":{"line":72,"column":13}}],"line":67},"4":{"loc":{"start":{"line":92,"column":12},"end":{"line":101,"column":13}},"type":"if","locations":[{"start":{"line":92,"column":12},"end":{"line":101,"column":13}},{"start":{"line":92,"column":12},"end":{"line":101,"column":13}}],"line":92},"5":{"loc":{"start":{"line":96,"column":17},"end":{"line":101,"column":13}},"type":"if","locations":[{"start":{"line":96,"column":17},"end":{"line":101,"column":13}},{"start":{"line":96,"column":17},"end":{"line":101,"column":13}}],"line":96},"6":{"loc":{"start":{"line":126,"column":12},"end":{"line":135,"column":13}},"type":"if","locations":[{"start":{"line":126,"column":12},"end":{"line":135,"column":13}},{"start":{"line":126,"column":12},"end":{"line":135,"column":13}}],"line":126},"7":{"loc":{"start":{"line":130,"column":17},"end":{"line":135,"column":13}},"type":"if","locations":[{"start":{"line":130,"column":17},"end":{"line":135,"column":13}},{"start":{"line":130,"column":17},"end":{"line":135,"column":13}}],"line":130}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":1},"f":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts"],"names":[],"mappings":";;;AAAA,iCAA0B;AAE1B,MAAa,cAAc;IAQvB,YACI,GAAW,EACX,MAAc,EACd,KAAa,EACb,KAAa,EACb,IAAY,EACZ,UAAkB;QAElB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACtB,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,4CAA4C,EAC5C;YACI,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE;gBACN;oBACI,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,MAAM;iBAClB;aACJ;YACD,WAAW,EAAE,IAAI,CAAC,UAAU;SAC/B,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QACP,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QACzB,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,sCAAsC,EACtC;YACI,KAAK,EAAE,wBAAwB;YAC/B,KAAK,EAAE,IAAI;SACd,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3C,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QAEP,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,YAAY;QACxB,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,4CAA4C,EAC5C;YACI,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,YAAY;YACtB,WAAW,EAAE,IAAI,CAAC,UAAU;SAC/B,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QAEP,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAc;QACnC,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,4CAA4C,EAC5C;YACI,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE;gBACN;oBACI,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,MAAM;iBAClB;aACJ;YACD,WAAW,EAAE,IAAI,CAAC,UAAU;SAC/B,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QACP,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;CACJ;AAlKD,wCAkKC","sourcesContent":["import axios from 'axios';\n\nexport class OpenAiEndpoint {\n url: string;\n apiKey: string;\n orgId: string;\n model: string;\n role: string;\n temprature: number;\n\n constructor(\n url: string,\n apiKey: string,\n orgId: string,\n model: string,\n role: string,\n temprature: number\n ) {\n this.url = url;\n this.apiKey = apiKey;\n this.orgId = orgId;\n this.model = model;\n this.role = role;\n this.temprature = temprature;\n }\n\n async gptFn(prompt: string): Promise {\n const responce = await axios\n .post(\n 'https://api.openai.com/v1/chat/completions',\n {\n model: this.model,\n messages: [\n {\n role: this.role,\n content: prompt,\n },\n ],\n temperature: this.temprature,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.apiKey,\n 'content-type': 'application/json',\n },\n }\n )\n .then(function (response) {\n return response.data.choices;\n })\n .catch(function (error) {\n if (error.response) {\n console.log('Server responded with status code:', error.response.status);\n console.log('Response data:', error.response.data);\n } else if (error.request) {\n console.log('No response received:', error.request);\n } else {\n console.log('Error creating request:', error.message);\n }\n });\n return responce[0].message.content;\n }\n\n async embeddings(resp: string): Promise {\n const responce = await axios\n .post(\n 'https://api.openai.com/v1/embeddings',\n {\n model: 'text-embedding-ada-002',\n input: resp,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.apiKey,\n 'content-type': 'application/json',\n },\n }\n )\n .then(function (response) {\n return response.data.data[0].embedding;\n })\n .catch(function (error) {\n if (error.response) {\n console.log('Server responded with status code:', error.response.status);\n console.log('Response data:', error.response.data);\n } else if (error.request) {\n console.log('No response received:', error.request);\n } else {\n console.log('Error creating request:', error.message);\n }\n });\n\n return responce;\n }\n\n async gptFnChat(chatMessages) {\n const responce = await axios\n .post(\n 'https://api.openai.com/v1/chat/completions',\n {\n model: this.model,\n messages: chatMessages,\n temperature: this.temprature,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.apiKey,\n 'content-type': 'application/json',\n },\n }\n )\n .then(function (response) {\n return response.data.choices;\n })\n .catch(function (error) {\n if (error.response) {\n console.log('Server responded with status code:', error.response.status);\n console.log('Response data:', error.response.data);\n } else if (error.request) {\n console.log('No response received:', error.request);\n } else {\n console.log('Error creating request:', error.message);\n }\n });\n\n return responce[0].message.content;\n }\n\n async gptFnTestGenerator(prompt: string): Promise {\n const responce = await axios\n .post(\n 'https://api.openai.com/v1/chat/completions',\n {\n model: this.model,\n messages: [\n {\n role: this.role,\n content: prompt,\n },\n ],\n temperature: this.temprature,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.apiKey,\n 'content-type': 'application/json',\n },\n }\n )\n .then(function (response) {\n return response.data.choices;\n })\n .catch(function (error) {\n if (error.response) {\n console.log('Server responded with status code:', error.response.status);\n console.log('Response data:', error.response.data);\n } else if (error.request) {\n console.log('No response received:', error.request);\n } else {\n console.log('Error creating request:', error.message);\n }\n });\n return responce[0].message.content;\n }\n}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3c5323af4d78716381cdfafe02415eb488befab9","contentHash":"eac568231f0f1152f49341c9fc4fd73b4b557501eeff610f91d30157e54d27fb"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":18},"end":{"line":4,"column":36}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":45}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":29}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":25}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":29}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":35}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":35}},"9":{"start":{"line":13,"column":8},"end":{"line":13,"column":37}},"10":{"start":{"line":14,"column":8},"end":{"line":14,"column":37}},"11":{"start":{"line":17,"column":20},"end":{"line":17,"column":59}},"12":{"start":{"line":18,"column":30},"end":{"line":18,"column":55}},"13":{"start":{"line":19,"column":8},"end":{"line":76,"column":9}},"14":{"start":{"line":20,"column":27},"end":{"line":20,"column":71}},"15":{"start":{"line":21,"column":12},"end":{"line":21,"column":46}},"16":{"start":{"line":22,"column":24},"end":{"line":22,"column":26}},"17":{"start":{"line":23,"column":12},"end":{"line":62,"column":13}},"18":{"start":{"line":23,"column":25},"end":{"line":23,"column":26}},"19":{"start":{"line":24,"column":34},"end":{"line":24,"column":72}},"20":{"start":{"line":25,"column":16},"end":{"line":29,"column":222}},"21":{"start":{"line":30,"column":16},"end":{"line":31,"column":85}},"22":{"start":{"line":31,"column":20},"end":{"line":31,"column":85}},"23":{"start":{"line":32,"column":16},"end":{"line":33,"column":86}},"24":{"start":{"line":33,"column":20},"end":{"line":33,"column":86}},"25":{"start":{"line":34,"column":16},"end":{"line":35,"column":79}},"26":{"start":{"line":35,"column":20},"end":{"line":35,"column":79}},"27":{"start":{"line":36,"column":16},"end":{"line":36,"column":311}},"28":{"start":{"line":37,"column":16},"end":{"line":38,"column":90}},"29":{"start":{"line":38,"column":20},"end":{"line":38,"column":90}},"30":{"start":{"line":39,"column":16},"end":{"line":40,"column":90}},"31":{"start":{"line":40,"column":20},"end":{"line":40,"column":90}},"32":{"start":{"line":41,"column":16},"end":{"line":42,"column":90}},"33":{"start":{"line":42,"column":20},"end":{"line":42,"column":90}},"34":{"start":{"line":43,"column":16},"end":{"line":43,"column":225}},"35":{"start":{"line":44,"column":16},"end":{"line":57,"column":17}},"36":{"start":{"line":46,"column":24},"end":{"line":46,"column":75}},"37":{"start":{"line":47,"column":24},"end":{"line":47,"column":30}},"38":{"start":{"line":49,"column":24},"end":{"line":49,"column":76}},"39":{"start":{"line":50,"column":24},"end":{"line":50,"column":30}},"40":{"start":{"line":52,"column":24},"end":{"line":52,"column":75}},"41":{"start":{"line":53,"column":24},"end":{"line":53,"column":30}},"42":{"start":{"line":55,"column":24},"end":{"line":55,"column":59}},"43":{"start":{"line":56,"column":24},"end":{"line":56,"column":30}},"44":{"start":{"line":58,"column":16},"end":{"line":58,"column":48}},"45":{"start":{"line":59,"column":16},"end":{"line":61,"column":17}},"46":{"start":{"line":60,"column":20},"end":{"line":60,"column":45}},"47":{"start":{"line":63,"column":12},"end":{"line":68,"column":13}},"48":{"start":{"line":64,"column":16},"end":{"line":64,"column":159}},"49":{"start":{"line":67,"column":16},"end":{"line":67,"column":72}},"50":{"start":{"line":69,"column":28},"end":{"line":69,"column":60}},"51":{"start":{"line":70,"column":12},"end":{"line":70,"column":32}},"52":{"start":{"line":71,"column":12},"end":{"line":71,"column":27}},"53":{"start":{"line":74,"column":12},"end":{"line":74,"column":33}},"54":{"start":{"line":75,"column":12},"end":{"line":75,"column":24}},"55":{"start":{"line":79,"column":0},"end":{"line":79,"column":40}},"56":{"start":{"line":81,"column":0},"end":{"line":85,"column":60}},"57":{"start":{"line":82,"column":4},"end":{"line":82,"column":48}},"58":{"start":{"line":83,"column":4},"end":{"line":83,"column":40}},"59":{"start":{"line":84,"column":4},"end":{"line":84,"column":40}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":100},"end":{"line":15,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":5}},"loc":{"start":{"line":16,"column":20},"end":{"line":77,"column":5}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":81,"column":1},"end":{"line":81,"column":2}},"loc":{"start":{"line":81,"column":35},"end":{"line":85,"column":1}},"line":81}},"branchMap":{"0":{"loc":{"start":{"line":30,"column":16},"end":{"line":31,"column":85}},"type":"if","locations":[{"start":{"line":30,"column":16},"end":{"line":31,"column":85}},{"start":{"line":30,"column":16},"end":{"line":31,"column":85}}],"line":30},"1":{"loc":{"start":{"line":32,"column":16},"end":{"line":33,"column":86}},"type":"if","locations":[{"start":{"line":32,"column":16},"end":{"line":33,"column":86}},{"start":{"line":32,"column":16},"end":{"line":33,"column":86}}],"line":32},"2":{"loc":{"start":{"line":34,"column":16},"end":{"line":35,"column":79}},"type":"if","locations":[{"start":{"line":34,"column":16},"end":{"line":35,"column":79}},{"start":{"line":34,"column":16},"end":{"line":35,"column":79}}],"line":34},"3":{"loc":{"start":{"line":37,"column":16},"end":{"line":38,"column":90}},"type":"if","locations":[{"start":{"line":37,"column":16},"end":{"line":38,"column":90}},{"start":{"line":37,"column":16},"end":{"line":38,"column":90}}],"line":37},"4":{"loc":{"start":{"line":39,"column":16},"end":{"line":40,"column":90}},"type":"if","locations":[{"start":{"line":39,"column":16},"end":{"line":40,"column":90}},{"start":{"line":39,"column":16},"end":{"line":40,"column":90}}],"line":39},"5":{"loc":{"start":{"line":41,"column":16},"end":{"line":42,"column":90}},"type":"if","locations":[{"start":{"line":41,"column":16},"end":{"line":42,"column":90}},{"start":{"line":41,"column":16},"end":{"line":42,"column":90}}],"line":41},"6":{"loc":{"start":{"line":44,"column":16},"end":{"line":57,"column":17}},"type":"switch","locations":[{"start":{"line":45,"column":20},"end":{"line":47,"column":30}},{"start":{"line":48,"column":20},"end":{"line":50,"column":30}},{"start":{"line":51,"column":20},"end":{"line":53,"column":30}},{"start":{"line":54,"column":20},"end":{"line":56,"column":30}}],"line":44},"7":{"loc":{"start":{"line":59,"column":16},"end":{"line":61,"column":17}},"type":"if","locations":[{"start":{"line":59,"column":16},"end":{"line":61,"column":17}},{"start":{"line":59,"column":16},"end":{"line":61,"column":17}}],"line":59},"8":{"loc":{"start":{"line":63,"column":12},"end":{"line":68,"column":13}},"type":"if","locations":[{"start":{"line":63,"column":12},"end":{"line":68,"column":13}},{"start":{"line":63,"column":12},"end":{"line":68,"column":13}}],"line":63},"9":{"loc":{"start":{"line":85,"column":3},"end":{"line":85,"column":58}},"type":"binary-expr","locations":[{"start":{"line":85,"column":3},"end":{"line":85,"column":25}},{"start":{"line":85,"column":30},"end":{"line":85,"column":57}}],"line":85}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":1,"56":1,"57":1,"58":1,"59":1},"f":{"0":0,"1":0,"2":1},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0,0,0],"7":[0,0],"8":[0,0],"9":[1,1]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts"],"names":[],"mappings":";;;AAAA,qCAA2C;AAE3C,MAAa,cAAc;IAUvB,YACI,cAA0B,EAC1B,MAAM,EACN,IAAI,EACJ,MAAM,EACN,SAAS,EACT,SAAiB,EACjB,UAAe,EACf,UAAU;QAEV,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO;QACT,MAAM,GAAG,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;QACrC,MAAM,aAAa,GAAG,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAChD,IAAI;YACA,MAAM,MAAM,GAAG,8BAA8B,IAAI,CAAC,MAAM,GAAG,CAAC;YAC5D,MAAM,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAElC,IAAI,KAAK,GAAW,EAAE,CAAC;YAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACjD,MAAM,SAAS,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEjE,KAAK,IAAI;kBAEL,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,UAC/B,qDACI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,cAC/B;kBAEI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UACrC,sDACI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,cACrC;kBAEI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,UAC/B,qDACI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,cAC/B;oKACoJ,SAAS,OACzJ,IAAI,CAAC,UAAU,CAAC,KACpB,oBAAoB,CAAC;gBAErB,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,MAAM;oBAC7C,KAAK,IAAI,0BAA0B,SAAS,oBAAoB,CAAC;gBACrE,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,sBAAsB,SAAS,yBAAyB,CAAC;gBACtE,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,qBAAqB,SAAS,mBAAmB,CAAC;gBAE/D,KAAK,IAAI,uOAAuO,IAAI,CAAC,SAAS,uBAAuB,IAAI,CAAC,SAAS,GAAG,CAAC;gBAEvS,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,MAAM;oBAC7C,KAAK,IAAI,4BAA4B,SAAS,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,4BAA4B,SAAS,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,4BAA4B,SAAS,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;gBAE1E,KAAK,IAAI,aAAa,IAAI,CAAC,SAAS,SAAS,IAAI,CAAC,UAAU,CAAC,aAAa,+BAA+B,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,wDAAwD,CAAC;gBAEjN,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;oBAC9B,KAAK,WAAW;wBACZ,KAAK,IAAI,yCAAyC,CAAC;wBACnD,MAAM;oBACV,KAAK,YAAY;wBACb,KAAK,IAAI,0CAA0C,CAAC;wBACpD,MAAM;oBACV,KAAK,WAAW;wBACZ,KAAK,IAAI,yCAAyC,CAAC;wBACnD,MAAM;oBACV,KAAK,SAAS;wBACV,KAAK,IAAI,yBAAyB,CAAC;wBACnC,MAAM;iBACb;gBAED,KAAK,IAAI,UAAU,IAAI,CAAC,IAAI,GAAG,CAAC;gBAChC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;oBACpC,KAAK,IAAI,eAAe,CAAC;iBAC5B;aACJ;YAED,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,KAAK,GAAG,0DAA0D,KAAK,qDAAqD,IAAI,CAAC,UAAU,GAAG,CAAC;aAClJ;iBAAM;gBACH,KAAK,IAAI,kCAAkC,IAAI,CAAC,IAAI,GAAG,CAAC;aAC3D;YACD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC;SAClB;QAAC,OAAO,KAAK,EAAE;YAEZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,KAAK,CAAC;SACf;IACL,CAAC;CACJ;AAnHD,wCAmHC;AAED,IAAK,sBAIJ;AAJD,WAAK,sBAAsB;IACvB,2CAAiB,CAAA;IACjB,mCAAS,CAAA;IACT,mCAAS,CAAA;AACb,CAAC,EAJI,sBAAsB,KAAtB,sBAAsB,QAI1B","sourcesContent":["import { createConnection } from 'typeorm';\n\nexport class PostgresClient {\n wordEmbeddings: number[][];\n metric: PostgresDistanceMetric;\n topK: number;\n probes: number;\n tableName: string;\n namespace: string;\n arkRequest: any;\n upperLimit: number;\n\n constructor(\n wordEmbeddings: number[][],\n metric,\n topK,\n probes,\n tableName,\n namespace: string,\n arkRequest: any,\n upperLimit\n ) {\n this.wordEmbeddings = wordEmbeddings;\n this.metric = metric;\n this.topK = topK;\n this.probes = probes;\n this.tableName = tableName;\n this.namespace = namespace;\n this.arkRequest = arkRequest;\n this.upperLimit = upperLimit;\n }\n\n async dbQuery() {\n const con = await createConnection();\n const entityManager = con.createEntityManager();\n try {\n const query1 = `SET LOCAL ivfflat.probes = ${this.probes};`;\n await entityManager.query(query1);\n\n let query: string = '';\n\n for (let i = 0; i < this.wordEmbeddings.length; i++) {\n const embedding: string = JSON.stringify(this.wordEmbeddings[i]);\n\n query += `( SELECT id, raw_text, document_date, metadata, namespace, filename, timestamp, \n ${\n this.arkRequest.textWeight.baseWeight\n } / (ROW_NUMBER() OVER (ORDER BY text_rank DESC) + ${\n this.arkRequest.textWeight.fineTuneWeight\n }) +\n ${\n this.arkRequest.similarityWeight.baseWeight\n } / (ROW_NUMBER() OVER (ORDER BY similarity DESC) + ${\n this.arkRequest.similarityWeight.fineTuneWeight\n }) +\n ${\n this.arkRequest.dateWeight.baseWeight\n } / (ROW_NUMBER() OVER (ORDER BY date_rank DESC) + ${\n this.arkRequest.dateWeight.fineTuneWeight\n }) AS rrf_score\n FROM ( SELECT sv.id, sv.raw_text, sv.namespace, sv.filename, sv.timestamp, svtm.document_date, svtm.metadata, ts_rank_cd(sv.tsv, plainto_tsquery('${'english'}', '${\n this.arkRequest.query\n }')) AS text_rank, `;\n\n if (this.metric === PostgresDistanceMetric.COSINE)\n query += `1 - (sv.embedding <=> '${embedding}') AS similarity, `;\n if (this.metric === PostgresDistanceMetric.IP)\n query += `(sv.embedding <#> '${embedding}') * -1 AS similarity, `;\n if (this.metric === PostgresDistanceMetric.L2)\n query += `sv.embedding <-> '${embedding}' AS similarity, `;\n\n query += `CASE WHEN svtm.document_date IS NULL THEN 0 ELSE EXTRACT(YEAR FROM svtm.document_date) * 365 + EXTRACT(DOY FROM svtm.document_date) END AS date_rank FROM (SELECT id, raw_text, embedding, tsv, namespace, filename, timestamp from ${this.tableName} WHERE namespace = '${this.namespace}'`;\n\n if (this.metric === PostgresDistanceMetric.COSINE)\n query += ` ORDER BY embedding <=> '${embedding}' LIMIT ${this.topK}`;\n if (this.metric === PostgresDistanceMetric.IP)\n query += ` ORDER BY embedding <#> '${embedding}' LIMIT ${this.topK}`;\n if (this.metric === PostgresDistanceMetric.L2)\n query += ` ORDER BY embedding <-> '${embedding}' LIMIT ${this.topK}`;\n\n query += `) sv JOIN ${this.tableName}_join_${this.arkRequest.metadataTable} jtm ON sv.id = jtm.id JOIN ${this.tableName}_${this.arkRequest.metadataTable} svtm ON jtm.metadata_id = svtm.metadata_id) subquery `;\n\n switch (this.arkRequest.orderRRF) {\n case 'text_rank':\n query += `ORDER BY text_rank DESC, rrf_score DESC`;\n break;\n case 'similarity':\n query += `ORDER BY similarity DESC, rrf_score DESC`;\n break;\n case 'date_rank':\n query += `ORDER BY date_rank DESC, rrf_score DESC`;\n break;\n case 'default':\n query += `ORDER BY rrf_score DESC`;\n break;\n }\n\n query += ` LIMIT ${this.topK})`;\n if (i < this.wordEmbeddings.length - 1) {\n query += ' UNION ALL \\n';\n }\n }\n\n if (this.wordEmbeddings.length > 1) {\n query = `SELECT * FROM (SELECT DISTINCT ON (result.id) * FROM ( ${query} ) result) subquery ORDER BY rrf_score DESC LIMIT ${this.upperLimit};`;\n } else {\n query += ` ORDER BY rrf_score DESC LIMIT ${this.topK};`;\n }\n const results = await entityManager.query(query);\n await con.destroy();\n return results;\n } catch (error) {\n // Handle errors here\n console.error(error);\n throw error;\n }\n }\n}\n\nenum PostgresDistanceMetric {\n COSINE = 'COSINE',\n IP = 'IP',\n L2 = 'L2',\n}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"5639f9bcc787a8827404bc7635271b0a5ba05241","contentHash":"4f2b9ecb2389c9b8416bce3f5963107ec0354e46bc8053ba98948c3769f41747"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":28}},"2":{"start":{"line":4,"column":23},"end":{"line":4,"column":56}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":28}},"4":{"start":{"line":6,"column":25},"end":{"line":6,"column":58}},"5":{"start":{"line":7,"column":16},"end":{"line":7,"column":44}},"6":{"start":{"line":8,"column":19},"end":{"line":8,"column":83}},"7":{"start":{"line":9,"column":26},"end":{"line":9,"column":96}},"8":{"start":{"line":10,"column":21},"end":{"line":10,"column":191}},"9":{"start":{"line":11,"column":18},"end":{"line":23,"column":7}},"10":{"start":{"line":25,"column":4},"end":{"line":46,"column":5}},"11":{"start":{"line":26,"column":21},"end":{"line":26,"column":59}},"12":{"start":{"line":27,"column":27},"end":{"line":30,"column":44}},"13":{"start":{"line":31,"column":32},"end":{"line":31,"column":101}},"14":{"start":{"line":32,"column":8},"end":{"line":32,"column":67}},"15":{"start":{"line":33,"column":23},"end":{"line":33,"column":109}},"16":{"start":{"line":34,"column":8},"end":{"line":34,"column":61}},"17":{"start":{"line":35,"column":28},"end":{"line":35,"column":36}},"18":{"start":{"line":36,"column":8},"end":{"line":36,"column":50}},"19":{"start":{"line":37,"column":8},"end":{"line":37,"column":73}},"20":{"start":{"line":38,"column":8},"end":{"line":38,"column":65}},"21":{"start":{"line":39,"column":27},"end":{"line":39,"column":59}},"22":{"start":{"line":40,"column":8},"end":{"line":40,"column":32}},"23":{"start":{"line":41,"column":8},"end":{"line":41,"column":117}},"24":{"start":{"line":42,"column":8},"end":{"line":42,"column":30}},"25":{"start":{"line":45,"column":8},"end":{"line":45,"column":27}},"26":{"start":{"line":48,"column":0},"end":{"line":48,"column":32}},"27":{"start":{"line":50,"column":27},"end":{"line":50,"column":60}},"28":{"start":{"line":51,"column":23},"end":{"line":51,"column":25}},"29":{"start":{"line":53,"column":4},"end":{"line":55,"column":5}},"30":{"start":{"line":54,"column":8},"end":{"line":54,"column":34}},"31":{"start":{"line":56,"column":4},"end":{"line":56,"column":22}}},"fnMap":{"0":{"name":"getContent","decl":{"start":{"line":24,"column":15},"end":{"line":24,"column":25}},"loc":{"start":{"line":24,"column":28},"end":{"line":47,"column":1}},"line":24},"1":{"name":"extractCodeBlocks","decl":{"start":{"line":49,"column":9},"end":{"line":49,"column":26}},"loc":{"start":{"line":49,"column":33},"end":{"line":57,"column":1}},"line":49}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0},"f":{"0":0,"1":0},"b":{},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts"],"names":[],"mappings":";;;AAAA,yDAAiD;AACjD,6BAA6B;AAC7B,2DAAwD;AAExD,MAAM,OAAO,GAAG,IAAI,sBAAO,EAAE,CAAC;AAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAC,sCAAsC,CAAC,CAAC;AACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAC,4CAA4C,CAAC,CAAC;AAEhG,MAAM,YAAY,GAAG,IAAI,+BAAc,CACnC,4CAA4C,EAC5C,qDAAqD,EACrD,EAAE,EACF,eAAe,EACf,MAAM,EACN,GAAG,CACN,CAAC;AAEF,MAAM,SAAS,GAAE,6CAA6C;IAC9D,2CAA2C;IAC3C,KAAK;IACL,iBAAiB;IACjB,4DAA4D;IAC5D,SAAS;IACT,+CAA+C;IAC/C,kDAAkD;IAClD,yEAAyE;IACzE,IAAI;IACJ,gCAAgC;IAChC,SAAS;IACT,GAAG,CAAC;AAEG,KAAK,UAAU,UAAU;IAC5B,IAAG;QAEC,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,gBAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;aACrD,SAAS,CAAC,YAAY,EAAC,SAAS,CAAC;aACjC,SAAS,CAAC,cAAc,EAAC,MAAM,CAAC;aAChC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAEjE,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;QAE9F,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAC,eAAe,CAAC,CAAC;QAEzD,IAAI,QAAQ,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,eAAe,GAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;QAEpG,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,aAAa,GAAG,QAAQ,CAAC;QAE7B,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC;QAE1C,aAAa,IAAI,MAAM,YAAY,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAEjE,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAC,aAAa,CAAC,CAAC;QAEvD,MAAM,UAAU,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,QAAQ,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAc,GAAC,MAAM,GAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;KAGzB;IAAA,OAAM,KAAK,EAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACtB;AACL,CAAC;AAnCD,gCAmCC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,MAAM,cAAc,GAAG,iCAAiC,CAAC;IACzD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;QACnD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3B;IAED,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import { Jsonnet } from \"@hanazuki/node-jsonnet\";\nimport * as path from 'path';\nimport { OpenAiEndpoint } from \"src/lib/OpenAiEndpoint\";\n\nconst jsonnet = new Jsonnet();\nconst promptPath = path.join(process.cwd(),'./src/testGeneration/prompts.jsonnet');\nconst testGeneratorPath = path.join(process.cwd(),'./src/testGeneration/testGenerator.jsonnet');\n\nconst gpt3endpoint = new OpenAiEndpoint(\n 'https://api.openai.com/v1/chat/completions',\n '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',\n '',\n 'gpt-3.5-turbo',\n 'user',\n 0.7\n);\n\nconst classText =\"@RestResource(urlMapping='/classcontent')\\n\" +\n\"global with sharing class ClassContent \\n\" +\n\"{\\n\" +\n\" @HttpPost\\n\" +\n\" global static String getClassInfo(String className) \\n\" +\n\" {\\n\" +\n\" String classContent = [SELECT Body \\n\" +\n\" FROM ApexClass \\n\" +\n\" WHERE Name = :className LIMIT 1].Body;\\n\" +\n\"\\n\" +\n\" return classContent;\\n\" +\n\" }\\n\" +\n\"}\";\n\nexport async function getContent(){\n try{\n\n var prompt = await jsonnet.evaluateFile(promptPath);\n\n const testPrompt = await jsonnet.extString('promptTemplate',JSON.parse(prompt).prompt)\n .extString('test_class',classText)\n .extString('test_package','Apex')\n .evaluateFile(testGeneratorPath);\n\n const initialResponse = await gpt3endpoint.gptFnTestGenerator(JSON.parse(prompt).promptStart);\n\n console.log('Initial Response.....\\n\\n'+initialResponse);\n\n var responce = await gpt3endpoint.gptFnTestGenerator(initialResponse+JSON.parse(testPrompt).prompt);\n \n console.log('First Response.......\\n \\n'+responce);\n var finalResponse = responce;\n\n responce += JSON.parse(prompt).promptPlan;\n\n finalResponse += await gpt3endpoint.gptFnTestGenerator(responce);\n \n console.log('Final Response.......\\n\\n'+finalResponse);\n\n const codeBlocks = extractCodeBlocks(finalResponse);\n \n console.log(codeBlocks);\n responce = await gpt3endpoint.gptFnTestGenerator(JSON.parse(prompt).textConversion+'\\n\\n'+codeBlocks[0]);\n console.log(responce);\n\n \n }catch(error){\n console.log(error);\n }\n}\n\nfunction extractCodeBlocks(text: string): string[] {\n const codeBlockRegex = /```(?:apex)\\s*([\\s\\S]+?)\\s*```/g;\n const codeBlocks: string[] = [];\n let match;\n \n while ((match = codeBlockRegex.exec(text)) !== null) {\n codeBlocks.push(match[1]);\n }\n \n return codeBlocks;\n }"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1985b4442b3b7d5613b4a77b99499da879141c54","contentHash":"9013d8dee93fd11bfcab6db337d37d544fdab7ba5e63f1eb91f76193d21b40c4"}} \ No newline at end of file diff --git a/JS/edgechains/examples/.nyc_output/68c0d032-e95e-4c66-8ea5-9659b55eff69.json b/JS/edgechains/examples/.nyc_output/68c0d032-e95e-4c66-8ea5-9659b55eff69.json deleted file mode 100644 index 9e26dfeeb..000000000 --- a/JS/edgechains/examples/.nyc_output/68c0d032-e95e-4c66-8ea5-9659b55eff69.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/JS/edgechains/examples/.nyc_output/779f69a4-3b9d-42b4-95f6-c78fbcc36846.json b/JS/edgechains/examples/.nyc_output/779f69a4-3b9d-42b4-95f6-c78fbcc36846.json deleted file mode 100644 index 88f45a8c2..000000000 --- a/JS/edgechains/examples/.nyc_output/779f69a4-3b9d-42b4-95f6-c78fbcc36846.json +++ /dev/null @@ -1 +0,0 @@ -{"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":7,"column":1}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":28}},"2":{"start":{"line":3,"column":34},"end":{"line":3,"column":125}},"3":{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},"4":{"start":{"line":4,"column":79},"end":{"line":4,"column":131}},"5":{"start":{"line":5,"column":9},"end":{"line":5,"column":150}},"6":{"start":{"line":5,"column":22},"end":{"line":5,"column":43}},"7":{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},"8":{"start":{"line":5,"column":81},"end":{"line":5,"column":150}},"9":{"start":{"line":6,"column":4},"end":{"line":6,"column":66}},"10":{"start":{"line":8,"column":17},"end":{"line":10,"column":1}},"11":{"start":{"line":9,"column":4},"end":{"line":9,"column":109}},"12":{"start":{"line":9,"column":79},"end":{"line":9,"column":109}},"13":{"start":{"line":11,"column":14},"end":{"line":13,"column":1}},"14":{"start":{"line":12,"column":4},"end":{"line":12,"column":73}},"15":{"start":{"line":12,"column":36},"end":{"line":12,"column":71}},"16":{"start":{"line":14,"column":0},"end":{"line":14,"column":62}},"17":{"start":{"line":15,"column":0},"end":{"line":15,"column":31}},"18":{"start":{"line":16,"column":17},"end":{"line":16,"column":42}},"19":{"start":{"line":17,"column":22},"end":{"line":17,"column":46}},"20":{"start":{"line":18,"column":22},"end":{"line":18,"column":58}},"21":{"start":{"line":19,"column":24},"end":{"line":19,"column":65}},"22":{"start":{"line":20,"column":20},"end":{"line":42,"column":1}},"23":{"start":{"line":22,"column":8},"end":{"line":22,"column":37}},"24":{"start":{"line":25,"column":8},"end":{"line":25,"column":42}},"25":{"start":{"line":28,"column":27},"end":{"line":36,"column":9}},"26":{"start":{"line":37,"column":8},"end":{"line":37,"column":69}},"27":{"start":{"line":40,"column":8},"end":{"line":40,"column":49}},"28":{"start":{"line":43,"column":0},"end":{"line":43,"column":38}},"29":{"start":{"line":44,"column":0},"end":{"line":49,"column":46}},"30":{"start":{"line":50,"column":0},"end":{"line":58,"column":48}},"31":{"start":{"line":59,"column":0},"end":{"line":65,"column":51}},"32":{"start":{"line":66,"column":0},"end":{"line":69,"column":18}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":46},"end":{"line":2,"column":47}},"loc":{"start":{"line":2,"column":87},"end":{"line":7,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":46},"end":{"line":8,"column":47}},"loc":{"start":{"line":8,"column":62},"end":{"line":10,"column":1}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":11,"column":40},"end":{"line":11,"column":41}},"loc":{"start":{"line":11,"column":73},"end":{"line":13,"column":1}},"line":11},"3":{"name":"(anonymous_3)","decl":{"start":{"line":12,"column":11},"end":{"line":12,"column":12}},"loc":{"start":{"line":12,"column":34},"end":{"line":12,"column":73}},"line":12},"4":{"name":"(anonymous_4)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":5}},"loc":{"start":{"line":21,"column":28},"end":{"line":23,"column":5}},"line":21},"5":{"name":"(anonymous_5)","decl":{"start":{"line":24,"column":4},"end":{"line":24,"column":5}},"loc":{"start":{"line":24,"column":15},"end":{"line":26,"column":5}},"line":24},"6":{"name":"(anonymous_6)","decl":{"start":{"line":27,"column":4},"end":{"line":27,"column":5}},"loc":{"start":{"line":27,"column":30},"end":{"line":38,"column":5}},"line":27},"7":{"name":"(anonymous_7)","decl":{"start":{"line":39,"column":4},"end":{"line":39,"column":5}},"loc":{"start":{"line":39,"column":20},"end":{"line":41,"column":5}},"line":39}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":17},"end":{"line":7,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":18},"end":{"line":2,"column":22}},{"start":{"line":2,"column":26},"end":{"line":2,"column":41}},{"start":{"line":2,"column":46},"end":{"line":7,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":34},"end":{"line":3,"column":125}},"type":"cond-expr","locations":[{"start":{"line":3,"column":42},"end":{"line":3,"column":48}},{"start":{"line":3,"column":51},"end":{"line":3,"column":125}}],"line":3},"2":{"loc":{"start":{"line":3,"column":51},"end":{"line":3,"column":125}},"type":"cond-expr","locations":[{"start":{"line":3,"column":67},"end":{"line":3,"column":118}},{"start":{"line":3,"column":121},"end":{"line":3,"column":125}}],"line":3},"3":{"loc":{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},"type":"if","locations":[{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},{"start":{"line":4,"column":4},"end":{"line":5,"column":150}}],"line":4},"4":{"loc":{"start":{"line":4,"column":8},"end":{"line":4,"column":77}},"type":"binary-expr","locations":[{"start":{"line":4,"column":8},"end":{"line":4,"column":35}},{"start":{"line":4,"column":39},"end":{"line":4,"column":77}}],"line":4},"5":{"loc":{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},"type":"if","locations":[{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},{"start":{"line":5,"column":58},"end":{"line":5,"column":150}}],"line":5},"6":{"loc":{"start":{"line":5,"column":85},"end":{"line":5,"column":149}},"type":"binary-expr","locations":[{"start":{"line":5,"column":86},"end":{"line":5,"column":143}},{"start":{"line":5,"column":148},"end":{"line":5,"column":149}}],"line":5},"7":{"loc":{"start":{"line":5,"column":86},"end":{"line":5,"column":143}},"type":"cond-expr","locations":[{"start":{"line":5,"column":94},"end":{"line":5,"column":98}},{"start":{"line":5,"column":101},"end":{"line":5,"column":143}}],"line":5},"8":{"loc":{"start":{"line":5,"column":101},"end":{"line":5,"column":143}},"type":"cond-expr","locations":[{"start":{"line":5,"column":109},"end":{"line":5,"column":126}},{"start":{"line":5,"column":129},"end":{"line":5,"column":143}}],"line":5},"9":{"loc":{"start":{"line":6,"column":11},"end":{"line":6,"column":62}},"type":"binary-expr","locations":[{"start":{"line":6,"column":11},"end":{"line":6,"column":16}},{"start":{"line":6,"column":20},"end":{"line":6,"column":21}},{"start":{"line":6,"column":25},"end":{"line":6,"column":62}}],"line":6},"10":{"loc":{"start":{"line":8,"column":17},"end":{"line":10,"column":1}},"type":"binary-expr","locations":[{"start":{"line":8,"column":18},"end":{"line":8,"column":22}},{"start":{"line":8,"column":26},"end":{"line":8,"column":41}},{"start":{"line":8,"column":46},"end":{"line":10,"column":1}}],"line":8},"11":{"loc":{"start":{"line":9,"column":4},"end":{"line":9,"column":109}},"type":"if","locations":[{"start":{"line":9,"column":4},"end":{"line":9,"column":109}},{"start":{"line":9,"column":4},"end":{"line":9,"column":109}}],"line":9},"12":{"loc":{"start":{"line":9,"column":8},"end":{"line":9,"column":77}},"type":"binary-expr","locations":[{"start":{"line":9,"column":8},"end":{"line":9,"column":35}},{"start":{"line":9,"column":39},"end":{"line":9,"column":77}}],"line":9},"13":{"loc":{"start":{"line":11,"column":14},"end":{"line":13,"column":1}},"type":"binary-expr","locations":[{"start":{"line":11,"column":15},"end":{"line":11,"column":19}},{"start":{"line":11,"column":23},"end":{"line":11,"column":35}},{"start":{"line":11,"column":40},"end":{"line":13,"column":1}}],"line":11}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":1,"11":0,"12":0,"13":1,"14":0,"15":0,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[1,1,1],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0,0],"10":[1,1,1],"11":[0,0],"12":[0,0],"13":[1,1,1]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA8E;AAC9E,+CAA2C;AAC3C,2DAAmE;AACnE,kEAA4D;AAGrD,IAAM,aAAa,GAAnB,MAAM,aAAa;IACtB,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAGvD,QAAQ;QACJ,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC;IAID,UAAU,CAAU,MAAW,EAAU,KAAU;QAC/C,MAAM,UAAU,GAAG;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SAC3B,CAAC;QACF,OAAO,IAAA,oCAAsB,EAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAID,aAAa;QACT,OAAO,IAAA,0BAAU,GAAE,CAAC;IACxB,CAAC;CACJ,CAAA;AA5BY,sCAAa;AAItB;IADC,IAAA,YAAG,GAAE;;;;6CAGL;AAID;IAFC,IAAA,aAAI,EAAC,wBAAwB,CAAC;IAC9B,IAAA,iBAAQ,EAAC,GAAG,CAAC;IACF,WAAA,IAAA,cAAK,GAAE,CAAA;IAAe,WAAA,IAAA,aAAI,GAAE,CAAA;;;;+CAWvC;AAID;IAFC,IAAA,aAAI,EAAC,oBAAoB,CAAC;IAC1B,IAAA,iBAAQ,EAAC,GAAG,CAAC;;;;kDAGb;wBA3BQ,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAEgC,wBAAU;GAD1C,aAAa,CA4BzB","sourcesContent":["import { Body, Controller, Get, HttpCode, Post, Query } from '@nestjs/common';\nimport { AppService } from './app.service';\nimport { hydeSearchAdaEmbedding } from './hydeExample/hydeExample';\nimport { getContent } from './testGeneration/TestGenerator';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get()\n getHello(): string {\n return this.appService.getHello();\n }\n\n @Post('/hyde-search/query-rrf')\n @HttpCode(200)\n hydeSearch(@Query() params: any, @Body() query: any) {\n const arkRequest = {\n topK: params.topK,\n metadataTable: query.metadataTable,\n query: query.query,\n textWeight: query.textWeight,\n similarityWeight: query.similarityWeight,\n dateWeight: query.dateWeight,\n orderRRF: query.orderRRF,\n };\n return hydeSearchAdaEmbedding(arkRequest);\n }\n\n @Post('/testcase/generate')\n @HttpCode(200)\n testGenerator(){\n return getContent();\n }\n}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1a5ce167997a50c174fd420328ea5e0e5fdf4223","contentHash":"60c622de341191246fb3bc97e28447514ac3a0dc9a9b7d795257328f31d30415"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":7,"column":1}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":28}},"2":{"start":{"line":3,"column":34},"end":{"line":3,"column":125}},"3":{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},"4":{"start":{"line":4,"column":79},"end":{"line":4,"column":131}},"5":{"start":{"line":5,"column":9},"end":{"line":5,"column":150}},"6":{"start":{"line":5,"column":22},"end":{"line":5,"column":43}},"7":{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},"8":{"start":{"line":5,"column":81},"end":{"line":5,"column":150}},"9":{"start":{"line":6,"column":4},"end":{"line":6,"column":66}},"10":{"start":{"line":8,"column":0},"end":{"line":8,"column":62}},"11":{"start":{"line":9,"column":0},"end":{"line":9,"column":28}},"12":{"start":{"line":10,"column":17},"end":{"line":10,"column":42}},"13":{"start":{"line":11,"column":17},"end":{"line":15,"column":1}},"14":{"start":{"line":13,"column":8},"end":{"line":13,"column":30}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":32}},"16":{"start":{"line":17,"column":0},"end":{"line":19,"column":15}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":46},"end":{"line":2,"column":47}},"loc":{"start":{"line":2,"column":87},"end":{"line":7,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":15},"end":{"line":14,"column":5}},"line":12}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":17},"end":{"line":7,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":18},"end":{"line":2,"column":22}},{"start":{"line":2,"column":26},"end":{"line":2,"column":41}},{"start":{"line":2,"column":46},"end":{"line":7,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":34},"end":{"line":3,"column":125}},"type":"cond-expr","locations":[{"start":{"line":3,"column":42},"end":{"line":3,"column":48}},{"start":{"line":3,"column":51},"end":{"line":3,"column":125}}],"line":3},"2":{"loc":{"start":{"line":3,"column":51},"end":{"line":3,"column":125}},"type":"cond-expr","locations":[{"start":{"line":3,"column":67},"end":{"line":3,"column":118}},{"start":{"line":3,"column":121},"end":{"line":3,"column":125}}],"line":3},"3":{"loc":{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},"type":"if","locations":[{"start":{"line":4,"column":4},"end":{"line":5,"column":150}},{"start":{"line":4,"column":4},"end":{"line":5,"column":150}}],"line":4},"4":{"loc":{"start":{"line":4,"column":8},"end":{"line":4,"column":77}},"type":"binary-expr","locations":[{"start":{"line":4,"column":8},"end":{"line":4,"column":35}},{"start":{"line":4,"column":39},"end":{"line":4,"column":77}}],"line":4},"5":{"loc":{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},"type":"if","locations":[{"start":{"line":5,"column":58},"end":{"line":5,"column":150}},{"start":{"line":5,"column":58},"end":{"line":5,"column":150}}],"line":5},"6":{"loc":{"start":{"line":5,"column":85},"end":{"line":5,"column":149}},"type":"binary-expr","locations":[{"start":{"line":5,"column":86},"end":{"line":5,"column":143}},{"start":{"line":5,"column":148},"end":{"line":5,"column":149}}],"line":5},"7":{"loc":{"start":{"line":5,"column":86},"end":{"line":5,"column":143}},"type":"cond-expr","locations":[{"start":{"line":5,"column":94},"end":{"line":5,"column":98}},{"start":{"line":5,"column":101},"end":{"line":5,"column":143}}],"line":5},"8":{"loc":{"start":{"line":5,"column":101},"end":{"line":5,"column":143}},"type":"cond-expr","locations":[{"start":{"line":5,"column":109},"end":{"line":5,"column":126}},{"start":{"line":5,"column":129},"end":{"line":5,"column":143}}],"line":5},"9":{"loc":{"start":{"line":6,"column":11},"end":{"line":6,"column":62}},"type":"binary-expr","locations":[{"start":{"line":6,"column":11},"end":{"line":6,"column":16}},{"start":{"line":6,"column":20},"end":{"line":6,"column":21}},{"start":{"line":6,"column":25},"end":{"line":6,"column":62}}],"line":6}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":1,"10":1,"11":1,"12":1,"13":1,"14":0,"15":1,"16":1},"f":{"0":1,"1":0},"b":{"0":[1,1,1],"1":[1,0],"2":[0,0],"3":[1,0],"4":[1,1],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[1,0,0]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAGrC,IAAM,UAAU,GAAhB,MAAM,UAAU;IACnB,QAAQ;QACJ,OAAO,cAAc,CAAC;IAC1B,CAAC;CACJ,CAAA;AAJY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;GACA,UAAU,CAItB","sourcesContent":["import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n getHello(): string {\n return 'Hello World!';\n }\n}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"566f7e0e02a3826477ba399747eb71c34a48f47a","contentHash":"e87935e42f8cae19393dbfc6c7e81b698365ed339fcadfc6669f322dba61450f"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":40}},"2":{"start":{"line":4,"column":23},"end":{"line":4,"column":56}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":28}},"4":{"start":{"line":6,"column":25},"end":{"line":6,"column":57}},"5":{"start":{"line":7,"column":25},"end":{"line":7,"column":57}},"6":{"start":{"line":9,"column":0},"end":{"line":13,"column":60}},"7":{"start":{"line":10,"column":4},"end":{"line":10,"column":48}},"8":{"start":{"line":11,"column":4},"end":{"line":11,"column":40}},"9":{"start":{"line":12,"column":4},"end":{"line":12,"column":40}},"10":{"start":{"line":14,"column":21},"end":{"line":14,"column":191}},"11":{"start":{"line":16,"column":4},"end":{"line":76,"column":5}},"12":{"start":{"line":17,"column":22},"end":{"line":17,"column":37}},"13":{"start":{"line":18,"column":26},"end":{"line":18,"column":36}},"14":{"start":{"line":19,"column":22},"end":{"line":19,"column":38}},"15":{"start":{"line":20,"column":21},"end":{"line":20,"column":44}},"16":{"start":{"line":21,"column":24},"end":{"line":21,"column":52}},"17":{"start":{"line":22,"column":27},"end":{"line":22,"column":88}},"18":{"start":{"line":23,"column":25},"end":{"line":23,"column":83}},"19":{"start":{"line":24,"column":29},"end":{"line":24,"column":67}},"20":{"start":{"line":25,"column":31},"end":{"line":25,"column":63}},"21":{"start":{"line":26,"column":25},"end":{"line":30,"column":35}},"22":{"start":{"line":31,"column":23},"end":{"line":31,"column":52}},"23":{"start":{"line":32,"column":28},"end":{"line":32,"column":60}},"24":{"start":{"line":33,"column":30},"end":{"line":33,"column":53}},"25":{"start":{"line":34,"column":36},"end":{"line":37,"column":11}},"26":{"start":{"line":35,"column":30},"end":{"line":35,"column":65}},"27":{"start":{"line":36,"column":12},"end":{"line":36,"column":29}},"28":{"start":{"line":38,"column":25},"end":{"line":38,"column":158}},"29":{"start":{"line":39,"column":28},"end":{"line":39,"column":52}},"30":{"start":{"line":40,"column":30},"end":{"line":40,"column":32}},"31":{"start":{"line":41,"column":8},"end":{"line":43,"column":9}},"32":{"start":{"line":42,"column":12},"end":{"line":42,"column":121}},"33":{"start":{"line":44,"column":8},"end":{"line":46,"column":9}},"34":{"start":{"line":45,"column":12},"end":{"line":45,"column":40}},"35":{"start":{"line":47,"column":28},"end":{"line":47,"column":55}},"36":{"start":{"line":48,"column":30},"end":{"line":48,"column":41}},"37":{"start":{"line":49,"column":32},"end":{"line":49,"column":74}},"38":{"start":{"line":50,"column":8},"end":{"line":54,"column":36}},"39":{"start":{"line":55,"column":34},"end":{"line":55,"column":63}},"40":{"start":{"line":56,"column":30},"end":{"line":56,"column":70}},"41":{"start":{"line":57,"column":8},"end":{"line":60,"column":36}},"42":{"start":{"line":61,"column":32},"end":{"line":61,"column":61}},"43":{"start":{"line":62,"column":29},"end":{"line":65,"column":9}},"44":{"start":{"line":66,"column":28},"end":{"line":66,"column":70}},"45":{"start":{"line":67,"column":25},"end":{"line":70,"column":9}},"46":{"start":{"line":71,"column":8},"end":{"line":71,"column":24}},"47":{"start":{"line":74,"column":8},"end":{"line":74,"column":29}},"48":{"start":{"line":75,"column":8},"end":{"line":75,"column":20}},"49":{"start":{"line":78,"column":0},"end":{"line":78,"column":56}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":9,"column":1},"end":{"line":9,"column":2}},"loc":{"start":{"line":9,"column":35},"end":{"line":13,"column":1}},"line":9},"1":{"name":"hydeSearchAdaEmbedding","decl":{"start":{"line":15,"column":15},"end":{"line":15,"column":37}},"loc":{"start":{"line":15,"column":50},"end":{"line":77,"column":1}},"line":15},"2":{"name":"(anonymous_2)","decl":{"start":{"line":34,"column":66},"end":{"line":34,"column":67}},"loc":{"start":{"line":34,"column":82},"end":{"line":37,"column":9}},"line":34}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":3},"end":{"line":13,"column":58}},"type":"binary-expr","locations":[{"start":{"line":13,"column":3},"end":{"line":13,"column":25}},{"start":{"line":13,"column":30},"end":{"line":13,"column":57}}],"line":13},"1":{"loc":{"start":{"line":44,"column":8},"end":{"line":46,"column":9}},"type":"if","locations":[{"start":{"line":44,"column":8},"end":{"line":46,"column":9}},{"start":{"line":44,"column":8},"end":{"line":46,"column":9}}],"line":44}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1},"f":{"0":1,"1":0,"2":0},"b":{"0":[1,1],"1":[0,0]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts"],"names":[],"mappings":";;;AAAA,yDAAiD;AACjD,6BAA6B;AAC7B,0DAAuD;AACvD,0DAAuD;AAEvD,IAAK,sBAIJ;AAJD,WAAK,sBAAsB;IACvB,2CAAiB,CAAA;IACjB,mCAAS,CAAA;IACT,mCAAS,CAAA;AACb,CAAC,EAJI,sBAAsB,KAAtB,sBAAsB,QAI1B;AAED,MAAM,YAAY,GAAG,IAAI,+BAAc,CACnC,4CAA4C,EAC5C,qDAAqD,EACrD,EAAE,EACF,eAAe,EACf,MAAM,EACN,GAAG,CACN,CAAC;AAEK,KAAK,UAAU,sBAAsB,CAAC,UAAsB;IAC/D,IAAI;QAEA,MAAM,KAAK,GAAG,eAAe,CAAC;QAC9B,MAAM,SAAS,GAAG,UAAU,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAGrC,MAAM,OAAO,GAAG,IAAI,sBAAO,EAAE,CAAC;QAE9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mCAAmC,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAE5E,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAG5D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;QAGxD,IAAI,UAAU,GAAG,MAAM,OAAO;aACzB,SAAS,CAAC,gBAAgB,EAAE,cAAc,CAAC;aAC3C,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;aACrB,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;aACzB,YAAY,CAAC,QAAQ,CAAC,CAAC;QAG5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAG7C,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAGrD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAG9C,MAAM,mBAAmB,GAAwB,OAAO,CAAC,GAAG,CACxD,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO,SAAS,CAAC;QACrB,CAAC,CAAC,CACL,CAAC;QAGF,MAAM,QAAQ,GAAG,IAAI,+BAAc,CAC/B,MAAM,mBAAmB,EACzB,sBAAsB,CAAC,EAAE,EACzB,IAAI,EACJ,EAAE,EACF,KAAK,EACL,SAAS,EACT,UAAU,EACV,EAAE,CACL,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAG7C,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;YAClC,aAAa,CAAC,IAAI,CACd,GAAG,UAAU,CAAC,QAAQ,YAAY,UAAU,CAAC,KAAK,eAAe,UAAU,CAAC,QAAQ,IAAI,CAC3F,CAAC;SACL;QAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE;YACtC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;SAC/B;QAED,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,WAAW,CAAC;QAGlC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC;QAEnE,UAAU,GAAG,MAAM,OAAO;aACrB,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC;aAC1C,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC;aAChC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC1C,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAGxD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC;QAE/D,UAAU,GAAG,MAAM,OAAO;aACrB,SAAS,CAAC,cAAc,EAAE,aAAa,CAAC;aACxC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;aACzB,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAEtD,MAAM,YAAY,GAAG;YACjB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE;YAC9C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE;SAC7C,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAE/D,MAAM,QAAQ,GAAG;YACb,cAAc,EAAE,WAAW;YAC3B,WAAW,EAAE,WAAW;SAC3B,CAAC;QAEF,OAAO,QAAQ,CAAC;KACnB;IAAC,OAAO,KAAK,EAAE;QAEZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,MAAM,KAAK,CAAC;KACf;AACL,CAAC;AA9GD,wDA8GC","sourcesContent":["import { Jsonnet } from '@hanazuki/node-jsonnet';\nimport * as path from 'path';\nimport { OpenAiEndpoint } from '../lib/OpenAiEndpoint';\nimport { PostgresClient } from '../lib/PostgresClient';\nimport { ArkRequest } from '../types/ArkRequest';\nenum PostgresDistanceMetric {\n COSINE = 'COSINE',\n IP = 'IP',\n L2 = 'L2',\n}\n\nconst gpt3endpoint = new OpenAiEndpoint(\n 'https://api.openai.com/v1/chat/completions',\n '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',\n '',\n 'gpt-3.5-turbo',\n 'user',\n 0.7\n);\n\nexport async function hydeSearchAdaEmbedding(arkRequest: ArkRequest) {\n try {\n // Get required params from API...\n const table = 'ada_hyde_prod';\n const namespace = '360_docs';\n const query = arkRequest.query;\n const topK = Number(arkRequest.topK);\n\n //\n const jsonnet = new Jsonnet();\n\n const promptPath = path.join(process.cwd(), './src/hydeExample/prompts.jsonnet');\n const hydePath = path.join(process.cwd(), './src/hydeExample/hyde.jsonnet');\n // Load Jsonnet to extract args..\n const promptLoader = await jsonnet.evaluateFile(promptPath);\n\n // Getting ${summary} basePrompt\n const promptTemplate = JSON.parse(promptLoader).summary;\n\n // Getting the updated promptTemplate with query\n let hydeLoader = await jsonnet\n .extString('promptTemplate', promptTemplate)\n .extString('time', '')\n .extString('query', query)\n .evaluateFile(hydePath);\n\n // Get concatenated prompt\n const prompt = JSON.parse(hydeLoader).prompt;\n\n // Block and get the response from GPT3\n const gptResponse = await gpt3endpoint.gptFn(prompt);\n\n // Chain 1 ==> Get Gpt3Response & split\n const gpt3Responses = gptResponse.split('\\n');\n\n // Chain 2 ==> Get Embeddings from OpenAI using Each Response\n const embeddingsListChain: Promise = Promise.all(\n gpt3Responses.map(async (resp) => {\n const embedding = await gpt3endpoint.embeddings(resp);\n return embedding;\n })\n );\n\n // Chain 5 ==> Query via EmbeddingChain\n const dbClient = new PostgresClient(\n await embeddingsListChain,\n PostgresDistanceMetric.IP,\n topK,\n 20,\n table,\n namespace,\n arkRequest,\n 15\n );\n const queryResult = await dbClient.dbQuery();\n\n // Chain 6 ==> Create Prompt using Embeddings\n const retrievedDocs: string[] = [];\n\n for (const embeddings of queryResult) {\n retrievedDocs.push(\n `${embeddings.raw_text}\\n score:${embeddings.score}\\n filename:${embeddings.filename}\\n`\n );\n }\n\n if (retrievedDocs.join('').length > 4096) {\n retrievedDocs.length = 4096;\n }\n\n const currentTime = new Date().toLocaleString();\n const formattedTime = currentTime;\n\n // System prompt\n const ansPromptSystem = JSON.parse(promptLoader).ans_prompt_system;\n\n hydeLoader = await jsonnet\n .extString(promptTemplate, ansPromptSystem)\n .extString('time', formattedTime)\n .extString('qeury', retrievedDocs.join(''))\n .evaluateFile(hydePath);\n\n const finalPromptSystem = JSON.parse(hydeLoader).prompt;\n\n // User prompt\n const ansPromptUser = JSON.parse(promptLoader).ans_prompt_user;\n\n hydeLoader = await jsonnet\n .extString(promptTemplate, ansPromptUser)\n .extString('qeury', query)\n .evaluateFile(hydePath);\n const finalPromptUser = JSON.parse(hydeLoader).prompt;\n\n const chatMessages = [\n { role: 'system', content: finalPromptSystem },\n { role: 'user', content: finalPromptUser },\n ];\n\n const finalAnswer = await gpt3endpoint.gptFnChat(chatMessages);\n\n const response = {\n wordEmbeddings: queryResult,\n finalAnswer: finalAnswer,\n };\n\n return response;\n } catch (error) {\n // Handle errors here\n console.error(error);\n throw error;\n }\n}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ef44be5395af2338366d467cfd2e87b40cc05abb","contentHash":"b58a305117fb51c4514152aed10ec1fa07921fa65f150418d303cf3461f783d4"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":32}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":23}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":29}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":27}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":27}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":25}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":37}},"9":{"start":{"line":15,"column":25},"end":{"line":45,"column":10}},"10":{"start":{"line":32,"column":12},"end":{"line":32,"column":41}},"11":{"start":{"line":35,"column":12},"end":{"line":44,"column":13}},"12":{"start":{"line":36,"column":16},"end":{"line":36,"column":89}},"13":{"start":{"line":37,"column":16},"end":{"line":37,"column":67}},"14":{"start":{"line":39,"column":17},"end":{"line":44,"column":13}},"15":{"start":{"line":40,"column":16},"end":{"line":40,"column":68}},"16":{"start":{"line":43,"column":16},"end":{"line":43,"column":70}},"17":{"start":{"line":46,"column":8},"end":{"line":46,"column":43}},"18":{"start":{"line":49,"column":25},"end":{"line":73,"column":10}},"19":{"start":{"line":60,"column":12},"end":{"line":60,"column":51}},"20":{"start":{"line":63,"column":12},"end":{"line":72,"column":13}},"21":{"start":{"line":64,"column":16},"end":{"line":64,"column":89}},"22":{"start":{"line":65,"column":16},"end":{"line":65,"column":67}},"23":{"start":{"line":67,"column":17},"end":{"line":72,"column":13}},"24":{"start":{"line":68,"column":16},"end":{"line":68,"column":68}},"25":{"start":{"line":71,"column":16},"end":{"line":71,"column":70}},"26":{"start":{"line":74,"column":8},"end":{"line":74,"column":24}},"27":{"start":{"line":77,"column":25},"end":{"line":102,"column":10}},"28":{"start":{"line":89,"column":12},"end":{"line":89,"column":41}},"29":{"start":{"line":92,"column":12},"end":{"line":101,"column":13}},"30":{"start":{"line":93,"column":16},"end":{"line":93,"column":89}},"31":{"start":{"line":94,"column":16},"end":{"line":94,"column":67}},"32":{"start":{"line":96,"column":17},"end":{"line":101,"column":13}},"33":{"start":{"line":97,"column":16},"end":{"line":97,"column":68}},"34":{"start":{"line":100,"column":16},"end":{"line":100,"column":70}},"35":{"start":{"line":103,"column":8},"end":{"line":103,"column":43}},"36":{"start":{"line":106,"column":25},"end":{"line":136,"column":10}},"37":{"start":{"line":123,"column":12},"end":{"line":123,"column":41}},"38":{"start":{"line":126,"column":12},"end":{"line":135,"column":13}},"39":{"start":{"line":127,"column":16},"end":{"line":127,"column":89}},"40":{"start":{"line":128,"column":16},"end":{"line":128,"column":67}},"41":{"start":{"line":130,"column":17},"end":{"line":135,"column":13}},"42":{"start":{"line":131,"column":16},"end":{"line":131,"column":68}},"43":{"start":{"line":134,"column":16},"end":{"line":134,"column":70}},"44":{"start":{"line":137,"column":8},"end":{"line":137,"column":43}},"45":{"start":{"line":140,"column":0},"end":{"line":140,"column":40}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":61},"end":{"line":13,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":4},"end":{"line":14,"column":5}},"loc":{"start":{"line":14,"column":24},"end":{"line":47,"column":5}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":31,"column":18},"end":{"line":31,"column":19}},"loc":{"start":{"line":31,"column":38},"end":{"line":33,"column":9}},"line":31},"3":{"name":"(anonymous_3)","decl":{"start":{"line":34,"column":19},"end":{"line":34,"column":20}},"loc":{"start":{"line":34,"column":36},"end":{"line":45,"column":9}},"line":34},"4":{"name":"(anonymous_4)","decl":{"start":{"line":48,"column":4},"end":{"line":48,"column":5}},"loc":{"start":{"line":48,"column":27},"end":{"line":75,"column":5}},"line":48},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":18},"end":{"line":59,"column":19}},"loc":{"start":{"line":59,"column":38},"end":{"line":61,"column":9}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":62,"column":19},"end":{"line":62,"column":20}},"loc":{"start":{"line":62,"column":36},"end":{"line":73,"column":9}},"line":62},"7":{"name":"(anonymous_7)","decl":{"start":{"line":76,"column":4},"end":{"line":76,"column":5}},"loc":{"start":{"line":76,"column":34},"end":{"line":104,"column":5}},"line":76},"8":{"name":"(anonymous_8)","decl":{"start":{"line":88,"column":18},"end":{"line":88,"column":19}},"loc":{"start":{"line":88,"column":38},"end":{"line":90,"column":9}},"line":88},"9":{"name":"(anonymous_9)","decl":{"start":{"line":91,"column":19},"end":{"line":91,"column":20}},"loc":{"start":{"line":91,"column":36},"end":{"line":102,"column":9}},"line":91},"10":{"name":"(anonymous_10)","decl":{"start":{"line":105,"column":4},"end":{"line":105,"column":5}},"loc":{"start":{"line":105,"column":37},"end":{"line":138,"column":5}},"line":105},"11":{"name":"(anonymous_11)","decl":{"start":{"line":122,"column":18},"end":{"line":122,"column":19}},"loc":{"start":{"line":122,"column":38},"end":{"line":124,"column":9}},"line":122},"12":{"name":"(anonymous_12)","decl":{"start":{"line":125,"column":19},"end":{"line":125,"column":20}},"loc":{"start":{"line":125,"column":36},"end":{"line":136,"column":9}},"line":125}},"branchMap":{"0":{"loc":{"start":{"line":35,"column":12},"end":{"line":44,"column":13}},"type":"if","locations":[{"start":{"line":35,"column":12},"end":{"line":44,"column":13}},{"start":{"line":35,"column":12},"end":{"line":44,"column":13}}],"line":35},"1":{"loc":{"start":{"line":39,"column":17},"end":{"line":44,"column":13}},"type":"if","locations":[{"start":{"line":39,"column":17},"end":{"line":44,"column":13}},{"start":{"line":39,"column":17},"end":{"line":44,"column":13}}],"line":39},"2":{"loc":{"start":{"line":63,"column":12},"end":{"line":72,"column":13}},"type":"if","locations":[{"start":{"line":63,"column":12},"end":{"line":72,"column":13}},{"start":{"line":63,"column":12},"end":{"line":72,"column":13}}],"line":63},"3":{"loc":{"start":{"line":67,"column":17},"end":{"line":72,"column":13}},"type":"if","locations":[{"start":{"line":67,"column":17},"end":{"line":72,"column":13}},{"start":{"line":67,"column":17},"end":{"line":72,"column":13}}],"line":67},"4":{"loc":{"start":{"line":92,"column":12},"end":{"line":101,"column":13}},"type":"if","locations":[{"start":{"line":92,"column":12},"end":{"line":101,"column":13}},{"start":{"line":92,"column":12},"end":{"line":101,"column":13}}],"line":92},"5":{"loc":{"start":{"line":96,"column":17},"end":{"line":101,"column":13}},"type":"if","locations":[{"start":{"line":96,"column":17},"end":{"line":101,"column":13}},{"start":{"line":96,"column":17},"end":{"line":101,"column":13}}],"line":96},"6":{"loc":{"start":{"line":126,"column":12},"end":{"line":135,"column":13}},"type":"if","locations":[{"start":{"line":126,"column":12},"end":{"line":135,"column":13}},{"start":{"line":126,"column":12},"end":{"line":135,"column":13}}],"line":126},"7":{"loc":{"start":{"line":130,"column":17},"end":{"line":135,"column":13}},"type":"if","locations":[{"start":{"line":130,"column":17},"end":{"line":135,"column":13}},{"start":{"line":130,"column":17},"end":{"line":135,"column":13}}],"line":130}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":1},"f":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts"],"names":[],"mappings":";;;AAAA,iCAA0B;AAE1B,MAAa,cAAc;IAQvB,YACI,GAAW,EACX,MAAc,EACd,KAAa,EACb,KAAa,EACb,IAAY,EACZ,UAAkB;QAElB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACtB,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,4CAA4C,EAC5C;YACI,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE;gBACN;oBACI,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,MAAM;iBAClB;aACJ;YACD,WAAW,EAAE,IAAI,CAAC,UAAU;SAC/B,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QACP,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QACzB,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,sCAAsC,EACtC;YACI,KAAK,EAAE,wBAAwB;YAC/B,KAAK,EAAE,IAAI;SACd,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3C,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QAEP,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,YAAY;QACxB,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,4CAA4C,EAC5C;YACI,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,YAAY;YACtB,WAAW,EAAE,IAAI,CAAC,UAAU;SAC/B,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QAEP,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAc;QACnC,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,4CAA4C,EAC5C;YACI,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE;gBACN;oBACI,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,MAAM;iBAClB;aACJ;YACD,WAAW,EAAE,IAAI,CAAC,UAAU;SAC/B,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QACP,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;CACJ;AAlKD,wCAkKC","sourcesContent":["import axios from 'axios';\n\nexport class OpenAiEndpoint {\n url: string;\n apiKey: string;\n orgId: string;\n model: string;\n role: string;\n temprature: number;\n\n constructor(\n url: string,\n apiKey: string,\n orgId: string,\n model: string,\n role: string,\n temprature: number\n ) {\n this.url = url;\n this.apiKey = apiKey;\n this.orgId = orgId;\n this.model = model;\n this.role = role;\n this.temprature = temprature;\n }\n\n async gptFn(prompt: string): Promise {\n const responce = await axios\n .post(\n 'https://api.openai.com/v1/chat/completions',\n {\n model: this.model,\n messages: [\n {\n role: this.role,\n content: prompt,\n },\n ],\n temperature: this.temprature,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.apiKey,\n 'content-type': 'application/json',\n },\n }\n )\n .then(function (response) {\n return response.data.choices;\n })\n .catch(function (error) {\n if (error.response) {\n console.log('Server responded with status code:', error.response.status);\n console.log('Response data:', error.response.data);\n } else if (error.request) {\n console.log('No response received:', error.request);\n } else {\n console.log('Error creating request:', error.message);\n }\n });\n return responce[0].message.content;\n }\n\n async embeddings(resp: string): Promise {\n const responce = await axios\n .post(\n 'https://api.openai.com/v1/embeddings',\n {\n model: 'text-embedding-ada-002',\n input: resp,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.apiKey,\n 'content-type': 'application/json',\n },\n }\n )\n .then(function (response) {\n return response.data.data[0].embedding;\n })\n .catch(function (error) {\n if (error.response) {\n console.log('Server responded with status code:', error.response.status);\n console.log('Response data:', error.response.data);\n } else if (error.request) {\n console.log('No response received:', error.request);\n } else {\n console.log('Error creating request:', error.message);\n }\n });\n\n return responce;\n }\n\n async gptFnChat(chatMessages) {\n const responce = await axios\n .post(\n 'https://api.openai.com/v1/chat/completions',\n {\n model: this.model,\n messages: chatMessages,\n temperature: this.temprature,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.apiKey,\n 'content-type': 'application/json',\n },\n }\n )\n .then(function (response) {\n return response.data.choices;\n })\n .catch(function (error) {\n if (error.response) {\n console.log('Server responded with status code:', error.response.status);\n console.log('Response data:', error.response.data);\n } else if (error.request) {\n console.log('No response received:', error.request);\n } else {\n console.log('Error creating request:', error.message);\n }\n });\n\n return responce[0].message.content;\n }\n\n async gptFnTestGenerator(prompt: string): Promise {\n const responce = await axios\n .post(\n 'https://api.openai.com/v1/chat/completions',\n {\n model: this.model,\n messages: [\n {\n role: this.role,\n content: prompt,\n },\n ],\n temperature: this.temprature,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.apiKey,\n 'content-type': 'application/json',\n },\n }\n )\n .then(function (response) {\n return response.data.choices;\n })\n .catch(function (error) {\n if (error.response) {\n console.log('Server responded with status code:', error.response.status);\n console.log('Response data:', error.response.data);\n } else if (error.request) {\n console.log('No response received:', error.request);\n } else {\n console.log('Error creating request:', error.message);\n }\n });\n return responce[0].message.content;\n }\n}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3c5323af4d78716381cdfafe02415eb488befab9","contentHash":"eac568231f0f1152f49341c9fc4fd73b4b557501eeff610f91d30157e54d27fb"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":18},"end":{"line":4,"column":36}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":45}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":29}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":25}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":29}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":35}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":35}},"9":{"start":{"line":13,"column":8},"end":{"line":13,"column":37}},"10":{"start":{"line":14,"column":8},"end":{"line":14,"column":37}},"11":{"start":{"line":17,"column":20},"end":{"line":17,"column":59}},"12":{"start":{"line":18,"column":30},"end":{"line":18,"column":55}},"13":{"start":{"line":19,"column":8},"end":{"line":76,"column":9}},"14":{"start":{"line":20,"column":27},"end":{"line":20,"column":71}},"15":{"start":{"line":21,"column":12},"end":{"line":21,"column":46}},"16":{"start":{"line":22,"column":24},"end":{"line":22,"column":26}},"17":{"start":{"line":23,"column":12},"end":{"line":62,"column":13}},"18":{"start":{"line":23,"column":25},"end":{"line":23,"column":26}},"19":{"start":{"line":24,"column":34},"end":{"line":24,"column":72}},"20":{"start":{"line":25,"column":16},"end":{"line":29,"column":222}},"21":{"start":{"line":30,"column":16},"end":{"line":31,"column":85}},"22":{"start":{"line":31,"column":20},"end":{"line":31,"column":85}},"23":{"start":{"line":32,"column":16},"end":{"line":33,"column":86}},"24":{"start":{"line":33,"column":20},"end":{"line":33,"column":86}},"25":{"start":{"line":34,"column":16},"end":{"line":35,"column":79}},"26":{"start":{"line":35,"column":20},"end":{"line":35,"column":79}},"27":{"start":{"line":36,"column":16},"end":{"line":36,"column":311}},"28":{"start":{"line":37,"column":16},"end":{"line":38,"column":90}},"29":{"start":{"line":38,"column":20},"end":{"line":38,"column":90}},"30":{"start":{"line":39,"column":16},"end":{"line":40,"column":90}},"31":{"start":{"line":40,"column":20},"end":{"line":40,"column":90}},"32":{"start":{"line":41,"column":16},"end":{"line":42,"column":90}},"33":{"start":{"line":42,"column":20},"end":{"line":42,"column":90}},"34":{"start":{"line":43,"column":16},"end":{"line":43,"column":225}},"35":{"start":{"line":44,"column":16},"end":{"line":57,"column":17}},"36":{"start":{"line":46,"column":24},"end":{"line":46,"column":75}},"37":{"start":{"line":47,"column":24},"end":{"line":47,"column":30}},"38":{"start":{"line":49,"column":24},"end":{"line":49,"column":76}},"39":{"start":{"line":50,"column":24},"end":{"line":50,"column":30}},"40":{"start":{"line":52,"column":24},"end":{"line":52,"column":75}},"41":{"start":{"line":53,"column":24},"end":{"line":53,"column":30}},"42":{"start":{"line":55,"column":24},"end":{"line":55,"column":59}},"43":{"start":{"line":56,"column":24},"end":{"line":56,"column":30}},"44":{"start":{"line":58,"column":16},"end":{"line":58,"column":48}},"45":{"start":{"line":59,"column":16},"end":{"line":61,"column":17}},"46":{"start":{"line":60,"column":20},"end":{"line":60,"column":45}},"47":{"start":{"line":63,"column":12},"end":{"line":68,"column":13}},"48":{"start":{"line":64,"column":16},"end":{"line":64,"column":159}},"49":{"start":{"line":67,"column":16},"end":{"line":67,"column":72}},"50":{"start":{"line":69,"column":28},"end":{"line":69,"column":60}},"51":{"start":{"line":70,"column":12},"end":{"line":70,"column":32}},"52":{"start":{"line":71,"column":12},"end":{"line":71,"column":27}},"53":{"start":{"line":74,"column":12},"end":{"line":74,"column":33}},"54":{"start":{"line":75,"column":12},"end":{"line":75,"column":24}},"55":{"start":{"line":79,"column":0},"end":{"line":79,"column":40}},"56":{"start":{"line":81,"column":0},"end":{"line":85,"column":60}},"57":{"start":{"line":82,"column":4},"end":{"line":82,"column":48}},"58":{"start":{"line":83,"column":4},"end":{"line":83,"column":40}},"59":{"start":{"line":84,"column":4},"end":{"line":84,"column":40}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":100},"end":{"line":15,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":5}},"loc":{"start":{"line":16,"column":20},"end":{"line":77,"column":5}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":81,"column":1},"end":{"line":81,"column":2}},"loc":{"start":{"line":81,"column":35},"end":{"line":85,"column":1}},"line":81}},"branchMap":{"0":{"loc":{"start":{"line":30,"column":16},"end":{"line":31,"column":85}},"type":"if","locations":[{"start":{"line":30,"column":16},"end":{"line":31,"column":85}},{"start":{"line":30,"column":16},"end":{"line":31,"column":85}}],"line":30},"1":{"loc":{"start":{"line":32,"column":16},"end":{"line":33,"column":86}},"type":"if","locations":[{"start":{"line":32,"column":16},"end":{"line":33,"column":86}},{"start":{"line":32,"column":16},"end":{"line":33,"column":86}}],"line":32},"2":{"loc":{"start":{"line":34,"column":16},"end":{"line":35,"column":79}},"type":"if","locations":[{"start":{"line":34,"column":16},"end":{"line":35,"column":79}},{"start":{"line":34,"column":16},"end":{"line":35,"column":79}}],"line":34},"3":{"loc":{"start":{"line":37,"column":16},"end":{"line":38,"column":90}},"type":"if","locations":[{"start":{"line":37,"column":16},"end":{"line":38,"column":90}},{"start":{"line":37,"column":16},"end":{"line":38,"column":90}}],"line":37},"4":{"loc":{"start":{"line":39,"column":16},"end":{"line":40,"column":90}},"type":"if","locations":[{"start":{"line":39,"column":16},"end":{"line":40,"column":90}},{"start":{"line":39,"column":16},"end":{"line":40,"column":90}}],"line":39},"5":{"loc":{"start":{"line":41,"column":16},"end":{"line":42,"column":90}},"type":"if","locations":[{"start":{"line":41,"column":16},"end":{"line":42,"column":90}},{"start":{"line":41,"column":16},"end":{"line":42,"column":90}}],"line":41},"6":{"loc":{"start":{"line":44,"column":16},"end":{"line":57,"column":17}},"type":"switch","locations":[{"start":{"line":45,"column":20},"end":{"line":47,"column":30}},{"start":{"line":48,"column":20},"end":{"line":50,"column":30}},{"start":{"line":51,"column":20},"end":{"line":53,"column":30}},{"start":{"line":54,"column":20},"end":{"line":56,"column":30}}],"line":44},"7":{"loc":{"start":{"line":59,"column":16},"end":{"line":61,"column":17}},"type":"if","locations":[{"start":{"line":59,"column":16},"end":{"line":61,"column":17}},{"start":{"line":59,"column":16},"end":{"line":61,"column":17}}],"line":59},"8":{"loc":{"start":{"line":63,"column":12},"end":{"line":68,"column":13}},"type":"if","locations":[{"start":{"line":63,"column":12},"end":{"line":68,"column":13}},{"start":{"line":63,"column":12},"end":{"line":68,"column":13}}],"line":63},"9":{"loc":{"start":{"line":85,"column":3},"end":{"line":85,"column":58}},"type":"binary-expr","locations":[{"start":{"line":85,"column":3},"end":{"line":85,"column":25}},{"start":{"line":85,"column":30},"end":{"line":85,"column":57}}],"line":85}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":1,"56":1,"57":1,"58":1,"59":1},"f":{"0":0,"1":0,"2":1},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0,0,0],"7":[0,0],"8":[0,0],"9":[1,1]},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts"],"names":[],"mappings":";;;AAAA,qCAA2C;AAE3C,MAAa,cAAc;IAUvB,YACI,cAA0B,EAC1B,MAAM,EACN,IAAI,EACJ,MAAM,EACN,SAAS,EACT,SAAiB,EACjB,UAAe,EACf,UAAU;QAEV,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO;QACT,MAAM,GAAG,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;QACrC,MAAM,aAAa,GAAG,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAChD,IAAI;YACA,MAAM,MAAM,GAAG,8BAA8B,IAAI,CAAC,MAAM,GAAG,CAAC;YAC5D,MAAM,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAElC,IAAI,KAAK,GAAW,EAAE,CAAC;YAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACjD,MAAM,SAAS,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEjE,KAAK,IAAI;kBAEL,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,UAC/B,qDACI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,cAC/B;kBAEI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UACrC,sDACI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,cACrC;kBAEI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,UAC/B,qDACI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,cAC/B;oKACoJ,SAAS,OACzJ,IAAI,CAAC,UAAU,CAAC,KACpB,oBAAoB,CAAC;gBAErB,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,MAAM;oBAC7C,KAAK,IAAI,0BAA0B,SAAS,oBAAoB,CAAC;gBACrE,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,sBAAsB,SAAS,yBAAyB,CAAC;gBACtE,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,qBAAqB,SAAS,mBAAmB,CAAC;gBAE/D,KAAK,IAAI,uOAAuO,IAAI,CAAC,SAAS,uBAAuB,IAAI,CAAC,SAAS,GAAG,CAAC;gBAEvS,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,MAAM;oBAC7C,KAAK,IAAI,4BAA4B,SAAS,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,4BAA4B,SAAS,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,4BAA4B,SAAS,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;gBAE1E,KAAK,IAAI,aAAa,IAAI,CAAC,SAAS,SAAS,IAAI,CAAC,UAAU,CAAC,aAAa,+BAA+B,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,wDAAwD,CAAC;gBAEjN,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;oBAC9B,KAAK,WAAW;wBACZ,KAAK,IAAI,yCAAyC,CAAC;wBACnD,MAAM;oBACV,KAAK,YAAY;wBACb,KAAK,IAAI,0CAA0C,CAAC;wBACpD,MAAM;oBACV,KAAK,WAAW;wBACZ,KAAK,IAAI,yCAAyC,CAAC;wBACnD,MAAM;oBACV,KAAK,SAAS;wBACV,KAAK,IAAI,yBAAyB,CAAC;wBACnC,MAAM;iBACb;gBAED,KAAK,IAAI,UAAU,IAAI,CAAC,IAAI,GAAG,CAAC;gBAChC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;oBACpC,KAAK,IAAI,eAAe,CAAC;iBAC5B;aACJ;YAED,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,KAAK,GAAG,0DAA0D,KAAK,qDAAqD,IAAI,CAAC,UAAU,GAAG,CAAC;aAClJ;iBAAM;gBACH,KAAK,IAAI,kCAAkC,IAAI,CAAC,IAAI,GAAG,CAAC;aAC3D;YACD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC;SAClB;QAAC,OAAO,KAAK,EAAE;YAEZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,KAAK,CAAC;SACf;IACL,CAAC;CACJ;AAnHD,wCAmHC;AAED,IAAK,sBAIJ;AAJD,WAAK,sBAAsB;IACvB,2CAAiB,CAAA;IACjB,mCAAS,CAAA;IACT,mCAAS,CAAA;AACb,CAAC,EAJI,sBAAsB,KAAtB,sBAAsB,QAI1B","sourcesContent":["import { createConnection } from 'typeorm';\n\nexport class PostgresClient {\n wordEmbeddings: number[][];\n metric: PostgresDistanceMetric;\n topK: number;\n probes: number;\n tableName: string;\n namespace: string;\n arkRequest: any;\n upperLimit: number;\n\n constructor(\n wordEmbeddings: number[][],\n metric,\n topK,\n probes,\n tableName,\n namespace: string,\n arkRequest: any,\n upperLimit\n ) {\n this.wordEmbeddings = wordEmbeddings;\n this.metric = metric;\n this.topK = topK;\n this.probes = probes;\n this.tableName = tableName;\n this.namespace = namespace;\n this.arkRequest = arkRequest;\n this.upperLimit = upperLimit;\n }\n\n async dbQuery() {\n const con = await createConnection();\n const entityManager = con.createEntityManager();\n try {\n const query1 = `SET LOCAL ivfflat.probes = ${this.probes};`;\n await entityManager.query(query1);\n\n let query: string = '';\n\n for (let i = 0; i < this.wordEmbeddings.length; i++) {\n const embedding: string = JSON.stringify(this.wordEmbeddings[i]);\n\n query += `( SELECT id, raw_text, document_date, metadata, namespace, filename, timestamp, \n ${\n this.arkRequest.textWeight.baseWeight\n } / (ROW_NUMBER() OVER (ORDER BY text_rank DESC) + ${\n this.arkRequest.textWeight.fineTuneWeight\n }) +\n ${\n this.arkRequest.similarityWeight.baseWeight\n } / (ROW_NUMBER() OVER (ORDER BY similarity DESC) + ${\n this.arkRequest.similarityWeight.fineTuneWeight\n }) +\n ${\n this.arkRequest.dateWeight.baseWeight\n } / (ROW_NUMBER() OVER (ORDER BY date_rank DESC) + ${\n this.arkRequest.dateWeight.fineTuneWeight\n }) AS rrf_score\n FROM ( SELECT sv.id, sv.raw_text, sv.namespace, sv.filename, sv.timestamp, svtm.document_date, svtm.metadata, ts_rank_cd(sv.tsv, plainto_tsquery('${'english'}', '${\n this.arkRequest.query\n }')) AS text_rank, `;\n\n if (this.metric === PostgresDistanceMetric.COSINE)\n query += `1 - (sv.embedding <=> '${embedding}') AS similarity, `;\n if (this.metric === PostgresDistanceMetric.IP)\n query += `(sv.embedding <#> '${embedding}') * -1 AS similarity, `;\n if (this.metric === PostgresDistanceMetric.L2)\n query += `sv.embedding <-> '${embedding}' AS similarity, `;\n\n query += `CASE WHEN svtm.document_date IS NULL THEN 0 ELSE EXTRACT(YEAR FROM svtm.document_date) * 365 + EXTRACT(DOY FROM svtm.document_date) END AS date_rank FROM (SELECT id, raw_text, embedding, tsv, namespace, filename, timestamp from ${this.tableName} WHERE namespace = '${this.namespace}'`;\n\n if (this.metric === PostgresDistanceMetric.COSINE)\n query += ` ORDER BY embedding <=> '${embedding}' LIMIT ${this.topK}`;\n if (this.metric === PostgresDistanceMetric.IP)\n query += ` ORDER BY embedding <#> '${embedding}' LIMIT ${this.topK}`;\n if (this.metric === PostgresDistanceMetric.L2)\n query += ` ORDER BY embedding <-> '${embedding}' LIMIT ${this.topK}`;\n\n query += `) sv JOIN ${this.tableName}_join_${this.arkRequest.metadataTable} jtm ON sv.id = jtm.id JOIN ${this.tableName}_${this.arkRequest.metadataTable} svtm ON jtm.metadata_id = svtm.metadata_id) subquery `;\n\n switch (this.arkRequest.orderRRF) {\n case 'text_rank':\n query += `ORDER BY text_rank DESC, rrf_score DESC`;\n break;\n case 'similarity':\n query += `ORDER BY similarity DESC, rrf_score DESC`;\n break;\n case 'date_rank':\n query += `ORDER BY date_rank DESC, rrf_score DESC`;\n break;\n case 'default':\n query += `ORDER BY rrf_score DESC`;\n break;\n }\n\n query += ` LIMIT ${this.topK})`;\n if (i < this.wordEmbeddings.length - 1) {\n query += ' UNION ALL \\n';\n }\n }\n\n if (this.wordEmbeddings.length > 1) {\n query = `SELECT * FROM (SELECT DISTINCT ON (result.id) * FROM ( ${query} ) result) subquery ORDER BY rrf_score DESC LIMIT ${this.upperLimit};`;\n } else {\n query += ` ORDER BY rrf_score DESC LIMIT ${this.topK};`;\n }\n const results = await entityManager.query(query);\n await con.destroy();\n return results;\n } catch (error) {\n // Handle errors here\n console.error(error);\n throw error;\n }\n }\n}\n\nenum PostgresDistanceMetric {\n COSINE = 'COSINE',\n IP = 'IP',\n L2 = 'L2',\n}\n"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"5639f9bcc787a8827404bc7635271b0a5ba05241","contentHash":"4f2b9ecb2389c9b8416bce3f5963107ec0354e46bc8053ba98948c3769f41747"},"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts":{"path":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":28}},"2":{"start":{"line":4,"column":23},"end":{"line":4,"column":56}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":28}},"4":{"start":{"line":6,"column":25},"end":{"line":6,"column":58}},"5":{"start":{"line":7,"column":16},"end":{"line":7,"column":44}},"6":{"start":{"line":8,"column":19},"end":{"line":8,"column":83}},"7":{"start":{"line":9,"column":26},"end":{"line":9,"column":96}},"8":{"start":{"line":10,"column":21},"end":{"line":10,"column":191}},"9":{"start":{"line":11,"column":18},"end":{"line":23,"column":7}},"10":{"start":{"line":25,"column":4},"end":{"line":46,"column":5}},"11":{"start":{"line":26,"column":21},"end":{"line":26,"column":59}},"12":{"start":{"line":27,"column":27},"end":{"line":30,"column":44}},"13":{"start":{"line":31,"column":32},"end":{"line":31,"column":101}},"14":{"start":{"line":32,"column":8},"end":{"line":32,"column":67}},"15":{"start":{"line":33,"column":23},"end":{"line":33,"column":109}},"16":{"start":{"line":34,"column":8},"end":{"line":34,"column":61}},"17":{"start":{"line":35,"column":28},"end":{"line":35,"column":36}},"18":{"start":{"line":36,"column":8},"end":{"line":36,"column":50}},"19":{"start":{"line":37,"column":8},"end":{"line":37,"column":73}},"20":{"start":{"line":38,"column":8},"end":{"line":38,"column":65}},"21":{"start":{"line":39,"column":27},"end":{"line":39,"column":59}},"22":{"start":{"line":40,"column":8},"end":{"line":40,"column":32}},"23":{"start":{"line":41,"column":8},"end":{"line":41,"column":117}},"24":{"start":{"line":42,"column":8},"end":{"line":42,"column":30}},"25":{"start":{"line":45,"column":8},"end":{"line":45,"column":27}},"26":{"start":{"line":48,"column":0},"end":{"line":48,"column":32}},"27":{"start":{"line":50,"column":27},"end":{"line":50,"column":60}},"28":{"start":{"line":51,"column":23},"end":{"line":51,"column":25}},"29":{"start":{"line":53,"column":4},"end":{"line":55,"column":5}},"30":{"start":{"line":54,"column":8},"end":{"line":54,"column":34}},"31":{"start":{"line":56,"column":4},"end":{"line":56,"column":22}}},"fnMap":{"0":{"name":"getContent","decl":{"start":{"line":24,"column":15},"end":{"line":24,"column":25}},"loc":{"start":{"line":24,"column":28},"end":{"line":47,"column":1}},"line":24},"1":{"name":"extractCodeBlocks","decl":{"start":{"line":49,"column":9},"end":{"line":49,"column":26}},"loc":{"start":{"line":49,"column":33},"end":{"line":57,"column":1}},"line":49}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0},"f":{"0":0,"1":0},"b":{},"inputSourceMap":{"version":3,"file":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts","sources":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts"],"names":[],"mappings":";;;AAAA,yDAAiD;AACjD,6BAA6B;AAC7B,2DAAwD;AAExD,MAAM,OAAO,GAAG,IAAI,sBAAO,EAAE,CAAC;AAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAC,sCAAsC,CAAC,CAAC;AACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAC,4CAA4C,CAAC,CAAC;AAEhG,MAAM,YAAY,GAAG,IAAI,+BAAc,CACnC,4CAA4C,EAC5C,qDAAqD,EACrD,EAAE,EACF,eAAe,EACf,MAAM,EACN,GAAG,CACN,CAAC;AAEF,MAAM,SAAS,GAAE,6CAA6C;IAC9D,2CAA2C;IAC3C,KAAK;IACL,iBAAiB;IACjB,4DAA4D;IAC5D,SAAS;IACT,+CAA+C;IAC/C,kDAAkD;IAClD,yEAAyE;IACzE,IAAI;IACJ,gCAAgC;IAChC,SAAS;IACT,GAAG,CAAC;AAEG,KAAK,UAAU,UAAU;IAC5B,IAAG;QAEC,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,gBAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;aACrD,SAAS,CAAC,YAAY,EAAC,SAAS,CAAC;aACjC,SAAS,CAAC,cAAc,EAAC,MAAM,CAAC;aAChC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAEjE,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;QAE9F,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAC,eAAe,CAAC,CAAC;QAEzD,IAAI,QAAQ,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,eAAe,GAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;QAEpG,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,aAAa,GAAG,QAAQ,CAAC;QAE7B,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC;QAE1C,aAAa,IAAI,MAAM,YAAY,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAEjE,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAC,aAAa,CAAC,CAAC;QAEvD,MAAM,UAAU,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,QAAQ,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAc,GAAC,MAAM,GAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;KAGzB;IAAA,OAAM,KAAK,EAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACtB;AACL,CAAC;AAnCD,gCAmCC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,MAAM,cAAc,GAAG,iCAAiC,CAAC;IACzD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;QACnD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3B;IAED,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import { Jsonnet } from \"@hanazuki/node-jsonnet\";\nimport * as path from 'path';\nimport { OpenAiEndpoint } from \"src/lib/OpenAiEndpoint\";\n\nconst jsonnet = new Jsonnet();\nconst promptPath = path.join(process.cwd(),'./src/testGeneration/prompts.jsonnet');\nconst testGeneratorPath = path.join(process.cwd(),'./src/testGeneration/testGenerator.jsonnet');\n\nconst gpt3endpoint = new OpenAiEndpoint(\n 'https://api.openai.com/v1/chat/completions',\n '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',\n '',\n 'gpt-3.5-turbo',\n 'user',\n 0.7\n);\n\nconst classText =\"@RestResource(urlMapping='/classcontent')\\n\" +\n\"global with sharing class ClassContent \\n\" +\n\"{\\n\" +\n\" @HttpPost\\n\" +\n\" global static String getClassInfo(String className) \\n\" +\n\" {\\n\" +\n\" String classContent = [SELECT Body \\n\" +\n\" FROM ApexClass \\n\" +\n\" WHERE Name = :className LIMIT 1].Body;\\n\" +\n\"\\n\" +\n\" return classContent;\\n\" +\n\" }\\n\" +\n\"}\";\n\nexport async function getContent(){\n try{\n\n var prompt = await jsonnet.evaluateFile(promptPath);\n\n const testPrompt = await jsonnet.extString('promptTemplate',JSON.parse(prompt).prompt)\n .extString('test_class',classText)\n .extString('test_package','Apex')\n .evaluateFile(testGeneratorPath);\n\n const initialResponse = await gpt3endpoint.gptFnTestGenerator(JSON.parse(prompt).promptStart);\n\n console.log('Initial Response.....\\n\\n'+initialResponse);\n\n var responce = await gpt3endpoint.gptFnTestGenerator(initialResponse+JSON.parse(testPrompt).prompt);\n \n console.log('First Response.......\\n \\n'+responce);\n var finalResponse = responce;\n\n responce += JSON.parse(prompt).promptPlan;\n\n finalResponse += await gpt3endpoint.gptFnTestGenerator(responce);\n \n console.log('Final Response.......\\n\\n'+finalResponse);\n\n const codeBlocks = extractCodeBlocks(finalResponse);\n \n console.log(codeBlocks);\n responce = await gpt3endpoint.gptFnTestGenerator(JSON.parse(prompt).textConversion+'\\n\\n'+codeBlocks[0]);\n console.log(responce);\n\n \n }catch(error){\n console.log(error);\n }\n}\n\nfunction extractCodeBlocks(text: string): string[] {\n const codeBlockRegex = /```(?:apex)\\s*([\\s\\S]+?)\\s*```/g;\n const codeBlocks: string[] = [];\n let match;\n \n while ((match = codeBlockRegex.exec(text)) !== null) {\n codeBlocks.push(match[1]);\n }\n \n return codeBlocks;\n }"]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1985b4442b3b7d5613b4a77b99499da879141c54","contentHash":"9013d8dee93fd11bfcab6db337d37d544fdab7ba5e63f1eb91f76193d21b40c4"}} \ No newline at end of file diff --git a/JS/edgechains/examples/.nyc_output/processinfo/3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2.json b/JS/edgechains/examples/.nyc_output/processinfo/3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2.json deleted file mode 100644 index 1c2e26a1b..000000000 --- a/JS/edgechains/examples/.nyc_output/processinfo/3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2.json +++ /dev/null @@ -1 +0,0 @@ -{"parent":"68c0d032-e95e-4c66-8ea5-9659b55eff69","pid":4484,"argv":["/opt/homebrew/Cellar/node/20.6.1/bin/node","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/test/app.e2e-spec.ts"],"execArgv":["-r","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/node_modules/ts-node/register/index.js"],"cwd":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples","time":1701185866417,"ppid":4480,"coverageFilename":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/.nyc_output/3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2.json","externalId":"test/app.e2e-spec.ts","uuid":"3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2","files":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.module.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts"]} \ No newline at end of file diff --git a/JS/edgechains/examples/.nyc_output/processinfo/68c0d032-e95e-4c66-8ea5-9659b55eff69.json b/JS/edgechains/examples/.nyc_output/processinfo/68c0d032-e95e-4c66-8ea5-9659b55eff69.json deleted file mode 100644 index b1bfd0592..000000000 --- a/JS/edgechains/examples/.nyc_output/processinfo/68c0d032-e95e-4c66-8ea5-9659b55eff69.json +++ /dev/null @@ -1 +0,0 @@ -{"parent":null,"pid":4480,"argv":["/opt/homebrew/Cellar/node/20.6.1/bin/node","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/node_modules/.bin/tap","--ts"],"execArgv":[],"cwd":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples","time":1701185865738,"ppid":4479,"coverageFilename":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/.nyc_output/68c0d032-e95e-4c66-8ea5-9659b55eff69.json","externalId":"","uuid":"68c0d032-e95e-4c66-8ea5-9659b55eff69","files":[]} \ No newline at end of file diff --git a/JS/edgechains/examples/.nyc_output/processinfo/779f69a4-3b9d-42b4-95f6-c78fbcc36846.json b/JS/edgechains/examples/.nyc_output/processinfo/779f69a4-3b9d-42b4-95f6-c78fbcc36846.json deleted file mode 100644 index 63e89122a..000000000 --- a/JS/edgechains/examples/.nyc_output/processinfo/779f69a4-3b9d-42b4-95f6-c78fbcc36846.json +++ /dev/null @@ -1 +0,0 @@ -{"parent":"68c0d032-e95e-4c66-8ea5-9659b55eff69","pid":4483,"argv":["/opt/homebrew/Cellar/node/20.6.1/bin/node","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.spec.ts"],"execArgv":["-r","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/node_modules/ts-node/register/index.js"],"cwd":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples","time":1701185866417,"ppid":4480,"coverageFilename":"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/.nyc_output/779f69a4-3b9d-42b4-95f6-c78fbcc36846.json","externalId":"src/app.controller.spec.ts","uuid":"779f69a4-3b9d-42b4-95f6-c78fbcc36846","files":["/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts","/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts"]} \ No newline at end of file diff --git a/JS/edgechains/examples/.nyc_output/processinfo/index.json b/JS/edgechains/examples/.nyc_output/processinfo/index.json deleted file mode 100644 index 70ee0fec1..000000000 --- a/JS/edgechains/examples/.nyc_output/processinfo/index.json +++ /dev/null @@ -1 +0,0 @@ -{"processes":{"3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2":{"parent":"68c0d032-e95e-4c66-8ea5-9659b55eff69","externalId":"test/app.e2e-spec.ts","children":[]},"68c0d032-e95e-4c66-8ea5-9659b55eff69":{"parent":null,"children":["3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2","779f69a4-3b9d-42b4-95f6-c78fbcc36846"]},"779f69a4-3b9d-42b4-95f6-c78fbcc36846":{"parent":"68c0d032-e95e-4c66-8ea5-9659b55eff69","externalId":"src/app.controller.spec.ts","children":[]}},"files":{"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.module.ts":["3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2"],"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.controller.ts":["3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2","779f69a4-3b9d-42b4-95f6-c78fbcc36846"],"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/app.service.ts":["3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2","779f69a4-3b9d-42b4-95f6-c78fbcc36846"],"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/hydeExample/hydeExample.ts":["3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2","779f69a4-3b9d-42b4-95f6-c78fbcc36846"],"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/OpenAiEndpoint.ts":["3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2","779f69a4-3b9d-42b4-95f6-c78fbcc36846"],"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/lib/PostgresClient.ts":["3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2","779f69a4-3b9d-42b4-95f6-c78fbcc36846"],"/Users/harshvardhanparmar/Github-Projects/EdgeChains/JS/edgechains/examples/src/testGeneration/TestGenerator.ts":["3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2","779f69a4-3b9d-42b4-95f6-c78fbcc36846"]},"externalIds":{"test/app.e2e-spec.ts":{"root":"3ecaa54b-6bc3-4e9a-b8e3-d7fa8ffb5da2","children":[]},"src/app.controller.spec.ts":{"root":"779f69a4-3b9d-42b4-95f6-c78fbcc36846","children":[]}}} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/package.json b/JS/edgechains/examples/dist/package.json deleted file mode 100644 index f8fa927d3..000000000 --- a/JS/edgechains/examples/dist/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "examples", - "version": "0.0.1", - "description": "", - "author": "", - "private": true, - "license": "UNLICENSED", - "scripts": { - "build": "nest build", - "clean": "rm -rf coverage dist .nyc_output", - "format": "prettier --list-different .", - "format:fix": "prettier --write .", - "lint": "eslint", - "lint:fix": "eslint --fix", - "start": "nest start", - "start:dev": "nest start --watch", - "start:debug": "nest start --debug --watch", - "start:prod": "node dist/main", - "test": "tap --ts", - "test:cov": "tap --ts --coverage", - "test:dev": "tap --ts --watch --coverage" - }, - "dependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/typeorm": "^10.0.0", - "pg": "^8.11.3", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1" - }, - "devDependencies": { - "@hanazuki/node-jsonnet": "^2.1.0", - "@nestjs/cli": "^10.0.0", - "@nestjs/schematics": "^10.0.0", - "@nestjs/testing": "^10.0.0", - "@rbicker/jsonnet": "^0.1.1-0.12.1", - "@types/express": "^4.17.17", - "@types/jest": "^29.5.2", - "@types/node": "^20.3.1", - "@types/supertest": "^2.0.12", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "eslint": "^8.42.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0", - "jest": "^29.5.0", - "prettier": "^3.0.0", - "source-map-support": "^0.5.21", - "supertest": "^6.3.3", - "tap": "^16.3.8", - "ts-jest": "^29.1.0", - "ts-loader": "^9.4.3", - "ts-node": "^10.9.1", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.1.3" - }, - "jest": { - "moduleFileExtensions": [ - "js", - "json", - "ts" - ], - "rootDir": "src", - "testRegex": ".*\\.spec\\.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - }, - "collectCoverageFrom": [ - "**/*.(t|j)s" - ], - "coverageDirectory": "../coverage", - "testEnvironment": "node" - } -} diff --git a/JS/edgechains/examples/dist/src/app.controller.d.ts b/JS/edgechains/examples/dist/src/app.controller.d.ts deleted file mode 100644 index 4ae8598d1..000000000 --- a/JS/edgechains/examples/dist/src/app.controller.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { AppService } from './app.service'; -export declare class AppController { - private readonly appService; - constructor(appService: AppService); - getHello(): string; - hydeSearch(params: any, query: any): Promise<{ - wordEmbeddings: any; - finalAnswer: any; - }>; - testGenerator(): Promise; -} diff --git a/JS/edgechains/examples/dist/src/app.controller.js b/JS/edgechains/examples/dist/src/app.controller.js deleted file mode 100644 index a00db2896..000000000 --- a/JS/edgechains/examples/dist/src/app.controller.js +++ /dev/null @@ -1,70 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -var __param = (this && this.__param) || function (paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AppController = void 0; -const common_1 = require("@nestjs/common"); -const app_service_1 = require("./app.service"); -const hydeExample_1 = require("./hydeExample/hydeExample"); -const TestGenerator_1 = require("./testGeneration/TestGenerator"); -let AppController = class AppController { - constructor(appService) { - this.appService = appService; - } - getHello() { - return this.appService.getHello(); - } - hydeSearch(params, query) { - const arkRequest = { - topK: params.topK, - metadataTable: query.metadataTable, - query: query.query, - textWeight: query.textWeight, - similarityWeight: query.similarityWeight, - dateWeight: query.dateWeight, - orderRRF: query.orderRRF, - }; - return (0, hydeExample_1.hydeSearchAdaEmbedding)(arkRequest); - } - testGenerator() { - return (0, TestGenerator_1.getContent)(); - } -}; -exports.AppController = AppController; -__decorate([ - (0, common_1.Get)(), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", String) -], AppController.prototype, "getHello", null); -__decorate([ - (0, common_1.Post)('/hyde-search/query-rrf'), - (0, common_1.HttpCode)(200), - __param(0, (0, common_1.Query)()), - __param(1, (0, common_1.Body)()), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object, Object]), - __metadata("design:returntype", void 0) -], AppController.prototype, "hydeSearch", null); -__decorate([ - (0, common_1.Post)('/testcase/generate'), - (0, common_1.HttpCode)(200), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], AppController.prototype, "testGenerator", null); -exports.AppController = AppController = __decorate([ - (0, common_1.Controller)(), - __metadata("design:paramtypes", [app_service_1.AppService]) -], AppController); -//# sourceMappingURL=app.controller.js.map \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/app.controller.js.map b/JS/edgechains/examples/dist/src/app.controller.js.map deleted file mode 100644 index c0673ae5a..000000000 --- a/JS/edgechains/examples/dist/src/app.controller.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.controller.js","sourceRoot":"","sources":["../../src/app.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA8E;AAC9E,+CAA2C;AAC3C,2DAAmE;AACnE,kEAA4D;AAGrD,IAAM,aAAa,GAAnB,MAAM,aAAa;IACtB,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAGvD,QAAQ;QACJ,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC;IAID,UAAU,CAAU,MAAW,EAAU,KAAU;QAC/C,MAAM,UAAU,GAAG;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SAC3B,CAAC;QACF,OAAO,IAAA,oCAAsB,EAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAID,aAAa;QACT,OAAO,IAAA,0BAAU,GAAE,CAAC;IACxB,CAAC;CACJ,CAAA;AA5BY,sCAAa;AAItB;IADC,IAAA,YAAG,GAAE;;;;6CAGL;AAID;IAFC,IAAA,aAAI,EAAC,wBAAwB,CAAC;IAC9B,IAAA,iBAAQ,EAAC,GAAG,CAAC;IACF,WAAA,IAAA,cAAK,GAAE,CAAA;IAAe,WAAA,IAAA,aAAI,GAAE,CAAA;;;;+CAWvC;AAID;IAFC,IAAA,aAAI,EAAC,oBAAoB,CAAC;IAC1B,IAAA,iBAAQ,EAAC,GAAG,CAAC;;;;kDAGb;wBA3BQ,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAEgC,wBAAU;GAD1C,aAAa,CA4BzB"} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/app.module.d.ts b/JS/edgechains/examples/dist/src/app.module.d.ts deleted file mode 100644 index 09cdb35c8..000000000 --- a/JS/edgechains/examples/dist/src/app.module.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare class AppModule { -} diff --git a/JS/edgechains/examples/dist/src/app.module.js b/JS/edgechains/examples/dist/src/app.module.js deleted file mode 100644 index 25985e83f..000000000 --- a/JS/edgechains/examples/dist/src/app.module.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AppModule = void 0; -const common_1 = require("@nestjs/common"); -const app_controller_1 = require("./app.controller"); -const app_service_1 = require("./app.service"); -let AppModule = class AppModule { -}; -exports.AppModule = AppModule; -exports.AppModule = AppModule = __decorate([ - (0, common_1.Module)({ - imports: [], - controllers: [app_controller_1.AppController], - providers: [app_service_1.AppService], - }) -], AppModule); -//# sourceMappingURL=app.module.js.map \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/app.module.js.map b/JS/edgechains/examples/dist/src/app.module.js.map deleted file mode 100644 index 4347216ca..000000000 --- a/JS/edgechains/examples/dist/src/app.module.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,qDAAiD;AACjD,+CAA2C;AAOpC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IALrB,IAAA,eAAM,EAAC;QACJ,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,CAAC,8BAAa,CAAC;QAC5B,SAAS,EAAE,CAAC,wBAAU,CAAC;KAC1B,CAAC;GACW,SAAS,CAAG"} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/app.service.d.ts b/JS/edgechains/examples/dist/src/app.service.d.ts deleted file mode 100644 index 0496e7902..000000000 --- a/JS/edgechains/examples/dist/src/app.service.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class AppService { - getHello(): string; -} diff --git a/JS/edgechains/examples/dist/src/app.service.js b/JS/edgechains/examples/dist/src/app.service.js deleted file mode 100644 index 3bfb90bde..000000000 --- a/JS/edgechains/examples/dist/src/app.service.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AppService = void 0; -const common_1 = require("@nestjs/common"); -let AppService = class AppService { - getHello() { - return 'Hello World!'; - } -}; -exports.AppService = AppService; -exports.AppService = AppService = __decorate([ - (0, common_1.Injectable)() -], AppService); -//# sourceMappingURL=app.service.js.map \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/app.service.js.map b/JS/edgechains/examples/dist/src/app.service.js.map deleted file mode 100644 index 149b2f2cc..000000000 --- a/JS/edgechains/examples/dist/src/app.service.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.service.js","sourceRoot":"","sources":["../../src/app.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAGrC,IAAM,UAAU,GAAhB,MAAM,UAAU;IACnB,QAAQ;QACJ,OAAO,cAAc,CAAC;IAC1B,CAAC;CACJ,CAAA;AAJY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;GACA,UAAU,CAItB"} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/config.d.ts b/JS/edgechains/examples/dist/src/config.d.ts deleted file mode 100644 index 1ae9ad654..000000000 --- a/JS/edgechains/examples/dist/src/config.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { AppConfig } from '../typings'; -declare const _default: () => AppConfig; -export default _default; diff --git a/JS/edgechains/examples/dist/src/config.js b/JS/edgechains/examples/dist/src/config.js deleted file mode 100644 index 3e100296e..000000000 --- a/JS/edgechains/examples/dist/src/config.js +++ /dev/null @@ -1,42 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const package_json_1 = require("../package.json"); -function ensureValues(key, defaultValue, throwOnMissing = true) { - const value = process.env[key]; - if (value === undefined) { - if (defaultValue) { - console.error(`Config missing env.${key} - the default value '${defaultValue}' will be used`); - return defaultValue; - } - if (throwOnMissing) - throw new Error(`Config missing env.${key}`); - } - return value; -} -exports.default = () => ({ - app: { - name: package_json_1.name, - version: package_json_1.version, - }, - auth0: { - audience: ensureValues('AUTH0_AUDIENCE'), - issuer: ensureValues('AUTH0_ISSUER_URL'), - clientId: ensureValues('AUTH0_CLIENT_ID'), - clientSecret: ensureValues('AUTH0_CLIENT_SECRET'), - }, - db: { - host: ensureValues('DB_HOST'), - port: parseInt(ensureValues('DB_PORT'), 10), - username: ensureValues('DB_USERNAME'), - password: ensureValues('DB_PASSWORD'), - database: ensureValues('DB_DATABASE'), - }, - frontend: { - url: ensureValues('FRONTEND_URL', undefined, false), - }, - server: { - address: ensureValues('SERVER_ADDRESS', '127.0.0.1'), - port: parseInt(ensureValues('SERVER_PORT', '3001'), 10), - }, -}); -//# sourceMappingURL=config.js.map \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/config.js.map b/JS/edgechains/examples/dist/src/config.js.map deleted file mode 100644 index e9549236c..000000000 --- a/JS/edgechains/examples/dist/src/config.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":";;AAAA,kDAAgD;AAUhD,SAAS,YAAY,CAAC,GAAW,EAAE,YAAqB,EAAE,cAAc,GAAG,IAAI;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS,EAAE;QACrB,IAAI,YAAY,EAAE;YACd,OAAO,CAAC,KAAK,CACT,sBAAsB,GAAG,yBAAyB,YAAY,gBAAgB,CACjF,CAAC;YACF,OAAO,YAAY,CAAC;SACvB;QACD,IAAI,cAAc;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;KACpE;IACD,OAAO,KAAe,CAAC;AAC3B,CAAC;AAGD,kBAAe,GAAc,EAAE,CAAC,CAAC;IAC7B,GAAG,EAAE;QACD,IAAI,EAAJ,mBAAI;QACJ,OAAO,EAAP,sBAAO;KACV;IACD,KAAK,EAAE;QACH,QAAQ,EAAE,YAAY,CAAC,gBAAgB,CAAC;QACxC,MAAM,EAAE,YAAY,CAAC,kBAAkB,CAAC;QACxC,QAAQ,EAAE,YAAY,CAAC,iBAAiB,CAAC;QACzC,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC;KACpD;IACD,EAAE,EAAE;QACA,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC;QAC7B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAC3C,QAAQ,EAAE,YAAY,CAAC,aAAa,CAAC;QACrC,QAAQ,EAAE,YAAY,CAAC,aAAa,CAAC;QACrC,QAAQ,EAAE,YAAY,CAAC,aAAa,CAAC;KACxC;IACD,QAAQ,EAAE;QACN,GAAG,EAAE,YAAY,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC;KACtD;IACD,MAAM,EAAE;QACJ,OAAO,EAAE,YAAY,CAAC,gBAAgB,EAAE,WAAW,CAAC;QACpD,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;KAC1D;CACJ,CAAC,CAAC"} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/hydeExample/hydeExample.d.ts b/JS/edgechains/examples/dist/src/hydeExample/hydeExample.d.ts deleted file mode 100644 index 51a98ebe0..000000000 --- a/JS/edgechains/examples/dist/src/hydeExample/hydeExample.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ArkRequest } from '../types/ArkRequest'; -export declare function hydeSearchAdaEmbedding(arkRequest: ArkRequest): Promise<{ - wordEmbeddings: any; - finalAnswer: any; -}>; diff --git a/JS/edgechains/examples/dist/src/hydeExample/hydeExample.js b/JS/edgechains/examples/dist/src/hydeExample/hydeExample.js deleted file mode 100644 index a00e80407..000000000 --- a/JS/edgechains/examples/dist/src/hydeExample/hydeExample.js +++ /dev/null @@ -1,79 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.hydeSearchAdaEmbedding = void 0; -const node_jsonnet_1 = require("@hanazuki/node-jsonnet"); -const path = require("path"); -const OpenAiEndpoint_1 = require("../lib/OpenAiEndpoint"); -const PostgresClient_1 = require("../lib/PostgresClient"); -var PostgresDistanceMetric; -(function (PostgresDistanceMetric) { - PostgresDistanceMetric["COSINE"] = "COSINE"; - PostgresDistanceMetric["IP"] = "IP"; - PostgresDistanceMetric["L2"] = "L2"; -})(PostgresDistanceMetric || (PostgresDistanceMetric = {})); -const gpt3endpoint = new OpenAiEndpoint_1.OpenAiEndpoint('https://api.openai.com/v1/chat/completions', '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', '', 'gpt-3.5-turbo', 'user', 0.7); -async function hydeSearchAdaEmbedding(arkRequest) { - try { - const table = 'ada_hyde_prod'; - const namespace = '360_docs'; - const query = arkRequest.query; - const topK = Number(arkRequest.topK); - const jsonnet = new node_jsonnet_1.Jsonnet(); - const promptPath = path.join(process.cwd(), './src/hydeExample/prompts.jsonnet'); - const hydePath = path.join(process.cwd(), './src/hydeExample/hyde.jsonnet'); - const promptLoader = await jsonnet.evaluateFile(promptPath); - const promptTemplate = JSON.parse(promptLoader).summary; - let hydeLoader = await jsonnet - .extString('promptTemplate', promptTemplate) - .extString('time', '') - .extString('query', query) - .evaluateFile(hydePath); - const prompt = JSON.parse(hydeLoader).prompt; - const gptResponse = await gpt3endpoint.gptFn(prompt); - const gpt3Responses = gptResponse.split('\n'); - const embeddingsListChain = Promise.all(gpt3Responses.map(async (resp) => { - const embedding = await gpt3endpoint.embeddings(resp); - return embedding; - })); - const dbClient = new PostgresClient_1.PostgresClient(await embeddingsListChain, PostgresDistanceMetric.IP, topK, 20, table, namespace, arkRequest, 15); - const queryResult = await dbClient.dbQuery(); - const retrievedDocs = []; - for (const embeddings of queryResult) { - retrievedDocs.push(`${embeddings.raw_text}\n score:${embeddings.score}\n filename:${embeddings.filename}\n`); - } - if (retrievedDocs.join('').length > 4096) { - retrievedDocs.length = 4096; - } - const currentTime = new Date().toLocaleString(); - const formattedTime = currentTime; - const ansPromptSystem = JSON.parse(promptLoader).ans_prompt_system; - hydeLoader = await jsonnet - .extString(promptTemplate, ansPromptSystem) - .extString('time', formattedTime) - .extString('qeury', retrievedDocs.join('')) - .evaluateFile(hydePath); - const finalPromptSystem = JSON.parse(hydeLoader).prompt; - const ansPromptUser = JSON.parse(promptLoader).ans_prompt_user; - hydeLoader = await jsonnet - .extString(promptTemplate, ansPromptUser) - .extString('qeury', query) - .evaluateFile(hydePath); - const finalPromptUser = JSON.parse(hydeLoader).prompt; - const chatMessages = [ - { role: 'system', content: finalPromptSystem }, - { role: 'user', content: finalPromptUser }, - ]; - const finalAnswer = await gpt3endpoint.gptFnChat(chatMessages); - const response = { - wordEmbeddings: queryResult, - finalAnswer: finalAnswer, - }; - return response; - } - catch (error) { - console.error(error); - throw error; - } -} -exports.hydeSearchAdaEmbedding = hydeSearchAdaEmbedding; -//# sourceMappingURL=hydeExample.js.map \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/hydeExample/hydeExample.js.map b/JS/edgechains/examples/dist/src/hydeExample/hydeExample.js.map deleted file mode 100644 index e80b1a468..000000000 --- a/JS/edgechains/examples/dist/src/hydeExample/hydeExample.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"hydeExample.js","sourceRoot":"","sources":["../../../src/hydeExample/hydeExample.ts"],"names":[],"mappings":";;;AAAA,yDAAiD;AACjD,6BAA6B;AAC7B,0DAAuD;AACvD,0DAAuD;AAEvD,IAAK,sBAIJ;AAJD,WAAK,sBAAsB;IACvB,2CAAiB,CAAA;IACjB,mCAAS,CAAA;IACT,mCAAS,CAAA;AACb,CAAC,EAJI,sBAAsB,KAAtB,sBAAsB,QAI1B;AAED,MAAM,YAAY,GAAG,IAAI,+BAAc,CACnC,4CAA4C,EAC5C,qDAAqD,EACrD,EAAE,EACF,eAAe,EACf,MAAM,EACN,GAAG,CACN,CAAC;AAEK,KAAK,UAAU,sBAAsB,CAAC,UAAsB;IAC/D,IAAI;QAEA,MAAM,KAAK,GAAG,eAAe,CAAC;QAC9B,MAAM,SAAS,GAAG,UAAU,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAGrC,MAAM,OAAO,GAAG,IAAI,sBAAO,EAAE,CAAC;QAE9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mCAAmC,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAE5E,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAG5D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;QAGxD,IAAI,UAAU,GAAG,MAAM,OAAO;aACzB,SAAS,CAAC,gBAAgB,EAAE,cAAc,CAAC;aAC3C,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;aACrB,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;aACzB,YAAY,CAAC,QAAQ,CAAC,CAAC;QAG5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAG7C,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAGrD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAG9C,MAAM,mBAAmB,GAAwB,OAAO,CAAC,GAAG,CACxD,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO,SAAS,CAAC;QACrB,CAAC,CAAC,CACL,CAAC;QAGF,MAAM,QAAQ,GAAG,IAAI,+BAAc,CAC/B,MAAM,mBAAmB,EACzB,sBAAsB,CAAC,EAAE,EACzB,IAAI,EACJ,EAAE,EACF,KAAK,EACL,SAAS,EACT,UAAU,EACV,EAAE,CACL,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAG7C,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;YAClC,aAAa,CAAC,IAAI,CACd,GAAG,UAAU,CAAC,QAAQ,YAAY,UAAU,CAAC,KAAK,eAAe,UAAU,CAAC,QAAQ,IAAI,CAC3F,CAAC;SACL;QAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE;YACtC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;SAC/B;QAED,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,WAAW,CAAC;QAGlC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC;QAEnE,UAAU,GAAG,MAAM,OAAO;aACrB,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC;aAC1C,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC;aAChC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC1C,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAGxD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC;QAE/D,UAAU,GAAG,MAAM,OAAO;aACrB,SAAS,CAAC,cAAc,EAAE,aAAa,CAAC;aACxC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;aACzB,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QAEtD,MAAM,YAAY,GAAG;YACjB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE;YAC9C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE;SAC7C,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAE/D,MAAM,QAAQ,GAAG;YACb,cAAc,EAAE,WAAW;YAC3B,WAAW,EAAE,WAAW;SAC3B,CAAC;QAEF,OAAO,QAAQ,CAAC;KACnB;IAAC,OAAO,KAAK,EAAE;QAEZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,MAAM,KAAK,CAAC;KACf;AACL,CAAC;AA9GD,wDA8GC"} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/lib/OpenAiEndpoint.d.ts b/JS/edgechains/examples/dist/src/lib/OpenAiEndpoint.d.ts deleted file mode 100644 index 73bb47d78..000000000 --- a/JS/edgechains/examples/dist/src/lib/OpenAiEndpoint.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -export declare class OpenAiEndpoint { - url: string; - apiKey: string; - orgId: string; - model: string; - role: string; - temprature: number; - constructor(url: string, apiKey: string, orgId: string, model: string, role: string, temprature: number); - gptFn(prompt: string): Promise; - embeddings(resp: string): Promise; - gptFnChat(chatMessages: any): Promise; - gptFnTestGenerator(prompt: string): Promise; -} diff --git a/JS/edgechains/examples/dist/src/lib/OpenAiEndpoint.js b/JS/edgechains/examples/dist/src/lib/OpenAiEndpoint.js deleted file mode 100644 index f48997cd5..000000000 --- a/JS/edgechains/examples/dist/src/lib/OpenAiEndpoint.js +++ /dev/null @@ -1,141 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.OpenAiEndpoint = void 0; -const axios_1 = require("axios"); -class OpenAiEndpoint { - constructor(url, apiKey, orgId, model, role, temprature) { - this.url = url; - this.apiKey = apiKey; - this.orgId = orgId; - this.model = model; - this.role = role; - this.temprature = temprature; - } - async gptFn(prompt) { - const responce = await axios_1.default - .post('https://api.openai.com/v1/chat/completions', { - model: this.model, - messages: [ - { - role: this.role, - content: prompt, - }, - ], - temperature: this.temprature, - }, { - headers: { - Authorization: 'Bearer ' + this.apiKey, - 'content-type': 'application/json', - }, - }) - .then(function (response) { - return response.data.choices; - }) - .catch(function (error) { - if (error.response) { - console.log('Server responded with status code:', error.response.status); - console.log('Response data:', error.response.data); - } - else if (error.request) { - console.log('No response received:', error.request); - } - else { - console.log('Error creating request:', error.message); - } - }); - return responce[0].message.content; - } - async embeddings(resp) { - const responce = await axios_1.default - .post('https://api.openai.com/v1/embeddings', { - model: 'text-embedding-ada-002', - input: resp, - }, { - headers: { - Authorization: 'Bearer ' + this.apiKey, - 'content-type': 'application/json', - }, - }) - .then(function (response) { - return response.data.data[0].embedding; - }) - .catch(function (error) { - if (error.response) { - console.log('Server responded with status code:', error.response.status); - console.log('Response data:', error.response.data); - } - else if (error.request) { - console.log('No response received:', error.request); - } - else { - console.log('Error creating request:', error.message); - } - }); - return responce; - } - async gptFnChat(chatMessages) { - const responce = await axios_1.default - .post('https://api.openai.com/v1/chat/completions', { - model: this.model, - messages: chatMessages, - temperature: this.temprature, - }, { - headers: { - Authorization: 'Bearer ' + this.apiKey, - 'content-type': 'application/json', - }, - }) - .then(function (response) { - return response.data.choices; - }) - .catch(function (error) { - if (error.response) { - console.log('Server responded with status code:', error.response.status); - console.log('Response data:', error.response.data); - } - else if (error.request) { - console.log('No response received:', error.request); - } - else { - console.log('Error creating request:', error.message); - } - }); - return responce[0].message.content; - } - async gptFnTestGenerator(prompt) { - const responce = await axios_1.default - .post('https://api.openai.com/v1/chat/completions', { - model: this.model, - messages: [ - { - role: this.role, - content: prompt, - }, - ], - temperature: this.temprature, - }, { - headers: { - Authorization: 'Bearer ' + this.apiKey, - 'content-type': 'application/json', - }, - }) - .then(function (response) { - return response.data.choices; - }) - .catch(function (error) { - if (error.response) { - console.log('Server responded with status code:', error.response.status); - console.log('Response data:', error.response.data); - } - else if (error.request) { - console.log('No response received:', error.request); - } - else { - console.log('Error creating request:', error.message); - } - }); - return responce[0].message.content; - } -} -exports.OpenAiEndpoint = OpenAiEndpoint; -//# sourceMappingURL=OpenAiEndpoint.js.map \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/lib/OpenAiEndpoint.js.map b/JS/edgechains/examples/dist/src/lib/OpenAiEndpoint.js.map deleted file mode 100644 index a185607e8..000000000 --- a/JS/edgechains/examples/dist/src/lib/OpenAiEndpoint.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"OpenAiEndpoint.js","sourceRoot":"","sources":["../../../src/lib/OpenAiEndpoint.ts"],"names":[],"mappings":";;;AAAA,iCAA0B;AAE1B,MAAa,cAAc;IAQvB,YACI,GAAW,EACX,MAAc,EACd,KAAa,EACb,KAAa,EACb,IAAY,EACZ,UAAkB;QAElB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACtB,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,4CAA4C,EAC5C;YACI,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE;gBACN;oBACI,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,MAAM;iBAClB;aACJ;YACD,WAAW,EAAE,IAAI,CAAC,UAAU;SAC/B,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QACP,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QACzB,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,sCAAsC,EACtC;YACI,KAAK,EAAE,wBAAwB;YAC/B,KAAK,EAAE,IAAI;SACd,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3C,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QAEP,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,YAAY;QACxB,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,4CAA4C,EAC5C;YACI,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,YAAY;YACtB,WAAW,EAAE,IAAI,CAAC,UAAU;SAC/B,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QAEP,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAc;QACnC,MAAM,QAAQ,GAAG,MAAM,eAAK;aACvB,IAAI,CACD,4CAA4C,EAC5C;YACI,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE;gBACN;oBACI,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,MAAM;iBAClB;aACJ;YACD,WAAW,EAAE,IAAI,CAAC,UAAU;SAC/B,EACD;YACI,OAAO,EAAE;gBACL,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM;gBACtC,cAAc,EAAE,kBAAkB;aACrC;SACJ,CACJ;aACA,IAAI,CAAC,UAAU,QAAQ;YACpB,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,UAAU,KAAK;YAClB,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtD;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACvD;iBAAM;gBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD;QACL,CAAC,CAAC,CAAC;QACP,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;CACJ;AAlKD,wCAkKC"} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/lib/PostgresClient.d.ts b/JS/edgechains/examples/dist/src/lib/PostgresClient.d.ts deleted file mode 100644 index 9187d3abe..000000000 --- a/JS/edgechains/examples/dist/src/lib/PostgresClient.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -export declare class PostgresClient { - wordEmbeddings: number[][]; - metric: PostgresDistanceMetric; - topK: number; - probes: number; - tableName: string; - namespace: string; - arkRequest: any; - upperLimit: number; - constructor(wordEmbeddings: number[][], metric: any, topK: any, probes: any, tableName: any, namespace: string, arkRequest: any, upperLimit: any); - dbQuery(): Promise; -} -declare enum PostgresDistanceMetric { - COSINE = "COSINE", - IP = "IP", - L2 = "L2" -} -export {}; diff --git a/JS/edgechains/examples/dist/src/lib/PostgresClient.js b/JS/edgechains/examples/dist/src/lib/PostgresClient.js deleted file mode 100644 index 85fd47295..000000000 --- a/JS/edgechains/examples/dist/src/lib/PostgresClient.js +++ /dev/null @@ -1,86 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PostgresClient = void 0; -const typeorm_1 = require("typeorm"); -class PostgresClient { - constructor(wordEmbeddings, metric, topK, probes, tableName, namespace, arkRequest, upperLimit) { - this.wordEmbeddings = wordEmbeddings; - this.metric = metric; - this.topK = topK; - this.probes = probes; - this.tableName = tableName; - this.namespace = namespace; - this.arkRequest = arkRequest; - this.upperLimit = upperLimit; - } - async dbQuery() { - const con = await (0, typeorm_1.createConnection)(); - const entityManager = con.createEntityManager(); - try { - const query1 = `SET LOCAL ivfflat.probes = ${this.probes};`; - await entityManager.query(query1); - let query = ''; - for (let i = 0; i < this.wordEmbeddings.length; i++) { - const embedding = JSON.stringify(this.wordEmbeddings[i]); - query += `( SELECT id, raw_text, document_date, metadata, namespace, filename, timestamp, - ${this.arkRequest.textWeight.baseWeight} / (ROW_NUMBER() OVER (ORDER BY text_rank DESC) + ${this.arkRequest.textWeight.fineTuneWeight}) + - ${this.arkRequest.similarityWeight.baseWeight} / (ROW_NUMBER() OVER (ORDER BY similarity DESC) + ${this.arkRequest.similarityWeight.fineTuneWeight}) + - ${this.arkRequest.dateWeight.baseWeight} / (ROW_NUMBER() OVER (ORDER BY date_rank DESC) + ${this.arkRequest.dateWeight.fineTuneWeight}) AS rrf_score - FROM ( SELECT sv.id, sv.raw_text, sv.namespace, sv.filename, sv.timestamp, svtm.document_date, svtm.metadata, ts_rank_cd(sv.tsv, plainto_tsquery('${'english'}', '${this.arkRequest.query}')) AS text_rank, `; - if (this.metric === PostgresDistanceMetric.COSINE) - query += `1 - (sv.embedding <=> '${embedding}') AS similarity, `; - if (this.metric === PostgresDistanceMetric.IP) - query += `(sv.embedding <#> '${embedding}') * -1 AS similarity, `; - if (this.metric === PostgresDistanceMetric.L2) - query += `sv.embedding <-> '${embedding}' AS similarity, `; - query += `CASE WHEN svtm.document_date IS NULL THEN 0 ELSE EXTRACT(YEAR FROM svtm.document_date) * 365 + EXTRACT(DOY FROM svtm.document_date) END AS date_rank FROM (SELECT id, raw_text, embedding, tsv, namespace, filename, timestamp from ${this.tableName} WHERE namespace = '${this.namespace}'`; - if (this.metric === PostgresDistanceMetric.COSINE) - query += ` ORDER BY embedding <=> '${embedding}' LIMIT ${this.topK}`; - if (this.metric === PostgresDistanceMetric.IP) - query += ` ORDER BY embedding <#> '${embedding}' LIMIT ${this.topK}`; - if (this.metric === PostgresDistanceMetric.L2) - query += ` ORDER BY embedding <-> '${embedding}' LIMIT ${this.topK}`; - query += `) sv JOIN ${this.tableName}_join_${this.arkRequest.metadataTable} jtm ON sv.id = jtm.id JOIN ${this.tableName}_${this.arkRequest.metadataTable} svtm ON jtm.metadata_id = svtm.metadata_id) subquery `; - switch (this.arkRequest.orderRRF) { - case 'text_rank': - query += `ORDER BY text_rank DESC, rrf_score DESC`; - break; - case 'similarity': - query += `ORDER BY similarity DESC, rrf_score DESC`; - break; - case 'date_rank': - query += `ORDER BY date_rank DESC, rrf_score DESC`; - break; - case 'default': - query += `ORDER BY rrf_score DESC`; - break; - } - query += ` LIMIT ${this.topK})`; - if (i < this.wordEmbeddings.length - 1) { - query += ' UNION ALL \n'; - } - } - if (this.wordEmbeddings.length > 1) { - query = `SELECT * FROM (SELECT DISTINCT ON (result.id) * FROM ( ${query} ) result) subquery ORDER BY rrf_score DESC LIMIT ${this.upperLimit};`; - } - else { - query += ` ORDER BY rrf_score DESC LIMIT ${this.topK};`; - } - const results = await entityManager.query(query); - await con.destroy(); - return results; - } - catch (error) { - console.error(error); - throw error; - } - } -} -exports.PostgresClient = PostgresClient; -var PostgresDistanceMetric; -(function (PostgresDistanceMetric) { - PostgresDistanceMetric["COSINE"] = "COSINE"; - PostgresDistanceMetric["IP"] = "IP"; - PostgresDistanceMetric["L2"] = "L2"; -})(PostgresDistanceMetric || (PostgresDistanceMetric = {})); -//# sourceMappingURL=PostgresClient.js.map \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/lib/PostgresClient.js.map b/JS/edgechains/examples/dist/src/lib/PostgresClient.js.map deleted file mode 100644 index fa2493857..000000000 --- a/JS/edgechains/examples/dist/src/lib/PostgresClient.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PostgresClient.js","sourceRoot":"","sources":["../../../src/lib/PostgresClient.ts"],"names":[],"mappings":";;;AAAA,qCAA2C;AAE3C,MAAa,cAAc;IAUvB,YACI,cAA0B,EAC1B,MAAM,EACN,IAAI,EACJ,MAAM,EACN,SAAS,EACT,SAAiB,EACjB,UAAe,EACf,UAAU;QAEV,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO;QACT,MAAM,GAAG,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;QACrC,MAAM,aAAa,GAAG,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAChD,IAAI;YACA,MAAM,MAAM,GAAG,8BAA8B,IAAI,CAAC,MAAM,GAAG,CAAC;YAC5D,MAAM,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAElC,IAAI,KAAK,GAAW,EAAE,CAAC;YAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACjD,MAAM,SAAS,GAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEjE,KAAK,IAAI;kBAEL,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,UAC/B,qDACI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,cAC/B;kBAEI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UACrC,sDACI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,cACrC;kBAEI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,UAC/B,qDACI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,cAC/B;oKACoJ,SAAS,OACzJ,IAAI,CAAC,UAAU,CAAC,KACpB,oBAAoB,CAAC;gBAErB,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,MAAM;oBAC7C,KAAK,IAAI,0BAA0B,SAAS,oBAAoB,CAAC;gBACrE,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,sBAAsB,SAAS,yBAAyB,CAAC;gBACtE,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,qBAAqB,SAAS,mBAAmB,CAAC;gBAE/D,KAAK,IAAI,uOAAuO,IAAI,CAAC,SAAS,uBAAuB,IAAI,CAAC,SAAS,GAAG,CAAC;gBAEvS,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,MAAM;oBAC7C,KAAK,IAAI,4BAA4B,SAAS,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,4BAA4B,SAAS,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,EAAE;oBACzC,KAAK,IAAI,4BAA4B,SAAS,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC;gBAE1E,KAAK,IAAI,aAAa,IAAI,CAAC,SAAS,SAAS,IAAI,CAAC,UAAU,CAAC,aAAa,+BAA+B,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,wDAAwD,CAAC;gBAEjN,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;oBAC9B,KAAK,WAAW;wBACZ,KAAK,IAAI,yCAAyC,CAAC;wBACnD,MAAM;oBACV,KAAK,YAAY;wBACb,KAAK,IAAI,0CAA0C,CAAC;wBACpD,MAAM;oBACV,KAAK,WAAW;wBACZ,KAAK,IAAI,yCAAyC,CAAC;wBACnD,MAAM;oBACV,KAAK,SAAS;wBACV,KAAK,IAAI,yBAAyB,CAAC;wBACnC,MAAM;iBACb;gBAED,KAAK,IAAI,UAAU,IAAI,CAAC,IAAI,GAAG,CAAC;gBAChC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;oBACpC,KAAK,IAAI,eAAe,CAAC;iBAC5B;aACJ;YAED,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,KAAK,GAAG,0DAA0D,KAAK,qDAAqD,IAAI,CAAC,UAAU,GAAG,CAAC;aAClJ;iBAAM;gBACH,KAAK,IAAI,kCAAkC,IAAI,CAAC,IAAI,GAAG,CAAC;aAC3D;YACD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC;SAClB;QAAC,OAAO,KAAK,EAAE;YAEZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,KAAK,CAAC;SACf;IACL,CAAC;CACJ;AAnHD,wCAmHC;AAED,IAAK,sBAIJ;AAJD,WAAK,sBAAsB;IACvB,2CAAiB,CAAA;IACjB,mCAAS,CAAA;IACT,mCAAS,CAAA;AACb,CAAC,EAJI,sBAAsB,KAAtB,sBAAsB,QAI1B"} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/main.d.ts b/JS/edgechains/examples/dist/src/main.d.ts deleted file mode 100644 index cb0ff5c3b..000000000 --- a/JS/edgechains/examples/dist/src/main.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/JS/edgechains/examples/dist/src/main.js b/JS/edgechains/examples/dist/src/main.js deleted file mode 100644 index 3a37dc3ad..000000000 --- a/JS/edgechains/examples/dist/src/main.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const core_1 = require("@nestjs/core"); -const app_module_1 = require("./app.module"); -async function bootstrap() { - const app = await core_1.NestFactory.create(app_module_1.AppModule); - await app.listen(8080); -} -bootstrap(); -//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/main.js.map b/JS/edgechains/examples/dist/src/main.js.map deleted file mode 100644 index 76f2bdf04..000000000 --- a/JS/edgechains/examples/dist/src/main.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AAEzC,KAAK,UAAU,SAAS;IACpB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,CAAC;IAChD,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AACD,SAAS,EAAE,CAAC"} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/testGeneration/TestGenerator.d.ts b/JS/edgechains/examples/dist/src/testGeneration/TestGenerator.d.ts deleted file mode 100644 index a8ac0c00f..000000000 --- a/JS/edgechains/examples/dist/src/testGeneration/TestGenerator.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare function getContent(): Promise; diff --git a/JS/edgechains/examples/dist/src/testGeneration/TestGenerator.js b/JS/edgechains/examples/dist/src/testGeneration/TestGenerator.js deleted file mode 100644 index 825d33736..000000000 --- a/JS/edgechains/examples/dist/src/testGeneration/TestGenerator.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getContent = void 0; -const node_jsonnet_1 = require("@hanazuki/node-jsonnet"); -const path = require("path"); -const OpenAiEndpoint_1 = require("../lib/OpenAiEndpoint"); -const jsonnet = new node_jsonnet_1.Jsonnet(); -const promptPath = path.join(process.cwd(), './src/testGeneration/prompts.jsonnet'); -const testGeneratorPath = path.join(process.cwd(), './src/testGeneration/testGenerator.jsonnet'); -const gpt3endpoint = new OpenAiEndpoint_1.OpenAiEndpoint('https://api.openai.com/v1/chat/completions', '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', '', 'gpt-3.5-turbo', 'user', 0.7); -const classText = "@RestResource(urlMapping='/classcontent')\n" + - "global with sharing class ClassContent \n" + - "{\n" + - " @HttpPost\n" + - " global static String getClassInfo(String className) \n" + - " {\n" + - " String classContent = [SELECT Body \n" + - " FROM ApexClass \n" + - " WHERE Name = :className LIMIT 1].Body;\n" + - "\n" + - " return classContent;\n" + - " }\n" + - "}"; -async function getContent() { - try { - var prompt = await jsonnet.evaluateFile(promptPath); - const testPrompt = await jsonnet.extString('promptTemplate', JSON.parse(prompt).prompt) - .extString('test_class', classText) - .extString('test_package', 'Apex') - .evaluateFile(testGeneratorPath); - const initialResponse = await gpt3endpoint.gptFnTestGenerator(JSON.parse(prompt).promptStart); - console.log('Initial Response.....\n\n' + initialResponse); - var responce = await gpt3endpoint.gptFnTestGenerator(initialResponse + JSON.parse(testPrompt).prompt); - console.log('First Response.......\n \n' + responce); - var finalResponse = responce; - responce += JSON.parse(prompt).promptPlan; - finalResponse += await gpt3endpoint.gptFnTestGenerator(responce); - console.log('Final Response.......\n\n' + finalResponse); - const codeBlocks = extractCodeBlocks(finalResponse); - console.log(codeBlocks); - responce = await gpt3endpoint.gptFnTestGenerator(JSON.parse(prompt).textConversion + '\n\n' + codeBlocks[0]); - console.log(responce); - } - catch (error) { - console.log(error); - } -} -exports.getContent = getContent; -function extractCodeBlocks(text) { - const codeBlockRegex = /```(?:apex)\s*([\s\S]+?)\s*```/g; - const codeBlocks = []; - let match; - while ((match = codeBlockRegex.exec(text)) !== null) { - codeBlocks.push(match[1]); - } - return codeBlocks; -} -//# sourceMappingURL=TestGenerator.js.map \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/testGeneration/TestGenerator.js.map b/JS/edgechains/examples/dist/src/testGeneration/TestGenerator.js.map deleted file mode 100644 index fe81fb433..000000000 --- a/JS/edgechains/examples/dist/src/testGeneration/TestGenerator.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TestGenerator.js","sourceRoot":"","sources":["../../../src/testGeneration/TestGenerator.ts"],"names":[],"mappings":";;;AAAA,yDAAiD;AACjD,6BAA6B;AAC7B,0DAAwD;AAExD,MAAM,OAAO,GAAG,IAAI,sBAAO,EAAE,CAAC;AAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAC,sCAAsC,CAAC,CAAC;AACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAC,4CAA4C,CAAC,CAAC;AAEhG,MAAM,YAAY,GAAG,IAAI,+BAAc,CACnC,4CAA4C,EAC5C,qDAAqD,EACrD,EAAE,EACF,eAAe,EACf,MAAM,EACN,GAAG,CACN,CAAC;AAEF,MAAM,SAAS,GAAE,6CAA6C;IAC9D,2CAA2C;IAC3C,KAAK;IACL,iBAAiB;IACjB,4DAA4D;IAC5D,SAAS;IACT,+CAA+C;IAC/C,kDAAkD;IAClD,yEAAyE;IACzE,IAAI;IACJ,gCAAgC;IAChC,SAAS;IACT,GAAG,CAAC;AAEG,KAAK,UAAU,UAAU;IAC5B,IAAG;QAEC,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,gBAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;aACrD,SAAS,CAAC,YAAY,EAAC,SAAS,CAAC;aACjC,SAAS,CAAC,cAAc,EAAC,MAAM,CAAC;aAChC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAEjE,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;QAE9F,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAC,eAAe,CAAC,CAAC;QAEzD,IAAI,QAAQ,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,eAAe,GAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;QAEpG,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,aAAa,GAAG,QAAQ,CAAC;QAE7B,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC;QAE1C,aAAa,IAAI,MAAM,YAAY,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAEjE,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAC,aAAa,CAAC,CAAC;QAEvD,MAAM,UAAU,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,QAAQ,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAc,GAAC,MAAM,GAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;KAGzB;IAAA,OAAM,KAAK,EAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACtB;AACL,CAAC;AAnCD,gCAmCC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,MAAM,cAAc,GAAG,iCAAiC,CAAC;IACzD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;QACnD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3B;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/types/ArkRequest.d.ts b/JS/edgechains/examples/dist/src/types/ArkRequest.d.ts deleted file mode 100644 index 629a78b7e..000000000 --- a/JS/edgechains/examples/dist/src/types/ArkRequest.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -export interface ArkRequest { - topK: number; - metadataTable: string; - query: string; - textWeight: { - baseWeight: string; - fineTuneWeight: string; - }; - similarityWeight: { - baseWeight: string; - fineTuneWeight: string; - }; - dateWeight: { - baseWeight: string; - fineTuneWeight: string; - }; - orderRRF: string; -} diff --git a/JS/edgechains/examples/dist/src/types/ArkRequest.js b/JS/edgechains/examples/dist/src/types/ArkRequest.js deleted file mode 100644 index 68b3ba994..000000000 --- a/JS/edgechains/examples/dist/src/types/ArkRequest.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=ArkRequest.js.map \ No newline at end of file diff --git a/JS/edgechains/examples/dist/src/types/ArkRequest.js.map b/JS/edgechains/examples/dist/src/types/ArkRequest.js.map deleted file mode 100644 index 8071e2797..000000000 --- a/JS/edgechains/examples/dist/src/types/ArkRequest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ArkRequest.js","sourceRoot":"","sources":["../../../src/types/ArkRequest.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/JS/edgechains/examples/dist/tsconfig.build.tsbuildinfo b/JS/edgechains/examples/dist/tsconfig.build.tsbuildinfo deleted file mode 100644 index 32d5f928b..000000000 --- a/JS/edgechains/examples/dist/tsconfig.build.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"program":{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.es2021.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../node_modules/typescript/lib/lib.scripthost.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.es2021.promise.d.ts","../node_modules/typescript/lib/lib.es2021.string.d.ts","../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../node_modules/typescript/lib/lib.es2021.intl.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/typescript/lib/lib.es2021.full.d.ts","../node_modules/reflect-metadata/index.d.ts","../node_modules/@nestjs/common/decorators/core/bind.decorator.d.ts","../node_modules/@nestjs/common/interfaces/abstract.interface.d.ts","../node_modules/@nestjs/common/interfaces/controllers/controller-metadata.interface.d.ts","../node_modules/@nestjs/common/interfaces/controllers/controller.interface.d.ts","../node_modules/@nestjs/common/interfaces/features/arguments-host.interface.d.ts","../node_modules/@nestjs/common/interfaces/exceptions/exception-filter.interface.d.ts","../node_modules/rxjs/dist/types/internal/subscription.d.ts","../node_modules/rxjs/dist/types/internal/subscriber.d.ts","../node_modules/rxjs/dist/types/internal/operator.d.ts","../node_modules/rxjs/dist/types/internal/observable.d.ts","../node_modules/rxjs/dist/types/internal/types.d.ts","../node_modules/rxjs/dist/types/internal/operators/audit.d.ts","../node_modules/rxjs/dist/types/internal/operators/audittime.d.ts","../node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","../node_modules/rxjs/dist/types/internal/operators/buffercount.d.ts","../node_modules/rxjs/dist/types/internal/operators/buffertime.d.ts","../node_modules/rxjs/dist/types/internal/operators/buffertoggle.d.ts","../node_modules/rxjs/dist/types/internal/operators/bufferwhen.d.ts","../node_modules/rxjs/dist/types/internal/operators/catcherror.d.ts","../node_modules/rxjs/dist/types/internal/operators/combinelatestall.d.ts","../node_modules/rxjs/dist/types/internal/operators/combineall.d.ts","../node_modules/rxjs/dist/types/internal/operators/combinelatest.d.ts","../node_modules/rxjs/dist/types/internal/operators/combinelatestwith.d.ts","../node_modules/rxjs/dist/types/internal/operators/concat.d.ts","../node_modules/rxjs/dist/types/internal/operators/concatall.d.ts","../node_modules/rxjs/dist/types/internal/operators/concatmap.d.ts","../node_modules/rxjs/dist/types/internal/operators/concatmapto.d.ts","../node_modules/rxjs/dist/types/internal/operators/concatwith.d.ts","../node_modules/rxjs/dist/types/internal/operators/connect.d.ts","../node_modules/rxjs/dist/types/internal/operators/count.d.ts","../node_modules/rxjs/dist/types/internal/operators/debounce.d.ts","../node_modules/rxjs/dist/types/internal/operators/debouncetime.d.ts","../node_modules/rxjs/dist/types/internal/operators/defaultifempty.d.ts","../node_modules/rxjs/dist/types/internal/operators/delay.d.ts","../node_modules/rxjs/dist/types/internal/operators/delaywhen.d.ts","../node_modules/rxjs/dist/types/internal/operators/dematerialize.d.ts","../node_modules/rxjs/dist/types/internal/operators/distinct.d.ts","../node_modules/rxjs/dist/types/internal/operators/distinctuntilchanged.d.ts","../node_modules/rxjs/dist/types/internal/operators/distinctuntilkeychanged.d.ts","../node_modules/rxjs/dist/types/internal/operators/elementat.d.ts","../node_modules/rxjs/dist/types/internal/operators/endwith.d.ts","../node_modules/rxjs/dist/types/internal/operators/every.d.ts","../node_modules/rxjs/dist/types/internal/operators/exhaustall.d.ts","../node_modules/rxjs/dist/types/internal/operators/exhaust.d.ts","../node_modules/rxjs/dist/types/internal/operators/exhaustmap.d.ts","../node_modules/rxjs/dist/types/internal/operators/expand.d.ts","../node_modules/rxjs/dist/types/internal/operators/filter.d.ts","../node_modules/rxjs/dist/types/internal/operators/finalize.d.ts","../node_modules/rxjs/dist/types/internal/operators/find.d.ts","../node_modules/rxjs/dist/types/internal/operators/findindex.d.ts","../node_modules/rxjs/dist/types/internal/operators/first.d.ts","../node_modules/rxjs/dist/types/internal/subject.d.ts","../node_modules/rxjs/dist/types/internal/operators/groupby.d.ts","../node_modules/rxjs/dist/types/internal/operators/ignoreelements.d.ts","../node_modules/rxjs/dist/types/internal/operators/isempty.d.ts","../node_modules/rxjs/dist/types/internal/operators/last.d.ts","../node_modules/rxjs/dist/types/internal/operators/map.d.ts","../node_modules/rxjs/dist/types/internal/operators/mapto.d.ts","../node_modules/rxjs/dist/types/internal/notification.d.ts","../node_modules/rxjs/dist/types/internal/operators/materialize.d.ts","../node_modules/rxjs/dist/types/internal/operators/max.d.ts","../node_modules/rxjs/dist/types/internal/operators/merge.d.ts","../node_modules/rxjs/dist/types/internal/operators/mergeall.d.ts","../node_modules/rxjs/dist/types/internal/operators/mergemap.d.ts","../node_modules/rxjs/dist/types/internal/operators/flatmap.d.ts","../node_modules/rxjs/dist/types/internal/operators/mergemapto.d.ts","../node_modules/rxjs/dist/types/internal/operators/mergescan.d.ts","../node_modules/rxjs/dist/types/internal/operators/mergewith.d.ts","../node_modules/rxjs/dist/types/internal/operators/min.d.ts","../node_modules/rxjs/dist/types/internal/observable/connectableobservable.d.ts","../node_modules/rxjs/dist/types/internal/operators/multicast.d.ts","../node_modules/rxjs/dist/types/internal/operators/observeon.d.ts","../node_modules/rxjs/dist/types/internal/operators/onerrorresumenextwith.d.ts","../node_modules/rxjs/dist/types/internal/operators/pairwise.d.ts","../node_modules/rxjs/dist/types/internal/operators/partition.d.ts","../node_modules/rxjs/dist/types/internal/operators/pluck.d.ts","../node_modules/rxjs/dist/types/internal/operators/publish.d.ts","../node_modules/rxjs/dist/types/internal/operators/publishbehavior.d.ts","../node_modules/rxjs/dist/types/internal/operators/publishlast.d.ts","../node_modules/rxjs/dist/types/internal/operators/publishreplay.d.ts","../node_modules/rxjs/dist/types/internal/operators/race.d.ts","../node_modules/rxjs/dist/types/internal/operators/racewith.d.ts","../node_modules/rxjs/dist/types/internal/operators/reduce.d.ts","../node_modules/rxjs/dist/types/internal/operators/repeat.d.ts","../node_modules/rxjs/dist/types/internal/operators/repeatwhen.d.ts","../node_modules/rxjs/dist/types/internal/operators/retry.d.ts","../node_modules/rxjs/dist/types/internal/operators/retrywhen.d.ts","../node_modules/rxjs/dist/types/internal/operators/refcount.d.ts","../node_modules/rxjs/dist/types/internal/operators/sample.d.ts","../node_modules/rxjs/dist/types/internal/operators/sampletime.d.ts","../node_modules/rxjs/dist/types/internal/operators/scan.d.ts","../node_modules/rxjs/dist/types/internal/operators/sequenceequal.d.ts","../node_modules/rxjs/dist/types/internal/operators/share.d.ts","../node_modules/rxjs/dist/types/internal/operators/sharereplay.d.ts","../node_modules/rxjs/dist/types/internal/operators/single.d.ts","../node_modules/rxjs/dist/types/internal/operators/skip.d.ts","../node_modules/rxjs/dist/types/internal/operators/skiplast.d.ts","../node_modules/rxjs/dist/types/internal/operators/skipuntil.d.ts","../node_modules/rxjs/dist/types/internal/operators/skipwhile.d.ts","../node_modules/rxjs/dist/types/internal/operators/startwith.d.ts","../node_modules/rxjs/dist/types/internal/operators/subscribeon.d.ts","../node_modules/rxjs/dist/types/internal/operators/switchall.d.ts","../node_modules/rxjs/dist/types/internal/operators/switchmap.d.ts","../node_modules/rxjs/dist/types/internal/operators/switchmapto.d.ts","../node_modules/rxjs/dist/types/internal/operators/switchscan.d.ts","../node_modules/rxjs/dist/types/internal/operators/take.d.ts","../node_modules/rxjs/dist/types/internal/operators/takelast.d.ts","../node_modules/rxjs/dist/types/internal/operators/takeuntil.d.ts","../node_modules/rxjs/dist/types/internal/operators/takewhile.d.ts","../node_modules/rxjs/dist/types/internal/operators/tap.d.ts","../node_modules/rxjs/dist/types/internal/operators/throttle.d.ts","../node_modules/rxjs/dist/types/internal/operators/throttletime.d.ts","../node_modules/rxjs/dist/types/internal/operators/throwifempty.d.ts","../node_modules/rxjs/dist/types/internal/operators/timeinterval.d.ts","../node_modules/rxjs/dist/types/internal/operators/timeout.d.ts","../node_modules/rxjs/dist/types/internal/operators/timeoutwith.d.ts","../node_modules/rxjs/dist/types/internal/operators/timestamp.d.ts","../node_modules/rxjs/dist/types/internal/operators/toarray.d.ts","../node_modules/rxjs/dist/types/internal/operators/window.d.ts","../node_modules/rxjs/dist/types/internal/operators/windowcount.d.ts","../node_modules/rxjs/dist/types/internal/operators/windowtime.d.ts","../node_modules/rxjs/dist/types/internal/operators/windowtoggle.d.ts","../node_modules/rxjs/dist/types/internal/operators/windowwhen.d.ts","../node_modules/rxjs/dist/types/internal/operators/withlatestfrom.d.ts","../node_modules/rxjs/dist/types/internal/operators/zip.d.ts","../node_modules/rxjs/dist/types/internal/operators/zipall.d.ts","../node_modules/rxjs/dist/types/internal/operators/zipwith.d.ts","../node_modules/rxjs/dist/types/operators/index.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/action.d.ts","../node_modules/rxjs/dist/types/internal/scheduler.d.ts","../node_modules/rxjs/dist/types/internal/testing/testmessage.d.ts","../node_modules/rxjs/dist/types/internal/testing/subscriptionlog.d.ts","../node_modules/rxjs/dist/types/internal/testing/subscriptionloggable.d.ts","../node_modules/rxjs/dist/types/internal/testing/coldobservable.d.ts","../node_modules/rxjs/dist/types/internal/testing/hotobservable.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/asyncscheduler.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/timerhandle.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/asyncaction.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/virtualtimescheduler.d.ts","../node_modules/rxjs/dist/types/internal/testing/testscheduler.d.ts","../node_modules/rxjs/dist/types/testing/index.d.ts","../node_modules/rxjs/dist/types/internal/symbol/observable.d.ts","../node_modules/rxjs/dist/types/internal/observable/dom/animationframes.d.ts","../node_modules/rxjs/dist/types/internal/behaviorsubject.d.ts","../node_modules/rxjs/dist/types/internal/replaysubject.d.ts","../node_modules/rxjs/dist/types/internal/asyncsubject.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/asapscheduler.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/asap.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/async.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/queuescheduler.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/queue.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/animationframescheduler.d.ts","../node_modules/rxjs/dist/types/internal/scheduler/animationframe.d.ts","../node_modules/rxjs/dist/types/internal/util/identity.d.ts","../node_modules/rxjs/dist/types/internal/util/pipe.d.ts","../node_modules/rxjs/dist/types/internal/util/noop.d.ts","../node_modules/rxjs/dist/types/internal/util/isobservable.d.ts","../node_modules/rxjs/dist/types/internal/lastvaluefrom.d.ts","../node_modules/rxjs/dist/types/internal/firstvaluefrom.d.ts","../node_modules/rxjs/dist/types/internal/util/argumentoutofrangeerror.d.ts","../node_modules/rxjs/dist/types/internal/util/emptyerror.d.ts","../node_modules/rxjs/dist/types/internal/util/notfounderror.d.ts","../node_modules/rxjs/dist/types/internal/util/objectunsubscribederror.d.ts","../node_modules/rxjs/dist/types/internal/util/sequenceerror.d.ts","../node_modules/rxjs/dist/types/internal/util/unsubscriptionerror.d.ts","../node_modules/rxjs/dist/types/internal/observable/bindcallback.d.ts","../node_modules/rxjs/dist/types/internal/observable/bindnodecallback.d.ts","../node_modules/rxjs/dist/types/internal/anycatcher.d.ts","../node_modules/rxjs/dist/types/internal/observable/combinelatest.d.ts","../node_modules/rxjs/dist/types/internal/observable/concat.d.ts","../node_modules/rxjs/dist/types/internal/observable/connectable.d.ts","../node_modules/rxjs/dist/types/internal/observable/defer.d.ts","../node_modules/rxjs/dist/types/internal/observable/empty.d.ts","../node_modules/rxjs/dist/types/internal/observable/forkjoin.d.ts","../node_modules/rxjs/dist/types/internal/observable/from.d.ts","../node_modules/rxjs/dist/types/internal/observable/fromevent.d.ts","../node_modules/rxjs/dist/types/internal/observable/fromeventpattern.d.ts","../node_modules/rxjs/dist/types/internal/observable/generate.d.ts","../node_modules/rxjs/dist/types/internal/observable/iif.d.ts","../node_modules/rxjs/dist/types/internal/observable/interval.d.ts","../node_modules/rxjs/dist/types/internal/observable/merge.d.ts","../node_modules/rxjs/dist/types/internal/observable/never.d.ts","../node_modules/rxjs/dist/types/internal/observable/of.d.ts","../node_modules/rxjs/dist/types/internal/observable/onerrorresumenext.d.ts","../node_modules/rxjs/dist/types/internal/observable/pairs.d.ts","../node_modules/rxjs/dist/types/internal/observable/partition.d.ts","../node_modules/rxjs/dist/types/internal/observable/race.d.ts","../node_modules/rxjs/dist/types/internal/observable/range.d.ts","../node_modules/rxjs/dist/types/internal/observable/throwerror.d.ts","../node_modules/rxjs/dist/types/internal/observable/timer.d.ts","../node_modules/rxjs/dist/types/internal/observable/using.d.ts","../node_modules/rxjs/dist/types/internal/observable/zip.d.ts","../node_modules/rxjs/dist/types/internal/scheduled/scheduled.d.ts","../node_modules/rxjs/dist/types/internal/config.d.ts","../node_modules/rxjs/dist/types/index.d.ts","../node_modules/@nestjs/common/interfaces/exceptions/rpc-exception-filter.interface.d.ts","../node_modules/@nestjs/common/interfaces/exceptions/ws-exception-filter.interface.d.ts","../node_modules/@nestjs/common/interfaces/external/validation-error.interface.d.ts","../node_modules/@nestjs/common/interfaces/features/execution-context.interface.d.ts","../node_modules/@nestjs/common/interfaces/features/can-activate.interface.d.ts","../node_modules/@nestjs/common/interfaces/features/custom-route-param-factory.interface.d.ts","../node_modules/@nestjs/common/interfaces/features/nest-interceptor.interface.d.ts","../node_modules/@nestjs/common/interfaces/features/paramtype.interface.d.ts","../node_modules/@nestjs/common/interfaces/type.interface.d.ts","../node_modules/@nestjs/common/interfaces/features/pipe-transform.interface.d.ts","../node_modules/@nestjs/common/enums/request-method.enum.d.ts","../node_modules/@nestjs/common/enums/http-status.enum.d.ts","../node_modules/@nestjs/common/enums/shutdown-signal.enum.d.ts","../node_modules/@nestjs/common/enums/version-type.enum.d.ts","../node_modules/@nestjs/common/enums/index.d.ts","../node_modules/@nestjs/common/interfaces/version-options.interface.d.ts","../node_modules/@nestjs/common/interfaces/middleware/middleware-configuration.interface.d.ts","../node_modules/@nestjs/common/interfaces/middleware/middleware-consumer.interface.d.ts","../node_modules/@nestjs/common/interfaces/middleware/middleware-config-proxy.interface.d.ts","../node_modules/@nestjs/common/interfaces/middleware/nest-middleware.interface.d.ts","../node_modules/@nestjs/common/interfaces/middleware/index.d.ts","../node_modules/@nestjs/common/interfaces/global-prefix-options.interface.d.ts","../node_modules/@nestjs/common/interfaces/hooks/before-application-shutdown.interface.d.ts","../node_modules/@nestjs/common/interfaces/hooks/on-application-bootstrap.interface.d.ts","../node_modules/@nestjs/common/interfaces/hooks/on-application-shutdown.interface.d.ts","../node_modules/@nestjs/common/interfaces/hooks/on-destroy.interface.d.ts","../node_modules/@nestjs/common/interfaces/hooks/on-init.interface.d.ts","../node_modules/@nestjs/common/interfaces/hooks/index.d.ts","../node_modules/@nestjs/common/interfaces/http/http-exception-body.interface.d.ts","../node_modules/@nestjs/common/interfaces/http/http-redirect-response.interface.d.ts","../node_modules/@nestjs/common/interfaces/external/cors-options.interface.d.ts","../node_modules/@nestjs/common/interfaces/external/https-options.interface.d.ts","../node_modules/@nestjs/common/services/logger.service.d.ts","../node_modules/@nestjs/common/interfaces/nest-application-context-options.interface.d.ts","../node_modules/@nestjs/common/interfaces/nest-application-options.interface.d.ts","../node_modules/@nestjs/common/interfaces/http/http-server.interface.d.ts","../node_modules/@nestjs/common/interfaces/http/message-event.interface.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/globals.global.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@nestjs/common/interfaces/http/raw-body-request.interface.d.ts","../node_modules/@nestjs/common/interfaces/http/index.d.ts","../node_modules/@nestjs/common/interfaces/injectable.interface.d.ts","../node_modules/@nestjs/common/interfaces/microservices/nest-hybrid-application-options.interface.d.ts","../node_modules/@nestjs/common/interfaces/modules/forward-reference.interface.d.ts","../node_modules/@nestjs/common/interfaces/scope-options.interface.d.ts","../node_modules/@nestjs/common/interfaces/modules/injection-token.interface.d.ts","../node_modules/@nestjs/common/interfaces/modules/optional-factory-dependency.interface.d.ts","../node_modules/@nestjs/common/interfaces/modules/provider.interface.d.ts","../node_modules/@nestjs/common/interfaces/modules/module-metadata.interface.d.ts","../node_modules/@nestjs/common/interfaces/modules/dynamic-module.interface.d.ts","../node_modules/@nestjs/common/interfaces/modules/introspection-result.interface.d.ts","../node_modules/@nestjs/common/interfaces/modules/nest-module.interface.d.ts","../node_modules/@nestjs/common/interfaces/modules/index.d.ts","../node_modules/@nestjs/common/interfaces/nest-application-context.interface.d.ts","../node_modules/@nestjs/common/interfaces/websockets/web-socket-adapter.interface.d.ts","../node_modules/@nestjs/common/interfaces/nest-application.interface.d.ts","../node_modules/@nestjs/common/interfaces/nest-microservice.interface.d.ts","../node_modules/@nestjs/common/interfaces/index.d.ts","../node_modules/@nestjs/common/decorators/core/catch.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/controller.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/dependencies.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/exception-filters.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/inject.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/injectable.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/optional.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/set-metadata.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/use-guards.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/use-interceptors.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/use-pipes.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/apply-decorators.d.ts","../node_modules/@nestjs/common/decorators/core/version.decorator.d.ts","../node_modules/@nestjs/common/decorators/core/index.d.ts","../node_modules/@nestjs/common/decorators/modules/global.decorator.d.ts","../node_modules/@nestjs/common/decorators/modules/module.decorator.d.ts","../node_modules/@nestjs/common/decorators/modules/index.d.ts","../node_modules/@nestjs/common/decorators/http/request-mapping.decorator.d.ts","../node_modules/@nestjs/common/decorators/http/route-params.decorator.d.ts","../node_modules/@nestjs/common/decorators/http/http-code.decorator.d.ts","../node_modules/@nestjs/common/decorators/http/create-route-param-metadata.decorator.d.ts","../node_modules/@nestjs/common/decorators/http/render.decorator.d.ts","../node_modules/@nestjs/common/decorators/http/header.decorator.d.ts","../node_modules/@nestjs/common/decorators/http/redirect.decorator.d.ts","../node_modules/@nestjs/common/decorators/http/sse.decorator.d.ts","../node_modules/@nestjs/common/decorators/http/index.d.ts","../node_modules/@nestjs/common/decorators/index.d.ts","../node_modules/@nestjs/common/exceptions/http.exception.d.ts","../node_modules/@nestjs/common/exceptions/bad-request.exception.d.ts","../node_modules/@nestjs/common/exceptions/unauthorized.exception.d.ts","../node_modules/@nestjs/common/exceptions/method-not-allowed.exception.d.ts","../node_modules/@nestjs/common/exceptions/not-found.exception.d.ts","../node_modules/@nestjs/common/exceptions/forbidden.exception.d.ts","../node_modules/@nestjs/common/exceptions/not-acceptable.exception.d.ts","../node_modules/@nestjs/common/exceptions/request-timeout.exception.d.ts","../node_modules/@nestjs/common/exceptions/conflict.exception.d.ts","../node_modules/@nestjs/common/exceptions/gone.exception.d.ts","../node_modules/@nestjs/common/exceptions/payload-too-large.exception.d.ts","../node_modules/@nestjs/common/exceptions/unsupported-media-type.exception.d.ts","../node_modules/@nestjs/common/exceptions/unprocessable-entity.exception.d.ts","../node_modules/@nestjs/common/exceptions/internal-server-error.exception.d.ts","../node_modules/@nestjs/common/exceptions/not-implemented.exception.d.ts","../node_modules/@nestjs/common/exceptions/http-version-not-supported.exception.d.ts","../node_modules/@nestjs/common/exceptions/bad-gateway.exception.d.ts","../node_modules/@nestjs/common/exceptions/service-unavailable.exception.d.ts","../node_modules/@nestjs/common/exceptions/gateway-timeout.exception.d.ts","../node_modules/@nestjs/common/exceptions/im-a-teapot.exception.d.ts","../node_modules/@nestjs/common/exceptions/precondition-failed.exception.d.ts","../node_modules/@nestjs/common/exceptions/misdirected.exception.d.ts","../node_modules/@nestjs/common/exceptions/index.d.ts","../node_modules/@nestjs/common/file-stream/interfaces/streamable-options.interface.d.ts","../node_modules/@nestjs/common/file-stream/interfaces/streamable-handler-response.interface.d.ts","../node_modules/@nestjs/common/file-stream/interfaces/index.d.ts","../node_modules/@nestjs/common/file-stream/streamable-file.d.ts","../node_modules/@nestjs/common/file-stream/index.d.ts","../node_modules/@nestjs/common/module-utils/constants.d.ts","../node_modules/@nestjs/common/module-utils/interfaces/configurable-module-async-options.interface.d.ts","../node_modules/@nestjs/common/module-utils/interfaces/configurable-module-cls.interface.d.ts","../node_modules/@nestjs/common/module-utils/interfaces/configurable-module-host.interface.d.ts","../node_modules/@nestjs/common/module-utils/interfaces/index.d.ts","../node_modules/@nestjs/common/module-utils/configurable-module.builder.d.ts","../node_modules/@nestjs/common/module-utils/index.d.ts","../node_modules/@nestjs/common/pipes/default-value.pipe.d.ts","../node_modules/@nestjs/common/interfaces/external/class-transform-options.interface.d.ts","../node_modules/@nestjs/common/interfaces/external/transformer-package.interface.d.ts","../node_modules/@nestjs/common/interfaces/external/validator-options.interface.d.ts","../node_modules/@nestjs/common/interfaces/external/validator-package.interface.d.ts","../node_modules/@nestjs/common/utils/http-error-by-code.util.d.ts","../node_modules/@nestjs/common/pipes/validation.pipe.d.ts","../node_modules/@nestjs/common/pipes/parse-array.pipe.d.ts","../node_modules/@nestjs/common/pipes/parse-bool.pipe.d.ts","../node_modules/@nestjs/common/pipes/parse-int.pipe.d.ts","../node_modules/@nestjs/common/pipes/parse-float.pipe.d.ts","../node_modules/@nestjs/common/pipes/parse-enum.pipe.d.ts","../node_modules/@nestjs/common/pipes/parse-uuid.pipe.d.ts","../node_modules/@nestjs/common/pipes/file/interfaces/file.interface.d.ts","../node_modules/@nestjs/common/pipes/file/interfaces/index.d.ts","../node_modules/@nestjs/common/pipes/file/file-validator.interface.d.ts","../node_modules/@nestjs/common/pipes/file/file-type.validator.d.ts","../node_modules/@nestjs/common/pipes/file/max-file-size.validator.d.ts","../node_modules/@nestjs/common/pipes/file/parse-file-options.interface.d.ts","../node_modules/@nestjs/common/pipes/file/parse-file.pipe.d.ts","../node_modules/@nestjs/common/pipes/file/parse-file-pipe.builder.d.ts","../node_modules/@nestjs/common/pipes/file/index.d.ts","../node_modules/@nestjs/common/pipes/index.d.ts","../node_modules/@nestjs/common/serializer/class-serializer.interfaces.d.ts","../node_modules/@nestjs/common/serializer/class-serializer.interceptor.d.ts","../node_modules/@nestjs/common/serializer/decorators/serialize-options.decorator.d.ts","../node_modules/@nestjs/common/serializer/decorators/index.d.ts","../node_modules/@nestjs/common/serializer/index.d.ts","../node_modules/@nestjs/common/services/console-logger.service.d.ts","../node_modules/@nestjs/common/services/index.d.ts","../node_modules/@nestjs/common/utils/forward-ref.util.d.ts","../node_modules/@nestjs/common/utils/index.d.ts","../node_modules/@nestjs/common/index.d.ts","../src/app.service.ts","../node_modules/@hanazuki/node-jsonnet/types/index.d.ts","../node_modules/axios/index.d.ts","../src/lib/openaiendpoint.ts","../node_modules/typeorm/metadata/types/relationtypes.d.ts","../node_modules/typeorm/metadata/types/deferrabletype.d.ts","../node_modules/typeorm/metadata/types/ondeletetype.d.ts","../node_modules/typeorm/metadata/types/onupdatetype.d.ts","../node_modules/typeorm/decorator/options/relationoptions.d.ts","../node_modules/typeorm/metadata/types/propertytypeinfunction.d.ts","../node_modules/typeorm/common/objecttype.d.ts","../node_modules/typeorm/common/entitytarget.d.ts","../node_modules/typeorm/metadata/types/relationtypeinfunction.d.ts","../node_modules/typeorm/metadata-args/relationmetadataargs.d.ts","../node_modules/typeorm/driver/types/columntypes.d.ts","../node_modules/typeorm/decorator/options/valuetransformer.d.ts","../node_modules/typeorm/decorator/options/columncommonoptions.d.ts","../node_modules/typeorm/decorator/options/columnoptions.d.ts","../node_modules/typeorm/metadata-args/types/columnmode.d.ts","../node_modules/typeorm/metadata-args/columnmetadataargs.d.ts","../node_modules/typeorm/common/objectliteral.d.ts","../node_modules/typeorm/schema-builder/options/tablecolumnoptions.d.ts","../node_modules/typeorm/schema-builder/table/tablecolumn.d.ts","../node_modules/typeorm/schema-builder/options/viewoptions.d.ts","../node_modules/typeorm/schema-builder/view/view.d.ts","../node_modules/typeorm/naming-strategy/namingstrategyinterface.d.ts","../node_modules/typeorm/metadata/foreignkeymetadata.d.ts","../node_modules/typeorm/metadata/relationmetadata.d.ts","../node_modules/typeorm/metadata-args/embeddedmetadataargs.d.ts","../node_modules/typeorm/metadata-args/relationidmetadataargs.d.ts","../node_modules/typeorm/metadata/relationidmetadata.d.ts","../node_modules/typeorm/metadata/relationcountmetadata.d.ts","../node_modules/typeorm/metadata/types/eventlistenertypes.d.ts","../node_modules/typeorm/metadata-args/entitylistenermetadataargs.d.ts","../node_modules/typeorm/metadata/entitylistenermetadata.d.ts","../node_modules/typeorm/metadata-args/uniquemetadataargs.d.ts","../node_modules/typeorm/metadata/uniquemetadata.d.ts","../node_modules/typeorm/metadata/embeddedmetadata.d.ts","../node_modules/typeorm/metadata/columnmetadata.d.ts","../node_modules/typeorm/driver/types/ctecapabilities.d.ts","../node_modules/typeorm/driver/types/mappedcolumntypes.d.ts","../node_modules/typeorm/driver/query.d.ts","../node_modules/typeorm/driver/sqlinmemory.d.ts","../node_modules/typeorm/schema-builder/schemabuilder.d.ts","../node_modules/typeorm/driver/types/datatypedefaults.d.ts","../node_modules/typeorm/entity-schema/entityschemaindexoptions.d.ts","../node_modules/typeorm/driver/types/geojsontypes.d.ts","../node_modules/typeorm/decorator/options/spatialcolumnoptions.d.ts","../node_modules/typeorm/entity-schema/entityschemacolumnoptions.d.ts","../node_modules/typeorm/decorator/options/joincolumnoptions.d.ts","../node_modules/typeorm/decorator/options/jointablemultiplecolumnsoptions.d.ts","../node_modules/typeorm/decorator/options/jointableoptions.d.ts","../node_modules/typeorm/entity-schema/entityschemarelationoptions.d.ts","../node_modules/typeorm/find-options/orderbycondition.d.ts","../node_modules/typeorm/metadata/types/tabletypes.d.ts","../node_modules/typeorm/entity-schema/entityschemauniqueoptions.d.ts","../node_modules/typeorm/entity-schema/entityschemacheckoptions.d.ts","../node_modules/typeorm/entity-schema/entityschemaexclusionoptions.d.ts","../node_modules/typeorm/entity-schema/entityschemainheritanceoptions.d.ts","../node_modules/typeorm/entity-schema/entityschemarelationidoptions.d.ts","../node_modules/typeorm/entity-schema/entityschemaoptions.d.ts","../node_modules/typeorm/entity-schema/entityschema.d.ts","../node_modules/typeorm/logger/logger.d.ts","../node_modules/typeorm/logger/loggeroptions.d.ts","../node_modules/typeorm/driver/types/databasetype.d.ts","../node_modules/typeorm/cache/queryresultcacheoptions.d.ts","../node_modules/typeorm/cache/queryresultcache.d.ts","../node_modules/typeorm/common/mixedlist.d.ts","../node_modules/typeorm/data-source/basedatasourceoptions.d.ts","../node_modules/typeorm/driver/types/replicationmode.d.ts","../node_modules/typeorm/schema-builder/options/tableforeignkeyoptions.d.ts","../node_modules/typeorm/schema-builder/table/tableforeignkey.d.ts","../node_modules/typeorm/driver/types/upserttype.d.ts","../node_modules/typeorm/driver/driver.d.ts","../node_modules/typeorm/find-options/joinoptions.d.ts","../node_modules/typeorm/find-options/findoperatortype.d.ts","../node_modules/typeorm/find-options/findoperator.d.ts","../node_modules/typeorm/driver/mongodb/bson.typings.d.ts","../node_modules/typeorm/platform/platformtools.d.ts","../node_modules/typeorm/driver/mongodb/typings.d.ts","../node_modules/typeorm/find-options/equaloperator.d.ts","../node_modules/typeorm/find-options/findoptionswhere.d.ts","../node_modules/typeorm/find-options/findoptionsselect.d.ts","../node_modules/typeorm/find-options/findoptionsrelations.d.ts","../node_modules/typeorm/find-options/findoptionsorder.d.ts","../node_modules/typeorm/find-options/findoneoptions.d.ts","../node_modules/typeorm/find-options/findmanyoptions.d.ts","../node_modules/typeorm/common/deeppartial.d.ts","../node_modules/typeorm/repository/saveoptions.d.ts","../node_modules/typeorm/repository/removeoptions.d.ts","../node_modules/typeorm/find-options/mongodb/mongofindoneoptions.d.ts","../node_modules/typeorm/find-options/mongodb/mongofindmanyoptions.d.ts","../node_modules/typeorm/schema-builder/options/tableuniqueoptions.d.ts","../node_modules/typeorm/schema-builder/table/tableunique.d.ts","../node_modules/typeorm/subscriber/event/transactioncommitevent.d.ts","../node_modules/typeorm/subscriber/event/transactionrollbackevent.d.ts","../node_modules/typeorm/subscriber/event/transactionstartevent.d.ts","../node_modules/typeorm/subscriber/event/updateevent.d.ts","../node_modules/typeorm/subscriber/event/removeevent.d.ts","../node_modules/typeorm/subscriber/event/insertevent.d.ts","../node_modules/typeorm/subscriber/event/loadevent.d.ts","../node_modules/typeorm/subscriber/event/softremoveevent.d.ts","../node_modules/typeorm/subscriber/event/recoverevent.d.ts","../node_modules/typeorm/subscriber/entitysubscriberinterface.d.ts","../node_modules/typeorm/subscriber/broadcasterresult.d.ts","../node_modules/typeorm/subscriber/broadcaster.d.ts","../node_modules/typeorm/schema-builder/options/tablecheckoptions.d.ts","../node_modules/typeorm/metadata-args/checkmetadataargs.d.ts","../node_modules/typeorm/metadata/checkmetadata.d.ts","../node_modules/typeorm/schema-builder/table/tablecheck.d.ts","../node_modules/typeorm/schema-builder/options/tableexclusionoptions.d.ts","../node_modules/typeorm/metadata-args/exclusionmetadataargs.d.ts","../node_modules/typeorm/metadata/exclusionmetadata.d.ts","../node_modules/typeorm/schema-builder/table/tableexclusion.d.ts","../node_modules/typeorm/driver/mongodb/mongoqueryrunner.d.ts","../node_modules/typeorm/query-builder/querypartialentity.d.ts","../node_modules/typeorm/query-runner/queryresult.d.ts","../node_modules/typeorm/query-builder/result/insertresult.d.ts","../node_modules/typeorm/query-builder/result/updateresult.d.ts","../node_modules/typeorm/query-builder/result/deleteresult.d.ts","../node_modules/typeorm/entity-manager/mongoentitymanager.d.ts","../node_modules/typeorm/repository/mongorepository.d.ts","../node_modules/typeorm/find-options/findtreeoptions.d.ts","../node_modules/typeorm/repository/treerepository.d.ts","../node_modules/typeorm/query-builder/transformer/plainobjecttonewentitytransformer.d.ts","../node_modules/typeorm/driver/types/isolationlevel.d.ts","../node_modules/typeorm/query-builder/insertorupdateoptions.d.ts","../node_modules/typeorm/repository/upsertoptions.d.ts","../node_modules/typeorm/common/pickkeysbytype.d.ts","../node_modules/typeorm/entity-manager/entitymanager.d.ts","../node_modules/typeorm/repository/repository.d.ts","../node_modules/typeorm/migration/migrationinterface.d.ts","../node_modules/typeorm/migration/migration.d.ts","../node_modules/typeorm/driver/cockroachdb/cockroachconnectioncredentialsoptions.d.ts","../node_modules/typeorm/driver/cockroachdb/cockroachconnectionoptions.d.ts","../node_modules/typeorm/driver/mysql/mysqlconnectioncredentialsoptions.d.ts","../node_modules/typeorm/driver/mysql/mysqlconnectionoptions.d.ts","../node_modules/typeorm/driver/postgres/postgresconnectioncredentialsoptions.d.ts","../node_modules/typeorm/driver/postgres/postgresconnectionoptions.d.ts","../node_modules/typeorm/driver/sqlite/sqliteconnectionoptions.d.ts","../node_modules/typeorm/driver/sqlserver/authentication/defaultauthentication.d.ts","../node_modules/typeorm/driver/sqlserver/authentication/azureactivedirectoryaccesstokenauthentication.d.ts","../node_modules/typeorm/driver/sqlserver/authentication/azureactivedirectorymsiappserviceauthentication.d.ts","../node_modules/typeorm/driver/sqlserver/authentication/azureactivedirectorymsivmauthentication.d.ts","../node_modules/typeorm/driver/sqlserver/authentication/azureactivedirectorypasswordauthentication.d.ts","../node_modules/typeorm/driver/sqlserver/authentication/azureactivedirectoryserviceprincipalsecret.d.ts","../node_modules/typeorm/driver/sqlserver/authentication/ntlmauthentication.d.ts","../node_modules/typeorm/driver/sqlserver/sqlserverconnectioncredentialsoptions.d.ts","../node_modules/typeorm/driver/sqlserver/sqlserverconnectionoptions.d.ts","../node_modules/typeorm/driver/oracle/oracleconnectioncredentialsoptions.d.ts","../node_modules/typeorm/driver/oracle/oracleconnectionoptions.d.ts","../node_modules/typeorm/driver/mongodb/mongoconnectionoptions.d.ts","../node_modules/typeorm/driver/cordova/cordovaconnectionoptions.d.ts","../node_modules/typeorm/driver/sqljs/sqljsconnectionoptions.d.ts","../node_modules/typeorm/driver/react-native/reactnativeconnectionoptions.d.ts","../node_modules/typeorm/driver/nativescript/nativescriptconnectionoptions.d.ts","../node_modules/typeorm/driver/expo/expoconnectionoptions.d.ts","../node_modules/typeorm/driver/aurora-mysql/auroramysqlconnectioncredentialsoptions.d.ts","../node_modules/typeorm/driver/aurora-mysql/auroramysqlconnectionoptions.d.ts","../node_modules/typeorm/driver/sap/sapconnectioncredentialsoptions.d.ts","../node_modules/typeorm/driver/sap/sapconnectionoptions.d.ts","../node_modules/typeorm/driver/aurora-postgres/aurorapostgresconnectionoptions.d.ts","../node_modules/typeorm/driver/better-sqlite3/bettersqlite3connectionoptions.d.ts","../node_modules/typeorm/driver/capacitor/capacitorconnectionoptions.d.ts","../node_modules/typeorm/connection/baseconnectionoptions.d.ts","../node_modules/typeorm/driver/spanner/spannerconnectioncredentialsoptions.d.ts","../node_modules/typeorm/driver/spanner/spannerconnectionoptions.d.ts","../node_modules/typeorm/data-source/datasourceoptions.d.ts","../node_modules/typeorm/entity-manager/sqljsentitymanager.d.ts","../node_modules/typeorm/query-builder/relationloader.d.ts","../node_modules/typeorm/query-builder/relationidloader.d.ts","../node_modules/typeorm/data-source/datasource.d.ts","../node_modules/typeorm/metadata-args/tablemetadataargs.d.ts","../node_modules/typeorm/metadata/types/treetypes.d.ts","../node_modules/typeorm/metadata/types/closuretreeoptions.d.ts","../node_modules/typeorm/metadata-args/treemetadataargs.d.ts","../node_modules/typeorm/metadata/entitymetadata.d.ts","../node_modules/typeorm/metadata-args/indexmetadataargs.d.ts","../node_modules/typeorm/metadata/indexmetadata.d.ts","../node_modules/typeorm/schema-builder/options/tableindexoptions.d.ts","../node_modules/typeorm/schema-builder/table/tableindex.d.ts","../node_modules/typeorm/schema-builder/options/tableoptions.d.ts","../node_modules/typeorm/schema-builder/table/table.d.ts","../node_modules/typeorm/query-runner/queryrunner.d.ts","../node_modules/typeorm/query-builder/querybuildercte.d.ts","../node_modules/typeorm/query-builder/alias.d.ts","../node_modules/typeorm/query-builder/joinattribute.d.ts","../node_modules/typeorm/query-builder/relation-id/relationidattribute.d.ts","../node_modules/typeorm/query-builder/relation-count/relationcountattribute.d.ts","../node_modules/typeorm/query-builder/selectquery.d.ts","../node_modules/typeorm/query-builder/selectquerybuilderoption.d.ts","../node_modules/typeorm/query-builder/whereclause.d.ts","../node_modules/typeorm/query-builder/queryexpressionmap.d.ts","../node_modules/typeorm/query-builder/brackets.d.ts","../node_modules/typeorm/query-builder/whereexpressionbuilder.d.ts","../node_modules/typeorm/query-builder/updatequerybuilder.d.ts","../node_modules/typeorm/query-builder/deletequerybuilder.d.ts","../node_modules/typeorm/query-builder/softdeletequerybuilder.d.ts","../node_modules/typeorm/query-builder/insertquerybuilder.d.ts","../node_modules/typeorm/query-builder/relationquerybuilder.d.ts","../node_modules/typeorm/query-builder/notbrackets.d.ts","../node_modules/typeorm/query-builder/querybuilder.d.ts","../node_modules/typeorm/query-builder/selectquerybuilder.d.ts","../node_modules/typeorm/metadata-args/relationcountmetadataargs.d.ts","../node_modules/typeorm/metadata-args/namingstrategymetadataargs.d.ts","../node_modules/typeorm/metadata-args/joincolumnmetadataargs.d.ts","../node_modules/typeorm/metadata-args/jointablemetadataargs.d.ts","../node_modules/typeorm/metadata-args/entitysubscribermetadataargs.d.ts","../node_modules/typeorm/metadata-args/inheritancemetadataargs.d.ts","../node_modules/typeorm/metadata-args/discriminatorvaluemetadataargs.d.ts","../node_modules/typeorm/metadata-args/entityrepositorymetadataargs.d.ts","../node_modules/typeorm/metadata-args/transactionentitymetadataargs.d.ts","../node_modules/typeorm/metadata-args/transactionrepositorymetadataargs.d.ts","../node_modules/typeorm/metadata-args/generatedmetadataargs.d.ts","../node_modules/typeorm/metadata-args/metadataargsstorage.d.ts","../node_modules/typeorm/connection/connectionmanager.d.ts","../node_modules/typeorm/globals.d.ts","../node_modules/typeorm/container.d.ts","../node_modules/typeorm/common/relationtype.d.ts","../node_modules/typeorm/error/typeormerror.d.ts","../node_modules/typeorm/error/cannotreflectmethodparametertypeerror.d.ts","../node_modules/typeorm/error/alreadyhasactiveconnectionerror.d.ts","../node_modules/typeorm/persistence/subjectchangemap.d.ts","../node_modules/typeorm/persistence/subject.d.ts","../node_modules/typeorm/error/subjectwithoutidentifiererror.d.ts","../node_modules/typeorm/error/cannotconnectalreadyconnectederror.d.ts","../node_modules/typeorm/error/locknotsupportedongivendrivererror.d.ts","../node_modules/typeorm/error/connectionisnotseterror.d.ts","../node_modules/typeorm/error/cannotcreateentityidmaperror.d.ts","../node_modules/typeorm/error/metadataalreadyexistserror.d.ts","../node_modules/typeorm/error/cannotdetermineentityerror.d.ts","../node_modules/typeorm/error/updatevaluesmissingerror.d.ts","../node_modules/typeorm/error/treerepositorynotsupportederror.d.ts","../node_modules/typeorm/error/customrepositorynotfounderror.d.ts","../node_modules/typeorm/error/transactionnotstartederror.d.ts","../node_modules/typeorm/error/transactionalreadystartederror.d.ts","../node_modules/typeorm/error/entitynotfounderror.d.ts","../node_modules/typeorm/error/entitymetadatanotfounderror.d.ts","../node_modules/typeorm/error/mustbeentityerror.d.ts","../node_modules/typeorm/error/optimisticlockversionmismatcherror.d.ts","../node_modules/typeorm/error/limitonupdatenotsupportederror.d.ts","../node_modules/typeorm/error/primarycolumncannotbenullableerror.d.ts","../node_modules/typeorm/error/customrepositorycannotinheritrepositoryerror.d.ts","../node_modules/typeorm/error/queryrunnerprovideralreadyreleasederror.d.ts","../node_modules/typeorm/error/cannotattachtreechildrenentityerror.d.ts","../node_modules/typeorm/error/customrepositorydoesnothaveentityerror.d.ts","../node_modules/typeorm/error/missingdeletedatecolumnerror.d.ts","../node_modules/typeorm/error/noconnectionforrepositoryerror.d.ts","../node_modules/typeorm/error/circularrelationserror.d.ts","../node_modules/typeorm/error/returningstatementnotsupportederror.d.ts","../node_modules/typeorm/error/usingjointableisnotallowederror.d.ts","../node_modules/typeorm/error/missingjoincolumnerror.d.ts","../node_modules/typeorm/error/missingprimarycolumnerror.d.ts","../node_modules/typeorm/error/entitypropertynotfounderror.d.ts","../node_modules/typeorm/error/missingdrivererror.d.ts","../node_modules/typeorm/error/driverpackagenotinstallederror.d.ts","../node_modules/typeorm/error/cannotgetentitymanagernotconnectederror.d.ts","../node_modules/typeorm/error/connectionnotfounderror.d.ts","../node_modules/typeorm/error/noversionorupdatedatecolumnerror.d.ts","../node_modules/typeorm/error/insertvaluesmissingerror.d.ts","../node_modules/typeorm/error/optimisticlockcannotbeusederror.d.ts","../node_modules/typeorm/error/metadatawithsuchnamealreadyexistserror.d.ts","../node_modules/typeorm/error/driveroptionnotseterror.d.ts","../node_modules/typeorm/error/findrelationsnotfounderror.d.ts","../node_modules/typeorm/error/namingstrategynotfounderror.d.ts","../node_modules/typeorm/error/pessimisticlocktransactionrequirederror.d.ts","../node_modules/typeorm/error/repositorynottreeerror.d.ts","../node_modules/typeorm/error/datatypenotsupportederror.d.ts","../node_modules/typeorm/error/initializedrelationerror.d.ts","../node_modules/typeorm/error/missingjointableerror.d.ts","../node_modules/typeorm/error/queryfailederror.d.ts","../node_modules/typeorm/error/noneedtoreleaseentitymanagererror.d.ts","../node_modules/typeorm/error/usingjoincolumnonlyononesideallowederror.d.ts","../node_modules/typeorm/error/usingjointableonlyononesideallowederror.d.ts","../node_modules/typeorm/error/subjectremovedandupdatederror.d.ts","../node_modules/typeorm/error/persistedentitynotfounderror.d.ts","../node_modules/typeorm/error/usingjoincolumnisnotallowederror.d.ts","../node_modules/typeorm/error/columntypeundefinederror.d.ts","../node_modules/typeorm/error/queryrunneralreadyreleasederror.d.ts","../node_modules/typeorm/error/offsetwithoutlimitnotsupportederror.d.ts","../node_modules/typeorm/error/cannotexecutenotconnectederror.d.ts","../node_modules/typeorm/error/noconnectionoptionerror.d.ts","../node_modules/typeorm/error/forbiddentransactionmodeoverrideerror.d.ts","../node_modules/typeorm/error/index.d.ts","../node_modules/typeorm/decorator/options/columnwithlengthoptions.d.ts","../node_modules/typeorm/decorator/options/columnnumericoptions.d.ts","../node_modules/typeorm/decorator/options/columnenumoptions.d.ts","../node_modules/typeorm/decorator/options/columnembeddedoptions.d.ts","../node_modules/typeorm/decorator/options/columnhstoreoptions.d.ts","../node_modules/typeorm/decorator/options/columnwithwidthoptions.d.ts","../node_modules/typeorm/decorator/columns/column.d.ts","../node_modules/typeorm/decorator/columns/createdatecolumn.d.ts","../node_modules/typeorm/decorator/columns/deletedatecolumn.d.ts","../node_modules/typeorm/decorator/options/primarygeneratedcolumnnumericoptions.d.ts","../node_modules/typeorm/decorator/options/primarygeneratedcolumnuuidoptions.d.ts","../node_modules/typeorm/decorator/options/primarygeneratedcolumnidentityoptions.d.ts","../node_modules/typeorm/decorator/columns/primarygeneratedcolumn.d.ts","../node_modules/typeorm/decorator/columns/primarycolumn.d.ts","../node_modules/typeorm/decorator/columns/updatedatecolumn.d.ts","../node_modules/typeorm/decorator/columns/versioncolumn.d.ts","../node_modules/typeorm/decorator/options/virtualcolumnoptions.d.ts","../node_modules/typeorm/decorator/columns/virtualcolumn.d.ts","../node_modules/typeorm/decorator/options/viewcolumnoptions.d.ts","../node_modules/typeorm/decorator/columns/viewcolumn.d.ts","../node_modules/typeorm/decorator/columns/objectidcolumn.d.ts","../node_modules/typeorm/decorator/listeners/afterinsert.d.ts","../node_modules/typeorm/decorator/listeners/afterload.d.ts","../node_modules/typeorm/decorator/listeners/afterremove.d.ts","../node_modules/typeorm/decorator/listeners/aftersoftremove.d.ts","../node_modules/typeorm/decorator/listeners/afterrecover.d.ts","../node_modules/typeorm/decorator/listeners/afterupdate.d.ts","../node_modules/typeorm/decorator/listeners/beforeinsert.d.ts","../node_modules/typeorm/decorator/listeners/beforeremove.d.ts","../node_modules/typeorm/decorator/listeners/beforesoftremove.d.ts","../node_modules/typeorm/decorator/listeners/beforerecover.d.ts","../node_modules/typeorm/decorator/listeners/beforeupdate.d.ts","../node_modules/typeorm/decorator/listeners/eventsubscriber.d.ts","../node_modules/typeorm/decorator/options/indexoptions.d.ts","../node_modules/typeorm/decorator/options/entityoptions.d.ts","../node_modules/typeorm/decorator/relations/joincolumn.d.ts","../node_modules/typeorm/decorator/relations/jointable.d.ts","../node_modules/typeorm/decorator/relations/manytomany.d.ts","../node_modules/typeorm/decorator/relations/manytoone.d.ts","../node_modules/typeorm/decorator/relations/onetomany.d.ts","../node_modules/typeorm/decorator/relations/onetoone.d.ts","../node_modules/typeorm/decorator/relations/relationcount.d.ts","../node_modules/typeorm/decorator/relations/relationid.d.ts","../node_modules/typeorm/decorator/entity/entity.d.ts","../node_modules/typeorm/decorator/entity/childentity.d.ts","../node_modules/typeorm/decorator/entity/tableinheritance.d.ts","../node_modules/typeorm/decorator/options/viewentityoptions.d.ts","../node_modules/typeorm/decorator/entity-view/viewentity.d.ts","../node_modules/typeorm/decorator/tree/treelevelcolumn.d.ts","../node_modules/typeorm/decorator/tree/treeparent.d.ts","../node_modules/typeorm/decorator/tree/treechildren.d.ts","../node_modules/typeorm/decorator/tree/tree.d.ts","../node_modules/typeorm/decorator/index.d.ts","../node_modules/typeorm/decorator/options/uniqueoptions.d.ts","../node_modules/typeorm/decorator/unique.d.ts","../node_modules/typeorm/decorator/check.d.ts","../node_modules/typeorm/decorator/exclusion.d.ts","../node_modules/typeorm/decorator/generated.d.ts","../node_modules/typeorm/decorator/entityrepository.d.ts","../node_modules/typeorm/find-options/operator/and.d.ts","../node_modules/typeorm/find-options/operator/any.d.ts","../node_modules/typeorm/find-options/operator/arraycontainedby.d.ts","../node_modules/typeorm/find-options/operator/arraycontains.d.ts","../node_modules/typeorm/find-options/operator/arrayoverlap.d.ts","../node_modules/typeorm/find-options/operator/between.d.ts","../node_modules/typeorm/find-options/operator/equal.d.ts","../node_modules/typeorm/find-options/operator/in.d.ts","../node_modules/typeorm/find-options/operator/isnull.d.ts","../node_modules/typeorm/find-options/operator/lessthan.d.ts","../node_modules/typeorm/find-options/operator/lessthanorequal.d.ts","../node_modules/typeorm/find-options/operator/ilike.d.ts","../node_modules/typeorm/find-options/operator/like.d.ts","../node_modules/typeorm/find-options/operator/morethan.d.ts","../node_modules/typeorm/find-options/operator/morethanorequal.d.ts","../node_modules/typeorm/find-options/operator/not.d.ts","../node_modules/typeorm/find-options/operator/raw.d.ts","../node_modules/typeorm/find-options/operator/jsoncontains.d.ts","../node_modules/typeorm/find-options/findoptionsutils.d.ts","../node_modules/typeorm/logger/abstractlogger.d.ts","../node_modules/typeorm/logger/advancedconsolelogger.d.ts","../node_modules/typeorm/logger/simpleconsolelogger.d.ts","../node_modules/typeorm/logger/filelogger.d.ts","../node_modules/typeorm/repository/abstractrepository.d.ts","../node_modules/typeorm/data-source/index.d.ts","../node_modules/typeorm/repository/baseentity.d.ts","../node_modules/typeorm/driver/sqlserver/mssqlparameter.d.ts","../node_modules/typeorm/connection/connectionoptionsreader.d.ts","../node_modules/typeorm/connection/connectionoptions.d.ts","../node_modules/typeorm/connection/connection.d.ts","../node_modules/typeorm/migration/migrationexecutor.d.ts","../node_modules/typeorm/naming-strategy/defaultnamingstrategy.d.ts","../node_modules/typeorm/naming-strategy/legacyoraclenamingstrategy.d.ts","../node_modules/typeorm/entity-schema/entityschemaembeddedcolumnoptions.d.ts","../node_modules/typeorm/schema-builder/rdbmsschemabuilder.d.ts","../node_modules/typeorm/util/instancechecker.d.ts","../node_modules/typeorm/repository/findtreesoptions.d.ts","../node_modules/typeorm/util/treerepositoryutils.d.ts","../node_modules/typeorm/index.d.ts","../src/lib/postgresclient.ts","../src/types/arkrequest.ts","../src/hydeexample/hydeexample.ts","../src/testgeneration/testgenerator.ts","../src/app.controller.ts","../src/app.module.ts","../package.json","../typings/index.d.ts","../src/config.ts","../node_modules/@nestjs/core/adapters/http-adapter.d.ts","../node_modules/@nestjs/core/adapters/index.d.ts","../node_modules/@nestjs/common/constants.d.ts","../node_modules/@nestjs/core/inspector/interfaces/edge.interface.d.ts","../node_modules/@nestjs/core/inspector/interfaces/entrypoint.interface.d.ts","../node_modules/@nestjs/core/inspector/interfaces/extras.interface.d.ts","../node_modules/@nestjs/core/inspector/interfaces/node.interface.d.ts","../node_modules/@nestjs/core/injector/settlement-signal.d.ts","../node_modules/@nestjs/core/injector/injector.d.ts","../node_modules/@nestjs/core/inspector/interfaces/serialized-graph-metadata.interface.d.ts","../node_modules/@nestjs/core/inspector/interfaces/serialized-graph-json.interface.d.ts","../node_modules/@nestjs/core/inspector/serialized-graph.d.ts","../node_modules/@nestjs/core/injector/module-token-factory.d.ts","../node_modules/@nestjs/core/injector/compiler.d.ts","../node_modules/@nestjs/core/injector/modules-container.d.ts","../node_modules/@nestjs/core/injector/container.d.ts","../node_modules/@nestjs/core/injector/instance-links-host.d.ts","../node_modules/@nestjs/core/injector/abstract-instance-resolver.d.ts","../node_modules/@nestjs/core/injector/module-ref.d.ts","../node_modules/@nestjs/core/injector/module.d.ts","../node_modules/@nestjs/core/injector/instance-wrapper.d.ts","../node_modules/@nestjs/core/router/interfaces/exclude-route-metadata.interface.d.ts","../node_modules/@nestjs/core/application-config.d.ts","../node_modules/@nestjs/core/constants.d.ts","../node_modules/@nestjs/core/discovery/discovery-module.d.ts","../node_modules/@nestjs/core/discovery/discovery-service.d.ts","../node_modules/@nestjs/core/discovery/index.d.ts","../node_modules/@nestjs/core/helpers/http-adapter-host.d.ts","../node_modules/@nestjs/core/exceptions/base-exception-filter.d.ts","../node_modules/@nestjs/core/exceptions/index.d.ts","../node_modules/@nestjs/core/helpers/context-id-factory.d.ts","../node_modules/@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface.d.ts","../node_modules/@nestjs/core/exceptions/exceptions-handler.d.ts","../node_modules/@nestjs/core/router/router-proxy.d.ts","../node_modules/@nestjs/core/helpers/context-creator.d.ts","../node_modules/@nestjs/core/exceptions/base-exception-filter-context.d.ts","../node_modules/@nestjs/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.d.ts","../node_modules/@nestjs/common/interfaces/exceptions/index.d.ts","../node_modules/@nestjs/core/exceptions/external-exception-filter.d.ts","../node_modules/@nestjs/core/exceptions/external-exceptions-handler.d.ts","../node_modules/@nestjs/core/exceptions/external-exception-filter-context.d.ts","../node_modules/@nestjs/core/guards/constants.d.ts","../node_modules/@nestjs/core/helpers/execution-context-host.d.ts","../node_modules/@nestjs/core/guards/guards-consumer.d.ts","../node_modules/@nestjs/core/guards/guards-context-creator.d.ts","../node_modules/@nestjs/core/guards/index.d.ts","../node_modules/@nestjs/core/interceptors/interceptors-consumer.d.ts","../node_modules/@nestjs/core/interceptors/interceptors-context-creator.d.ts","../node_modules/@nestjs/core/interceptors/index.d.ts","../node_modules/@nestjs/common/enums/route-paramtypes.enum.d.ts","../node_modules/@nestjs/core/pipes/params-token-factory.d.ts","../node_modules/@nestjs/core/pipes/pipes-consumer.d.ts","../node_modules/@nestjs/core/pipes/pipes-context-creator.d.ts","../node_modules/@nestjs/core/pipes/index.d.ts","../node_modules/@nestjs/core/helpers/context-utils.d.ts","../node_modules/@nestjs/core/injector/inquirer/inquirer-constants.d.ts","../node_modules/@nestjs/core/injector/inquirer/index.d.ts","../node_modules/@nestjs/core/interfaces/module-definition.interface.d.ts","../node_modules/@nestjs/core/interfaces/module-override.interface.d.ts","../node_modules/@nestjs/core/inspector/interfaces/enhancer-metadata-cache-entry.interface.d.ts","../node_modules/@nestjs/core/inspector/graph-inspector.d.ts","../node_modules/@nestjs/core/metadata-scanner.d.ts","../node_modules/@nestjs/core/scanner.d.ts","../node_modules/@nestjs/core/injector/instance-loader.d.ts","../node_modules/@nestjs/core/injector/lazy-module-loader/lazy-module-loader-options.interface.d.ts","../node_modules/@nestjs/core/injector/lazy-module-loader/lazy-module-loader.d.ts","../node_modules/@nestjs/core/injector/index.d.ts","../node_modules/@nestjs/core/helpers/interfaces/external-handler-metadata.interface.d.ts","../node_modules/@nestjs/core/helpers/interfaces/params-metadata.interface.d.ts","../node_modules/@nestjs/core/helpers/external-context-creator.d.ts","../node_modules/@nestjs/core/helpers/index.d.ts","../node_modules/@nestjs/core/inspector/initialize-on-preview.allowlist.d.ts","../node_modules/@nestjs/core/inspector/partial-graph.host.d.ts","../node_modules/@nestjs/core/inspector/index.d.ts","../node_modules/@nestjs/core/middleware/route-info-path-extractor.d.ts","../node_modules/@nestjs/core/middleware/routes-mapper.d.ts","../node_modules/@nestjs/core/middleware/builder.d.ts","../node_modules/@nestjs/core/middleware/index.d.ts","../node_modules/@nestjs/core/nest-application-context.d.ts","../node_modules/@nestjs/core/nest-application.d.ts","../node_modules/@nestjs/common/interfaces/microservices/nest-microservice-options.interface.d.ts","../node_modules/@nestjs/core/nest-factory.d.ts","../node_modules/@nestjs/core/repl/repl.d.ts","../node_modules/@nestjs/core/repl/index.d.ts","../node_modules/@nestjs/core/router/interfaces/routes.interface.d.ts","../node_modules/@nestjs/core/router/interfaces/index.d.ts","../node_modules/@nestjs/core/router/request/request-constants.d.ts","../node_modules/@nestjs/core/router/request/index.d.ts","../node_modules/@nestjs/core/router/router-module.d.ts","../node_modules/@nestjs/core/router/index.d.ts","../node_modules/@nestjs/core/services/reflector.service.d.ts","../node_modules/@nestjs/core/services/index.d.ts","../node_modules/@nestjs/core/index.d.ts","../src/main.ts","../node_modules/@babel/types/lib/index.d.ts","../node_modules/@types/babel__generator/index.d.ts","../node_modules/@babel/parser/typings/babel-parser.d.ts","../node_modules/@types/babel__template/index.d.ts","../node_modules/@types/babel__traverse/index.d.ts","../node_modules/@types/babel__core/index.d.ts","../node_modules/@types/connect/index.d.ts","../node_modules/@types/body-parser/index.d.ts","../node_modules/@types/cookiejar/index.d.ts","../node_modules/@types/eslint/helpers.d.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/eslint/index.d.ts","../node_modules/@types/eslint-scope/index.d.ts","../node_modules/@types/mime/index.d.ts","../node_modules/@types/send/index.d.ts","../node_modules/@types/range-parser/index.d.ts","../node_modules/@types/qs/index.d.ts","../node_modules/@types/express-serve-static-core/index.d.ts","../node_modules/@types/http-errors/index.d.ts","../node_modules/@types/serve-static/index.d.ts","../node_modules/@types/express/index.d.ts","../node_modules/@types/graceful-fs/index.d.ts","../node_modules/@types/istanbul-lib-coverage/index.d.ts","../node_modules/@types/istanbul-lib-report/index.d.ts","../node_modules/@types/istanbul-reports/index.d.ts","../node_modules/@jest/expect-utils/build/index.d.ts","../node_modules/chalk/index.d.ts","../node_modules/@sinclair/typebox/typebox.d.ts","../node_modules/@jest/schemas/build/index.d.ts","../node_modules/pretty-format/build/index.d.ts","../node_modules/jest-diff/build/index.d.ts","../node_modules/jest-matcher-utils/build/index.d.ts","../node_modules/expect/build/index.d.ts","../node_modules/@types/jest/index.d.ts","../node_modules/@types/parse-json/index.d.ts","../node_modules/@types/semver/classes/semver.d.ts","../node_modules/@types/semver/functions/parse.d.ts","../node_modules/@types/semver/functions/valid.d.ts","../node_modules/@types/semver/functions/clean.d.ts","../node_modules/@types/semver/functions/inc.d.ts","../node_modules/@types/semver/functions/diff.d.ts","../node_modules/@types/semver/functions/major.d.ts","../node_modules/@types/semver/functions/minor.d.ts","../node_modules/@types/semver/functions/patch.d.ts","../node_modules/@types/semver/functions/prerelease.d.ts","../node_modules/@types/semver/functions/compare.d.ts","../node_modules/@types/semver/functions/rcompare.d.ts","../node_modules/@types/semver/functions/compare-loose.d.ts","../node_modules/@types/semver/functions/compare-build.d.ts","../node_modules/@types/semver/functions/sort.d.ts","../node_modules/@types/semver/functions/rsort.d.ts","../node_modules/@types/semver/functions/gt.d.ts","../node_modules/@types/semver/functions/lt.d.ts","../node_modules/@types/semver/functions/eq.d.ts","../node_modules/@types/semver/functions/neq.d.ts","../node_modules/@types/semver/functions/gte.d.ts","../node_modules/@types/semver/functions/lte.d.ts","../node_modules/@types/semver/functions/cmp.d.ts","../node_modules/@types/semver/functions/coerce.d.ts","../node_modules/@types/semver/classes/comparator.d.ts","../node_modules/@types/semver/classes/range.d.ts","../node_modules/@types/semver/functions/satisfies.d.ts","../node_modules/@types/semver/ranges/max-satisfying.d.ts","../node_modules/@types/semver/ranges/min-satisfying.d.ts","../node_modules/@types/semver/ranges/to-comparators.d.ts","../node_modules/@types/semver/ranges/min-version.d.ts","../node_modules/@types/semver/ranges/valid.d.ts","../node_modules/@types/semver/ranges/outside.d.ts","../node_modules/@types/semver/ranges/gtr.d.ts","../node_modules/@types/semver/ranges/ltr.d.ts","../node_modules/@types/semver/ranges/intersects.d.ts","../node_modules/@types/semver/ranges/simplify.d.ts","../node_modules/@types/semver/ranges/subset.d.ts","../node_modules/@types/semver/internals/identifiers.d.ts","../node_modules/@types/semver/index.d.ts","../node_modules/@types/stack-utils/index.d.ts","../node_modules/buffer/index.d.ts","../node_modules/@types/superagent/index.d.ts","../node_modules/@types/supertest/index.d.ts","../node_modules/@types/yargs-parser/index.d.ts","../node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"2ac9cdcfb8f8875c18d14ec5796a8b029c426f73ad6dc3ffb580c228b58d1c44","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569",{"version":"0075fa5ceda385bcdf3488e37786b5a33be730e8bc4aa3cf1e78c63891752ce8","affectsGlobalScope":true},{"version":"35299ae4a62086698444a5aaee27fc7aa377c68cbb90b441c9ace246ffd05c97","affectsGlobalScope":true},{"version":"c5c5565225fce2ede835725a92a28ece149f83542aa4866cfb10290bff7b8996","affectsGlobalScope":true},{"version":"7d2dbc2a0250400af0809b0ad5f84686e84c73526de931f84560e483eb16b03c","affectsGlobalScope":true},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"09226e53d1cfda217317074a97724da3e71e2c545e18774484b61562afc53cd2","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"8b41361862022eb72fcc8a7f34680ac842aca802cf4bc1f915e8c620c9ce4331","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"709efdae0cb5df5f49376cde61daacc95cdd44ae4671da13a540da5088bf3f30","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"bc496ef4377553e461efcf7cc5a5a57cf59f9962aea06b5e722d54a36bf66ea1","affectsGlobalScope":true},{"version":"038a2f66a34ee7a9c2fbc3584c8ab43dff2995f8c68e3f566f4c300d2175e31e","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"f35a831e4f0fe3b3697f4a0fe0e3caa7624c92b78afbecaf142c0f93abfaf379","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"c1e8d979afc15d66e2bd5a58c732d5a2ba3ccaae41ac7d5a2c539e6de66a8e51",{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true},"6d8dedbec739bc79642c1e96e9bfc0b83b25b104a0486aebf016fc7b85b39f48","e89535c3ec439608bcd0f68af555d0e5ddf121c54abe69343549718bd7506b9c","622a984b60c294ffb2f9152cf1d4d12e91d2b733d820eec949cf54d63a3c1025","81aae92abdeaccd9c1723cef39232c90c1aed9d9cf199e6e2a523b7d8e058a11","a63a6c6806a1e519688ef7bd8ca57be912fc0764485119dbd923021eb4e79665","75b57b109d774acca1e151df21cf5cb54c7a1df33a273f0457b9aee4ebd36fb9","ecf5cb089ea438f2545e04b6c52828c68d0b0f4bfaa661986faf36da273e9892","95444fb6292d5e2f7050d7021383b719c0252bf5f88854973977db9e3e3d8006","241bd4add06f06f0699dcd58f3b334718d85e3045d9e9d4fa556f11f4d1569c1","06540a9f3f2f88375ada0b89712de1c4310f7398d821c4c10ab5c6477dafb4bc",{"version":"de2d3120ed0989dbc776de71e6c0e8a6b4bf1935760cf468ff9d0e9986ef4c09","affectsGlobalScope":true},"b8bff8a60af0173430b18d9c3e5c443eaa3c515617210c0c7b3d2e1743c19ecb","97bdf234f5db52085d99c6842db560bca133f8a0413ff76bf830f5f38f088ce3","a76ebdf2579e68e4cfe618269c47e5a12a4e045c2805ed7f7ab37af8daa6b091","b493ff8a5175cbbb4e6e8bcfa9506c08f5a7318b2278365cfca3b397c9710ebc","e59d36b7b6e8ba2dd36d032a5f5c279d2460968c8b4e691ca384f118fb09b52a","e96885c0684c9042ec72a9a43ef977f6b4b4a2728f4b9e737edcbaa0c74e5bf6","303ee143a869e8f605e7b1d12be6c7269d4cab90d230caba792495be595d4f56","89e061244da3fc21b7330f4bd32f47c1813dd4d7f1dc3d0883d88943f035b993","e46558c2e04d06207b080138678020448e7fc201f3d69c2601b0d1456105f29a","71549375db52b1163411dba383b5f4618bdf35dc57fa327a1c7d135cf9bf67d1","7e6b2d61d6215a4e82ea75bc31a80ebb8ad0c2b37a60c10c70dd671e8d9d6d5d","78bea05df2896083cca28ed75784dde46d4b194984e8fc559123b56873580a23","5dd04ced37b7ea09f29d277db11f160df7fd73ba8b9dba86cb25552e0653a637","f74b81712e06605677ae1f061600201c425430151f95b5ef4d04387ad7617e6a","9a72847fcf4ac937e352d40810f7b7aec7422d9178451148296cf1aa19467620","3ae18f60e0b96fa1e025059b7d25b3247ba4dcb5f4372f6d6e67ce2adac74eac","2b9260f44a2e071450ae82c110f5dc8f330c9e5c3e85567ed97248330f2bf639","4f196e13684186bda6f5115fc4677a87cf84a0c9c4fc17b8f51e0984f3697b6d","61419f2c5822b28c1ea483258437c1faab87d00c6f84481aa22afb3380d8e9a4","64479aee03812264e421c0bf5104a953ca7b02740ba80090aead1330d0effe91","a5eb4835ab561c140ffc4634bb039387d5d0cceebb86918f1696c7ac156d26fd","c5570e504be103e255d80c60b56c367bf45d502ca52ee35c55dec882f6563b5c","4252b852dd791305da39f6e1242694c2e560d5e46f9bb26e2aca77252057c026","0520b5093712c10c6ef23b5fea2f833bf5481771977112500045e5ea7e8e2b69","5c3cf26654cf762ac4d7fd7b83f09acfe08eef88d2d6983b9a5a423cb4004ca3","e60fa19cf7911c1623b891155d7eb6b7e844e9afdf5738e3b46f3b687730a2bd","b1fd72ff2bb0ba91bb588f3e5329f8fc884eb859794f1c4657a2bfa122ae54d0","6cf42a4f3cfec648545925d43afaa8bb364ac10a839ffed88249da109361b275","ba13c7d46a560f3d4df8ffb1110e2bbec5801449af3b1240a718514b5576156e","6df52b70d7f7702202f672541a5f4a424d478ee5be51a9d37b8ccbe1dbf3c0f2","0ca7f997e9a4d8985e842b7c882e521b6f63233c4086e9fe79dd7a9dc4742b5e","91046b5c6b55d3b194c81fd4df52f687736fad3095e9d103ead92bb64dc160ee","db5704fdad56c74dfc5941283c1182ed471bd17598209d3ac4a49faa72e43cfc","758e8e89559b02b81bc0f8fd395b17ad5aff75490c862cbe369bb1a3d1577c40","2ee64342c077b1868f1834c063f575063051edd6e2964257d34aad032d6b657c","6f6b4b3d670b6a5f0e24ea001c1b3d36453c539195e875687950a178f1730fa7","05c4e2a992bb83066a3a648bad1c310cecd4d0628d7e19545bb107ac9596103a","b48b83a86dd9cfe36f8776b3ff52fcd45b0e043c0538dc4a4b149ba45fe367b9","792de5c062444bd2ee0413fb766e57e03cce7cdaebbfc52fc0c7c8e95069c96b","a79e3e81094c7a04a885bad9b049c519aace53300fb8a0fe4f26727cb5a746ce","dd6c3362aaaec60be028b4ba292806da8e7020eef7255c7414ce4a5c3a7138ef","8a4e89564d8ea66ad87ee3762e07540f9f0656a62043c910d819b4746fc429c5","b9011d99942889a0f95e120d06b698c628b0b6fdc3e6b7ecb459b97ed7d5bcc6","4d639cbbcc2f8f9ce6d55d5d503830d6c2556251df332dc5255d75af53c8a0e7","cdb48277f600ab5f429ecf1c5ea046683bc6b9f73f3deab9a100adac4b34969c","75be84956a29040a1afbe864c0a7a369dfdb739380072484eff153905ef867ee","b06b4adc2ae03331a92abd1b19af8eb91ec2bf8541747ee355887a167d53145e","3114b315cd0687aad8b57cff36f9c8c51f5b1bc6254f1b1e8446ae583d8e2474","0d417c15c5c635384d5f1819cc253a540fe786cc3fda32f6a2ae266671506a21","af733cb878419f3012f0d4df36f918a69ba38d73f3232ba1ab46ef9ede6cb29c","cb59317243a11379a101eb2f27b9df1022674c3df1df0727360a0a3f963f523b","0a01b0b5a9e87d04737084731212106add30f63ec640169f1462ba2e44b6b3a8","06b8a7d46195b6b3980e523ef59746702fd210b71681a83a5cf73799623621f9","860e4405959f646c101b8005a191298b2381af8f33716dc5f42097e4620608f8","f7e32adf714b8f25d3c1783473abec3f2e82d5724538d8dcf6f51baaaff1ca7a","e07d62a8a9a3bb65433a62e9bbf400c6bfd2df4de60652af4d738303ee3670a1","bfbf80f9cd4558af2d7b2006065340aaaced15947d590045253ded50aabb9bc5","851e8d57d6dd17c71e9fa0319abd20ab2feb3fb674d0801611a09b7a25fd281c","c3bd2b94e4298f81743d92945b80e9b56c1cdfb2bef43c149b7106a2491b1fc9","a246cce57f558f9ebaffd55c1e5673da44ea603b4da3b2b47eb88915d30a9181","d993eacc103c5a065227153c9aae8acea3a4322fe1a169ee7c70b77015bf0bb2","fc2b03d0c042aa1627406e753a26a1eaad01b3c496510a78016822ef8d456bb6","063c7ebbe756f0155a8b453f410ca6b76ffa1bbc1048735bcaf9c7c81a1ce35f","748e79252a7f476f8f28923612d7696b214e270cc909bc685afefaac8f052af0","9669075ac38ce36b638b290ba468233980d9f38bdc62f0519213b2fd3e2552ec","4d123de012c24e2f373925100be73d50517ac490f9ed3578ac82d0168bfbd303","656c9af789629aa36b39092bee3757034009620439d9a39912f587538033ce28","3ac3f4bdb8c0905d4c3035d6f7fb20118c21e8a17bee46d3735195b0c2a9f39f","1f453e6798ed29c86f703e9b41662640d4f2e61337007f27ac1c616f20093f69","af43b7871ff21c62bf1a54ec5c488e31a8d3408d5b51ff2e9f8581b6c55f2fc7","70550511d25cbb0b6a64dcac7fffc3c1397fd4cbeb6b23ccc7f9b794ab8a6954","af0fbf08386603a62f2a78c42d998c90353b1f1d22e05a384545f7accf881e0a","c3f32a185cd27ac232d3428a8d9b362c3f7b4892a58adaaa022828a7dcd13eed","3139c3e5e09251feec7a87f457084bee383717f3626a7f1459d053db2f34eb76","4888fd2bcfee9a0ce89d0df860d233e0cee8ee9c479b6bd5a5d5f9aae98342fe","3be870c8e17ec14f1c18fc248f5d2c4669e576404744ff5c63e6dafcf05b97ea","56654d2c5923598384e71cb808fac2818ca3f07dd23bb018988a39d5e64f268b","8b6719d3b9e65863da5390cb26994602c10a315aa16e7d70778a63fee6c4c079","6ab380571d87bd1d6f644fb6ab7837239d54b59f07dc84347b1341f866194214","547d3c406a21b30e2b78629ecc0b2ddaf652d9e0bdb2d59ceebce5612906df33","b3a4f9385279443c3a5568ec914a9492b59a723386161fd5ef0619d9f8982f97","3fe66aba4fbe0c3ba196a4f9ed2a776fe99dc4d1567a558fb11693e9fcc4e6ed","140eef237c7db06fc5adcb5df434ee21e81ee3a6fd57e1a75b8b3750aa2df2d8","0944ec553e4744efae790c68807a461720cff9f3977d4911ac0d918a17c9dd99","7c9ed7ffdc6f843ab69e5b2a3e7f667b050dd8d24d0052db81e35480f6d4e15d","7c7d9e116fe51100ff766703e6b5e4424f51ad8977fe474ddd8d0959aa6de257","af70a2567e586be0083df3938b6a6792e6821363d8ef559ad8d721a33a5bcdaf","006cff3a8bcb92d77953f49a94cd7d5272fef4ab488b9052ef82b6a1260d870b","7d44bfdc8ee5e9af70738ff652c622ae3ad81815e63ab49bdc593d34cb3a68e5","339814517abd4dbc7b5f013dfd3b5e37ef0ea914a8bbe65413ecffd668792bc6","34d5bc0a6958967ec237c99f980155b5145b76e6eb927c9ffc57d8680326b5d8","9eae79b70c9d8288032cbe1b21d0941f6bd4f315e14786b2c1d10bccc634e897","18ce015ed308ea469b13b17f99ce53bbb97975855b2a09b86c052eefa4aa013a","5a931bc4106194e474be141e0bc1046629510dc95b9a0e4b02a3783847222965","5e5f371bf23d5ced2212a5ff56675aefbd0c9b3f4d4fdda1b6123ac6e28f058c","907c17ad5a05eecb29b42b36cc8fec6437be27cc4986bb3a218e4f74f606911c","3656f0584d5a7ee0d0f2cc2b9cffbb43af92e80186b2ce160ebd4421d1506655","a726ad2d0a98bfffbe8bc1cd2d90b6d831638c0adc750ce73103a471eb9a891c","f44c0c8ce58d3dacac016607a1a90e5342d830ea84c48d2e571408087ae55894","75a315a098e630e734d9bc932d9841b64b30f7a349a20cf4717bf93044eff113","9131d95e32b3d4611d4046a613e022637348f6cebfe68230d4e81b691e4761a1","b03aa292cfdcd4edc3af00a7dbd71136dd067ec70a7536b655b82f4dd444e857","90f690a1c5fcb4c2d19c80fea05c8ab590d8f6534c4c296d70af6293ede67366","be95e987818530082c43909be722a838315a0fc5deb6043de0a76f5221cbad24","9ed5b799c50467b0c9f81ddf544b6bcda3e34d92076d6cab183c84511e45c39f","b4fa87cc1833839e51c49f20de71230e259c15b2c9c3e89e4814acc1d1ef10de","e90ac9e4ac0326faa1bc39f37af38ace0f9d4a655cd6d147713c653139cf4928","ea27110249d12e072956473a86fd1965df8e1be985f3b686b4e277afefdde584","1f6058d60eaa8825f59d4b76bbf6cc0e6ad9770948be58de68587b0931da00cc","5666075052877fe2fdddd5b16de03168076cf0f03fbca5c1d4a3b8f43cba570c","50100b1a91f61d81ca3329a98e64b7f05cddc5e3cb26b3411adc137c9c631aca","11aceaee5663b4ed597544567d6e6a5a94b66857d7ebd62a9875ea061018cd2c","6e30d0b5a1441d831d19fe02300ab3d83726abd5141cbcc0e2993fa0efd33db4","423f28126b2fc8d8d6fa558035309000a1297ed24473c595b7dec52e5c7ebae5","fb30734f82083d4790775dae393cd004924ebcbfde49849d9430bf0f0229dd16","2c92b04a7a4a1cd9501e1be338bf435738964130fb2ad5bd6c339ee41224ac4c","c5c5f0157b41833180419dacfbd2bcce78fb1a51c136bd4bcba5249864d8b9b5","669b754ec246dd7471e19b655b73bda6c2ca5bb7ccb1a4dff44a9ae45b6a716a","4bb6035e906946163ecfaec982389d0247ceeac6bdee7f1d07c03d9c224db3aa","8a44b424edee7bb17dc35a558cc15f92555f14a0441205613e0e50452ab3a602","24a00d0f98b799e6f628373249ece352b328089c3383b5606214357e9107e7d5","33637e3bc64edd2075d4071c55d60b32bdb0d243652977c66c964021b6fc8066","0f0ad9f14dedfdca37260931fac1edf0f6b951c629e84027255512f06a6ebc4c","16ad86c48bf950f5a480dc812b64225ca4a071827d3d18ffc5ec1ae176399e36","8cbf55a11ff59fd2b8e39a4aa08e25c5ddce46e3af0ed71fb51610607a13c505","d5bc4544938741f5daf8f3a339bfbf0d880da9e89e79f44a6383aaf056fe0159","c82857a876075e665bbcc78213abfe9e9b0206d502379576d7abd481ade3a569","4f71d883ed6f398ba8fe11fcd003b44bb5f220f840b3eac3c395ad91304e4620","5229c3934f58413f34f1b26c01323c93a5a65a2d9f2a565f216590dfbed1fe32","9fd7466b77020847dbc9d2165829796bf7ea00895b2520ff3752ffdcff53564b","fbfc12d54a4488c2eb166ed63bab0fb34413e97069af273210cf39da5280c8d6","85a84240002b7cf577cec637167f0383409d086e3c4443852ca248fc6e16711e","4c754b03f36ff35fc539f9ebb5f024adbb73ec2d3e4bfb35b385a05abb36a50e","59507446213e73654d6979f3b82dadc4efb0ed177425ae052d96a3f5a5be0d35","a914be97ca7a5be670d1545fc0691ac3fbabd023d7d084b338f6934349798a1f","8f62cbd3afbd6a07bb8c934294b6bfbe437021b89e53a4da7de2648ecfc7af25","62c3621d34fb2567c17a2c4b89914ebefbfbd1b1b875b070391a7d4f722e55dc","c05ac811542e0b59cb9c2e8f60e983461f0b0e39cea93e320fad447ff8e474f3","8e7a5b8f867b99cc8763c0b024068fb58e09f7da2c4810c12833e1ca6eb11c4f","132351cbd8437a463757d3510258d0fa98fd3ebef336f56d6f359cf3e177a3ce","df877050b04c29b9f8409aa10278d586825f511f0841d1ec41b6554f8362092b","33d1888c3c27d3180b7fd20bac84e97ecad94b49830d5dd306f9e770213027d1","ee942c58036a0de88505ffd7c129f86125b783888288c2389330168677d6347f","a3f317d500c30ea56d41501632cdcc376dae6d24770563a5e59c039e1c2a08ec","eb21ddc3a8136a12e69176531197def71dc28ffaf357b74d4bf83407bd845991","0c1651a159995dfa784c57b4ea9944f16bdf8d924ed2d8b3db5c25d25749a343","aaa13958e03409d72e179b5d7f6ec5c6cc666b7be14773ae7b6b5ee4921e52db","0a86e049843ad02977a94bb9cdfec287a6c5a0a4b6b5391a6648b1a122072c5a","87437ca9dabab3a41d483441696ff9220a19e713f58e0b6a99f1731af10776d7","26c5dfa9aa4e6428f4bb7d14cbf72917ace69f738fa92480b9749eebce933370","8e94328e7ca1a7a517d1aa3c569eac0f6a44f67473f6e22c2c4aff5f9f4a9b38","d604d413aff031f4bfbdae1560e54ebf503d374464d76d50a2c6ded4df525712","299f0af797897d77685d606502be72846b3d1f0dc6a2d8c964e9ea3ccbacf5bc","12bfd290936824373edda13f48a4094adee93239b9a73432db603127881a300d","340ceb3ea308f8e98264988a663640e567c553b8d6dc7d5e43a8f3b64f780374","c5a769564e530fba3ec696d0a5cff1709b9095a0bdf5b0826d940d2fc9786413","7124ef724c3fc833a17896f2d994c368230a8d4b235baed39aa8037db31de54f","5de1c0759a76e7710f76899dcae601386424eab11fb2efaf190f2b0f09c3d3d3","9c5ee8f7e581f045b6be979f062a61bf076d362bf89c7f966b993a23424e8b0d","1a11df987948a86aa1ec4867907c59bdf431f13ed2270444bf47f788a5c7f92d","3c97b5ea66276cf463525a6aa9d5bb086bf5e05beac70a0597cda2575503b57b","b756781cd40d465da57d1fc6a442c34ae61fe8c802d752aace24f6a43fedacee","0fe76167c87289ea094e01616dcbab795c11b56bad23e1ef8aba9aa37e93432a","3a45029dba46b1f091e8dc4d784e7be970e209cd7d4ff02bd15270a98a9ba24b","032c1581f921f8874cf42966f27fd04afcabbb7878fa708a8251cac5415a2a06","69c68ed9652842ce4b8e495d63d2cd425862104c9fb7661f72e7aa8a9ef836f8","a31383256374723b47d8b5497a9558bbbcf95bcecfb586a36caf7bfd3693eb0e","06f62a14599a68bcde148d1efd60c2e52e8fa540cc7dcfa4477af132bb3de271","64aa66c7458cbfd0f48f88070b08c2f66ae94aba099dac981f17c2322d147c06","11f19ce32d21222419cecab448fa335017ebebf4f9e5457c4fa9df42fa2dcca7","2e8ee2cbb5e9159764e2189cf5547aebd0e6b0d9a64d479397bb051cd1991744","1b0471d75f5adb7f545c1a97c02a0f825851b95fe6e069ac6ecaa461b8bb321d","1d157c31a02b1e5cca9bc495b3d8d39f4b42b409da79f863fb953fbe3c7d4884","07baaceaec03d88a4b78cb0651b25f1ae0322ac1aa0b555ae3749a79a41cba86","619a132f634b4ebe5b4b4179ea5870f62f2cb09916a25957bff17b408de8b56d","f60fa446a397eb1aead9c4e568faf2df8068b4d0306ebc075fb4be16ed26b741","f3cb784be4d9e91f966a0b5052a098d9b53b0af0d341f690585b0cc05c6ca412","350f63439f8fe2e06c97368ddc7fb6d6c676d54f59520966f7dbbe6a4586014e","eba613b9b357ac8c50a925fa31dc7e65ff3b95a07efbaa684b624f143d8d34ba","9814545517193cf51127d7fbdc3b7335688206ec04ee3a46bba2ee036bd0dcac","0f6199602df09bdb12b95b5434f5d7474b1490d2cd8cc036364ab3ba6fd24263","c8ca7fd9ec7a3ec82185bfc8213e4a7f63ae748fd6fced931741d23ef4ea3c0f","5c6a8a3c2a8d059f0592d4eab59b062210a1c871117968b10797dee36d991ef7","ad77fd25ece8e09247040826a777dc181f974d28257c9cd5acb4921b51967bd8","795a08ae4e193f345073b49f68826ab6a9b280400b440906e4ec5c237ae777e6","8153df63cf65122809db17128e5918f59d6bb43a371b5218f4430c4585f64085","a8150bc382dd12ce58e00764d2366e1d59a590288ee3123af8a4a2cb4ef7f9df","5adfaf2f9f33957264ad199a186456a4676b2724ed700fc313ff945d03372169","d5c41a741cd408c34cb91f84468f70e9bda3dfeabf33251a61039b3cdb8b22d8","c91d3f9753a311284e76cdcb348cbb50bca98733336ec726b54d77b7361b34de","cbaf4a4aa8a8c02aa681c5870d5c69127974de29b7e01df570edec391a417959","c7135e329a18b0e712378d5c7bc2faec6f5ab0e955ea0002250f9e232af8b3e4","340a45cd77b41d8a6deda248167fa23d3dc67ec798d411bd282f7b3d555b1695","fae330f86bc10db6841b310f32367aaa6f553036a3afc426e0389ddc5566cd74","cf25d45c02d5fd5d7adb16230a0e1d6715441eef5c0a79a21bfeaa9bbc058939","54c3822eaf6436f2eddc92dd6e410750465aba218adbf8ce5d488d773919ec01","99d99a765426accf8133737843fb024a154dc6545fc0ffbba968a7c0b848959d","c782c5fd5fa5491c827ecade05c3af3351201dd1c7e77e06711c8029b7a9ee4d","883d2104e448bb351c49dd9689a7e8117b480b614b2622732655cef03021bf6d","d9b00ee2eca9b149663fdba1c1956331841ae296ee03eaaff6c5becbc0ff1ea8","09a7e04beb0547c43270b327c067c85a4e2154372417390731dfe092c4350998","eee530aaa93e9ec362e3941ee8355e2d073c7b21d88c2af4713e3d701dab8fef","b5ef97d6974dc1246197361e661027adb2625a8544bb406d5ad1daae0fe47a22","8b8b92781a6bf150f9ee83f3d8ee278b6cdb98b8308c7ab3413684fc5d9078ef","7a0e4cd92545ad03910fd019ae9838718643bd4dde39881c745f236914901dfa","c99ebd20316217e349004ee1a0bc74d32d041fb6864093f10f31984c737b8cad","6f622e7f054f5ab86258362ac0a64a2d6a27f1e88732d6f5f052f422e08a70e7","d62d2ef93ceeb41cf9dfab25989a1e5f9ca5160741aac7f1453c69a6c14c69be","1491e80d72873fc586605283f2d9056ee59b166333a769e64378240df130d1c9","c32c073d389cfaa3b3e562423e16c2e6d26b8edebbb7d73ccffff4aa66f2171d","eca72bf229eecadb63e758613c62fab13815879053539a22477d83a48a21cd73","633db46fd1765736409a4767bfc670861468dde60dbb9a501fba4c1b72f8644d","689390db63cb282e6d0e5ce9b8f1ec2ec0912d0e2e6dac7235699a15ad17d339","f2ee748883723aa9325e5d7f30fce424f6a786706e1b91a5a55237c78ee89c4a","a2d8505de5a285a95212b0e7d8abb5a85944bbc76c50804d5fe2d001b9f5dcac","a314a39426700ba2b5a76c01bab321bbe79cfef898dae996e930b017fc2b0af9","c33a88f2578e8df2fdf36c6a0482bbee615eb3234c8f084ba31a9a96bd306b7f","22cca068109eb0e6b4f8acc3fe638d1e6ac277e2044246438763319792b546a1","8776e64e6165838ac152fa949456732755b0976d1867ae5534ce248f0ccd7f41","b6f78e34ec0465c8748976b4ecffbc18443193686136e4ef5f09e0acf64425c7","5c4c5b49bbb01828402bb04af1d71673b18852c11b7e95bfd5cf4c3d80d352c8","587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"d32f90e6cf32e99c86009b5f79fa50bc750fe54e17137d9bb029c377a2822ee2","affectsGlobalScope":true},"33536b5951667cd5a54b4bea28d3d52aaca1844448258f1281d3843b89ac5895",{"version":"c81c51f43e343b6d89114b17341fb9d381c4ccbb25e0ee77532376052c801ba7","affectsGlobalScope":true},"3dd49afd822c82b63b3905a13e22240f34cf367aea4f4dd0e6564f4bddcb8370","57135ce61976a8b1dadd01bb412406d1805b90db6e8ecb726d0d78e0b5f76050",{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","f302f3a47d7758f67f2afc753b9375d6504dde05d2e6ecdb1df50abbb131fc89","93db4c949a785a3dbef7f5e08523be538e468c580dd276178b818e761b3b68cd","5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"6e335a70826a634c5a1a1fa36a2dacbf3712ef2be7a517540ae1de8a1e8ea4f6","affectsGlobalScope":true},"f3f3fc5a0de590ceb4aa0b5d2de20afd0ac6af1b0426c0a67f847fe16bdc5d21","df8529626079d6f9d5d3cd7b6fb7db9cda5a3118d383d8cd46c52aadb59593e7","1b0856424524be4d18e41b31506c9640c4786ee68fd9658abdbf27c856f70125","3122a3f1136508a27a229e0e4e2848299028300ffa11d0cdfe99df90c492fe20","42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","ad8848c289c0b633452e58179f46edccd14b5a0fe90ebce411f79ff040b803e0",{"version":"b748ed8ff77f2c330857f01f385e52f708448b6ff6424415ab0de749fd7bc664","affectsGlobalScope":true},"fe6dba0e8c69f2b244e3da38e53dd2cc9e51b2543e647e805396af73006613f7","5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d",{"version":"5810080a0da989a944d3b691b7b479a4a13c75947fb538abb8070710baa5ccee","affectsGlobalScope":true},{"version":"72f4a812489dee501c41a085f174e1a843aa78e93dd2af0a6f9ed89f796565c8","affectsGlobalScope":true},"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","8904e5b670bbfc712dda607853de9227206e7dad93ac97109fe30875c5f12b78","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270",{"version":"a54ee34c2cc03ec4bbf0c9b10a08b9f909a21b3314f90a743de7b12b85867cef","affectsGlobalScope":true},{"version":"8a985c7d30aea82342d5017730b546bb2b734fe37a2684ca55d4734deb019d58","affectsGlobalScope":true},"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","5bc85813bfcb6907cc3a960fec8734a29d7884e0e372515147720c5991b8bc22","812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661",{"version":"4d06f3abc2a6aae86f1be39e397372f74fb6e7964f594d645926b4a3419cc15d","affectsGlobalScope":true},{"version":"0e08c360c9b5961ecb0537b703e253842b3ded53151ee07024148219b61a8baf","affectsGlobalScope":true},"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","5ba5b760345053acdf5beb1a9048ff43a51373f3d87849963779c1711ea7cbcc","16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b",{"version":"d19e76b1210879a533e64d687e7c4aa605c7fecaa554fbb6b319d9ae9d0f5164","affectsGlobalScope":true},"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"13e851ee5f3dad116583e14e9d3f4aaf231194bbb6f4b969dc7446ae98a3fa73","b1879b3db28afe9ba769e84058e7d544c55322e69f34b928df96ec50f17a051d","a96bc00e0c356e29e620eaec24a56d6dd7f4e304feefcc99066a1141c6fe05a7","d12cc0e5b09943c4cd0848f787eb9d07bf78b60798e4588c50582db9d4decc70","53b094f1afe442490555eeeb0384fc1ceb487560c83e31f9c64fb934c2dccd94","19c3760af3cbc9da99d5b7763b9e33aaf8d018bc2ed843287b7ff4343adf4634","9d1e38aeb76084848d2fcd39b458ec88246de028c0f3f448b304b15d764b23d2","d406da1eccf18cec56fd29730c24af69758fe3ff49c4f94335e797119cbc0554","4898c93890a136da9156c75acd1a80a941a961b3032a0cf14e1fa09a764448b7","f5d7a845e3e1c6c27351ea5f358073d0b0681537a2da6201fab254aa434121d3","9ddf8e9069327faa75d20135cab675779844f66590249769c3d35dd2a38c2ba9","d7c30f0abfe9e197e376b016086cf66b2ffb84015139963f37301ed0da9d3d0d","ff75bba0148f07775bcb54bf4823421ed4ebdb751b3bf79cc003bd22e49d7d73","d40d20ac633703a7333770bfd60360126fc3302d5392d237bbb76e8c529a4f95","35a9867207c488061fb4f6fe4715802fbc164b4400018d2fa0149ad02db9a61c","91bf47a209ad0eae090023c3ebc1165a491cf9758799368ffcbee8dbe7448f33","0abe2cd72812bbfc509975860277c7cd6f6e0be95d765a9da77fee98264a7e32","13286c0c8524606b17a8d68650970bab896fb505f348f71601abf0f2296e8913","fc2a131847515b3dff2f0e835633d9a00a9d03ed59e690e27eec85b7b0522f92","90433c678bc26751eb7a5d54a2bb0a14be6f5717f69abb5f7a04afc75dce15a4","cd0565ace87a2d7802bf4c20ea23a997c54e598b9eb89f9c75e69478c1f7a0b4","738020d2c8fc9df92d5dee4b682d35a776eaedfe2166d12bc8f186e1ea57cc52","86dd7c5657a0b0bc6bee8002edcfd544458d3d3c60974555746eb9b2583dc35e","d97b96b6ecd4ee03f9f1170722c825ef778430a6a0d7aab03b8929012bf773cd","f61963dc02ef27c48fb0e0016a413b1e00bcb8b97a3f5d4473cedc7b44c8dc77","272dbfe04cfa965d6fff63fdaba415c1b5a515b1881ae265148f8a84ddeb318f","2035fb009b5fafa9a4f4e3b3fdb06d9225b89f2cbbf17a5b62413bf72cea721a","e7f68ad89f943f167d40e045423f035beed4f91d4ceeec02381289211af1c644","72636f59b635c378dc9ea5246b9b3517b1214e340e468e54cb80126353053b2e","ebb79f267a3bf2de5f8edc1995c5d31777b539935fab8b7d863e8efb06c8e9ea","ada033e6a4c7f4e147e6d76bb881069dc66750619f8cc2472d65beeec1100145","52ff5e1ea35c54428b46c75fd14f87b7a7158a8f4a1ecfc4a9b996a03185c738","605d29d619180fbec287d1701e8b1f51f2d16747ec308d20aba3e9a0dac43a0f","67c19848b442d77c767414084fc571ce118b08301c4ddff904889d318f3a3363","c704ff0e0cb86d1b791767a88af21dadfee259180720a14c12baee668d0eb8fb","195c50e15d5b3ea034e01fbdca6f8ad4b35ad47463805bb0360bdffd6fce3009","da665f00b6877ae4adb39cd548257f487a76e3d99e006a702a4f38b4b39431cb","f17e48117e4b212a239088645116fb0f7115dcab3767e5ca57bab5ef97ce14d2","79cfed5eb33a189e2a590d4b4bb53ec0edd0624779d51126caae6395620a717d","d7a4309673b06223537bc9544b1a5fe9425628e1c8ab5605f3c5ebc27ecb8074","a1ca31e02359442c3e254204445cded3a4712e8830663a0fe06f894b8982ab7c","3eadfd083d40777b403f4f4eecfa40f93876f2a01779157cc114b2565a7afb51","3ac0b94ba8f884f63d38450ce9e29ecd59ff00805ffdd609193d7532b8605459","a3684ea9719122f9477902acd08cd363a6f3cff6d493df89d4dc12fa58204e27","2828dabf17a6507d39ebcc58fef847e111dcf2d51b8e4ff0d32732c72be032b3","c0c46113b4cd5ec9e7cf56e6dbfb3930ef6cbba914c0883eeced396988ae8320","118ea3f4e7b9c12e92551be0766706f57a411b4f18a1b4762cfde3cd6d4f0a96","33395c26f51d1663fda112972df743324d1054fe2a932c85a8bd59d1c771c33e","6305acbe492b9882ec940f8f0c8e5d1e1395258852f99328efcb1cf1683ca817","7619b1f6087a4e9336b2c42bd784b05aa4a2204a364b60171e5a628f817a381e","15be9120572c9fbcd3c267bd93b4140354514c9e70734e6fcca65ff4a246f83a","412482ab85893cec1d6f26231359474d1f59f6339e2743c08da1b05fc1d12767","858e2315e58af0d28fcd7f141a2505aba6a76fd10378ba0ad169b0336fee33fc","02da6c1b34f4ae2120d70cf5f9268bf1aedf62e55529d34f5974f5a93655ce38","3ecf179ef1cc28f7f9b46c8d2e496d50b542c176e94ed0147bab147b4a961cd6","b145da03ce7e174af5ced2cbbd16e96d3d5c2212f9a90d3657b63a5650a73b7f","c7aadab66a2bc90eeb0ab145ca4daebcbc038e24359263de3b40e7b1c7affba6","99518dc06286877a7b716e0f22c1a72d3c62be42701324b49f27bcc03573efff","f4575fd196a7e33c7be9773a71bcc5fbe7182a2152be909f6b8e8e7ba2438f06","05cba5acd77a4384389b9c62739104b5a1693efd66e6abac6c5ffc53280ae777","acacda82ebd929fe2fe9e31a37f193fc8498a7393a1c31dc5ceb656e2b45b708","1b13e7c5c58ab894fe65b099b6d19bb8afae6d04252db1bf55fe6ba95a0af954","4355d326c3129e5853b56267903f294ad03e34cc28b75f96b80734882dedac80","37139a8d45342c05b6a5aa1698a2e8e882d6dca5fb9a77aa91f05ac04e92e70b","e37191297f1234d3ae54edbf174489f9a3091a05fe959724db36f8e58d21fb17","3fca8fb3aab1bc7abb9b1420f517e9012fdddcbe18803bea2dd48fad6c45e92e","d0b0779e0cac4809a9a3c764ba3bd68314de758765a8e3b9291fe1671bfeb8a1","d2116b5f989aa68e585ae261b9d6d836be6ed1be0b55b47336d9f3db34674e86","d79a227dd654be16d8006eac8b67212679d1df494dfe6da22ea0bd34a13e010c","b9c89b4a2435c171e0a9a56668f510a376cb7991eaecef08b619e6d484841735","e2efbe9ad735950e0536a93120106219a25f45ba0ab7984d58497b5c9d19330e","6a79b61f57699de0a381c8a13f4c4bcd120556bfab0b4576994b6917cb62948b","c5133d7bdec65f465df12f0b507fbc0d96c78bfa5a012b0eb322cf1ff654e733","ac417fa503b647015b710d1a12263a0b806941f817e1da7bf984a1c3c4c809b8","89049878a456b5e0870bb50289ea8ece28a2abd0255301a261fa8ab6a3e9a07d","55ae9554811525f24818e19bdc8779fa99df434be7c03e5fc47fa441315f0226","24abac81e9c60089a126704e936192b2309413b40a53d9da68dadd1dd107684e","f13310c360ecffddb3858dcb33a7619665369d465f55e7386c31d45dfc3847bf","e7bde95a05a0564ee1450bc9a53797b0ac7944bf24d87d6f645baca3aa60df48","62e68ce120914431a7d34232d3eca643a7ddd67584387936a5202ae1c4dd9a1b","4e49cb98e2c4e546dd90fb6a867ef88978dea05502df92cb252078cdd407cd1d","e1cb8168c7e0bd4857a66558fe7fe6c66d08432a0a943c51bacdac83773d5745","a464510505f31a356e9833963d89ce39f37a098715fc2863e533255af4410525","ebbe6765a836bfa7f03181bc433c8984ca29626270ca1e240c009851222cb8a7","ac10457b51ee4a3173b7165c87c795eadd094e024f1d9f0b6f0c131126e3d903","468df9d24a6e2bc6b4351417e3b5b4c2ca08264d6d5045fe18eb42e7996e58b4","954523d1f4856180cbf79b35bd754e14d3b2aea06c7efd71b254c745976086e9","a8af4739274959d70f7da4bfdd64f71cfc08d825c2d5d3561bc7baed760b33ef","3e1e58eff1981ef808ead362d1586c132b309247cd14e3929fbd36d9ca80d3fe","cc32874a27100c32e3706d347eb4f435d6dd5c0d83e547c157352f977bbc6385","e45b069d58c9ac341d371b8bc3db4fa7351b9eee1731bffd651cfc1eb622f844","7f3c74caad25bfb6dfbf78c6fe194efcf8f79d1703d785fc05cd606fe0270525","54f3f7ff36384ca5c9e1627118b43df3014b7e0f62c9722619d19cdb7e43d608","2f346f1233bae487f1f9a11025fc73a1bf9093ee47980a9f4a75b84ea0bb7021","e04c5673b82d68376f57dea0e4a4fbacf6f1692c9382fb12b5fb2e93ce174c12","2350e4399e456a61e4340254b71fba87b02b76a403a502c649912865a249f14d","2579b150b86b5f644d86a6d58f17e3b801772c78866c34d41f86f3fc9eb523fe","0353e05b0d8475c10ddd88056e0483b191aa5cdea00a25e0505b96e023f1a2d9","d60d0eeebe3a5a7489e57b9d00d43868281014b0d8b180e29e2f664f1bfe873b","22a35275abc67f8aba44efc52b2f4b1abc2c94e183d36647fdab5a5e7c1bdf23","99193bafaa9ce112889698de25c4b8c80b1209bb7402189aea1c7ada708a8a54","70473538c6eb9494d53bf1539fe69df68d87c348743d8f7244dcb02ca3619484","c48932ab06a4e7531bdca7b0f739ace5fa273f9a1b9009bcd26902f8c0b851f0","df6c83e574308f6540c19e3409370482a7d8f448d56c65790b4ac0ab6f6fedd8","32f19b665839b1382b21afc41917cda47a56e744cd3df9986b13a72746d1c522","8db1ed144dd2304b9bd6e41211e22bad5f4ab1d8006e6ac127b29599f4b36083","843a5e3737f2abbbbd43bf2014b70f1c69a80530814a27ae1f8be213ae9ec222","6fc1be224ad6b3f3ec11535820def2d21636a47205c2c9de32238ba1ac8d82e6","5a44788293f9165116c9c183be66cefef0dc5d718782a04847de53bf664f3cc1","afd653ae63ce07075b018ba5ce8f4e977b6055c81cc65998410b904b94003c0a","00b9ff040025f6b00e0f4ac8305fea1809975b325af31541bd9d69fa3b5e57b1","9f96b9fd0362a7bfe6a3aa70baa883c47ae167469c904782c99ccc942f62f0dc","9172155acfeb17b9d75f65b84f36cb3eb0ff3cd763db3f0d1ad5f6d10d55662f","71807b208e5f15feffb3ff530bec5b46b1217af0d8cc96dde00d549353bcb864","1a6eca5c2bc446481046c01a54553c3ffb856f81607a074f9f0256c59dd0ab13","1a4aee937b03ee188e657d402591e335a945d9c2a0c4bca13b200732423e46d7","9ec932a6da5124c65b927f0ed9af97115c31a448ee98bfd8185812f882905de9","df23705fd32cee6822fc57b5eb5ca88dba0552aae08c4eeff02acde07ea2bf28","204189c6906fa1a3ec75757d627ecbd451a7760af92f1fd96bce0d65cd4b3682","2e2bc02af7b535d267be8cecbc5831466dd71c5af294401821791b26cb363c47","986affe0f60331f20df7d708ee097056b0973d85422ec2ce754af19c1fa4e4b1","8f06c2807459f1958b297f4ad09c6612d7dbd7997c9ccfc6ea384f7538e0cea8","a7de30cd043d7299bfe9daaca3732b086e734341587c3e923b01f3fd74d31126","78f7fad319e4ac305ffe8e03027423279b53a8af4db305096aa75d446b1ec7af","3bf58923a1d27819745bdad52bca1bdced9fef12cc0c7f8a3fd5f4e0206b684a","8fc11f102df58f03d36fcbf0da3efa37c177f5f18f534c76179ceef0c3a672cd","e6935ab0f64a886e778c12a54ed6e9075ce7e7f44723ff0d52020a654b025a09","9829af7653a29f1b85d3dd688a6c6256087c0b737b85d84b630e7f93fd420faf","3d9d985d41e536fcf79fc95082925c2f1ae5ade75814ad2bd70c0944747f7ac4","167fdeb976d2a67158d372f4b9159ebf1e9fed6fc30345a577a8506ae998a274","b0e6f1b1569779cf567317c2265d67460d1d3b4de4e79126533109d87dc16d50","18cb8be1326ffa4158abd8d84c9b0a189c0f52201f12f7af2d2af830c077f2bf","b08fc2b6ccd4d3db42af01b3c6390fc1e30dc1d95496d9a8ee5f9319c2e4883f","0de68916e23c1e3df800f9f61cdd7c506ceb0656fcbc245ee9974aad26786781","80c538ee6a62249e77ba3de07efb23d4a7ca8946499c065261bf5079f1cd3cf0","ad4277862bdcbe1cf5c1e0d43b39770e1ccc033da92f5b9ff75ca8c3a03a569b","46a86c47400a564df04a1604fcac41cb599ebbada392527a1462c9dfe4713d78","f342dcb96ad26855757929a9f6632704b7013f65786573d4fdcd4da09f475923","dcd467dc444953a537502d9e140d4f2dc13010664d4216cc8e6977b3c5c3efa3","ca476924dfa6120b807a14e0a8aea7b061b8bdaa7eecdb303d7957c769102e96","5d82f2d07d9a079efe29ab47910c7f194ed5839db3d48a140e3a5cafcfc347c1","f3bb275073b5db8931c042d347fdce888775436a4774836221af57fdccec32ff","03cb8cb2f8ef002a5cac9b8c9a0c02e5fd09de128b9769c5b920a6cbfc080087","3e5ebc3a6a938a03a361f4cdb9a26c9f5a1bac82b46273e11d5d37cd8eccc918","a0a7800e71c504c21f3051a29f0f6f948f0b8296c9ebffeb67033822aabf92e0","6a219f12b3e853398d51192736707e320699a355052687bad4729784649ff519","4294a84634c56529e67301a3258448019e41c101de6b9646ea41c0ecdc70df92","80fc027e10234b809a9a40086114a8154657dcb8478d58c85ef850592d352870","27f24ba43083d406b372e9eff72dbc378afa0503dac1c1dd32499cc92fc9cb22","12594611a054ca7fe69962f690a4e79922d563b4b434716eb855d63a9d11a78f","1440eca2d8bc47ebdbc5a901b369de1b7b39c3297e5b4ac9631899f49ea9740b","fc9897fbada879bda954603ea204c6e5df913262a90ad848b5efaab182b58033","93443b2da120bea58eb48bd7da86559d4cf868dc2d581eebf9b48b51ba1e8894","182f9553b74cf62425ef64d82075bf16452cc7096450aca1aa6a1e863594a45d","c2956026078814be6dc01515213aeb1eb816e81715085952bbc97b7c81fe3f6d","ac3a69c529ab256532825b08902aec65d0d88c66963e39ae19a3d214953aedc5","fe29108f3ddf7030c3d573c5226ebe03213170b3beca5200ca7cb33755184017","04d5bfb0a0eecd66c0b3f522477bf69065a9703be8300fbea5566a0fc4a97b9d","d5e3e13faca961679bed01d80bc38b3336e7de598ebf9b03ec7d31081af735ad","de05a488fb501de32c1ec0af2a6ddfe0fdef46935b9f4ffb3922d355b15da674","9f00f2bc49f0c10275a52cb4f9e2991860d8b7b0922bfab6eafe14178377aa72","af1e2889c68a697192a0ecbda332193f022032018158f890ad403b6513e9ec17","0e7c3660d1df392b6f6ae7fa697f0629ae4404e5b7bac05dd81136247aff32d5","d110a9869e09144198be68ed9224e3f509d8409a01d578ff1c471f92b0b4c58c","c6688fd4c2a8a24c9b80da3660a7a06b93ed37d12d84f3ba4aa071ffc125e75f","20efc25890a0b2f09e4d224afaaf84917baa77b1aee60d9dfd11ff8078d73f93","d00b48096854d711cee688e7ff1ca796c1bf0d27ca509633c2a98b85cc23d47d","30f116226d0e53c6cbbdbc967479d5c8036935f771b2af51987c2e8d4cc7fc6a","8be98ffc3c54fb40b220796b796388f8ade50c8ba813a811bffccf98006566d5","4e82eed3c1b5084132708ce030f8ec90b69e4b7bb844dcaacd808045ae24c0e2","eae8c7cbcb175b997ce8e76cd6e770eca5dba07228f6cb4a44e1b0a11eb87685","b3ded8e50b3cdf548d7c8d3b3b5b2105932b04a2f08b392564f4bc499407e4e5","4ed2d8fb4c598719985b8fbef65f7de9c3f5ae6a233fc0fe20bd00193c490908","6da51da9b74383988b89e17298ceca510357f63830f78b40f72afe4d5a9cee3e","512a079a1a3de2492c80aa599e173b2ea8cc6afb2800e3e99f14330b34155fe1","28b0c5477937d40bbdc0cd329d2a9ce7c6bc9fcfd3b3cd880f62c983137bde52","8e3842ba15690ab4b340893a4552a8c3670b8f347fbb835afe14be98891eef10","9e7817283b8b1ca62652bbc10475e2e89df05b8ddc6ff4a8e32d65d9f68622e7","15911b87a2ad4b65b30c445802d55fa6186c66068603113042e8c3dfa4a35e2a","a9dc7b8d06b1f69d219f61fa3f7ac621e6e3a8d5a430e800cd7d1a755cc058c3","f8c496656cb5fd737931b4d6c60bd72a97c48f37c07dcb74a593dd24ac3f684a","abcb5db28886eec7437cb341a42fec07580fb1fbc927d1bd4f0f22b558a7aa9a","0fa43815d4b05eafe97c056dae73c313f23a9f00b559f1e942d042c7a04db93c","9d2e963a1608ebeea2728bea165742680cab4dea64542b7382a70644f82da649","a02db6aabaa291a85cf52b0c3f02a75301b80be856db63d44af4feea2179f37b","e1e94e41f47a4496566a9f40e815687a2eca1e7b7910b67704813cf61248b869","557ba6713b2a6fefd943399d5fb6c64e315dc461e9e05eaa6300fdbeeda5d0a1","94d594a0f3ce879202ea19c736e1da53b60d14bf6affac40c72c783afdd8d350","6c689f6498e87962dbbe36cedcd07ad89f9dc876f23687a41544fc485d63e92f","1a014a8365354f37ea245349a4361d3b46589be7921fe7f1dbf408cc0f084bab","e58c601cdc72f2f982b495cea79b36438f1ebc068529cb878901ec8648d30566","73c0b8df0e282e26a53820f53502847a043bd77a9cda78782207d5349842fba2","5bae6e8aeb6486bc8503767978e4960e25ce1ea16b7e89c1ea4eed1c3ab62788","e758ff8f1bf17f80b220a79139c007bad7eaa18aae8ab5e004cd13be20fb7b64","8c676a0f3158205c4c261ce9bd1ce0362923c9fd24c0bcdb17077e5ba0360bab","d6db974317fd9ff66a923555464850dcf87976054a7adacf09d53323f64686d1","92a094c28709aa6062b8cd162ae188d1755761c8e11ec7b164323152926704ce","7df6dfe294fd23c1ab8482ba7957cad3cf3419df2c64dda1f258ec87f80aea5a","9af4db510139f651fd9262340e29bc1bbd5441fc1f5518af82f3277804913402","9fb5226917009e53461dd0211acc975c720e45d9d610629efda0c1c0162501c4","a9417a980a4300048d179d0295e5b7dd76e4db7b566344779ee576cbd084b3c4","b96760c030c41fa078b35ea05fc3e7e4d2a81710a8329271d42b6abc110d5dbe","ef8ff23609cec5eb95e2beb98132ad90c0c5075415b50228b12f89ffaf981a4a","1154ed167b954ffb24a95ec3b11b1519a597024e7fda1df63c144962bc523aaf","174a3381f98fc78c451528cb1aa1baaa37a51852ec6fa90d42efd876301537c1","2c0de27d99a9331cfac8bc5c6bbd174e0593628bf3df268faa6c4188962a9549","1a17bcbc124a098987f7b1adbbcd412f8372ecb37e352b1c50165dac439eee5e","0ef49170735d9e5902f55b72465accadd0db93cae52544e3c469cbc8fbdbf654","f68a30e88dfa7d12d8dd4609bc9d5226a31d260bf3526de5554feed3f0bf0cb6","1fffef141820a0556f60aa6050eccb17dbcdc29ecd8a17ee4366573fd9c96ce3","d2598c755c11170e3b5f85cd0c237033e783fd4896070c06c35b2246879612b8","8d2044a28963c6c85a2cf4e334eb49bb6f3dd0c0dfe316233148a9be74510a0e","4c1f2da4e18122d57a16e4c6ea4b6fe60ea4f65b14e77cb20339f9158b27ca12","54a4f21be5428d7bff9240efb4e8cae3cb771cad37f46911978e013ff7289238","2411942fcfd1c06aa6a24a12e12819366c5cf0556600c73a3f02f10d5f11d5f1","cc4483c79688bd3f69c11cb3299a07d5dcf87646c35b869c77cde553c42893cf","faf76eeb5dd5d4d1e37c6eb875d114fa97297c2b50b10e25066fed09e325a77a","b741703daf465b44177ef31cc637bde5cd5345e6c048d5807108e6e868182b01","bbca0eb1a05fd2e38f4ffc686ba36ffece50c11ba13420cc662a73433c94bf74","d8acc6f92c85e784acbbc72036156a4c1168a18cba5390c7d363040479c39396","0cf6ed6724677967d5eb331c3755757ed23795f3d5be9a52a7fabefd4ceea890","5eb09226bfa1928721a438e37c004647fc19d8d1f4817bddcc350e57fb32935f","5994ed389d7fc28c03dad647ecb62e5349160bde443b0c7a54e0e10d6368bcbd","e1ff7df643e1aa1dbf1863113a913358844ed66f1af452e774834b0008e578b2","c5114285d0283d05e09cd959e605a4f76e5816c2fbe712241993fd66496083e5","2752e949c871f2cbd146efa21ebc34e4693c0ac8020401f90a45d4e150682181","c349cea980e28566998972522156daac849af8a9e4a9d59074845e319b975f5d","0370682454d1d243b75a7c7031bc8589531a472e927b67854c1b53b55ee496ea","cf6b4dbb5a1ac9ece24761c3a08682029851b292b67113a93b5e2bfd2e64e49d","5f117aca99483d48657676bd9d055e0da373dd1dff62d07a5979243345d28c5c","cb2fea712720bb7951d7e5d63db8670bf4a400d3e0fb197bceb6ef44efe36ec3","d1b5663356da50b06bf7a8c547dd30161d6435f8061678437c06efe2d1c3f66c","ef19d5fe42541f8b529bccd10f488d12caefa3b57a0deb1ed6143219cba716b4","84b5e6269d7cf53008a479eeb533ef09d025eafb4febe3729301b8d4daf37ff2","04196b5d9edd60b9648daa329c3355d7c95f33b7e520e7835eb21002174a8b8c","e17b09f8011ab42eb55095225b126ae67d8944fe86a32e5d8c6feb0f11a0f49b","762ca0ff9c7ee821b2958085a504ee6f9c47e10f466ee7e4a1a79702931a402b","c8eeffebe6c2c6800f73aa59d1436d4dadbad7f3ddda02a831ffa66114c3122d","caf3f141f93cbf527ad18ecce326311d70342fe1e16ce93e5ce8d6bcdf02bd48","4283d88023e6e9645626475e392565464eae99068f17e324cfc40a27d10fe94f","51e3b73dea24e2a9638345fb7a2a7ef5d3aa2e7a285ad6bd446b45fab826def1","546157e2534fc81242dab0ed3d69f77c82a18442a2bf0899bdafb328cc9ccd8c","c78bb1275f640e4902ad5c3383ab4f54f73322a59c95924ab671125ba9546294","1cb0838371e8213ce116a1497bb86bcf01a11a755b77587980ee7cfb2d625ece","7adaa31af611851bb98f0d111447221c24d090df7c757e32463583ca48a4e238","4e8fb81d7a8a0299f03196db93017e1811a47e8977f3f8dde0c122352b23e1a6","10b322f5bc001bec9bf08513c978c120adb0abe3c82793b11bdaf75873426c05","51b4efdc8dc92bc6ae2c44d4edad265decad70e8577d5653fc7f85200cbf6c6e","ab159dda8873292919fb0d498cafd4c922c2969928eced2b834062b4ffc2d7c7","81f80859aeaa50bde911c32c824cdb73609010dd36173e2d0ad6cc05d294eb1b","3e855437e99a09e54d2813e8e0ddcc78caf14dc9709c35ac93cdc35f2b581abd","5d6a095deeceaeff22c90fc3fdc773034fa6db61384f7b0cd115fd3e142e430c","32f9169fb6cad29917b3f1670550df48ba30dee34dcb0bffaed13947b2e0d2d2","f922ee0d3c98c614919041e327e65f1d18b9d8311ead1e16a2e89be419598a58","6df6afb0424a7c7581ee98a9333d30e893b943d0a4709b88f18c252ddc3101b4","59c2cbf84c22fae87f4f506f36a7258a72b931b602115067dfd6008ee526f8c0","1e09cd1bc6b6baa0733e1e799c4533105ea79cbb109937c71e8c870e14693216","ba25681012e5117866a2456dd3557e24aa5a946ed641126aa4469880db526883","2b1e058a8c3944890c7ce7c712ecfd0f2645420ee67537ac031d7afe6feda6e0","175dbcd1f226eebd93fd9628e9180fb537bb1171489b33db7b388ef0f4e73b37","69ec6331ee3a7cd6bade5d5f683f1705c1041ff77432aa18c50d2097e61f93db","06f34a0f2151b619314fc8a54e4352a40fd5606bda50623c326c3be365cc1ef9","fcdd4523a8af4337c755c713d7dfb23b8116ec07a98010f49df4aed8aeb6c4f5","4c9786f6198be0310ababe89f5ca93c7f048618783f21524e3596a402b34a56f","6c3d3586d8fff56a9763c47133b4a9230480534471b38c7a2f688eac5d819164","1b91b4d73641b4434ca2603b42e20f6a579cc5d2e29dd09676721cd64e9fd6a3","42852f35ebc5733c0f09eb4cb495ed78a1a12f9664eb7cf7ae877acd999d885c","70a3659d557bb683091f9d318762a330a3acb3954f5e89e5134d24c9272192f1","d9fe2c804f7db2f19e4323601278b748dc2984798f265c37cd37bb84e6c88ab8","3525647a73ae2124fa8f353f0a078b44ff1ee6f82958c2bb507de61575f12fff","d7238315cbd18ebeed93f41ad756a0ed9759824b9b158c3d7a1e0b71682d8966","eeba7376ce9721610d3282a4159f3c60154b7b3877fb251f7b3211b085cfdc18","54b0cc65b2e86cc59adf157b32b4fde2143ac2ed733f91a26f06c90d93ed9fe6","788c870cac6b39980a5cc41bf610b1873952ecdd339b781f0687d42682ffc5dc","d51a2e050c8a131b13ec9330a0869e5ac75b9ac4ebde52d5f474e819510b5263","3544b854dccadff219b992b2e5dadfbd7a8e0b9815d6d56006775a17e6500568","6c034655fa83236bd779cacfc1d5b469d6e2150a1993e66ecca92376a8b2c6a7","6bd6933efe9d6263d9f1a534a28a8f88b1e4c331b95d85d39350cf02eca8dce0","658cf468a05b2b591fcd5455a76d9927face59ac4a21b4965982b3c234f5d289","6bf893d1b824bde22ee5880c0c760c1dd0a5163c38d22311441a3341b6965d2d","18006f71012652a98486900031259844ab599473acd3ea89052d9276f27e7c0f","4fed67df4d254bc1196516fd0858e2be233d13a96b8cda58b1e9c9aabf2b74a4","28b415e70f9da0346545b7d2bcf361844a8e5778bd6b45bc1a2859f99700ff5b","a905f2f6785e3971bd97c42191394209d97f2aefb11841f7353dd9789821fa8c","e099c5ebddf80ae7285d380c7dd3b5d49c1347346ced51ae121b846833a8d102","aec91730b9f4d83758b4a45596317d34d6ecdbe9330a44629f53af47641b96ee","0ec0a1138652e89501946ebe3ec376fb0228fd637262a9c2b3a01746cc5a0b58","a096ec0badb5f63acd58ab838159b70e5e5e6351cbfa91cc4272bb81325539b8","738ddac5ab5b61d70d3466f3906d6b3c83c8786e922c6e726a6597296181ae87","90d202ace592f7b51b131a5890ec93e4df774c8677a485391c280cef0ea53f48","b34e1861949a545916696ef40f4a7fe71793661e72dd4db5e04cacc60ef23f7a","f27936f9aaf66c489f785928b887c4ac53d056b9b4ce12b4471d530bc4f2b7a6","a3ee2eb87d12e95e37defeffbe209e0901190a82f234cafd67de3d2e2a08eb4a","5c60d93010bd9b998fa8ba50e1f9914458643b3756edbdc5fa8ff53d2e6762db","69dd38e25b0a8ecd40638fadcb47935834a02b2b631bc4811484ef9fa4a7c83b","fdabf0c2593658f129c87c8052c5f8bff9a959f8dd2c5b6522ff3d10f64ad9d5","7ed8c65a78b5116d015b22bcac6a413f8c60edf5396cff3d474b5065a10720a2","d2ff82b084732349284d12417b09d44c35f86b01302c13acb618628c0ff88a79","21f253f734e5e4a615203036822a5d497965415d4940f2a66abe76d3def3713c","74ffa4541a56571f379060acaf9ab86da6c889dfe1f588425807e0117e62bba5","cf4dc15ca9dc6c0995dd2a9264e5ec37d09d9d551c85f395034e812abdf60a99","73e8b003f39c7ce46d2811749dab1dd1b309235fd5c277bd672c30a98b5cf90f","4cb49e79595c6413fcb01af55a8a574705bf385bd2ec5cf8b777778952e2914a","d6b44382b2670f38c8473e7c16b6e8a9bfa546b396b920afc4c53410eeb22abf","3b5c6f451b7ad87e3fcd2008d3a6cb69bd33803e541e9c0fe35754201389158f","8329556a2e85e3c3ff3dff43141790ff624b0f5138cedec5bb793164cf8b088f","e38609d74a50114800997624542cb06e4248426086e5d383f0de91c1718dc2fc","77cedad06715a4f0c60f0d26f3ee579df36a4187824c88053fc21350cd625df4","7232467057ec57666b884924f84fd21cd3a79cc826430c312e61a5bc5758f879","77c4c9f71f3736ed179043a72c4fad9832023855804fbe5261a956428b26a7a6","f5aa57712223d7438799be67b0c4a0e5ac3841f6397b5e692673944374f58a83","774c37f8faed74c238915868ccc36d0afedfbafb1d2329d6a230966457f57cbd","bc41b711477270e8d6f1110d57863284d084b089a22592c7c09df8d4cc3d1d20","ff405ec0cc453987823304b18b82dbe3e68e6f8bd2e56f5041c41effcc4ce717","228ed3721f42cc25bfebceef33754ce4766414d975ff71d012f01f141dbe3549","08985cdb65bbfe3c70d0037794a3d0f0a5613f55c278c77277a7acc17205db57","a32bef91fa483b905391e5d37ef9e1ae9be3355ba73f8c9e14c0a9066593bf12","22f4d25a372f587dc27e0169ff1b4aa9780d979c6101f91f2ae77f5be20e4c4c","c86fea295c21ea01c93410eba2ec6e4f918b97d0c3bf9f1bb1960eabe417e7eb","05d41b3e7789381ff4d7f06d8739bf54cc8e75b835cb28f22e59c1d212e48ff3","6fbcfc270125b77808679b682663c7c6ad36518f5a528c5f7258bcd635096770","9d3bd4ee558de42e9d8434f7293b404c4b7a09b344e77c36bbe959696328d594","f63be9b46a22ee5894316cf71a4ba7581809dd98cf046109060a1214ee9e2977","dd3cc41b5764c9435b7cae3cc830be4ee6071f41a607188e43aa1edeba4fbb3e","b2dbb9485701a1d8250d9a35b74afd41b9a403c32484ed40ed195e8aa369ae70","5aa7565991c306061181bd0148c458bcce3472d912e2af6a98a0a54904cd84fc","9629e70ae80485928a562adb978890c53c7be47c3b3624dbb82641e1da48fd2f","c33d86e1d4753d035c4ea8d0fdb2377043bc894e4227be3ceabc8e6a5411ab2e","f9ec74382c95cbc85804daf0e9dabed56511a6dfb72f8a2868aa46a0b9b5eafc","be32c0a0576265a4dee467f328c5945805a832e6268d312ed768cae1f2666fa6","af9692ce3b9db8b94dcfbaa672cb6a87472f8c909b83b5aeea043d6e53e8b107","782f2628a998fd03f4ccbe9884da532b8c9be645077556e235149ca9e6bd8c7d","269b7db8b769d5677f8d5d219e74ea2390b72ea2c65676b307e172e8f605a74a","ae731d469fae328ba73d6928e4466b72e3966f92f14cd1a711f9a489c6f93839","90878ed33999d4ff8da72bd2ca3efb1cde76d81940767adc8c229a70eb9332b2","d7236656e70e3a7005dba52aa27b2c989ba676aff1cab0863795ac6185f8d54f","e327901e9f31d1ad13928a95d95604ee4917d72ad96092da65612879d89aba42","868914e3630910e58d4ad917f44b045d05303adc113931e4b197357f59c3e93e","7d59adb080be18e595f1ce421fc50facd0073672b8e67abac5665ba7376b29b9","275344839c4df9f991bcf5d99c98d61ef3ce3425421e63eeb4641f544cb76e25","c4f1cc0bd56665694e010a6096a1d31b689fa33a4dd2e3aa591c4e343dd5181c","81c3d9b4d90902aa6b3cbd22e4d956b6eb5c46c4ea2d42c8ff63201c3e9676da","5bfc3a4bd84a6f4b992b3d285193a8140c80bbb49d50a98c4f28ad14d10e0acc","a7cf6a2391061ca613649bc3497596f96c1e933f7b166fa9b6856022b68783ab","864c844c424536df0f6f745101d90d69dd14b36aa8bd6dde11268bb91e7de88e","c74a70a215bbd8b763610f195459193ab05c877b3654e74f6c8881848b9ddb7f","3fa94513af13055cd79ea0b70078521e4484e576f8973e0712db9aab2f5dd436","48ffc1a6b67d61110c44d786d520a0cba81bb89667c7cdc35d4157263bfb7175","7cb4007e1e7b6192af196dc1dacd29a0c3adc44df23190752bef6cbbc94b5e0b","3d409649b4e73004b7561219ce791874818239913cac47accc083fad58f4f985","051908114dee3ca6d0250aacb0a4a201e60f458085177d5eda1fc3cde2e570f3","3744239074f9d681192bc60dea91e30360e28c96207f53d2e80d64956ac8e63a","d82609394127fb33eed0b58e33f8a0f55b62b21c2b6c10f1d7348b4781e392cb","b0f8a6436fbaf3fb7b707e2551b3029650bfaeb51d4b98e089e9a104d5b559b5","eae0ac4f87d56dcf9fbcf9314540cc1447e7a206eee8371b44afa3e2911e520c","b585e7131070c77b28cc682f9b1be6710e5506c196a4b6b94c3028eb865de4a7","b92ac4cc40d551450a87f9154a8d088e31cff02c36e81db2976d9ff070ba9929","6f99b4a552fbdc6afd36d695201712901d9b3f009e340db8b8d1d3415f2776f5","43700e8832b12f82e6f519b56fae2695e93bb18dddb485ddea6583a0d1482992","e8165ea64af5de7f400d851aeea5703a3b8ac021c08bebc958859d341fa53387","6db546ea3ced87efda943e6016c2a748e150941a0704af013dfe535936e820e1","f521c4293b6d8f097e885be50c2fef97de3dd512ad26f978360bb70c766e7eae","a0666dfd499f319cc51a1e6d9722ed9c830b040801427bbdd2984b73f98d292a","a7d86611d7882643dd8c529d56d2e2b698afd3a13a5adc2d9e8157b57927c0da","7e4615c366c93399f288c7bfbaa00a1dc123578be9d8ac96b15d489efc3f4851","f2e6c87a2c322ee1473cb0bd776eb20ee7bff041bc56619e5d245134ab73e83d","ee89bc94431b2dfaf6a7e690f8d9a5473b9d61de4ddcb637217d11229fe5b69f","a19c1014936f60281156dd4798395ad4ab26b7578b5a6a062b344a3e924a4333","5608be84dd2ca55fc6d9b6da43f67194182f40af00291198b6487229403a98fe","4a800f1d740379122c473c18343058f4bd63c3dffdef4d0edba668caa9c75f54","8e6868a58ca21e92e09017440fdb42ebfe78361803be2c1e7f49883b7113fdc2","2fbb72a22faefa3c9ae0dfb2a7e83d7b3d82ec625a74a8800a9da973511b0672","3e8c1a811bad9e5cd313c3d90c39a99867befa746098cdad81a9578ac3392541","d88f78b4e272864f414d98e5ed0996cd09f7a3bb01c5b7528320386f7383153d","0b9c34da2c6f0170e6a357112b91f2351712c5a537b76e42adfee9a91308b122","47adac87ec85a52ed2562cb4a3b441383551727ed802e471aa05c12e7cc7e27e","d1cacf181763c5d0960986f6d0abd1a36fc58fc06a707c9f5060b6b5526179ca","92610d503212366ff87801c2b9dc2d1bccfa427f175261a5c11331bc3588bb3f","805e2737ce5d94d7da549ed51dfa2e27c2f06114b19573687e9bde355a20f0ff","77fece0e88132fb5383810d303de6152ea8f2ff1ed2cd4ac1abd69a7fc570cc5","a37b576e17cf09938090a0e7feaec52d5091a1d2bbd73d7335d350e5f0e8be95","98971aa63683469692fef990fcba8b7ba3bae3077de26ac4be3e1545d09874b8","c6d36fa611917b6177e9c103a2719a61421044fb81cdd0accd19eba08d1b54de","77081112c1ca3ad1670df79cdfd28a1f2fd6334a593623aaf7268c353798e5c3","5eb39c56462b29c90cb373676a9a9a179f348a8684b85990367b3bbc6be5a6e9","d77a02413f5b0f845a39546255af68ab04c906b07c5f3385f9b6fb64fb75d5f1","731d07940d9b4313122e6cc58829ea57dcc5748003df9a0cad7eb444b0644685","b3ead4874138ce39966238b97f758fdb06f56a14df3f5e538d77596195ece0b5","032b40b5529f2ecce0524974dbec04e9c674278ae39760b2ee0d7fce1bb0b165","c25736b0cb086cd2afa4206c11959cb8141cea9700f95a766ad37c2712b7772b","033c269cd9631b3f56bb69a9f912c1f0d6f83cf2cff4d436ee1c98f6e655e3b5","bd6d692a4a950abbfabe29131420abe804e7f3cc187c3c451f9811e9cf4408ce","a9b6411417d4bffd9a89c41dc9dedda7d39fb4fa378eaa0ab55ec9ea1a94eb6a","1329e7cd7aca4d223ef5a088d82bc3f6f302ce70581c8d3823a050ea155eec3b","09248c76437c5b1efce189b4050c398f76a9385135af75c5fb46308b0d1432e0","b8df115bf7b30cceeb4550c0be507082b9930ee6268539a1a1aaffb0791cc299","dde00f41a2d2b1e70df6df8ac33de7cb3a658956212c7bee326245cc01c990c2","115d092e2748990ff0f67f376f47e9a45a2f21f7c7784102419c14b32c4362d1","bad694fd79dc34f31d401f890c05f5423232bff88f2c3aa8b14eb6c809d7eeda","5cd5a999e218c635ea6c3e0d64da34a0f112757e793f29bc097fd18b5267f427","cc14b99b4e1bbedab2e3fbf058ed95231d8ced691f0645f2a206c32464f1bd7b","e6db934da4b03c1f4f1da6f4165a981ec004e9e7d956c585775326b392d4d886","53e65282ab040a9f535f4ad2e3c8d8346034d8d69941370886d17055874b348d","6ecb85c8cbb289fe72e1d302684e659cc01ef76ae8e0ad01e8b2203706af1d56","35ab64ba795a16668247552da22f2efe1c5fbc5bc775392c534747be7f91df04","34283015304de5df8d6e3740b9bca58e40513ec6333b3fb0a3fa3aa4c43b856b","4a397c8a3d1cccf28751bcca469d57faeb637e76b74f6826e76ad66a3c57c7b8","34c1bb0d4cf216f2acb3d013ad2c79f906fe89ce829e23a899029dfa738f97e0","b70b5b3d14d125d6dcc16a9ac43cafe8801f644954ac36cb2918723f9cbbd4fe","b50f05738b1e82cbb7318eb35a7aaf25036f5585b75bbf4377cfa2bad15c40bf","c682cb23f38a786bb37901b3f64727bd3c6210292f5bb36f3b11b63fbe2b23ee","d6592cf10dc7797d138af32800d53ff4707fdcd6e053812ce701404f5f533351","997f6604cd3d35281083706aa2862e8181ed1929a6cbb004c087557d6c7f23c4","9584dd669a3bf285e079502ebbb683e7da0bf7f7c1eb3d63f6ef929350667541","41a10e2db052a8bf53ed4d933d9b4f5caa30bdaee5a9d978af95f6641ce44860","1dd236a02d5974092780f456750107a3158124002de00ca17342f3a4819e297b","652e51858bafd77e1abcc4d4e9d5e48cc4426c3dd2910021abd8cc664961e135","8c5c602045ffdfebeffc7a71cd2bf201fe147a371274b5fcbded765a92f2af78","6392ce794eef6f9b57818264bb0eeb24a46cf923f7695a957c15d3d087fbb6cc","b10f123e8100aa98723c133af16f1226a6360ec5b6990a0fe82b165d289549db","93d20368cdb5fff7f7398bfc9b2b474b2a2d5867277a0631a33b7db7fd53d5b4","b1e69b9834104482fabf7fba40e86a282ee10e0600ffd75123622f4610b0ef9e","ad5bb6c450cb574289db945ff82be103ed5d0ad8ee8c76164cee7999c695ae01","217761e8a5482b3ad20588a801521c2f5f9f7fb2fbb416d4eff3aff9b57f8471","7ad780687331f05998c62277d73b6f15ee3e8045b0187a515ffc49c0ad993606","e9aa5ccb42e118f5418721d2ac8c0ebdebeb9502007db9b4c1b7c9b8d493013e","d300868212b3cc4d13228f5dc2e9880d5959dc742c0c55be2fc43bcda8504c8f","0c55daad827669843bd2401f1ddd163b74d9f922680b08ae6e162ceb6c11b078","fe45a9bc654dfd1550c9466c0dad9c8017f2626476ed9d25c65ddfc1943f6b74","03abcbc7b5b68887525be71a194dd7f9f68276b5fb5b8989abae9a91585ddc33","5055e86e689cfe39104ab71298757e5aac839c2ea9d1f12299e76fa79303d47d","42266c387025558423c19d624f671352aac3e449c23906cb636f9ae317b72d7e","b8263f60855a11e955b7a229dd3554b9df204e03ce3f221079687a242545050b","af1af59e70d7cd03669420193574e8b8d2667213e1c874f17fcbf78e3e96d185","9b21e8a79f4213c1cf29f3c408f85a622f9eb6f4902549ccb9a2c00717a0b220","d556e498591413e254793f9d64d3108b369a97bd50f9dd4015b5552888e975ef","e2c652c7a45072e408c1749908ca39528d3a9a0eb6634a8999b8cf0e35ef20c8","ec08224b320739d26aaf61cead7f1e0f82e6581df0216f6fe048aa6f5042cb8c","4eadaa271acca9bd20fc6ac1ea5e4bf9ab6698b8ccf3ec07c33df4970f8130f1","3a0a397189726902c046697f7bf38fecb557a79d5a644aac9ec983024b4c3d17","46f1df33bc635aa84313579ff51a7269707b58a8a32728e4e5fc7ab47816b44a","5ecd8fdeb6c87db9c320eefbfa9ea27efccbdce853ed38d5ba58e2da482edf1f","19a4d116285e7d77e91411966930761a2204ce2d20915afdb12652681a4a88d7","c30ca82112586c5dae7477d7e82cc91a7e0d1e658c581f9ec3df07c4485bba84","68fca1813d17ee736f41124ccc958d0364cdef79ad1222951bfacc36b2630a58","7813329e568df1d42e5a6c52312b1a7c69700e35a561cf085158c345be155b22","561067dc7b6b7635277d3cad0a0e11f698d377063dd2c15dfac43ef78847eef4","438247e782a8a9b9abdce618e963667cf95157cc6d3f5194a452d3c7d9e9655c","253f79802f33f405c1807f33efa7d78e0a26143ee694297d4f8e1477c7ed5e28","f1e8eca509487806fdf979349cfcdb6ffdeb20f11b7e95666c4309d12dcd9ba6","83724b26b711d85d6cfc9dd92fd5d666ffaae27fcfb1a0110401b98814ea26c0","869a27c929366c3c864013a991fd4c4c86af73eba25513e8ae915f814d3d349c","756e3f41a7f2501a34e1a070283c7f5550e200eeb43fed3c806e3f2edd924a75","59935cc13dcb7c3c7825e770a61e6696bfd11b65e3e47c28acc410dbdf8461c0","85e2808cc73ab3ac07774802b34a6ff0d7e1e46c26de7bc2dbe08e04b3340edb","f766e5cdea938e0c9d214533fd4501ab0ee23ab4efca9edba334fa02d2869f11","eb380820a3a1feda3a182a3d078da18e0d5b7da08ae531ce11133a84b479678c","7fba5cc3088ad9acada3daeff52dae0f2cac8d84d19508abd78af5924dc96bea","14176cfdbc3d1d633ad9b5daf044ab4c7d0d73be61ca2f14388800e21f0989cd","648acdbcbcd01b1a91e8b0ad390ed59fada685977f44b90e148b65bd8159dfe8","8309898ba0ac6f2856a94a11723d499091253a6d5df34ddebc6149d43480bfd2","a317ae0eb092da3fd799d1717a2da319a74abebe85e2914cb259222969f95705","36d76e2dbd5f5243bd566b018c589e2ba707e34b24ec7d285feb11ba6bf23fbe","f780879a2ca63dbb59b36f772bc28dccd2840f1377d8d632e8c978b99c26a45f","335c2e013b572967a9a282a70f9dded38631189b992381f1df50e966c7f315d6","8b7a519edbd0b7654491300d8e3cbd2cb3ef921003569ca39ebd33e77479bb99","c90f8038c75600e55db93d97bab73c0ab8fb618d75392d1d1ad32e2f6e9c7908","ca083f3bf68e813b5bded56ecbf177636aa75833eb86c7b40e3d75b8ce4c2f78","3c8bf00283ef468da8389119d3f5662c81106e302c8810f40ea86b1018df647e","67b248e4bac845c5139898b44cbd3e1213674bcc9831039701b5f0f957243a24","63d49516f359186f7b3e3115f2c829ed75c319b34022c97b56beead032a073b7","9f5f256c7b5cc4a98ef557ea9720f81e96319d569f731c897ddb4514936242b4","a20ded6c920f6e566537e93d69cbad79bc57d7e3ce85686003078cf88c1c9cfc","40b2d781df7b4a76d33454cb917c3883655ec1d8d05424b7a80d01610ad5082f","703ea2acd8b4741248897a5709cd46e22fcd9d13f01ff3481322a86505f0b77c","e09c56f8c446225e061b53cb2f95fcbbc8555483ab29165f6b0f39bc82c8d773","51ebaff0cba6b3adf43f13b57bb731d56946cabd06d14cf9dfc7c5eaa8f95770","d5cb1de6b2e971bd60a936d95a0e0f99803b248c7dde1091cd9d21f992931543","6e2533e27eba5ff02d6eed37e0a7eb69ae7982e0f72fd8f74c90ab201f061867","58c62e415bf74b1423bf443587e33d7951a8bf19d7b03073f26e86d9b43ba9ea","dd6ec67ad168e92b8bf79ba975c6e0be8c60e403ba704d1c1b31a6059c12f967","bcaf468eea143f8e68ca40e5da58d640656b4f36697170c339042500be78ac5d","92de961d1db5fe075db8c0b6414a6eec430adaf9022465fe9d0a23f437aafcb3","ab8424a42a580a76317f4020d047f1732424066e22d198c47735b13727790cb1","7355edff7686f91edbca25e0fe9d6c3359df2520d48d3dc6d857aa47047f8ddf","9a4e56ec89f4716609ca2cb5b92798adbdbabd7167e2738f85597685d8211964","b25556c4111afad4cb174aa4674db2e5b23a6b191dc6a3e42c7c3417ea446a68","f9568a3a6c74013aee8b09d73ef04175596b51ce6f5d9dcd4885418170fe9306","bd3910ccd4fcd05ebd83fbfeb62f5a82a6674c85c6c0e4755c16298df7abe4d7","2bfad224656e6eea9e6e59683cd0b8468f557969dd3d3acdcaaf47ee3d295604","70137204b720e4dd1b81260a70578f0f4f417c53837f8a13859b2f58e20d7150","b28b6875a761fd153ebf120fecb359660de80fd36e90c9b3d72a12318bd5d789","65cb25590953015354787742ef5b08b24d9cb7a8bf13df3e72adec7b3d770099","a4709d5d466ad8dcf4ddccb905ad95348131df1616f964185be9739f96526bde","73b0fd6255f24e82be861f800a264f0175984062b6ccca3052578b03ed6f397b","4a3f7c6f02cb01eb7a9800548b41cfa03a57e476fc92a72869983f37efa8067a","a640f7a6345f4dec86a07f53ae796ba2afa0f48c2acac68232f0915f074a1593","2d2504ecfa6a5efa2e76415a645cc9fcd0a8b9ac70a597d608813bb07cf56a32","521df34d6543dfdb608fae4d6017f4c7693ad32bec6345f0f2926f0c575fcb79","fe994a451624e7926446cba80d287e6cc7899dad1b9c132cfe6b8420b751ba61","fc720f0e950c15c866dc9a52c255023e0fb022f68eed0e66f106239231f58d0d","24347163ad095588bd699effed48b4f3de1cefa94ac19d6d1e2657e2fcc6b914","a19eecfdd2553bc001ea7e2f42afc53d3da346fb084c72801848c01cd864abab","fc1069cca0b2f7a4c2e52fdad38c35758d8f8795bfcd6d7f4e2bb9fedac290ab","07e987a66e3602d3d30e47651f4242504ed612e12ef653f2a595f8aa024512e5","05816c44e52175b29c759301bbf2557120271a155a9f8e95b70d73b4e2654b7e","e398ebcb592512a3d7af9f0335b629f91c525719a37d7130ef6d508568209d5d","8b0b6a4c032a56d5651f7dd02ba3f05fbfe4131c4095093633cda3cae0991972","ff3c48a17bf10dfbb62448152042e4a48a56c9972059997ab9e7ed03b191809b","192a0c215bffe5e4ac7b9ff1e90e94bf4dfdad4f0f69a5ae07fccc36435ebb87","3ef8565e3d254583cced37534f161c31e3a8f341ff005c98b582c6d8c9274538","d7e42a3800e287d2a1af8479c7dd58c8663e80a01686cb89e0068be6c777d687","1098034333d3eb3c1d974435cacba9bd5a625711453412b3a514774fec7ca748","f2388b97b898a93d5a864e85627e3af8638695ebfa6d732ecd39d382824f0e63","6c6bd91368169cfa94b4f8cc64ebca2b050685ec76bc4082c44ce125b5530cca","f477375e6f0bf2a638a71d4e7a3da8885e3a03f3e5350688541d136b10b762a6","a44d6ea4dc70c3d789e9cef3cc42b79c78d17d3ce07f5fd278a7e1cbe824da56","a74519588a22a1c254c2853ba4dc82d0dfc1da22ad7ac7fd6feb6a91236ef5d1","c93d8bc910212402ef392e810dd28b1e6d5148f2a78137d6a0a04db5db3bc156","875c43c5409e197e72ee517cb1f8fd358406b4adf058dbdc1e50c8db93d68f26","8854713984b9588eac1cab69c9e2a6e1a33760d9a2d182169059991914dd8577","e333d487ca89f26eafb95ea4b59bea8ba26b357e9f2fd3728be81d999f9e8cf6","2f554c6798b731fc39ff4e3d86aadc932fdeaa063e3cbab025623ff5653c0031","fe4613c6c0d23edc04cd8585bdd86bc7337dc6265fb52037d11ca19eeb5e5aaf","53b26fbee1a21a6403cf4625d0e501a966b9ccf735754b854366cee8984b711c","30676a61ef0eca261117e20257cd3ac49803301afc9a29c543abf34930202933","981379335e8bb8e39196931acc39ff446922c964ac0998b61caac8e242068d31","8c59d8256086ed17676139ee43c1155673e357ab956fb9d00711a7cac73e059d","cfe88132f67aa055a3f49d59b01585fa8d890f5a66a0a13bb71973d57573eee7","53ce488a97f0b50686ade64252f60a1e491591dd7324f017b86d78239bd232ca","50fd11b764194f06977c162c37e5a70bcf0d3579bf82dd4de4eee3ac68d0f82f","e0ceb647dcdf6b27fd37e8b0406c7eafb8adfc99414837f3c9bfd28ffed6150a","99579aa074ed298e7a3d6a47e68f0cd099e92411212d5081ce88344a5b1b528d","d2d58166965f631fa203f405f3713b0f86f1f8b80755e9daea43057a25311e16","ce7dbf31739cc7bca35ca50e4f0cbd75cd31fd6c05c66841f8748e225dc73aaf","942ab34f62ac3f3d20014615b6442b6dc51815e30a878ebc390dd70e0dec63bf","7a671bf8b4ad81b8b8aea76213ca31b8a5de4ba39490fbdee249fc5ba974a622","8e07f13fb0f67e12863b096734f004e14c5ebfd34a524ed4c863c80354c25a44","6f6bdb523e5162216efc36ebba4f1ef8e845f1a9e55f15387df8e85206448aee","aa2d6531a04d6379318d29891de396f61ccc171bfd2f8448cc1649c184becdf2","d422f0c340060a53cb56d0db24dd170e31e236a808130ab106f7ab2c846f1cdb","424403ef35c4c97a7f00ea85f4a5e2f088659c731e75dbe0c546137cb64ef8d8","16900e9a60518461d7889be8efeca3fe2cbcd3f6ce6dee70fea81dfbf8990a76","6daf17b3bd9499bd0cc1733ab227267d48cd0145ed9967c983ccb8f52eb72d6e","e4177e6220d0fef2500432c723dbd2eb9a27dcb491344e6b342be58cc1379ec0","ab710f1ee2866e473454a348cffd8d5486e3c07c255f214e19e59a4f17eece4d","db7ff3459e80382c61441ea9171f183252b6acc82957ecb6285fff4dca55c585","4a168e11fe0f46918721d2f6fcdb676333395736371db1c113ae30b6fde9ccd2","2a899aef0c6c94cc3537fe93ec8047647e77a3f52ee7cacda95a8c956d3623fb","ef2c1585cad462bdf65f2640e7bcd75cd0dbc45bae297e75072e11fe3db017fa","6a52170a5e4600bbb47a94a1dd9522dca7348ce591d8cdbb7d4fe3e23bbea461","6f6eadb32844b0ec7b322293b011316486894f110443197c4c9fbcba01b3b2fa","a51e08f41e3e948c287268a275bfe652856a10f68ddd2bf3e3aaf5b8cdb9ef85","16c144a21cd99926eeba1605aec9984439e91aa864d1c210e176ca668f5f586a","af48a76b75041e2b3e7bd8eed786c07f39ea896bb2ff165e27e18208d09b8bee","ef1aa3da0d6bc679154169c3830ab65441b615641a6e982410ee3cbdc66fa290","deb092bc337b2cb0a1b14f3d43f56bc663e1447694e6d479d6df8296bdd452d6","aa4e4a68ce82cb642b78a1efa5768fb717ba3a019641d161c803a09c748813d1","77165b117f552be305d3bc2ef83424ff1e67afb22bfabd14ebebb3468c21fcaa","128e7c2ffd37aa29e05367400d718b0e4770cefb1e658d8783ec80a16bc0643a","076ac4f2d642c473fa7f01c8c1b7b4ef58f921130174d9cf78430651f44c43ec","396c1e5a39706999ec8cc582916e05fcb4f901631d2c192c1292e95089a494d9","89df75d28f34fc698fe261f9489125b4e5828fbd62d863bbe93373d3ed995056","8ccf5843249a042f4553a308816fe8a03aa423e55544637757d0cfa338bb5186","93b44aa4a7b27ba57d9e2bad6fb7943956de85c5cc330d2c3e30cd25b4583d44","a0c6216075f54cafdfa90412596b165ff85e2cadd319c49557cc8410f487b77c","3c359d811ec0097cba00fb2afd844b125a2ddf4cad88afaf864e88c8d3d358bd","d8ec19be7d6d3950992c3418f3a4aa2bcad144252bd7c0891462b5879f436e4e","f0a6974a1b5d0ceb79f5a589373cc2a291bd80a765eb2d799db6d8d51f2c2462","d62f09256941e92a95b78ae2267e4cf5ff2ca8915d62b9561b1bc85af1baf428","e6223b7263dd7a49f4691bf8df2b1e69f764fb46972937e6f9b28538d050b1ba","2daf06d8e15cbca27baa6c106253b92dad96afd87af9996cf49a47103b97dc95","1db014db736a09668e0c0576585174dbcfd6471bb5e2d79f151a241e0d18d66b","8a153d30edde9cefd102e5523b5a9673c298fc7cf7af5173ae946cbb8dd48f11","abaaf8d606990f505ee5f76d0b45a44df60886a7d470820fcfb2c06eafa99659","8109e0580fc71dbefd6091b8825acf83209b6c07d3f54c33afeafab5e1f88844","d92a80c2c05cf974704088f9da904fe5eadc0b3ad49ddd1ef70ca8028b5adda1","fbd7450f20b4486c54f8a90486c395b14f76da66ba30a7d83590e199848f0660","ece5b0e45c865645ab65880854899a5422a0b76ada7baa49300c76d38a530ee1","62d89ac385aeab821e2d55b4f9a23a277d44f33c67fefe4859c17b80fdb397ea","fdf7c509d71aa2449602687f9689ce294510985f701e97b014f5aef69f5cbec7","fb8dd49a4cd6d802be4554fbab193bb06e2035905779777f32326cb57cf6a2c2","df29ade4994de2d9327a5f44a706bbe6103022a8f40316839afa38d3e078ee06","82d3e00d56a71fc169f3cf9ec5f5ffcc92f6c0e67d4dfc130dafe9f1886d5515","f06737e21dd482dc9ea719299a665460aaa9d0f185c7302703468f46002cc16e","4c30a5cb3097befb9704d16aa4670e64e39ea69c5964a1433b9ffd32e1a5a3a1","1b33478647aa1b771314745807397002a410c746480e9447db959110999873ce","7b3a5e25bf3c51af55cb2986b89949317aa0f6cbfb5317edd7d4037fa52219a9","b4f1cc43cdf2f75f62ea43ab32ac29e26649920906712d9605cef4849f48065b","9fac6ebf3c60ced53dd21def30a679ec225fc3ff4b8d66b86326c285a4eebb5a","f3372851e708211ee805349e38c96a7c89dc797ca7ca711c380a55e851c2c4bd","07bc8a3551e39e70c38e7293b1a09916867d728043e352b119f951742cb91624","e47adc2176f43c617c0ab47f2d9b2bb1706d9e0669bf349a30c3fe09ddd63261","7fec79dfd7319fec7456b1b53134edb54c411ba493a0aef350eee75a4f223eeb","189c489705bb96a308dcde9b3336011d08bfbca568bcaf5d5d55c05468e9de7a","98f4b1074567341764b580bf14c5aabe82a4390d11553780814f7e932970a6f7","dadfa5fd3d5c511ca6bfe240243b5cf2e0f87e44ea63e23c4b2fce253c0d4601","2e252235037a2cd8feebfbf74aa460f783e5d423895d13f29a934d7655a1f8be","763f4ac187891a6d71ae8821f45eef7ff915b5d687233349e2c8a76c22b3bf2a","8742967cd9e11068032850a4f9ccfb446983be9eef65bcde81c43797d6fccd4c","7e49f40350bf14fb4cb4d813d899b344ad4c06d437c5b451e5de166f949be946","cc957354aa3c94c9961ebf46282cfde1e81d107fc5785a61f62c67f1dd3ac2eb","a2e86df4db576d80704e25293cec6f20fc6101a11f4747440e2eef58fb3c860c","93de1c6dab503f053efe8d304cb522bb3a89feab8c98f307a674a4fae04773e9","6704f0b54df85640baaeebd86c9d4a1dbb661d5a4d57a75bc84162f562f6531d","9d255af1b09c6697089d3c9bf438292a298d8b7a95c68793c9aae80afc9e5ca7","82819f9ecc249a6a3e284003540d02ea1b1f56f410c23231797b9e1e4b9622df","afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","8d48b8f8a377ade8dd1f000625bc276eea067f2529cc9cafdf082d17142107d6",{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true},"bee89e1eb6425eb49894f3f25e4562dc2564e84e5aa7610b7e13d8ecddf8f5db","dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","facc7572c3330810ff4728113a324790679d4ed41fbd9e371028f08f1cad29f3","e050a0afcdbb269720a900c85076d18e0c1ab73e580202a2bf6964978181222a","84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","c7da551241b7be719b7bd654ab12a5098c3206fbb189076dd2d8871011a6ab5a",{"version":"4aed81e1115540695f896fa93fb22840fe06086741e94c6859e745f173498213","affectsGlobalScope":true},"f463d61cf39c3a6a5f96cdf7adfdb72a0b1d663f7b5d5b6dd042adba835430c2","f7a9cb83c8fbc081a8b605880d191e0d0527cde2c1b2b2b623beca8f0203a2cd","43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","bf88ef4208a770ca39a844b182b3695df536326ea566893fdc5b8418702a331e","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","7eb06594824ada538b1d8b48c3925a83e7db792f47a081a62cf3e5c4e23cf0ee","f5638f7c2f12a9a1a57b5c41b3c1ea7db3876c003bab68e6a57afd6bcc169af0","cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec",{"version":"1fe4f59d471c69fd533049505081f7e5d6d56486416b12aafb22ba9616034ab7","affectsGlobalScope":true},"2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b","2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","55e103448f452988dbdf65e293607c77fb91a967744bad2a72f1a36765e7e88d","7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","3865ef9eb6900d3efa27d96edf3576bd52fe57c2ff3247daf00f575d32626719","b0d10e46cfe3f6c476b69af02eaa38e4ccc7430221ce3109ae84bb9fb8282298","8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","214f291323316651737db8ca0db4c14ae568a429e59fc5b4f364dd80fe72d5f6","76232dbb982272b182a76ad8745a9b02724dc9896e2328ce360e2c56c64c9778","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","e9eb1b173aa166892f3eddab182e49cfe59aa2e14d33aedb6b49d175ed6a3750"],"root":[456,459,[838,843],845,846,940],"options":{"allowSyntheticDefaultImports":true,"declaration":true,"emitDecoratorMetadata":true,"experimentalDecorators":true,"module":1,"noFallthroughCasesInSwitch":false,"noImplicitAny":false,"outDir":"./","removeComments":true,"skipLibCheck":true,"sourceMap":true,"strictBindCallApply":false,"strictNullChecks":false,"target":8},"fileIdsList":[[334,941],[334],[334,969],[334,360],[334,455],[56,334,361,362,363,364,365,366,367,368,369,370,371,372,373],[259,334,347],[266,334],[256,334,360,455],[334,378,379,380,381,382,383,384,385],[261,334],[334,360,455],[334,374,377,386],[334,375,376],[334,351],[261,262,263,264,334],[334,388],[279,334],[334,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409],[334,414],[334,411,412],[322,334,341,413],[55,265,334,360,387,410,415,422,445,450,452,454],[61,259,334],[60,334],[61,251,252,334,878,883],[251,259,334],[60,250,334],[259,334,424],[253,334,426],[250,254,334],[60,334,360],[258,259,334],[271,334],[273,274,275,276,277,334],[265,334],[265,266,281,285,334],[279,280,286,287,334,342],[334,341],[57,58,59,60,61,251,252,253,254,255,256,257,258,259,260,266,271,272,278,285,334,343,344,345,347,355,356,357,358,359],[284,334],[267,268,269,270,334],[259,267,268,334],[259,265,266,334],[259,269,334],[259,334,351],[334,346,348,349,350,351,352,353,354],[57,259,334],[334,347],[57,259,334,346,350,352],[268,334],[334,348],[259,334,347,348,349],[283,334],[259,263,283,334,355],[281,282,284,334],[255,257,266,272,281,286,334,356,357,360],[61,255,257,260,334,356,357],[264,334],[250,334],[283,334,360,416,420],[334,420,421],[334,360,416],[334,360,416,417],[334,417,418],[334,417,418,419],[260,334],[334,437,438],[334,437],[334,438,439,440,441,442,443],[334,436],[334,428,438],[334,438,439,440,441,442],[260,334,437,438,441],[334,423,429,430,431,432,433,434,435,444],[260,334,360,429],[260,334,428],[260,334,428,455],[253,259,260,334,424,425,426,427,428],[250,334,360,424,425,446],[334,360,424],[334,448],[334,387,446],[334,446,447,449],[283,334,451],[334,346],[265,334,360],[334,453],[281,285,334,360,455],[334,847],[334,360,455,867,868],[334,849],[334,455,861,866,867],[334,871,872],[61,334,360,862,867,881],[334,455,848,874],[60,334,455,875,878],[334,360,862,867,869,880,882,886],[60,334,884,885],[334,875],[250,334,360,455,889],[334,360,455,862,867,869,881],[334,888,890,891],[334,360,867],[334,867],[334,360,455,889],[60,334,360,455],[334,360,455,861,862,867,887,889,892,895,900,901,914,915],[334,874,877,916],[334,901,913],[55,334,848,869,870,873,876,908,913,917,920,924,925,926,928,930,936,938],[334,360,455,855,863,866,867],[334,360,859],[334,360,455,849,858,859,860,861,866,867,869,939],[334,861,862,865,867,903,912],[334,360,455,854,866,867],[334,902],[334,455,862,867],[334,455,855,862,866,907],[334,360,455,849,854,866],[334,455,860,861,865,905,909,910,911],[334,455,855,862,863,864,866,867],[259,334,455],[334,360,849,862,865,867],[334,866],[334,851,852,853,862,866,867,906],[334,858,907,918,919],[334,455,849,867],[334,455,849],[334,850,851,852,853,856,858],[334,855],[334,857,858],[334,455,850,851,852,853,856,857],[334,893,894],[334,360,862,867,869,881],[334,904],[334,344],[271,334,360,921,922],[334,923],[334,360,869],[334,360,862,869],[284,334,360,455,855,862,863,864,866,867],[281,283,334,360,455,848,862,869,907,925],[284,285,334,455,847,927],[334,897,898,899],[334,455,896],[334,929],[321,334,341,455],[334,932,934,935],[334,931],[334,933],[334,455,861,866,932],[334,879],[334,360,455,849,862,866,867,869,904,905,907,908],[334,937],[334,941,942,943,944,945],[334,941,943],[307,334,341,947],[307,334,341],[334,951,953],[334,950,951,952],[304,307,334,341,956,957,958],[334,948,958,959,961],[305,334,341],[334,964],[334,965],[334,971,974],[288,334],[291,334],[292,297,325,334],[293,304,305,312,322,333,334],[293,294,304,312,334],[295,334],[296,297,305,313,334],[297,322,330,334],[298,300,304,312,334],[299,334],[300,301,334],[304,334],[302,304,334],[304,305,306,322,333,334],[304,305,306,319,322,325,334],[334,338],[300,304,307,312,322,333,334],[304,305,307,308,312,322,330,333,334],[307,309,322,330,333,334],[288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340],[304,310,334],[311,333,334,338],[300,304,312,322,334],[313,334],[314,334],[291,315,334],[316,332,334,338],[317,334],[318,334],[304,319,320,334],[319,321,334,336],[292,304,322,323,324,325,334],[292,322,324,334],[322,323,334],[325,334],[326,334],[291,322,334],[304,328,329,334],[328,329,334],[297,312,322,330,334],[331,334],[312,332,334],[292,307,318,333,334],[297,334],[322,334,335],[311,334,336],[334,337],[292,297,304,306,315,322,333,334,336,338],[322,334,339],[334,977,1016],[334,977,1001,1016],[334,1016],[334,977],[334,977,1002,1016],[334,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015],[334,1002,1016],[305,322,334,341,955],[307,334,341,955,960],[292,305,307,322,334,341,949],[334,1019],[334,1021],[334,967,973],[334,971],[334,968,972],[334,970],[62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,78,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133,134,135,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,181,182,183,185,194,196,197,198,199,200,201,203,204,206,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,334],[107,334],[63,66,334],[65,334],[65,66,334],[62,63,64,66,334],[63,65,66,223,334],[66,334],[62,65,107,334],[65,66,223,334],[65,231,334],[63,65,66,334],[75,334],[98,334],[119,334],[65,66,107,334],[66,114,334],[65,66,107,125,334],[65,66,125,334],[66,166,334],[66,107,334],[62,66,184,334],[62,66,185,334],[207,334],[191,193,334],[202,334],[191,334],[62,66,184,191,192,334],[184,185,193,334],[205,334],[62,66,191,192,193,334],[64,65,66,334],[62,66,334],[63,65,185,186,187,188,334],[107,185,186,187,188,334],[185,187,334],[65,186,187,189,190,194,334],[62,65,334],[66,209,334],[67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,108,109,110,111,112,113,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,334],[195,334],[334,521,639],[334,466,837],[334,524],[334,627],[334,623,627],[334,623],[334,481,517,518,519,520,522,523,627],[334,466,467,476,481,518,522,525,529,559,576,577,579,581,585,586,587,588,623,624,625,626,632,639,658],[334,590,592,594,595,604,606,607,608,609,610,611,612,614,616,617,618,619,622],[334,470,472,473,503,740,741,742,743,744,745],[334,473],[334,470,473],[334,749,750,751],[334,758],[334,470,756],[334,786],[334,774],[334,517],[334,773],[334,471],[334,470,471,472],[334,509],[334,505],[334,470],[334,461,462,463],[334,502],[334,461],[334,837],[334,470,471],[334,506,507],[334,464,466],[334,658],[334,629,630],[334,462],[334,793],[334,524,613],[330,334],[334,524,589],[334,462,463,470,476,478,480,494,495,496,499,500,524,525,527,528,632,638,639],[334,524,535],[334,478,480,498,525,527,534,535,549,561,565,569,576,627,636,638,639],[300,312,330,334,533,534],[334,524,591],[334,524,605],[334,524,593],[334,524,615],[334,620,621],[334,497],[334,596,597,598,599,600,601,602],[334,524,603],[334,466,467,476,535,537,541,542,543,544,545,571,573,574,575,577,579,580,581,583,584,586,627,639,658],[334,467,476,494,535,538,542,546,547,570,571,573,574,575,585,627,632],[334,585,627,639],[334,516],[334,470,471,503],[334,501,504,508,509,510,511,512,513,514,515,837],[334,460,461,462,463,467,505,506,507],[334,675],[334,632,675],[334,470,494,520,675],[334,467,675],[334,588,675],[334,675,676,677,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738],[334,483,675],[334,483,632,675],[334,675,679],[334,529,675],[334,532],[334,541],[334,530,537,538,539,540],[334,471,476,531],[334,535],[334,476,541,542,578,632,658],[334,532,535,536],[334,546],[334,476,541],[334,532,536],[334,476,532],[334,466,467,476,576,577,579,585,586,623,624,627,658,670,671],[55,334,464,466,467,470,471,473,476,477,478,479,481,501,502,504,505,507,508,509,516,517,518,519,520,523,525,526,527,529,530,531,532,535,536,537,538,539,540,541,542,543,544,545,548,549,550,551,552,553,554,555,556,557,558,559,562,565,566,569,572,573,574,575,576,577,578,579,585,586,587,588,623,627,632,635,636,637,638,639,649,650,651,652,654,655,656,657,658,671,672,673,674,739,746,747,748,752,753,754,755,757,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,787,788,789,790,791,792,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,824,825,826,827,828,829,830,831,832,834,836],[334,518,519,639],[334,518,639,818],[334,518,519,639,818],[334,639],[334,518],[334,473,474],[334,488],[334,467],[334,661],[334,469,475,484,485,489,491,563,567,628,631,633,659,660,661,662,663,664,665,666,667,668,669],[334,460,464,465,468],[334,509,510,837],[334,481,563,632],[334,470,471,475,476,483,493,627,632],[334,483,484,486,487,490,492,494,627,632,634],[334,476,488,489,493,632],[334,476,482,483,486,487,490,492,493,494,509,510,564,568,627,628,629,630,631,634,837],[334,481,567,632],[334,461,462,463,481,494,632],[334,481,493,494,632,633],[334,483,632,658,659],[334,476,483,485,632,658],[334,460,461,462,463,465,469,476,482,493,494,632],[334,494],[334,461,481,491,493,494,632],[334,587],[334,588,627,639],[334,481,638],[334,481,830],[334,480,638],[334,476,483,494,632,678],[334,483,494,679],[304,305,322,334],[334,632],[334,650],[334,467,476,575,627,639,649,650,657],[334,528],[334,467,476,494,571,573,582,657],[334,483,627,632,641,648],[334,649],[334,467,476,494,529,571,627,632,639,640,641,647,648,649,651,652,653,654,655,656,658],[334,476,483,494,509,528,627,632,640,641,642,643,644,645,646,647,657],[334,476],[334,483,632,648,658],[334,476,483,627,639,658],[334,476,657],[334,572],[334,476,572],[334,467,476,483,509,534,537,538,539,540,542,632,639,645,646,648,649,650,657],[334,467,476,509,574,627,639,649,650,657],[334,476,632],[334,476,509,571,574,627,639,649,650,657],[334,476,649],[334,476,478,480,498,525,527,534,549,561,565,569,572,581,585,627,636,638],[334,466,476,579,585,586,658],[334,467,535,537,541,542,543,544,545,571,573,574,575,583,584,586,658,823],[334,476,535,541,542,546,547,576,586,639,658],[334,467,476,535,537,541,542,543,544,545,571,573,574,575,583,584,585,639,658,837],[334,476,578,586,658],[334,528,582],[334,477,526,548,562,566,635],[334,477,494,498,499,627,632,639],[334,498],[334,478,527,529,549,565,569,632,636,637],[334,562,564],[334,477],[334,566,568],[334,482,526,529],[334,634,635],[334,492,548],[334,479,837],[334,476,483,494,559,560,632,639],[334,550,551,552,553,554,555,556,557,558],[334,585,627,632,639],[334,554],[334,476,483,494,585,627,632,639],[334,478,480,494,497,517,527,532,536,549,565,569,576,624,632,636,638,649,651,652,653,654,655,656,658,679,823,824,825,833],[334,585,632,835],[334,455,456,840,841],[334,455,456,842],[334,844,845],[314,334,457,459,838,839],[334,458],[334,843,939],[314,334,457,459]],"referencedMap":[[943,1],[941,2],[457,2],[967,2],[970,3],[849,2],[372,2],[56,2],[361,4],[362,4],[363,2],[364,5],[374,6],[365,2],[366,7],[367,2],[368,2],[369,4],[370,4],[371,4],[373,8],[381,9],[383,2],[380,2],[386,10],[384,2],[382,2],[378,11],[379,12],[385,2],[387,13],[375,2],[377,14],[376,15],[262,2],[265,16],[261,2],[896,2],[263,2],[264,2],[404,17],[389,17],[396,17],[393,17],[406,17],[397,17],[403,17],[388,18],[407,17],[410,19],[401,17],[391,17],[409,17],[394,17],[392,17],[402,17],[398,17],[408,17],[395,17],[405,17],[390,17],[400,17],[399,17],[415,20],[413,21],[412,2],[411,2],[414,22],[455,23],[57,2],[58,2],[59,2],[878,24],[61,25],[884,26],[883,27],[251,28],[252,25],[424,2],[281,2],[282,2],[425,29],[253,2],[426,2],[427,30],[60,2],[255,31],[256,2],[254,32],[257,31],[258,2],[260,33],[272,34],[273,2],[278,35],[274,2],[275,2],[276,2],[277,2],[279,2],[280,36],[286,37],[343,38],[287,2],[342,39],[360,40],[344,2],[345,2],[927,41],[271,42],[269,43],[267,44],[268,45],[270,2],[352,46],[346,2],[355,47],[348,48],[353,49],[351,50],[354,51],[349,52],[350,53],[284,54],[356,55],[285,56],[358,57],[359,58],[347,2],[259,2],[266,59],[357,60],[421,61],[416,2],[422,62],[417,63],[418,64],[419,65],[420,66],[423,67],[439,68],[438,69],[444,70],[436,2],[437,71],[440,68],[441,72],[443,73],[442,74],[445,75],[430,76],[431,77],[434,78],[433,78],[432,77],[435,77],[429,79],[447,80],[446,81],[449,82],[448,83],[450,84],[451,54],[452,85],[283,2],[453,86],[428,87],[454,88],[847,89],[848,90],[869,91],[870,92],[871,2],[872,93],[873,94],[882,95],[875,96],[879,97],[887,98],[885,5],[886,99],[876,100],[888,2],[890,101],[891,102],[892,103],[881,104],[877,105],[901,106],[889,107],[916,108],[874,90],[917,109],[914,110],[915,5],[939,111],[864,112],[860,113],[862,114],[913,115],[855,116],[903,117],[902,2],[863,118],[910,119],[867,120],[911,2],[912,121],[865,122],[859,123],[866,124],[861,125],[854,2],[907,126],[920,127],[918,5],[850,5],[906,128],[851,12],[852,92],[853,129],[857,130],[856,131],[919,132],[858,133],[895,134],[893,101],[894,135],[904,12],[905,136],[908,137],[923,138],[924,139],[921,140],[922,141],[925,142],[926,143],[928,144],[900,145],[897,146],[898,4],[899,135],[930,147],[929,148],[936,149],[868,5],[932,150],[931,5],[934,151],[933,2],[935,152],[880,153],[909,154],[938,155],[937,5],[969,2],[946,156],[942,1],[944,157],[945,1],[948,158],[947,159],[949,2],[954,160],[950,2],[953,161],[951,2],[959,162],[962,163],[963,164],[960,2],[964,2],[965,165],[966,166],[975,167],[952,2],[955,2],[288,168],[289,168],[291,169],[292,170],[293,171],[294,172],[295,173],[296,174],[297,175],[298,176],[299,177],[300,178],[301,178],[303,179],[302,180],[304,179],[305,181],[306,182],[290,183],[340,2],[307,184],[308,185],[309,186],[341,187],[310,188],[311,189],[312,190],[313,191],[314,192],[315,193],[316,194],[317,195],[318,196],[319,197],[320,197],[321,198],[322,199],[324,200],[323,201],[325,202],[326,203],[327,204],[328,205],[329,206],[330,207],[331,208],[332,209],[333,210],[334,211],[335,212],[336,213],[337,214],[338,215],[339,216],[976,2],[958,2],[957,2],[1001,217],[1002,218],[977,219],[980,219],[999,217],[1000,217],[990,217],[989,220],[987,217],[982,217],[995,217],[993,217],[997,217],[981,217],[994,217],[998,217],[983,217],[984,217],[996,217],[978,217],[985,217],[986,217],[988,217],[992,217],[1003,221],[991,217],[979,217],[1016,222],[1015,2],[1010,221],[1012,223],[1011,221],[1004,221],[1005,221],[1007,221],[1009,221],[1013,223],[1014,223],[1006,223],[1008,223],[956,224],[961,225],[1017,2],[1019,226],[1020,227],[1021,2],[1022,228],[458,2],[1018,2],[968,2],[974,229],[972,230],[973,231],[971,232],[55,2],[250,233],[223,2],[201,234],[199,234],[249,235],[214,236],[213,236],[114,237],[65,238],[221,237],[222,237],[224,239],[225,237],[226,240],[125,241],[227,237],[198,237],[228,237],[229,242],[230,237],[231,236],[232,243],[233,237],[234,237],[235,237],[236,237],[237,236],[238,237],[239,237],[240,237],[241,237],[242,244],[243,237],[244,237],[245,237],[246,237],[247,237],[64,235],[67,240],[68,240],[69,240],[70,240],[71,240],[72,240],[73,240],[74,237],[76,245],[77,240],[75,240],[78,240],[79,240],[80,240],[81,240],[82,240],[83,240],[84,237],[85,240],[86,240],[87,240],[88,240],[89,240],[90,237],[91,240],[92,240],[93,240],[94,240],[95,240],[96,240],[97,237],[99,246],[98,240],[100,240],[101,240],[102,240],[103,240],[104,244],[105,237],[106,237],[120,247],[108,248],[109,240],[110,240],[111,237],[112,240],[113,240],[115,249],[116,240],[117,240],[118,240],[119,240],[121,240],[122,240],[123,240],[124,240],[126,250],[127,240],[128,240],[129,240],[130,237],[131,240],[132,251],[133,251],[134,251],[135,237],[136,240],[137,240],[138,240],[143,240],[139,240],[140,237],[141,240],[142,237],[144,240],[145,240],[146,240],[147,240],[148,240],[149,240],[150,237],[151,240],[152,240],[153,240],[154,240],[155,240],[156,240],[157,240],[158,240],[159,240],[160,240],[161,240],[162,240],[163,240],[164,240],[165,240],[166,240],[167,252],[168,240],[169,240],[170,240],[171,240],[172,240],[173,240],[174,237],[175,237],[176,237],[177,237],[178,237],[179,240],[180,240],[181,240],[182,240],[200,253],[248,237],[185,254],[184,255],[208,256],[207,257],[203,258],[202,257],[204,259],[193,260],[191,261],[206,262],[205,259],[192,2],[194,263],[107,264],[63,265],[62,240],[197,2],[189,266],[190,267],[187,2],[188,268],[186,240],[195,269],[66,270],[215,2],[216,2],[209,2],[212,236],[211,2],[217,2],[218,2],[210,271],[219,2],[220,2],[183,272],[196,273],[522,274],[521,2],[543,2],[467,275],[523,2],[476,2],[466,2],[584,2],[674,2],[620,276],[828,277],[671,278],[827,279],[826,279],[673,2],[524,280],[627,281],[623,282],[823,278],[795,2],[746,283],[747,284],[748,284],[760,284],[753,285],[752,286],[754,284],[755,284],[759,287],[757,288],[787,289],[784,2],[783,290],[785,284],[798,291],[796,2],[797,2],[792,292],[761,2],[762,2],[765,2],[763,2],[764,2],[766,2],[767,2],[770,2],[768,2],[769,2],[771,2],[772,2],[472,293],[743,2],[742,2],[744,2],[741,2],[473,294],[740,2],[745,2],[774,295],[773,2],[505,2],[506,296],[507,296],[751,297],[749,297],[750,2],[464,298],[503,299],[793,300],[471,2],[758,293],[786,301],[756,302],[775,296],[776,303],[777,304],[778,304],[779,304],[780,304],[781,305],[782,305],[791,306],[790,2],[788,2],[789,307],[794,308],[613,2],[614,309],[617,276],[618,276],[619,276],[589,310],[590,311],[608,276],[529,312],[612,276],[533,2],[607,313],[570,314],[535,315],[591,2],[592,316],[611,276],[605,2],[606,317],[593,310],[594,318],[497,2],[610,276],[615,2],[616,319],[621,2],[622,320],[498,321],[595,276],[609,276],[597,2],[598,2],[599,2],[600,2],[601,2],[596,2],[602,2],[825,2],[603,322],[604,323],[470,2],[495,2],[520,2],[500,2],[502,2],[581,2],[496,297],[525,2],[528,2],[585,324],[576,325],[624,326],[517,327],[512,2],[504,328],[832,291],[513,2],[501,2],[514,284],[516,329],[515,305],[508,330],[511,300],[677,331],[700,331],[681,331],[684,332],[686,331],[736,331],[712,331],[676,331],[704,331],[733,331],[683,331],[713,331],[698,331],[701,331],[689,331],[723,333],[718,331],[711,331],[693,334],[692,334],[709,332],[719,331],[738,335],[739,336],[724,337],[715,331],[696,331],[682,331],[685,331],[717,331],[702,332],[710,331],[707,338],[725,338],[708,332],[694,331],[720,331],[703,331],[737,331],[727,331],[714,331],[735,331],[716,331],[695,331],[731,331],[721,331],[697,331],[726,331],[734,331],[699,331],[722,334],[705,331],[730,339],[680,339],[691,331],[690,331],[688,340],[675,2],[687,331],[732,338],[728,338],[706,338],[729,338],[536,341],[542,342],[541,343],[532,344],[531,2],[540,345],[539,345],[538,345],[817,346],[537,347],[578,2],[530,2],[547,348],[546,349],[799,341],[800,341],[801,341],[802,341],[803,341],[804,341],[805,350],[810,341],[806,341],[807,341],[816,341],[808,341],[809,341],[811,341],[812,341],[813,341],[814,341],[815,351],[509,2],[672,352],[837,353],[818,354],[819,355],[821,356],[518,357],[519,358],[820,355],[563,2],[475,359],[665,2],[484,2],[489,360],[666,361],[663,2],[567,2],[669,2],[633,2],[664,284],[661,2],[662,362],[670,363],[660,2],[659,305],[485,305],[469,364],[628,365],[667,2],[668,2],[631,306],[474,2],[491,300],[564,366],[494,367],[493,368],[490,369],[632,370],[568,371],[482,372],[634,373],[487,374],[486,375],[483,376],[630,377],[461,2],[488,2],[462,2],[463,2],[465,2],[468,361],[460,2],[510,2],[629,2],[492,378],[588,379],[829,380],[587,357],[830,381],[831,382],[481,383],[679,384],[678,385],[534,386],[641,387],[649,388],[652,389],[582,390],[654,391],[642,392],[656,393],[657,394],[640,2],[648,395],[571,396],[644,397],[643,397],[626,398],[625,398],[655,399],[575,400],[573,401],[574,401],[645,2],[658,402],[646,2],[653,403],[580,404],[651,405],[647,2],[650,406],[572,2],[639,407],[822,408],[824,409],[835,2],[577,410],[545,2],[586,411],[544,2],[579,412],[583,413],[562,2],[477,2],[566,2],[526,2],[635,2],[637,414],[548,2],[479,301],[833,415],[499,416],[638,417],[565,418],[478,419],[569,420],[527,421],[636,422],[549,423],[480,424],[561,425],[560,2],[559,426],[555,427],[556,427],[558,428],[554,427],[557,428],[550,326],[551,326],[552,326],[553,429],[834,430],[836,431],[52,2],[53,2],[9,2],[10,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[4,2],[23,2],[27,2],[24,2],[25,2],[26,2],[28,2],[29,2],[30,2],[5,2],[31,2],[32,2],[33,2],[34,2],[6,2],[38,2],[35,2],[36,2],[37,2],[39,2],[7,2],[40,2],[45,2],[46,2],[41,2],[42,2],[43,2],[44,2],[8,2],[54,2],[50,2],[47,2],[48,2],[49,2],[1,2],[51,2],[12,2],[11,2],[844,2],[842,432],[843,433],[456,5],[846,434],[840,435],[459,436],[838,301],[940,437],[841,438],[839,2],[845,2]],"exportedModulesMap":[[943,1],[941,2],[457,2],[967,2],[970,3],[849,2],[372,2],[56,2],[361,4],[362,4],[363,2],[364,5],[374,6],[365,2],[366,7],[367,2],[368,2],[369,4],[370,4],[371,4],[373,8],[381,9],[383,2],[380,2],[386,10],[384,2],[382,2],[378,11],[379,12],[385,2],[387,13],[375,2],[377,14],[376,15],[262,2],[265,16],[261,2],[896,2],[263,2],[264,2],[404,17],[389,17],[396,17],[393,17],[406,17],[397,17],[403,17],[388,18],[407,17],[410,19],[401,17],[391,17],[409,17],[394,17],[392,17],[402,17],[398,17],[408,17],[395,17],[405,17],[390,17],[400,17],[399,17],[415,20],[413,21],[412,2],[411,2],[414,22],[455,23],[57,2],[58,2],[59,2],[878,24],[61,25],[884,26],[883,27],[251,28],[252,25],[424,2],[281,2],[282,2],[425,29],[253,2],[426,2],[427,30],[60,2],[255,31],[256,2],[254,32],[257,31],[258,2],[260,33],[272,34],[273,2],[278,35],[274,2],[275,2],[276,2],[277,2],[279,2],[280,36],[286,37],[343,38],[287,2],[342,39],[360,40],[344,2],[345,2],[927,41],[271,42],[269,43],[267,44],[268,45],[270,2],[352,46],[346,2],[355,47],[348,48],[353,49],[351,50],[354,51],[349,52],[350,53],[284,54],[356,55],[285,56],[358,57],[359,58],[347,2],[259,2],[266,59],[357,60],[421,61],[416,2],[422,62],[417,63],[418,64],[419,65],[420,66],[423,67],[439,68],[438,69],[444,70],[436,2],[437,71],[440,68],[441,72],[443,73],[442,74],[445,75],[430,76],[431,77],[434,78],[433,78],[432,77],[435,77],[429,79],[447,80],[446,81],[449,82],[448,83],[450,84],[451,54],[452,85],[283,2],[453,86],[428,87],[454,88],[847,89],[848,90],[869,91],[870,92],[871,2],[872,93],[873,94],[882,95],[875,96],[879,97],[887,98],[885,5],[886,99],[876,100],[888,2],[890,101],[891,102],[892,103],[881,104],[877,105],[901,106],[889,107],[916,108],[874,90],[917,109],[914,110],[915,5],[939,111],[864,112],[860,113],[862,114],[913,115],[855,116],[903,117],[902,2],[863,118],[910,119],[867,120],[911,2],[912,121],[865,122],[859,123],[866,124],[861,125],[854,2],[907,126],[920,127],[918,5],[850,5],[906,128],[851,12],[852,92],[853,129],[857,130],[856,131],[919,132],[858,133],[895,134],[893,101],[894,135],[904,12],[905,136],[908,137],[923,138],[924,139],[921,140],[922,141],[925,142],[926,143],[928,144],[900,145],[897,146],[898,4],[899,135],[930,147],[929,148],[936,149],[868,5],[932,150],[931,5],[934,151],[933,2],[935,152],[880,153],[909,154],[938,155],[937,5],[969,2],[946,156],[942,1],[944,157],[945,1],[948,158],[947,159],[949,2],[954,160],[950,2],[953,161],[951,2],[959,162],[962,163],[963,164],[960,2],[964,2],[965,165],[966,166],[975,167],[952,2],[955,2],[288,168],[289,168],[291,169],[292,170],[293,171],[294,172],[295,173],[296,174],[297,175],[298,176],[299,177],[300,178],[301,178],[303,179],[302,180],[304,179],[305,181],[306,182],[290,183],[340,2],[307,184],[308,185],[309,186],[341,187],[310,188],[311,189],[312,190],[313,191],[314,192],[315,193],[316,194],[317,195],[318,196],[319,197],[320,197],[321,198],[322,199],[324,200],[323,201],[325,202],[326,203],[327,204],[328,205],[329,206],[330,207],[331,208],[332,209],[333,210],[334,211],[335,212],[336,213],[337,214],[338,215],[339,216],[976,2],[958,2],[957,2],[1001,217],[1002,218],[977,219],[980,219],[999,217],[1000,217],[990,217],[989,220],[987,217],[982,217],[995,217],[993,217],[997,217],[981,217],[994,217],[998,217],[983,217],[984,217],[996,217],[978,217],[985,217],[986,217],[988,217],[992,217],[1003,221],[991,217],[979,217],[1016,222],[1015,2],[1010,221],[1012,223],[1011,221],[1004,221],[1005,221],[1007,221],[1009,221],[1013,223],[1014,223],[1006,223],[1008,223],[956,224],[961,225],[1017,2],[1019,226],[1020,227],[1021,2],[1022,228],[458,2],[1018,2],[968,2],[974,229],[972,230],[973,231],[971,232],[55,2],[250,233],[223,2],[201,234],[199,234],[249,235],[214,236],[213,236],[114,237],[65,238],[221,237],[222,237],[224,239],[225,237],[226,240],[125,241],[227,237],[198,237],[228,237],[229,242],[230,237],[231,236],[232,243],[233,237],[234,237],[235,237],[236,237],[237,236],[238,237],[239,237],[240,237],[241,237],[242,244],[243,237],[244,237],[245,237],[246,237],[247,237],[64,235],[67,240],[68,240],[69,240],[70,240],[71,240],[72,240],[73,240],[74,237],[76,245],[77,240],[75,240],[78,240],[79,240],[80,240],[81,240],[82,240],[83,240],[84,237],[85,240],[86,240],[87,240],[88,240],[89,240],[90,237],[91,240],[92,240],[93,240],[94,240],[95,240],[96,240],[97,237],[99,246],[98,240],[100,240],[101,240],[102,240],[103,240],[104,244],[105,237],[106,237],[120,247],[108,248],[109,240],[110,240],[111,237],[112,240],[113,240],[115,249],[116,240],[117,240],[118,240],[119,240],[121,240],[122,240],[123,240],[124,240],[126,250],[127,240],[128,240],[129,240],[130,237],[131,240],[132,251],[133,251],[134,251],[135,237],[136,240],[137,240],[138,240],[143,240],[139,240],[140,237],[141,240],[142,237],[144,240],[145,240],[146,240],[147,240],[148,240],[149,240],[150,237],[151,240],[152,240],[153,240],[154,240],[155,240],[156,240],[157,240],[158,240],[159,240],[160,240],[161,240],[162,240],[163,240],[164,240],[165,240],[166,240],[167,252],[168,240],[169,240],[170,240],[171,240],[172,240],[173,240],[174,237],[175,237],[176,237],[177,237],[178,237],[179,240],[180,240],[181,240],[182,240],[200,253],[248,237],[185,254],[184,255],[208,256],[207,257],[203,258],[202,257],[204,259],[193,260],[191,261],[206,262],[205,259],[192,2],[194,263],[107,264],[63,265],[62,240],[197,2],[189,266],[190,267],[187,2],[188,268],[186,240],[195,269],[66,270],[215,2],[216,2],[209,2],[212,236],[211,2],[217,2],[218,2],[210,271],[219,2],[220,2],[183,272],[196,273],[522,274],[521,2],[543,2],[467,275],[523,2],[476,2],[466,2],[584,2],[674,2],[620,276],[828,277],[671,278],[827,279],[826,279],[673,2],[524,280],[627,281],[623,282],[823,278],[795,2],[746,283],[747,284],[748,284],[760,284],[753,285],[752,286],[754,284],[755,284],[759,287],[757,288],[787,289],[784,2],[783,290],[785,284],[798,291],[796,2],[797,2],[792,292],[761,2],[762,2],[765,2],[763,2],[764,2],[766,2],[767,2],[770,2],[768,2],[769,2],[771,2],[772,2],[472,293],[743,2],[742,2],[744,2],[741,2],[473,294],[740,2],[745,2],[774,295],[773,2],[505,2],[506,296],[507,296],[751,297],[749,297],[750,2],[464,298],[503,299],[793,300],[471,2],[758,293],[786,301],[756,302],[775,296],[776,303],[777,304],[778,304],[779,304],[780,304],[781,305],[782,305],[791,306],[790,2],[788,2],[789,307],[794,308],[613,2],[614,309],[617,276],[618,276],[619,276],[589,310],[590,311],[608,276],[529,312],[612,276],[533,2],[607,313],[570,314],[535,315],[591,2],[592,316],[611,276],[605,2],[606,317],[593,310],[594,318],[497,2],[610,276],[615,2],[616,319],[621,2],[622,320],[498,321],[595,276],[609,276],[597,2],[598,2],[599,2],[600,2],[601,2],[596,2],[602,2],[825,2],[603,322],[604,323],[470,2],[495,2],[520,2],[500,2],[502,2],[581,2],[496,297],[525,2],[528,2],[585,324],[576,325],[624,326],[517,327],[512,2],[504,328],[832,291],[513,2],[501,2],[514,284],[516,329],[515,305],[508,330],[511,300],[677,331],[700,331],[681,331],[684,332],[686,331],[736,331],[712,331],[676,331],[704,331],[733,331],[683,331],[713,331],[698,331],[701,331],[689,331],[723,333],[718,331],[711,331],[693,334],[692,334],[709,332],[719,331],[738,335],[739,336],[724,337],[715,331],[696,331],[682,331],[685,331],[717,331],[702,332],[710,331],[707,338],[725,338],[708,332],[694,331],[720,331],[703,331],[737,331],[727,331],[714,331],[735,331],[716,331],[695,331],[731,331],[721,331],[697,331],[726,331],[734,331],[699,331],[722,334],[705,331],[730,339],[680,339],[691,331],[690,331],[688,340],[675,2],[687,331],[732,338],[728,338],[706,338],[729,338],[536,341],[542,342],[541,343],[532,344],[531,2],[540,345],[539,345],[538,345],[817,346],[537,347],[578,2],[530,2],[547,348],[546,349],[799,341],[800,341],[801,341],[802,341],[803,341],[804,341],[805,350],[810,341],[806,341],[807,341],[816,341],[808,341],[809,341],[811,341],[812,341],[813,341],[814,341],[815,351],[509,2],[672,352],[837,353],[818,354],[819,355],[821,356],[518,357],[519,358],[820,355],[563,2],[475,359],[665,2],[484,2],[489,360],[666,361],[663,2],[567,2],[669,2],[633,2],[664,284],[661,2],[662,362],[670,363],[660,2],[659,305],[485,305],[469,364],[628,365],[667,2],[668,2],[631,306],[474,2],[491,300],[564,366],[494,367],[493,368],[490,369],[632,370],[568,371],[482,372],[634,373],[487,374],[486,375],[483,376],[630,377],[461,2],[488,2],[462,2],[463,2],[465,2],[468,361],[460,2],[510,2],[629,2],[492,378],[588,379],[829,380],[587,357],[830,381],[831,382],[481,383],[679,384],[678,385],[534,386],[641,387],[649,388],[652,389],[582,390],[654,391],[642,392],[656,393],[657,394],[640,2],[648,395],[571,396],[644,397],[643,397],[626,398],[625,398],[655,399],[575,400],[573,401],[574,401],[645,2],[658,402],[646,2],[653,403],[580,404],[651,405],[647,2],[650,406],[572,2],[639,407],[822,408],[824,409],[835,2],[577,410],[545,2],[586,411],[544,2],[579,412],[583,413],[562,2],[477,2],[566,2],[526,2],[635,2],[637,414],[548,2],[479,301],[833,415],[499,416],[638,417],[565,418],[478,419],[569,420],[527,421],[636,422],[549,423],[480,424],[561,425],[560,2],[559,426],[555,427],[556,427],[558,428],[554,427],[557,428],[550,326],[551,326],[552,326],[553,429],[834,430],[836,431],[52,2],[53,2],[9,2],[10,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[4,2],[23,2],[27,2],[24,2],[25,2],[26,2],[28,2],[29,2],[30,2],[5,2],[31,2],[32,2],[33,2],[34,2],[6,2],[38,2],[35,2],[36,2],[37,2],[39,2],[7,2],[40,2],[45,2],[46,2],[41,2],[42,2],[43,2],[44,2],[8,2],[54,2],[50,2],[47,2],[48,2],[49,2],[1,2],[51,2],[12,2],[11,2],[844,2],[842,432],[843,433],[456,5],[846,434],[840,435],[459,436],[838,301],[940,437],[841,438],[839,2],[845,2]]},"version":"5.2.2"} \ No newline at end of file diff --git a/JS/edgechains/examples/hydeSearch/.gitignore b/JS/edgechains/examples/hydeSearch/.gitignore new file mode 100644 index 000000000..d9cd34b5a --- /dev/null +++ b/JS/edgechains/examples/hydeSearch/.gitignore @@ -0,0 +1,6 @@ +# standard exclusions +node_modules +# build artifacts +dist +# environment files +.env \ No newline at end of file diff --git a/JS/edgechains/examples/hydeSearch/README.md b/JS/edgechains/examples/hydeSearch/README.md new file mode 100644 index 000000000..81cc59336 --- /dev/null +++ b/JS/edgechains/examples/hydeSearch/README.md @@ -0,0 +1,13 @@ +## How to run hydeSearch Example:- + +- Use the following command in the root directory to run this example: + + `npm i` + + `npm run build` + + `npm start` + +- You will see that server will running on port `3000`. + +- Type `localhost:3000` in your favorite browser to use this example. diff --git a/JS/edgechains/examples/esbuild.build.js b/JS/edgechains/examples/hydeSearch/esbuild.build.js similarity index 100% rename from JS/edgechains/examples/esbuild.build.js rename to JS/edgechains/examples/hydeSearch/esbuild.build.js diff --git a/JS/edgechains/examples/htmljs.ts b/JS/edgechains/examples/hydeSearch/htmljs.ts similarity index 100% rename from JS/edgechains/examples/htmljs.ts rename to JS/edgechains/examples/hydeSearch/htmljs.ts diff --git a/JS/edgechains/examples/ormconfig.json b/JS/edgechains/examples/hydeSearch/ormconfig.json similarity index 100% rename from JS/edgechains/examples/ormconfig.json rename to JS/edgechains/examples/hydeSearch/ormconfig.json diff --git a/JS/edgechains/examples/package-lock.json b/JS/edgechains/examples/hydeSearch/package-lock.json similarity index 92% rename from JS/edgechains/examples/package-lock.json rename to JS/edgechains/examples/hydeSearch/package-lock.json index fc93554fa..419b32c98 100644 --- a/JS/edgechains/examples/package-lock.json +++ b/JS/edgechains/examples/hydeSearch/package-lock.json @@ -1,11 +1,11 @@ { - "name": "examples", + "name": "example", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "examples", + "name": "example", "version": "1.0.0", "license": "ISC", "dependencies": { @@ -18,6 +18,7 @@ "typescript": "^5.3.2" }, "devDependencies": { + "@arakoodev/edgechains.js": "0.1.10", "@hanazuki/node-jsonnet": "^2.1.0", "@types/jest": "^29.5.8", "@types/node": "^20.9.4", @@ -63,10 +64,28 @@ "node": ">=6.0.0" } }, + "node_modules/@arakoodev/edgechains.js": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@arakoodev/edgechains.js/-/edgechains.js-0.1.10.tgz", + "integrity": "sha512-QUzUpEc+nr+QNFvkD0+lvloo8R/pYWHsC99zY3IaGyL2fTuRi75BnR7RAwXKLKDjG8+Qng7K4+CzSaNrn+kcCw==", + "dev": true, + "dependencies": { + "@hono/node-server": "^1.2.0", + "@types/dotenv": "^8.2.0", + "axios": "^1.6.2", + "dotenv": "^16.3.1", + "hono": "^3.9.2", + "inquirer": "^9.2.12", + "prettier": "^3.1.0" + }, + "bin": { + "create-edgechains": "create-edgechains/scripts/create-edgechains.js" + } + }, "node_modules/@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { "@babel/highlight": "^7.23.4", @@ -148,30 +167,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", + "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", + "@babel/helpers": "^7.23.5", + "@babel/parser": "^7.23.5", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -196,12 +215,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", - "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.4", + "@babel/types": "^7.23.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -352,23 +371,23 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", - "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", + "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.4", - "@babel/types": "^7.23.4" + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5" }, "engines": { "node": ">=6.9.0" @@ -460,9 +479,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -649,9 +668,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", - "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -675,19 +694,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", - "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", + "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.4", - "@babel/generator": "^7.23.4", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.4", - "@babel/types": "^7.23.4", + "@babel/parser": "^7.23.5", + "@babel/types": "^7.23.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -705,9 +724,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", + "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -1101,9 +1120,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1124,9 +1143,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1148,9 +1167,9 @@ } }, "node_modules/@hono/node-server": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.2.3.tgz", - "integrity": "sha512-IH2lpqgSSLt9sIhWBE6FivFj+0RglCNYVuBT39vkumfjqjHAwQnx7KJw9WDVNlyH+AJY0N5ImZgcIbfM5xgyBw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.3.1.tgz", + "integrity": "sha512-eQBCDbH1Vv/TiYXNP8aGfJTuXi9xGhEd/EZg9u6dhr7zC5/WKKztcBmbrOTtixVBvvV6bfcay6KEginwiqHyXg==", "engines": { "node": ">=18.14.1" } @@ -1622,6 +1641,18 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@ljharb/through": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", + "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1793,9 +1824,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", - "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", + "version": "20.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.2.tgz", + "integrity": "sha512-37MXfxkb0vuIlRKHNxwCkb60PNBpR94u4efQuN4JgIAm66zfCDXGSAFCef9XUWFovX2R1ok6Z7MHhtdVXXkkIw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1829,16 +1860,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz", - "integrity": "sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", + "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/type-utils": "6.12.0", - "@typescript-eslint/utils": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/type-utils": "6.13.1", + "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1864,15 +1895,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", - "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", + "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/typescript-estree": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4" }, "engines": { @@ -1892,13 +1923,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", - "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0" + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1909,13 +1940,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz", - "integrity": "sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", + "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.12.0", - "@typescript-eslint/utils": "6.12.0", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/utils": "6.13.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1936,9 +1967,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", - "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1949,13 +1980,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", - "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1976,17 +2007,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.12.0.tgz", - "integrity": "sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", + "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", "semver": "^7.5.4" }, "engines": { @@ -2001,12 +2032,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", - "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2461,6 +2492,17 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2537,9 +2579,9 @@ } }, "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -2557,7 +2599,7 @@ ], "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "ieee754": "^1.1.13" } }, "node_modules/buffer-from": { @@ -2628,9 +2670,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001564", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", - "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", + "version": "1.0.30001565", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", + "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", "dev": true, "funding": [ { @@ -2672,6 +2714,12 @@ "node": ">=10" } }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -2702,6 +2750,18 @@ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cli-highlight": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", @@ -2734,6 +2794,23 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cli-highlight/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/cli-highlight/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -2761,6 +2838,27 @@ "node": ">=10" } }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -2775,6 +2873,32 @@ "node": ">=12" } }, + "node_modules/cliui/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/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/cmake-js": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.2.1.tgz", @@ -2981,6 +3105,18 @@ "node": ">=0.10.0" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", @@ -3097,9 +3233,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.593", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.593.tgz", - "integrity": "sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg==", + "version": "1.4.601", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.601.tgz", + "integrity": "sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==", "dev": true }, "node_modules/emittery": { @@ -3281,15 +3417,15 @@ } }, "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3453,9 +3589,9 @@ } }, "node_modules/eslint-plugin-es-x": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.4.0.tgz", - "integrity": "sha512-WJa3RhYzBtl8I37ebY9p76s61UhZyi4KaFOnX2A5r32RPazkXj5yoT6PGnD02dhwzEUj0KwsUdqfKDd/OuvGsw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", + "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", @@ -3720,6 +3856,20 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3784,6 +3934,34 @@ "bser": "2.1.1" } }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -4297,9 +4475,9 @@ } }, "node_modules/hono": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/hono/-/hono-3.10.2.tgz", - "integrity": "sha512-QwJLjWs3e+nZ3b5nQrrdJpYCJqiTK744jeYhX7yhZdxwcQ3KIohBfzI2dA8gSF6HEZkmFUdiKL1BelJ8utIm4w==", + "version": "3.10.4", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.10.4.tgz", + "integrity": "sha512-2LJd+a3qyvSuyFlyJSRN1CeH5wg6/Rjua/5L5gdT1W+4U7EUZtnHph74klbyysGg69sfZNXsIrR7PJWSjf2Vww==", "engines": { "node": ">=16.0.0" } @@ -4319,6 +4497,18 @@ "node": ">=10.17.0" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -4414,6 +4604,44 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, + "node_modules/inquirer": { + "version": "9.2.12", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz", + "integrity": "sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==", + "dev": true, + "dependencies": { + "@ljharb/through": "^2.3.11", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/internal-slot": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", @@ -4569,6 +4797,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -4699,6 +4936,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -5483,6 +5732,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -5501,6 +5756,34 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5698,6 +5981,15 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -5734,9 +6026,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/normalize-path": { @@ -5803,13 +6095,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -5907,6 +6199,50 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6525,6 +6861,19 @@ "node": ">=10" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -6550,6 +6899,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6573,6 +6931,15 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-array-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", @@ -6625,6 +6992,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -7027,6 +7400,18 @@ "node": ">=0.8" } }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -7396,6 +7781,30 @@ "balanced-match": "^1.0.0" } }, + "node_modules/typeorm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/typeorm/node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -7572,6 +7981,15 @@ "makeerror": "1.0.12" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7632,9 +8050,9 @@ } }, "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==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -7642,10 +8060,7 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrappy": { diff --git a/JS/edgechains/examples/package.json b/JS/edgechains/examples/hydeSearch/package.json similarity index 95% rename from JS/edgechains/examples/package.json rename to JS/edgechains/examples/hydeSearch/package.json index 0e3d25de5..ae8132296 100644 --- a/JS/edgechains/examples/package.json +++ b/JS/edgechains/examples/hydeSearch/package.json @@ -1,5 +1,5 @@ { - "name": "examples", + "name": "example", "version": "1.0.0", "description": "", "main": "dist/index.js", @@ -40,6 +40,7 @@ "jest": "^29.7.0", "prettier": "^3.1.0", "react": "^18.2.0", + "@arakoodev/edgechains.js": "0.1.10", "ts-jest": "^29.1.1", "tsx": "^3.12.2", "typeorm": "^0.3.17", diff --git a/JS/edgechains/examples/src/layouts/ExampleLayout.ts b/JS/edgechains/examples/hydeSearch/src/ExampleLayout.ts similarity index 100% rename from JS/edgechains/examples/src/layouts/ExampleLayout.ts rename to JS/edgechains/examples/hydeSearch/src/ExampleLayout.ts diff --git a/JS/edgechains/examples/src/service/HydeSearchService.test.ts b/JS/edgechains/examples/hydeSearch/src/HydeSearch.test.ts similarity index 90% rename from JS/edgechains/examples/src/service/HydeSearchService.test.ts rename to JS/edgechains/examples/hydeSearch/src/HydeSearch.test.ts index a15c7b82e..8dc9b3726 100644 --- a/JS/edgechains/examples/src/service/HydeSearchService.test.ts +++ b/JS/edgechains/examples/hydeSearch/src/HydeSearch.test.ts @@ -1,6 +1,6 @@ -import { ArkRequest } from "edgechains"; -import { hydeSearchAdaEmbedding } from "./HydeSearchService.js"; +import { ArkRequest } from "@arakoodev/edgechains.js"; import dotenv from "dotenv"; +import { hydeSearchAdaEmbedding } from "./HydeSearch"; dotenv.config({ path: ".env" }); describe("Hyde Search", () => { diff --git a/JS/edgechains/examples/src/service/HydeSearchService.ts b/JS/edgechains/examples/hydeSearch/src/HydeSearch.ts similarity index 55% rename from JS/edgechains/examples/src/service/HydeSearchService.ts rename to JS/edgechains/examples/hydeSearch/src/HydeSearch.ts index 130da31c0..887fa046a 100644 --- a/JS/edgechains/examples/src/service/HydeSearchService.ts +++ b/JS/edgechains/examples/hydeSearch/src/HydeSearch.ts @@ -1,8 +1,10 @@ import { Jsonnet } from "@hanazuki/node-jsonnet"; -import { OpenAiEndpoint } from "edgechains"; -import { PostgresClient } from "edgechains"; -import type { ArkRequest } from "edgechains"; +import { OpenAiEndpoint } from "@arakoodev/edgechains.js"; +import { PostgresClient } from "@arakoodev/edgechains.js"; +import type { ArkRequest } from "@arakoodev/edgechains.js"; import * as path from "path"; +import { Hono } from "hono"; +const HydeSearchRouter = new Hono(); enum PostgresDistanceMetric { COSINE = "COSINE", @@ -10,6 +12,17 @@ enum PostgresDistanceMetric { L2 = "L2", } +export interface HydeFragmentData { + responses: Array<{ + rawText?: string; + metadata?: string; + filename?: string; + titleMetadata?: string; + documentDate?: string; + }>; + final_answer?: string; +} + async function hydeSearchAdaEmbedding(arkRequest: ArkRequest, apiKey: string, orgId: string) { try { const gpt3endpoint = new OpenAiEndpoint( @@ -29,8 +42,8 @@ async function hydeSearchAdaEmbedding(arkRequest: ArkRequest, apiKey: string, or // const jsonnet = new Jsonnet(); - const promptPath = path.join(__dirname, "../src/jsonnet/prompts.jsonnet"); - const hydePath = path.join(__dirname, "../src/jsonnet/hyde.jsonnet"); + const promptPath = path.join(__dirname, "../src/prompts.jsonnet"); + const hydePath = path.join(__dirname, "../src/hyde.jsonnet"); // Load Jsonnet to extract args.. const promptLoader = await jsonnet.evaluateFile(promptPath); @@ -130,3 +143,75 @@ async function hydeSearchAdaEmbedding(arkRequest: ArkRequest, apiKey: string, or } export { hydeSearchAdaEmbedding }; + +HydeSearchRouter.get("/search", async (c) => { + const query = await c.req.query(); + const arkRequest = { + topK: parseInt(query.topK ?? "5"), + metadataTable: query.metadataTable, + query: query.query, + textWeight: { + baseWeight: query.textBaseWeight, + fineTuneWeight: query.textFineTuneWeight, + }, + similarityWeight: { + baseWeight: query.similarityBaseWeight, + fineTuneWeight: query.similarityFineTuneWeight, + }, + dateWeight: { + baseWeight: query.dateBaseWeight, + fineTuneWeight: query.dateFineTuneWeight, + }, + orderRRF: query.orderRRF, + }; + const answer = await hydeSearchAdaEmbedding( + arkRequest, + process.env.OPENAI_API_KEY!, + process.env.OPENAI_ORG_ID! + ); + const final_answer = answer.finalAnswer; + const responses = answer.wordEmbeddings; + const data: HydeFragmentData = { responses, final_answer }; + return c.html(` + +
+
+
${data.final_answer}
+
+
    + ${data.responses.map( + (item) => ` +
  • +
    +
    + ${ + item.rawText != null + ? `
    ${item.rawText}
    ` + : `
    ${item.metadata}
    ` + } + ${ + item.filename != null + ? `
    ${item.filename}
    ` + : "" + } + ${ + item.titleMetadata != null + ? `
    ${item.titleMetadata}
    ` + : "" + } + ${ + item.documentDate != null + ? `
    ${item.documentDate}
    ` + : "" + } +
    +
    +
  • + ` + )} +
+ + `); +}); + +export { HydeSearchRouter }; diff --git a/JS/edgechains/examples/src/jsonnet/hyde.jsonnet b/JS/edgechains/examples/hydeSearch/src/hyde.jsonnet similarity index 100% rename from JS/edgechains/examples/src/jsonnet/hyde.jsonnet rename to JS/edgechains/examples/hydeSearch/src/hyde.jsonnet diff --git a/JS/edgechains/examples/src/index.ts b/JS/edgechains/examples/hydeSearch/src/index.ts similarity index 71% rename from JS/edgechains/examples/src/index.ts rename to JS/edgechains/examples/hydeSearch/src/index.ts index 188077192..12e7d5f6b 100644 --- a/JS/edgechains/examples/src/index.ts +++ b/JS/edgechains/examples/hydeSearch/src/index.ts @@ -1,9 +1,9 @@ import "dotenv/config"; import { serve } from "@hono/node-server"; import { Hono } from "hono"; -import { HydeSearchRouter } from "./routes/hydeSearch.route.js"; +import { HydeSearchRouter } from "./HydeSearch.js"; import { view } from "../htmljs.js"; -import ExampleLayout from "./layouts/ExampleLayout.js"; +import ExampleLayout from "./ExampleLayout.js"; const app = new Hono(); diff --git a/JS/edgechains/examples/src/jsonnet/prompts.jsonnet b/JS/edgechains/examples/hydeSearch/src/prompts.jsonnet similarity index 100% rename from JS/edgechains/examples/src/jsonnet/prompts.jsonnet rename to JS/edgechains/examples/hydeSearch/src/prompts.jsonnet diff --git a/JS/edgechains/examples/tsconfig.json b/JS/edgechains/examples/hydeSearch/tsconfig.json similarity index 79% rename from JS/edgechains/examples/tsconfig.json rename to JS/edgechains/examples/hydeSearch/tsconfig.json index 9f5e36d0a..f370e670f 100644 --- a/JS/edgechains/examples/tsconfig.json +++ b/JS/edgechains/examples/hydeSearch/tsconfig.json @@ -13,8 +13,5 @@ "moduleResolution": "NodeNext", "declaration": true }, - "include": [ - "src/**/*.ts", - "dist/**/*.d.ts" // include the generated declaration file - ] + "include": ["src/**/*.ts", "dist/**/*.d.ts"] } diff --git a/JS/edgechains/examples/react-chain/.gitignore b/JS/edgechains/examples/react-chain/.gitignore new file mode 100644 index 000000000..03c61f409 --- /dev/null +++ b/JS/edgechains/examples/react-chain/.gitignore @@ -0,0 +1,8 @@ +# standard exclusions +node_modules + +# build artifacts +dist + +# environment files +.env diff --git a/JS/edgechains/examples/react-chain/README.md b/JS/edgechains/examples/react-chain/README.md new file mode 100644 index 000000000..5cd72d778 --- /dev/null +++ b/JS/edgechains/examples/react-chain/README.md @@ -0,0 +1,13 @@ +## How to run ReActChain:- + +- Use the following command in the root directory to run this example: + + `npm i` + + `npm run build` + + `npm start` + +- To use this example make a `POST` request call on `http://localhost:3000/react-chain`. +- Request body: + `{"prompt": "Your Search Topic"}` diff --git a/JS/edgechains/examples/react-chain/esbuild.build.js b/JS/edgechains/examples/react-chain/esbuild.build.js new file mode 100644 index 000000000..8da795c0e --- /dev/null +++ b/JS/edgechains/examples/react-chain/esbuild.build.js @@ -0,0 +1,45 @@ +const esbuild = require("esbuild"); +const path = require("path"); +const fs = require("fs"); +const { execSync } = require("child_process"); + +const outputDir = path.resolve(__dirname, "dist"); + +if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir); +} + +const distPath = path.join(process.cwd(), "dist"); + +fs.promises.mkdir(distPath, { recursive: true }); + +esbuild + .build({ + entryPoints: ["./src/index.ts"], + bundle: true, + minify: true, + platform: "node", + outfile: "./dist/index.js", + tsconfig: "./tsconfig.json", + target: "node21.1.0", + external: [ + "express", + "tsx", + "typescript", + "typeorm", + "react", + "react-dom", + "pg", + "jsdom", + "hono", + "@hanazuki/node-jsonnet", + "readline/promises", + ], + format: "cjs", + loader: { + ".html": "text", + ".css": "css", + ".jsonnet": "text", + }, + }) + .catch(() => process.exit(1)); diff --git a/JS/edgechains/examples/react-chain/ormconfig.json b/JS/edgechains/examples/react-chain/ormconfig.json new file mode 100644 index 000000000..21819c00f --- /dev/null +++ b/JS/edgechains/examples/react-chain/ormconfig.json @@ -0,0 +1,11 @@ +{ + "type": "postgres", + "host": "db.rmzqtepwnzoxgkkzjctt.supabase.co", + "port": 5432, + "username": "postgres", + "password": "xaX0MYcf1YiJlChK", + "database": "postgres", + "entities": ["dist/entities/**/*.js"], + "synchronize": false, + "logging": false +} diff --git a/JS/edgechains/examples/react-chain/package-lock.json b/JS/edgechains/examples/react-chain/package-lock.json new file mode 100644 index 000000000..2e8bcc04c --- /dev/null +++ b/JS/edgechains/examples/react-chain/package-lock.json @@ -0,0 +1,8148 @@ +{ + "name": "example", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "example", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@hono/node-server": "^1.2.0", + "@types/dotenv": "^8.2.0", + "hono": "^3.9.2", + "pg": "^8.11.3", + "reflect-metadata": "^0.1.13", + "tsc": "^2.0.4", + "typescript": "^5.3.2" + }, + "devDependencies": { + "@arakoodev/edgechains.js": "0.1.10", + "@hanazuki/node-jsonnet": "^2.1.0", + "@types/jest": "^29.5.8", + "@types/node": "^20.9.4", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "axios": "^1.6.2", + "dotenv": "^16.3.1", + "dts-bundle-generator": "^8.1.2", + "eslint": "^8.54.0", + "eslint-config-prettier": "^9.0.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-n": "^16.3.1", + "eslint-plugin-promise": "^6.1.1", + "jest": "^29.7.0", + "prettier": "^3.1.0", + "react": "^18.2.0", + "ts-jest": "^29.1.1", + "tsx": "^3.12.2", + "typeorm": "^0.3.17", + "typescript": "^5.0.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@arakoodev/edgechains.js": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@arakoodev/edgechains.js/-/edgechains.js-0.1.10.tgz", + "integrity": "sha512-QUzUpEc+nr+QNFvkD0+lvloo8R/pYWHsC99zY3IaGyL2fTuRi75BnR7RAwXKLKDjG8+Qng7K4+CzSaNrn+kcCw==", + "dev": true, + "dependencies": { + "@hono/node-server": "^1.2.0", + "@types/dotenv": "^8.2.0", + "axios": "^1.6.2", + "dotenv": "^16.3.1", + "hono": "^3.9.2", + "inquirer": "^9.2.12", + "prettier": "^3.1.0" + }, + "bin": { + "create-edgechains": "create-edgechains/scripts/create-edgechains.js" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", + "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.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/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "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.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@hanazuki/node-jsonnet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hanazuki/node-jsonnet/-/node-jsonnet-2.1.0.tgz", + "integrity": "sha512-eAky1kbhBNXeqCoPZbkXa6pASEYXgIY6WwszJiGctUCFaQpQcZlxIvRv+P96GiQ+P8mU1CTfVYqsjTIihG3UkA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "cmake-js": "^7.0.0", + "node-addon-api": "^6.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@hono/node-server": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.3.3.tgz", + "integrity": "sha512-zD+TJvSBb5rqx5KSRlpoxNM3ESC8JU3pdecNZc2nK/TJSt88Ae/ko2nKnzYqX2IDegc+4hxLs8CW92B683C2VQ==", + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.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": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "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/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.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@ljharb/through": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", + "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-ylSC9GhfRH7m1EUXBXofhgx4lUWmFeQDINW5oLuS+gxWdfUeW4zJdeVTYVkexEW+e2VUvlZR2kGnGGipAWR7kw==", + "deprecated": "This is a stub types definition. dotenv provides its own type definitions, so you do not need this installed.", + "dependencies": { + "dotenv": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.11", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", + "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz", + "integrity": "sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/type-utils": "6.15.0", + "@typescript-eslint/utils": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz", + "integrity": "sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz", + "integrity": "sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz", + "integrity": "sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/utils": "6.15.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.15.0.tgz", + "integrity": "sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz", + "integrity": "sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.15.0.tgz", + "integrity": "sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/typescript-estree": "6.15.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz", + "integrity": "sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.15.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "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==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "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-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "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/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/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/cli-highlight/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/cli-highlight/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/cli-highlight/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/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cmake-js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.2.1.tgz", + "integrity": "sha512-AdPSz9cSIJWdKvm0aJgVu3X8i0U3mNTswJkSHzZISqmYVjZk7Td4oDFg0mCBA383wO+9pG5Ix7pEP1CZH9x2BA==", + "dev": true, + "dependencies": { + "axios": "^1.3.2", + "debug": "^4", + "fs-extra": "^10.1.0", + "lodash.isplainobject": "^4.0.6", + "memory-stream": "^1.0.0", + "node-api-headers": "^0.0.2", + "npmlog": "^6.0.2", + "rc": "^1.2.7", + "semver": "^7.3.8", + "tar": "^6.1.11", + "url-join": "^4.0.1", + "which": "^2.0.2", + "yargs": "^17.6.0" + }, + "bin": { + "cmake-js": "bin/cmake-js" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "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/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "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/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "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/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dts-bundle-generator": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/dts-bundle-generator/-/dts-bundle-generator-8.1.2.tgz", + "integrity": "sha512-/yvy9Xw0cfFodA8n6jEq8/COZ/WXgJtPabnLBAzIfP/TfxWbD/0a0dvfqNHneNqswQrH0kUcaAfGJC9UNvH97w==", + "dev": true, + "dependencies": { + "typescript": ">=5.0.2", + "yargs": "^17.6.0" + }, + "bin": { + "dts-bundle-generator": "dist/bin/dts-bundle-generator.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.615", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz", + "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?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/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "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.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "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.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "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", + "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.3", + "strip-ansi": "^6.0.1", + "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-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "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" + } + ], + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-config-standard-with-typescript": { + "version": "40.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-40.0.0.tgz", + "integrity": "sha512-GXUJcwIXiTQaS3H4etv8a1lejVVdZYaxZNz3g7vt6GoJosQqMTurbmSC4FVGyHiGT/d1TjFr3+47A3xsHhsG+Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^6.4.0", + "eslint-config-standard": "17.1.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.4.0", + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0", + "typescript": "*" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", + "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0", + "eslint-compat-utils": "^0.1.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-n": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.4.0.tgz", + "integrity": "sha512-IkqJjGoWYGskVaJA7WQuN8PINIxc0N/Pk/jLeYT4ees6Fo5lAhpwGsYek6gS9tCUxgDC4zJ+OwY2bY/6/9OMKQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "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.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.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/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/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/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "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-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "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.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "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.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/hono": { + "version": "3.11.8", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.11.8.tgz", + "integrity": "sha512-s+7FDN0CS0lAvooyj4oQw0PyEec7I+YuVg40gtFHuUrfHBEhKITrLu4dskTdeYn0Xvhbz7s4yRJebJx6gCN/5Q==", + "engines": { + "node": ">=16.0.0" + } + }, + "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/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "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/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "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/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inquirer": { + "version": "9.2.12", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz", + "integrity": "sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==", + "dev": true, + "dependencies": { + "@ljharb/through": "^2.3.11", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "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/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "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": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "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/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/memory-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", + "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", + "dev": true, + "dependencies": { + "readable-stream": "^3.4.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "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/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true + }, + "node_modules/node-api-headers": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-0.0.2.tgz", + "integrity": "sha512-YsjmaKGPDkmhoNKIpkChtCsPVaRE0a274IdERKnuc/E8K1UJdBZ4/mvI006OijlQZHCfpRNOH3dfHQs92se8gg==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.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/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "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/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "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/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pg": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "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/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "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/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "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/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "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/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/tsc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/tsc/-/tsc-2.0.4.tgz", + "integrity": "sha512-fzoSieZI5KKJVBYGvwbVZs/J5za84f2lSTLPYf6AGiIf43tZ3GNrI1QzTLcjtyDDP4aLxd46RTZq1nQxe7+k5Q==", + "bin": { + "tsc": "bin/tsc" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tsx": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz", + "integrity": "sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==", + "dev": true, + "dependencies": { + "esbuild": "~0.18.20", + "get-tsconfig": "^4.7.2", + "source-map-support": "^0.5.21" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/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/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-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typeorm": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.17.tgz", + "integrity": "sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig==", + "dev": true, + "dependencies": { + "@sqltools/formatter": "^1.2.5", + "app-root-path": "^3.1.0", + "buffer": "^6.0.3", + "chalk": "^4.1.2", + "cli-highlight": "^2.1.11", + "date-fns": "^2.29.3", + "debug": "^4.3.4", + "dotenv": "^16.0.3", + "glob": "^8.1.0", + "mkdirp": "^2.1.3", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.5.0", + "uuid": "^9.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" + }, + "engines": { + "node": ">= 12.9.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0", + "@sap/hana-client": "^2.12.25", + "better-sqlite3": "^7.1.2 || ^8.0.0", + "hdb-pool": "^0.1.6", + "ioredis": "^5.0.4", + "mongodb": "^5.2.0", + "mssql": "^9.1.1", + "mysql2": "^2.2.5 || ^3.0.1", + "oracledb": "^5.1.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "hdb-pool": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typeorm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/typeorm/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typeorm/node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "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/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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" + } + } + } +} diff --git a/JS/edgechains/examples/react-chain/package.json b/JS/edgechains/examples/react-chain/package.json new file mode 100644 index 000000000..ae8132296 --- /dev/null +++ b/JS/edgechains/examples/react-chain/package.json @@ -0,0 +1,49 @@ +{ + "name": "example", + "version": "1.0.0", + "description": "", + "main": "dist/index.js", + "scripts": { + "build": "rm -rf dist && node esbuild.build.js", + "start": "node dist/index.js", + "lint": "eslint --ignore-path .eslintignore --ext .js,.ts", + "format": "prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json)\"", + "test": "npx jest" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@hono/node-server": "^1.2.0", + "@types/dotenv": "^8.2.0", + "hono": "^3.9.2", + "pg": "^8.11.3", + "reflect-metadata": "^0.1.13", + "tsc": "^2.0.4", + "typescript": "^5.3.2" + }, + "devDependencies": { + "@hanazuki/node-jsonnet": "^2.1.0", + "@types/jest": "^29.5.8", + "@types/node": "^20.9.4", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "axios": "^1.6.2", + "dotenv": "^16.3.1", + "dts-bundle-generator": "^8.1.2", + "eslint": "^8.54.0", + "eslint-config-prettier": "^9.0.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-n": "^16.3.1", + "eslint-plugin-promise": "^6.1.1", + "jest": "^29.7.0", + "prettier": "^3.1.0", + "react": "^18.2.0", + "@arakoodev/edgechains.js": "0.1.10", + "ts-jest": "^29.1.1", + "tsx": "^3.12.2", + "typeorm": "^0.3.17", + "typescript": "^5.0.2" + } +} diff --git a/JS/edgechains/examples/react-chain/src/ReactChain.test.ts b/JS/edgechains/examples/react-chain/src/ReactChain.test.ts new file mode 100644 index 000000000..a8b193519 --- /dev/null +++ b/JS/edgechains/examples/react-chain/src/ReactChain.test.ts @@ -0,0 +1,11 @@ +const reactChain = require("./ReactChain"); + +describe("ReAct Chain", () => { + it("should return a response", async () => { + expect( + await reactChain( + "Author David Chanoff has collaborated with a U.S. Navy admiral who served as the ambassador to the United Kingdom under which President?" + ) + ).toContain("Bill Clinton"); + }, 30000); +}); diff --git a/JS/edgechains/examples/react-chain/src/ReactChain.ts b/JS/edgechains/examples/react-chain/src/ReactChain.ts new file mode 100644 index 000000000..3107dbff2 --- /dev/null +++ b/JS/edgechains/examples/react-chain/src/ReactChain.ts @@ -0,0 +1,117 @@ +import { Jsonnet } from "@hanazuki/node-jsonnet"; +import { OpenAiEndpoint } from "@arakoodev/edgechains.js"; +import * as path from "path"; +import { Hono } from "hono"; +import axios from "axios"; + +const jsonnet = new Jsonnet(); + +jsonnet.nativeCallback( + "udf.fn", + async (prompt) => { + const wikiResponse = await axios + .post( + "https://en.wikipedia.org/w/api.php", + {}, + { + params: { + action: "query", + prop: "extracts", + format: "json", + titles: prompt, + explaintext: "", + }, + headers: { + "content-type": "application/x-www-form-urlencoded", + Accept: "application/json", + }, + } + ) + .then(function (response) { + if (response.data.query == undefined) return ""; + else return Object.values(response.data.query.pages); + }) + .catch(function (error) { + if (error.response) { + console.log("Server responded with status code:", error.response.status); + console.log("Response data:", error.response.data); + } else if (error.request) { + console.log("No response received:", error.request); + } else { + console.log("Error creating request:", error.message); + } + }); + + if (wikiResponse == "") { + return ""; + } else { + if (wikiResponse[0].extract == undefined) { + return ""; + } + return wikiResponse[0].extract; + } + }, + "prompt" +); + +export const ReactChainRouter = new Hono(); + +const gpt3Endpoint = new OpenAiEndpoint( + "https://api.openai.com/v1/chat/completions", + process.env.OPENAI_API_KEY!, + "", + "gpt-3.5-turbo", + "user", + parseInt("0.7") +); + +const reactChainJsonnetPath = path.join(__dirname, "../src/react-chain.jsonnet"); + +ReactChainRouter.post("/react-chain", async (c) => { + const query = await c.req.json(); + const reactResponse = await reactChain(query.prompt); + + return c.json({ answer: reactResponse }, 200); +}); + +export async function reactChain(query) { + var reactJsonnet = await jsonnet + .extString("gptResponse", "") + .extString("context", "This is contenxt") + .evaluateFile(reactChainJsonnetPath); + + var context = ""; + + var preset = JSON.parse(reactJsonnet).preset; + + query = preset + "\nQuestion: " + query; + + var gptResponse = await gpt3Endpoint.gptFn(query); + + console.log(gptResponse); + + context = context + query; + + jsonnet.extString("context", context).extString("gptResponse", gptResponse); + + while (!checkIfFinished(gptResponse)) { + reactJsonnet = await jsonnet.evaluateFile(reactChainJsonnetPath); + query = JSON.parse(reactJsonnet).prompt; + + gptResponse = await gpt3Endpoint.gptFn(query); + + console.log(gptResponse); + + context += "\n" + query; + jsonnet.extString("context", context).extString("gptResponse", gptResponse); + } + + console.log(gptResponse); + + var res = gptResponse.substring(gptResponse.indexOf("Finish[")); + return res.substring(res.indexOf("[") + 1, res.indexOf("]")); +} + +function checkIfFinished(response: string) { + return response.includes("Finish"); +} diff --git a/JS/edgechains/examples/react-chain/src/index.ts b/JS/edgechains/examples/react-chain/src/index.ts new file mode 100644 index 000000000..48060dbce --- /dev/null +++ b/JS/edgechains/examples/react-chain/src/index.ts @@ -0,0 +1,12 @@ +import "dotenv/config"; +import { serve } from "@hono/node-server"; +import { Hono } from "hono"; +import { ReactChainRouter } from "./ReactChain.js"; + +const app = new Hono(); + +app.route("/", ReactChainRouter); + +serve(app, () => { + console.log("server running on port 3000"); +}); diff --git a/JS/edgechains/examples/react-chain/src/react-chain.jsonnet b/JS/edgechains/examples/react-chain/src/react-chain.jsonnet new file mode 100644 index 000000000..d7e29208a --- /dev/null +++ b/JS/edgechains/examples/react-chain/src/react-chain.jsonnet @@ -0,0 +1,89 @@ +//ReAct-Chain example is taken from https://tsmatz.wordpress.com/2023/03/07/react-with-openai-gpt-and-langchain + +local config = { + "edgechains.config": { + "mapper": { + "search": std.native("udf.fn"), + }, + }, +}; + +local callFunction(funcName) = + local mapper = config["edgechains.config"].mapper; + mapper[funcName]; +local preset = ||| + You are a Reasoning + Acting (React) Chain Bot. You have to be interactive so ask the queries one by one from the user to reach to the final answer. Please provide a single Thought and single Action to the user so that the user can search the query of the action and provide you with the observation. When you have found the answer to the original prompt then the final response should be Action: Finish[Answer to the original prompt]. + For example the chain would be like this: + + Question: Which magazine was started first Arthur's Magazine or First for Women? + Thought 1: I need to search Arthur's Magazine and First for Women, and find which was + started first. + Action 1: Search[Arthur's Magazine] + Observation 1: Arthur's Magazine (1844-1846) was an American literary periodical published + in Philadelphia in the 19th century. + Thought 2: Arthur's Magazine was started in 1844. I need to search First for Women + next. + Action 2: Search[First for Women] + Observation 2: First for Women is a woman’s magazine published by Bauer Media Group in the + USA.[1] The magazine was started in 1989. + Thought 3: First for Women was started in 1989. 1844 (Arthur's Magazine) < 1989 (First + for Women), so Arthur's Magazine was started first. + Action 3: Finish[Arthur's Magazine] + + Question: Were Pavel Urysohn and Leonid Levin known for the same type of work? + Thought 1: I need to search Pavel Urysohn and Leonid Levin, find their types of work, + then find if they are the same. + Action 1: Search[Pavel Urysohn] + Observation 1: Pavel Samuilovich Urysohn (February 3, 1898 - August 17, 1924) was a Soviet + mathematician who is best known for his contributions in dimension theory. + Thought 2: Pavel Urysohn is a mathematician. I need to search Leonid Levin next and + find its type of work. + Action 2: Search[Leonid Levin] + Observation 2: Leonid Anatolievich Levin is a Soviet-American mathematician and computer + scientist. + Thought 3: Leonid Levin is a mathematician and computer scientist. So Pavel Urysohn + and Leonid Levin have the same type of work. + Action 3: Finish[yes] + + **ALL THE OBSERVATIONS WILL BE PROVIDED BY THE USER, YOU DON'T HAVE TO PROVIDE ANY OBSERVATION** + |||; + +local subStringBefore(str,c) = + local substr = std.split(str,c); + if std.length(substr) == 0 then "" else substr[0]; + +local subStringAfter(str,c) = + local substr = std.split(str,c); + if std.length(substr) == 2 then substr[1] else substr[0]; + +//To extract action from the response +local extractAction(str) = + local action = subStringBefore(subStringAfter(str, "["), "]"); + action; + +//To extract thought from the response +local extractThought(str) = + local thought = subStringAfter(subStringBefore(str, "Action"), ":"); + thought; + +local appendIfMissing(str, c) = + local arr = std.findSubstr(c,str); + if std.length(arr) == 0 then str+c else str; + +local gptResponse = std.extVar("gptResponse"); //this will be populated from the java code after the prompt is submitted to gpt +local action = extractAction(gptResponse); +local thought = extractThought(gptResponse); +local searchResponse = std.substr(callFunction("search")(action), 0, 400); //extract action from response and insert here +local observation = std.join('',["Observation:", searchResponse]); +local context = std.extVar("context") + "\n" + gptResponse + "\n" + observation; +local prompt = appendIfMissing(context, "\n" + observation); +{ + observation: observation, + thought: thought, + action: action, + preset: preset, + prompt: prompt, + context: context, + searchResponse: searchResponse, + gptResponse: gptResponse +} diff --git a/JS/edgechains/examples/react-chain/tsconfig.json b/JS/edgechains/examples/react-chain/tsconfig.json new file mode 100644 index 000000000..f370e670f --- /dev/null +++ b/JS/edgechains/examples/react-chain/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "types": ["dotenv/config", "jest", "node"], + "target": "ES2022", + "module": "NodeNext", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx", + "noImplicitAny": false, + "moduleResolution": "NodeNext", + "declaration": true + }, + "include": ["src/**/*.ts", "dist/**/*.d.ts"] +} diff --git a/JS/edgechains/examples/src/routes/hydeSearch.route.ts b/JS/edgechains/examples/src/routes/hydeSearch.route.ts deleted file mode 100644 index 51b376524..000000000 --- a/JS/edgechains/examples/src/routes/hydeSearch.route.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Hono } from "hono"; -import { hydeSearchAdaEmbedding } from "../service/HydeSearchService.js"; -import { HydeFragmentData } from "../types/HydeFragmentData.js"; -const HydeSearchRouter = new Hono(); - -HydeSearchRouter.get("/search", async (c) => { - const query = await c.req.query(); - const arkRequest = { - topK: parseInt(query.topK ?? "5"), - metadataTable: query.metadataTable, - query: query.query, - textWeight: { - baseWeight: query.textBaseWeight, - fineTuneWeight: query.textFineTuneWeight, - }, - similarityWeight: { - baseWeight: query.similarityBaseWeight, - fineTuneWeight: query.similarityFineTuneWeight, - }, - dateWeight: { - baseWeight: query.dateBaseWeight, - fineTuneWeight: query.dateFineTuneWeight, - }, - orderRRF: query.orderRRF, - }; - const answer = await hydeSearchAdaEmbedding( - arkRequest, - process.env.OPENAI_API_KEY!, - process.env.OPENAI_ORG_ID! - ); - const final_answer = answer.finalAnswer; - const responses = answer.wordEmbeddings; - const data: HydeFragmentData = { responses, final_answer }; - return c.html(` - -
-
-
${data.final_answer}
-
-
    - ${data.responses.map( - (item) => ` -
  • -
    -
    - ${ - item.rawText != null - ? `
    ${item.rawText}
    ` - : `
    ${item.metadata}
    ` - } - ${ - item.filename != null - ? `
    ${item.filename}
    ` - : "" - } - ${ - item.titleMetadata != null - ? `
    ${item.titleMetadata}
    ` - : "" - } - ${ - item.documentDate != null - ? `
    ${item.documentDate}
    ` - : "" - } -
    -
    -
  • - ` - )} -
- - `); -}); - -export { HydeSearchRouter }; diff --git a/JS/edgechains/examples/src/testGeneration/TestGenerator.ts b/JS/edgechains/examples/src/testGeneration/TestGenerator.ts deleted file mode 100644 index 9dfee10f9..000000000 --- a/JS/edgechains/examples/src/testGeneration/TestGenerator.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Jsonnet } from "@hanazuki/node-jsonnet"; -import * as path from "path"; -import { OpenAiEndpoint } from "src/lib/OpenAiEndpoint"; - -const jsonnet = new Jsonnet(); -const promptPath = path.join(process.cwd(), "./src/testGeneration/prompts.jsonnet"); -const testGeneratorPath = path.join(process.cwd(), "./src/testGeneration/testGenerator.jsonnet"); - -const gpt3endpoint = new OpenAiEndpoint( - "https://api.openai.com/v1/chat/completions", - "", - "", - "gpt-3.5-turbo", - "user", - 0.7 -); - -const classText = - "public class ChatMessage {\n" + - " String role;\n" + - " String content;\n\n" + - " public ChatMessage(String role, String content) {\n" + - " this.role = role;\n" + - " this.content = content;\n" + - " }\n\n" + - " public ChatMessage() {}\n\n" + - " public String getRole() {\n" + - " return role;\n" + - " }\n\n" + - " public String getContent() {\n" + - " return content;\n" + - " }\n\n" + - " public void setContent(String content) {\n" + - " this.content = content;\n" + - " }\n\n" + - " @Override\n" + - " public String toString() {\n" + - ' return "ChatMessage{" + "role=\'" + role + "\', content=\'" + content + "\'}";\n' + - " }\n" + - "}"; -export async function getContent() { - try { - var prompt = await jsonnet.evaluateFile(promptPath); - - const testPrompt = await jsonnet - .extString("promptTemplate", JSON.parse(prompt).prompt) - .extString("test_class", classText) - .extString("test_package", "JUnit") - .evaluateFile(testGeneratorPath); - - var responce = await gpt3endpoint.gptFnTestGenerator(JSON.parse(testPrompt).prompt); - - console.log("First Response.......\n \n" + responce); - var finalResponse = responce; - - responce += JSON.parse(prompt).promptPlan; - - finalResponse += await gpt3endpoint.gptFnTestGenerator(responce); - - console.log("Final Response.......\n\n"); - - return finalResponse; - } catch (error) { - console.log(error); - } -} diff --git a/JS/edgechains/examples/src/testGeneration/prompts.jsonnet b/JS/edgechains/examples/src/testGeneration/prompts.jsonnet deleted file mode 100644 index daa0bf998..000000000 --- a/JS/edgechains/examples/src/testGeneration/prompts.jsonnet +++ /dev/null @@ -1,28 +0,0 @@ -local prompt = ||| - # How to write great unit tests with {test_package} - In this advanced tutorial for experts, we'll use Java and {test_package} to write a suite of unit tests to verify the behavior of the following function. - ```java - {test_class} - ``` - Before writing any unit tests, let's review what each element of the function is doing exactly and what the author's intentions may have been. - - First, - |||; - -local prompt_to_explain_a_plan =||| - A good unit test suite should aim to: - - Test the function's behavior for a wide range of possible inputs - - Test edge cases that the author may not have foreseen - - Take advantage of the features of {test_package} to make the tests easy to write and maintain - - Be easy to read and understand, with clean code and descriptive names - - Be deterministic, so that the tests always pass or fail in the same way - - {test_package} has many convenient features that make it easy to write and maintain unit tests. We'll use them to write unit tests for the function above. - - For this particular function, we'll want our unit tests to handle the following diverse scenarios (and under each scenario, we include a few examples as sub-bullets): - - - |||; - -{ - "promptPlan" : prompt_to_explain_a_plan, - "prompt" : prompt -} \ No newline at end of file diff --git a/JS/edgechains/examples/src/testGeneration/testGenerator.jsonnet b/JS/edgechains/examples/src/testGeneration/testGenerator.jsonnet deleted file mode 100644 index 351357215..000000000 --- a/JS/edgechains/examples/src/testGeneration/testGenerator.jsonnet +++ /dev/null @@ -1,18 +0,0 @@ -//Replace the {} in the prompt template with the query -local updateTestPrompt(promptTemplate, test_class) = - local updatedPrompt = std.strReplace(promptTemplate,'{test_class}',test_class); - updatedPrompt; - -//To replace the time in the system prompt -local updateTimePrompt(promptTemplate, test_package) = - local updatedPrompt =std.strReplace(promptTemplate,'{test_package}',test_package); - updatedPrompt; - -local promptTemplate = std.extVar("promptTemplate"); -local test_class = std.extVar("test_class"); -local test_package = std.extVar("test_package"); -local updatedQueryPrompt = updateTestPrompt(promptTemplate, test_class); -local updatedPrompt = updateTimePrompt(updatedQueryPrompt, test_package); -{ - "prompt": updatedPrompt -} \ No newline at end of file diff --git a/JS/edgechains/examples/src/types/HydeFragmentData.ts b/JS/edgechains/examples/src/types/HydeFragmentData.ts deleted file mode 100644 index e807409b3..000000000 --- a/JS/edgechains/examples/src/types/HydeFragmentData.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface HydeFragmentData { - responses: Array<{ - rawText?: string; - metadata?: string; - filename?: string; - titleMetadata?: string; - documentDate?: string; - }>; - final_answer?: string; -} diff --git a/JS/edgechains/examples/wikiExample/.gitignore b/JS/edgechains/examples/wikiExample/.gitignore new file mode 100644 index 000000000..03c61f409 --- /dev/null +++ b/JS/edgechains/examples/wikiExample/.gitignore @@ -0,0 +1,8 @@ +# standard exclusions +node_modules + +# build artifacts +dist + +# environment files +.env diff --git a/JS/edgechains/examples/wikiExample/README.md b/JS/edgechains/examples/wikiExample/README.md new file mode 100644 index 000000000..9b4660be9 --- /dev/null +++ b/JS/edgechains/examples/wikiExample/README.md @@ -0,0 +1,15 @@ +## How to run WikiExample:- + +- Use the following command in the root directory to run this example: + + `npm i` + + `npm run build` + + `npm start` + +- This example searches on Wikipedia on given input by you and then it will ask to GPT to summarize the result of Wikipedia in `30` bullet points. + +- To use this example make a `POST` request call on `http://localhost:3000/wiki-summary`. +- Request body: + `{"input": "Your Search Topic"}` diff --git a/JS/edgechains/examples/wikiExample/esbuild.build.js b/JS/edgechains/examples/wikiExample/esbuild.build.js new file mode 100644 index 000000000..8da795c0e --- /dev/null +++ b/JS/edgechains/examples/wikiExample/esbuild.build.js @@ -0,0 +1,45 @@ +const esbuild = require("esbuild"); +const path = require("path"); +const fs = require("fs"); +const { execSync } = require("child_process"); + +const outputDir = path.resolve(__dirname, "dist"); + +if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir); +} + +const distPath = path.join(process.cwd(), "dist"); + +fs.promises.mkdir(distPath, { recursive: true }); + +esbuild + .build({ + entryPoints: ["./src/index.ts"], + bundle: true, + minify: true, + platform: "node", + outfile: "./dist/index.js", + tsconfig: "./tsconfig.json", + target: "node21.1.0", + external: [ + "express", + "tsx", + "typescript", + "typeorm", + "react", + "react-dom", + "pg", + "jsdom", + "hono", + "@hanazuki/node-jsonnet", + "readline/promises", + ], + format: "cjs", + loader: { + ".html": "text", + ".css": "css", + ".jsonnet": "text", + }, + }) + .catch(() => process.exit(1)); diff --git a/JS/edgechains/examples/wikiExample/ormconfig.json b/JS/edgechains/examples/wikiExample/ormconfig.json new file mode 100644 index 000000000..21819c00f --- /dev/null +++ b/JS/edgechains/examples/wikiExample/ormconfig.json @@ -0,0 +1,11 @@ +{ + "type": "postgres", + "host": "db.rmzqtepwnzoxgkkzjctt.supabase.co", + "port": 5432, + "username": "postgres", + "password": "xaX0MYcf1YiJlChK", + "database": "postgres", + "entities": ["dist/entities/**/*.js"], + "synchronize": false, + "logging": false +} diff --git a/JS/edgechains/examples/wikiExample/package-lock.json b/JS/edgechains/examples/wikiExample/package-lock.json new file mode 100644 index 000000000..602f98557 --- /dev/null +++ b/JS/edgechains/examples/wikiExample/package-lock.json @@ -0,0 +1,8148 @@ +{ + "name": "example", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "example", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@hono/node-server": "^1.2.0", + "@types/dotenv": "^8.2.0", + "hono": "^3.9.2", + "pg": "^8.11.3", + "reflect-metadata": "^0.1.13", + "tsc": "^2.0.4", + "typescript": "^5.3.2" + }, + "devDependencies": { + "@arakoodev/edgechains.js": "0.1.10", + "@hanazuki/node-jsonnet": "^2.1.0", + "@types/jest": "^29.5.8", + "@types/node": "^20.9.4", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "axios": "^1.6.2", + "dotenv": "^16.3.1", + "dts-bundle-generator": "^8.1.2", + "eslint": "^8.54.0", + "eslint-config-prettier": "^9.0.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-n": "^16.3.1", + "eslint-plugin-promise": "^6.1.1", + "jest": "^29.7.0", + "prettier": "^3.1.0", + "react": "^18.2.0", + "ts-jest": "^29.1.1", + "tsx": "^3.12.2", + "typeorm": "^0.3.17", + "typescript": "^5.0.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@arakoodev/edgechains.js": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@arakoodev/edgechains.js/-/edgechains.js-0.1.10.tgz", + "integrity": "sha512-QUzUpEc+nr+QNFvkD0+lvloo8R/pYWHsC99zY3IaGyL2fTuRi75BnR7RAwXKLKDjG8+Qng7K4+CzSaNrn+kcCw==", + "dev": true, + "dependencies": { + "@hono/node-server": "^1.2.0", + "@types/dotenv": "^8.2.0", + "axios": "^1.6.2", + "dotenv": "^16.3.1", + "hono": "^3.9.2", + "inquirer": "^9.2.12", + "prettier": "^3.1.0" + }, + "bin": { + "create-edgechains": "create-edgechains/scripts/create-edgechains.js" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", + "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.5", + "@babel/parser": "^7.23.5", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", + "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", + "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.5", + "@babel/types": "^7.23.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", + "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.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/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "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.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@hanazuki/node-jsonnet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hanazuki/node-jsonnet/-/node-jsonnet-2.1.0.tgz", + "integrity": "sha512-eAky1kbhBNXeqCoPZbkXa6pASEYXgIY6WwszJiGctUCFaQpQcZlxIvRv+P96GiQ+P8mU1CTfVYqsjTIihG3UkA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "cmake-js": "^7.0.0", + "node-addon-api": "^6.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@hono/node-server": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.3.1.tgz", + "integrity": "sha512-eQBCDbH1Vv/TiYXNP8aGfJTuXi9xGhEd/EZg9u6dhr7zC5/WKKztcBmbrOTtixVBvvV6bfcay6KEginwiqHyXg==", + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.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": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "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/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.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@ljharb/through": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", + "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-ylSC9GhfRH7m1EUXBXofhgx4lUWmFeQDINW5oLuS+gxWdfUeW4zJdeVTYVkexEW+e2VUvlZR2kGnGGipAWR7kw==", + "deprecated": "This is a stub types definition. dotenv provides its own type definitions, so you do not need this installed.", + "dependencies": { + "dotenv": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.10", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz", + "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.2.tgz", + "integrity": "sha512-37MXfxkb0vuIlRKHNxwCkb60PNBpR94u4efQuN4JgIAm66zfCDXGSAFCef9XUWFovX2R1ok6Z7MHhtdVXXkkIw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", + "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/type-utils": "6.13.1", + "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", + "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", + "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/utils": "6.13.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", + "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.1", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "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==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "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-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "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/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001565", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", + "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/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/cli-highlight/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/cli-highlight/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/cli-highlight/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/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cmake-js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.2.1.tgz", + "integrity": "sha512-AdPSz9cSIJWdKvm0aJgVu3X8i0U3mNTswJkSHzZISqmYVjZk7Td4oDFg0mCBA383wO+9pG5Ix7pEP1CZH9x2BA==", + "dev": true, + "dependencies": { + "axios": "^1.3.2", + "debug": "^4", + "fs-extra": "^10.1.0", + "lodash.isplainobject": "^4.0.6", + "memory-stream": "^1.0.0", + "node-api-headers": "^0.0.2", + "npmlog": "^6.0.2", + "rc": "^1.2.7", + "semver": "^7.3.8", + "tar": "^6.1.11", + "url-join": "^4.0.1", + "which": "^2.0.2", + "yargs": "^17.6.0" + }, + "bin": { + "cmake-js": "bin/cmake-js" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "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/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "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/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "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/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dts-bundle-generator": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/dts-bundle-generator/-/dts-bundle-generator-8.1.2.tgz", + "integrity": "sha512-/yvy9Xw0cfFodA8n6jEq8/COZ/WXgJtPabnLBAzIfP/TfxWbD/0a0dvfqNHneNqswQrH0kUcaAfGJC9UNvH97w==", + "dev": true, + "dependencies": { + "typescript": ">=5.0.2", + "yargs": "^17.6.0" + }, + "bin": { + "dts-bundle-generator": "dist/bin/dts-bundle-generator.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.601", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.601.tgz", + "integrity": "sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?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/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "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.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "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.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "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", + "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.3", + "strip-ansi": "^6.0.1", + "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-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "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" + } + ], + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-config-standard-with-typescript": { + "version": "40.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-40.0.0.tgz", + "integrity": "sha512-GXUJcwIXiTQaS3H4etv8a1lejVVdZYaxZNz3g7vt6GoJosQqMTurbmSC4FVGyHiGT/d1TjFr3+47A3xsHhsG+Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^6.4.0", + "eslint-config-standard": "17.1.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.4.0", + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0", + "typescript": "*" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", + "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0", + "eslint-compat-utils": "^0.1.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-n": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.3.1.tgz", + "integrity": "sha512-w46eDIkxQ2FaTHcey7G40eD+FhTXOdKudDXPUO2n9WNcslze/i/HT2qJ3GXjHngYSGDISIgPNhwGtgoix4zeOw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.1.0", + "get-tsconfig": "^4.7.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "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.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.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/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/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/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "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-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "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.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "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.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/hono": { + "version": "3.10.4", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.10.4.tgz", + "integrity": "sha512-2LJd+a3qyvSuyFlyJSRN1CeH5wg6/Rjua/5L5gdT1W+4U7EUZtnHph74klbyysGg69sfZNXsIrR7PJWSjf2Vww==", + "engines": { + "node": ">=16.0.0" + } + }, + "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/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "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/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "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/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inquirer": { + "version": "9.2.12", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz", + "integrity": "sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==", + "dev": true, + "dependencies": { + "@ljharb/through": "^2.3.11", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "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/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "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": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "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/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/memory-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", + "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", + "dev": true, + "dependencies": { + "readable-stream": "^3.4.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "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/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true + }, + "node_modules/node-api-headers": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-0.0.2.tgz", + "integrity": "sha512-YsjmaKGPDkmhoNKIpkChtCsPVaRE0a274IdERKnuc/E8K1UJdBZ4/mvI006OijlQZHCfpRNOH3dfHQs92se8gg==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.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/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "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/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "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/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pg": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "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/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/prettier": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "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/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "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/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "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/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/tsc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/tsc/-/tsc-2.0.4.tgz", + "integrity": "sha512-fzoSieZI5KKJVBYGvwbVZs/J5za84f2lSTLPYf6AGiIf43tZ3GNrI1QzTLcjtyDDP4aLxd46RTZq1nQxe7+k5Q==", + "bin": { + "tsc": "bin/tsc" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tsx": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz", + "integrity": "sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==", + "dev": true, + "dependencies": { + "esbuild": "~0.18.20", + "get-tsconfig": "^4.7.2", + "source-map-support": "^0.5.21" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/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/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-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typeorm": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.17.tgz", + "integrity": "sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig==", + "dev": true, + "dependencies": { + "@sqltools/formatter": "^1.2.5", + "app-root-path": "^3.1.0", + "buffer": "^6.0.3", + "chalk": "^4.1.2", + "cli-highlight": "^2.1.11", + "date-fns": "^2.29.3", + "debug": "^4.3.4", + "dotenv": "^16.0.3", + "glob": "^8.1.0", + "mkdirp": "^2.1.3", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.5.0", + "uuid": "^9.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" + }, + "engines": { + "node": ">= 12.9.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0", + "@sap/hana-client": "^2.12.25", + "better-sqlite3": "^7.1.2 || ^8.0.0", + "hdb-pool": "^0.1.6", + "ioredis": "^5.0.4", + "mongodb": "^5.2.0", + "mssql": "^9.1.1", + "mysql2": "^2.2.5 || ^3.0.1", + "oracledb": "^5.1.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "hdb-pool": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typeorm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/typeorm/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typeorm/node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "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/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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" + } + } + } +} diff --git a/JS/edgechains/examples/wikiExample/package.json b/JS/edgechains/examples/wikiExample/package.json new file mode 100644 index 000000000..ae8132296 --- /dev/null +++ b/JS/edgechains/examples/wikiExample/package.json @@ -0,0 +1,49 @@ +{ + "name": "example", + "version": "1.0.0", + "description": "", + "main": "dist/index.js", + "scripts": { + "build": "rm -rf dist && node esbuild.build.js", + "start": "node dist/index.js", + "lint": "eslint --ignore-path .eslintignore --ext .js,.ts", + "format": "prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json)\"", + "test": "npx jest" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@hono/node-server": "^1.2.0", + "@types/dotenv": "^8.2.0", + "hono": "^3.9.2", + "pg": "^8.11.3", + "reflect-metadata": "^0.1.13", + "tsc": "^2.0.4", + "typescript": "^5.3.2" + }, + "devDependencies": { + "@hanazuki/node-jsonnet": "^2.1.0", + "@types/jest": "^29.5.8", + "@types/node": "^20.9.4", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "axios": "^1.6.2", + "dotenv": "^16.3.1", + "dts-bundle-generator": "^8.1.2", + "eslint": "^8.54.0", + "eslint-config-prettier": "^9.0.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-n": "^16.3.1", + "eslint-plugin-promise": "^6.1.1", + "jest": "^29.7.0", + "prettier": "^3.1.0", + "react": "^18.2.0", + "@arakoodev/edgechains.js": "0.1.10", + "ts-jest": "^29.1.1", + "tsx": "^3.12.2", + "typeorm": "^0.3.17", + "typescript": "^5.0.2" + } +} diff --git a/JS/edgechains/examples/wikiExample/src/WikiExample.test.ts b/JS/edgechains/examples/wikiExample/src/WikiExample.test.ts new file mode 100644 index 000000000..86552f3db --- /dev/null +++ b/JS/edgechains/examples/wikiExample/src/WikiExample.test.ts @@ -0,0 +1,7 @@ +const wikiSummary = require("./WikiExample"); + +describe("Wiki Search", () => { + it("should return a response", async () => { + expect(await wikiSummary("Barak Obama")).toContain("Barak Obama"); + }, 30000); +}); diff --git a/JS/edgechains/examples/wikiExample/src/WikiExample.ts b/JS/edgechains/examples/wikiExample/src/WikiExample.ts new file mode 100644 index 000000000..5d9903830 --- /dev/null +++ b/JS/edgechains/examples/wikiExample/src/WikiExample.ts @@ -0,0 +1,74 @@ +import { Jsonnet } from "@hanazuki/node-jsonnet"; +import { OpenAiEndpoint } from "@arakoodev/edgechains.js"; +import * as path from "path"; +import { Hono } from "hono"; +import axios from "axios"; + +const jsonnet = new Jsonnet(); + +export const WikiRouter = new Hono(); + +WikiRouter.post("/wiki-summary", async (c) => { + const query = await c.req.json(); + const summary = await wikiSummary(query.input); + + return c.json({ message: summary }, 200); +}); + +const wikiJsonnetPath = path.join(__dirname, "../src/wiki.jsonnet"); + +const gpt3endpoint = new OpenAiEndpoint( + "https://api.openai.com/v1/chat/completions", + process.env.OPENAI_API_KEY!, + "", + "gpt-3.5-turbo", + "user", + parseInt("0.7") +); + +export async function wikiSummary(input: string) { + const wikiResponse = await axios + .post( + "https://en.wikipedia.org/w/api.php", + {}, + { + params: { + action: "query", + prop: "extracts", + format: "json", + titles: input, + explaintext: "", + }, + headers: { + "content-type": "application/x-www-form-urlencoded", + Accept: "application/json", + }, + } + ) + .then(function (response) { + return Object.values(response.data.query.pages); + }) + .catch(function (error) { + if (error.response) { + console.log("Server responded with status code:", error.response.status); + console.log("Response data:", error.response.data); + } else if (error.request) { + console.log("No response received:", error.request); + } else { + console.log("Error creating request:", error.message); + } + }); + + const wikiJsonnet = await jsonnet + .extString("keepMaxTokens", "true") + .extString("maxTokens", "4096") + .extString("keepContext", "true") + .extString("context", wikiResponse[0].extract) + .evaluateFile(wikiJsonnetPath); + + const gpt3Response = await gpt3endpoint.gptFn(JSON.parse(wikiJsonnet).prompt); + + console.log("Summary from GPT: \n\n\n" + gpt3Response); + + return gpt3Response; +} diff --git a/JS/edgechains/examples/wikiExample/src/index.ts b/JS/edgechains/examples/wikiExample/src/index.ts new file mode 100644 index 000000000..cdab1d916 --- /dev/null +++ b/JS/edgechains/examples/wikiExample/src/index.ts @@ -0,0 +1,12 @@ +import "dotenv/config"; +import { serve } from "@hono/node-server"; +import { Hono } from "hono"; +import { WikiRouter } from "./WikiExample"; + +const app = new Hono(); + +app.route("/", WikiRouter); + +serve(app, () => { + console.log("server running on port 3000"); +}); diff --git a/JS/edgechains/examples/wikiExample/src/wiki.jsonnet b/JS/edgechains/examples/wikiExample/src/wiki.jsonnet new file mode 100644 index 000000000..5eb6c16c6 --- /dev/null +++ b/JS/edgechains/examples/wikiExample/src/wiki.jsonnet @@ -0,0 +1,32 @@ +local stringToBool(s) = + if s == "true" then true + else false; + +local keepMaxTokens = stringToBool(std.extVar("keepMaxTokens")); +local maxTokens = if keepMaxTokens == "true" then std.parseInt(std.extVar("maxTokens")) else 5120; + +local preset = ||| + You are a Summary Generator Bot. For any question other than summarizing the data, you should tell that you cannot answer it. + You should detect the language and the characters the user is writing in, and reply in the same character set and language. + + You should follow the following template while answering the user: + + ``` + 1. - + 2. - + ... + ``` + Now, given the data, create a 30-bullet point summary of: + |||; +local keepContext = std.extVar("keepContext"); +local context = if keepContext == "true" then std.extVar("context") else ""; + + +local prompt = std.join("\n", [preset, context]); +{ + "maxTokens": maxTokens, + "typeOfKeepContext": std.type(keepContext), + "preset" : preset, + "context": context, + "prompt": if(std.length(prompt) > maxTokens) then std.substr(prompt, 0, maxTokens) else prompt +} \ No newline at end of file diff --git a/JS/edgechains/examples/wikiExample/tsconfig.json b/JS/edgechains/examples/wikiExample/tsconfig.json new file mode 100644 index 000000000..f370e670f --- /dev/null +++ b/JS/edgechains/examples/wikiExample/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "types": ["dotenv/config", "jest", "node"], + "target": "ES2022", + "module": "NodeNext", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx", + "noImplicitAny": false, + "moduleResolution": "NodeNext", + "declaration": true + }, + "include": ["src/**/*.ts", "dist/**/*.d.ts"] +} diff --git a/JS/edgechains/lib/esbuild.build.js b/JS/edgechains/lib/esbuild.build.js index 6745597dd..36e52e245 100644 --- a/JS/edgechains/lib/esbuild.build.js +++ b/JS/edgechains/lib/esbuild.build.js @@ -51,6 +51,10 @@ esbuild }); console.log("TypeScript compilation and index.d.ts generation successful."); + + execSync("cd create-edgechains && rm -rf dist"); + + execSync("cd create-edgechains && tsup-node index.ts --format esm", { stdio: "inherit" }); }) .catch(() => { console.error("TypeScript compilation or index.d.ts generation failed."); diff --git a/JS/wasm/assets/wasmjs/wit/arakoo-geo.witx b/JS/wasm/assets/wasmjs/wit/arakoo-geo.witx new file mode 100644 index 000000000..ef5d9e13e --- /dev/null +++ b/JS/wasm/assets/wasmjs/wit/arakoo-geo.witx @@ -0,0 +1,29 @@ +(typename $arakoo_status + (enum (@witx tag u32) + $ok + $error + $inval + $badf + $buflen + $unsupported + $badalign + $httpinvalid + $httpuser + $httpincomplete + $none + $httpheadtoolarge + $httpinvalidstatus + $limitexceeded + $again + )) + +(module $arakoo_geo + (@interface func (export "lookup") + (param $addr_octets (@witx const_pointer (@witx char8))) + (param $addr_len (@witx usize)) + (param $buf (@witx pointer (@witx char8))) + (param $buf_len (@witx usize)) + (param $nwritten_out (@witx pointer (@witx usize))) + (result $err (expected (error $arakoo_status))) + ) +) \ No newline at end of file diff --git a/JS/wasm/assets/wasmjs/wit/http-types.wit b/JS/wasm/assets/wasmjs/wit/http-types.wit new file mode 100644 index 000000000..41c3ecee1 --- /dev/null +++ b/JS/wasm/assets/wasmjs/wit/http-types.wit @@ -0,0 +1,45 @@ +type uri = string +type http-status = u16 +type http-header = tuple +type http-headers = list +enum http-method { + get, + post, + put, + patch, + delete, + options, + head +} +type http-param = tuple +type http-params = list +type http-body = list +record http-request { + body: option, + headers: http-headers, + method: http-method, + params: http-params, + uri: uri, +} +record http-request-error { + error: http-error, + message: string +} +record http-response { + body: option, + headers: http-headers, + status: http-status, +} +enum http-error { + invalid-request, + invalid-request-body, + invalid-response-body, + not-allowed, + internal-error, + timeout, + redirect-loop, +} +enum file-error { + not-found, + invalid-path, +} diff --git a/JS/wasm/assets/wasmjs/wit/http.wit b/JS/wasm/assets/wasmjs/wit/http.wit new file mode 100644 index 000000000..df2a5f05b --- /dev/null +++ b/JS/wasm/assets/wasmjs/wit/http.wit @@ -0,0 +1,4 @@ +use * from http-types +send-http-request: func(request: http-request) -> expected +parse-jsonnet: func(file: string) -> expected +read-bytes: func(file: string) -> expected diff --git a/JS/wasm/crates/wasmjs-engine/.gitignore b/JS/wasm/crates/wasmjs-engine/.gitignore new file mode 100644 index 000000000..a404254d7 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/.gitignore @@ -0,0 +1,2 @@ +target/ +**/node_modules/ \ No newline at end of file diff --git a/JS/wasm/crates/wasmjs-engine/Cargo.lock b/JS/wasm/crates/wasmjs-engine/Cargo.lock new file mode 100644 index 000000000..f950d0ccb --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/Cargo.lock @@ -0,0 +1,1205 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59d2a3357dde987206219e78ecfbbb6e8dad06cbb65292758d3270e6254f7355" + +[[package]] +name = "async-trait" +version = "0.1.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.42", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bindgen" +version = "0.64.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" +dependencies = [ + "bitflags 1.3.2", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 1.0.109", + "which", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clang-sys" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "futures-channel" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd" + +[[package]] +name = "futures-task" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879" + +[[package]] +name = "futures-util" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951dfc2e32ac02d67c90c0d65bd27009a635dc9b381a2cc7d284ab01e3a0150d" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92445bc9cc14bfa0a3ce56817dc3b5bcc227a168781a356b702410789cec0d10" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.0.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b75264b2003a3913f118d35c586e535293b3e22e41f074930762929d071e092" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "tokio", + "tracing", + "want", +] + +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "javy" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82bea151527df24f765b795a87a80d144f8cc35ef99acaed99465f1206a4501e" +dependencies = [ + "anyhow", + "quickjs-wasm-rs", + "serde-transcode", + "serde_json", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.45.0", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "openssl" +version = "0.10.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pulldown-cmark" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffade02495f22453cd593159ea2f59827aae7f53fa8323f756799b670881dcf8" +dependencies = [ + "bitflags 1.3.2", + "memchr", + "unicase", +] + +[[package]] +name = "quickjs-wasm-rs" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "174a4fb51c14dcb82f1f98ec1ec3c2f26f2cd6e40f200d86c5f6eecacf40b409" +dependencies = [ + "anyhow", + "once_cell", + "quickjs-wasm-sys", + "serde", +] + +[[package]] +name = "quickjs-wasm-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1af9a5eb35f2df97dc9816b711e681b0c3cc8f5c18fdd7df0021ec4f60bbcb4" +dependencies = [ + "anyhow", + "bindgen", + "bytes", + "cc", + "futures-core", + "futures-task", + "futures-util", + "http-body-util", + "hyper", + "mio", + "native-tls", + "openssl-macros", + "tokio", + "tokio-macros", + "tokio-native-tls", + "walkdir", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-transcode" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "590c0e25c2a5bb6e85bf5c1bce768ceb86b316e7a01bdf07d2cb4ec2271990e2" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.42", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "shlex" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b7d0a2c048d661a1a59fcd7355baa232f7ed34e0ee4df2eef3c1c1c0d3852d8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" +dependencies = [ + "autocfg", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.45.0", +] + +[[package]] +name = "tokio-macros" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasmjs-engine" +version = "0.1.0" +dependencies = [ + "anyhow", + "javy", + "regex", + "serde_json", + "wit-bindgen-rust", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "wit-bindgen-gen-core" +version = "0.2.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=v0.2.0#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" +dependencies = [ + "anyhow", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-gen-rust" +version = "0.2.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=v0.2.0#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" +dependencies = [ + "heck", + "wit-bindgen-gen-core", +] + +[[package]] +name = "wit-bindgen-gen-rust-wasm" +version = "0.2.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=v0.2.0#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" +dependencies = [ + "heck", + "wit-bindgen-gen-core", + "wit-bindgen-gen-rust", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.2.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=v0.2.0#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" +dependencies = [ + "async-trait", + "bitflags 1.3.2", + "wit-bindgen-rust-impl", +] + +[[package]] +name = "wit-bindgen-rust-impl" +version = "0.2.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=v0.2.0#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" +dependencies = [ + "proc-macro2", + "syn 1.0.109", + "wit-bindgen-gen-core", + "wit-bindgen-gen-rust-wasm", +] + +[[package]] +name = "wit-parser" +version = "0.2.0" +source = "git+https://github.com/bytecodealliance/wit-bindgen?tag=v0.2.0#cb871cfa1ee460b51eb1d144b175b9aab9c50aba" +dependencies = [ + "anyhow", + "id-arena", + "pulldown-cmark", + "unicode-normalization", + "unicode-xid", +] diff --git a/JS/wasm/crates/wasmjs-engine/Cargo.toml b/JS/wasm/crates/wasmjs-engine/Cargo.toml new file mode 100644 index 000000000..07bf9c246 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "wasmjs-engine" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1" +javy = { version = "2.1.0", features = ["json"] } +regex = "1" +serde_json = "1.0.108" +# wit-bindgen-rust = "0.13.1" +wit-bindgen-rust = { git = "https://github.com/bytecodealliance/wit-bindgen", tag = "v0.2.0" } + +[profile.release] +lto = "thin" diff --git a/JS/wasm/crates/wasmjs-engine/build.rs b/JS/wasm/crates/wasmjs-engine/build.rs new file mode 100644 index 000000000..506027b3f --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/build.rs @@ -0,0 +1,19 @@ +use std::process::Command; + +fn main() { + Command::new("npm") + .current_dir("shims") + .arg("install") + .status() + .unwrap(); + + Command::new("npm") + .current_dir("shims") + .args(["run", "build"]) + .status() + .unwrap(); + + println!("cargo:rerun-if-changed=shims/package.json"); + println!("cargo:rerun-if-changed=shims/build.js"); + println!("cargo:rerun-if-changed=shims/src/*.js"); +} diff --git a/JS/wasm/crates/wasmjs-engine/package-lock.json b/JS/wasm/crates/wasmjs-engine/package-lock.json new file mode 100644 index 000000000..42532ba21 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "wasmjs-engine", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/.gitignore b/JS/wasm/crates/wasmjs-engine/shims/.gitignore new file mode 100644 index 000000000..77738287f --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/.gitignore @@ -0,0 +1 @@ +dist/ \ No newline at end of file diff --git a/JS/wasm/crates/wasmjs-engine/shims/build.js b/JS/wasm/crates/wasmjs-engine/shims/build.js new file mode 100644 index 000000000..ebfb9d72e --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/build.js @@ -0,0 +1,68 @@ +import { build } from "esbuild"; + +// Build for index.js +build({ + entryPoints: ["src/index.js"], + bundle: true, + outfile: "dist/index.js", + format: "esm", + target: "esnext", + platform: "node", + treeShaking: false, +}).catch((error) => { + console.error(error); + process.exit(1); +}); + +// Build for buffer.js +build({ + entryPoints: ["src/buffer.js"], + bundle: true, + outfile: "dist/buffer.js", + format: "esm", + target: "esnext", + platform: "node", + treeShaking: false, +}).catch((error) => { + console.error(error); + process.exit(1); +}); + +build({ + entryPoints: ["src/path.js"], + bundle: true, + outfile: "dist/path.js", + format: "esm", + target: "esnext", + platform: "node", + treeShaking: false, +}).catch((error) => { + console.error(error); + process.exit(1); +}); + +build({ + entryPoints: ["src/crypto.ts"], + bundle: true, + outfile: "dist/crypto.js", + format: "esm", + target: "esnext", + platform: "node", + treeShaking: false, +}).catch((error) => { + console.error(error); + process.exit(1); +}); + +build({ + entryPoints: ["src/arakoo-jsonnet.js"], + bundle: true, + outfile: "dist/arakoo-jsonnet.js", + format: "esm", + target: "esnext", + platform: "node", + treeShaking: false, +}).catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/JS/wasm/crates/wasmjs-engine/shims/package-lock.json b/JS/wasm/crates/wasmjs-engine/shims/package-lock.json new file mode 100644 index 000000000..7bb9dc38c --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/package-lock.json @@ -0,0 +1,567 @@ +{ + "name": "shims", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "shims", + "version": "1.0.0", + "dependencies": { + "@sinonjs/text-encoding": "^0.7", + "@types/node": "^20.10.3", + "@ungap/url-search-params": "^0.2", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "esbuild": "^0.19", + "http-status": "^1.7", + "query-string": "^7.1.1", + "sjcl": "^1.0.8", + "url-parse": "^1.5.10" + }, + "devDependencies": { + "@types/sjcl": "^1.0.34" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==" + }, + "node_modules/@types/node": { + "version": "20.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", + "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/sjcl": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/@types/sjcl/-/sjcl-1.0.34.tgz", + "integrity": "sha512-bQHEeK5DTQRunIfQeUMgtpPsNNCcZyQ9MJuAfW1I7iN0LDunTc78Fu17STbLMd7KiEY/g2zHVApippa70h6HoQ==", + "dev": true + }, + "node_modules/@ungap/url-search-params": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@ungap/url-search-params/-/url-search-params-0.2.2.tgz", + "integrity": "sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esbuild": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-status": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.7.3.tgz", + "integrity": "sha512-GS8tL1qHT2nBCMJDYMHGkkkKQLNkIAHz37vgO68XKvzv+XyqB4oh/DfmMHdtRzfqSJPj1xKG2TaELZtlCz6BEQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/sjcl": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/sjcl/-/sjcl-1.0.8.tgz", + "integrity": "sha512-LzIjEQ0S0DpIgnxMEayM1rq9aGwGRG4OnZhCdjx7glTaJtf4zRfpg87ImfjSJjoW9vKpagd82McDOwbRT5kQKQ==", + "engines": { + "node": "*" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + } + } +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/package.json b/JS/wasm/crates/wasmjs-engine/shims/package.json new file mode 100644 index 000000000..da05da7b5 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/package.json @@ -0,0 +1,24 @@ +{ + "name": "shims", + "version": "1.0.0", + "type": "module", + "main": "bin/index.js", + "scripts": { + "build": "node ./build.js" + }, + "dependencies": { + "@sinonjs/text-encoding": "^0.7", + "@types/node": "^20.10.3", + "@ungap/url-search-params": "^0.2", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "esbuild": "^0.19", + "http-status": "^1.7", + "query-string": "^7.1.1", + "sjcl": "^1.0.8", + "url-parse": "^1.5.10" + }, + "devDependencies": { + "@types/sjcl": "^1.0.34" + } +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/arakoo-jsonnet.js b/JS/wasm/crates/wasmjs-engine/shims/src/arakoo-jsonnet.js new file mode 100644 index 000000000..b64160d75 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/arakoo-jsonnet.js @@ -0,0 +1,3 @@ +const parseJsonnet = globalThis.parseJsonnet; + +export { parseJsonnet }; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/buffer.js b/JS/wasm/crates/wasmjs-engine/shims/src/buffer.js new file mode 100644 index 000000000..5d9131bf5 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/buffer.js @@ -0,0 +1,17 @@ +import { + constants, + kMaxLength, + kStringMaxLength, + Buffer, + SlowBuffer, +} from "./internal/internal_buffer"; + +export { constants, kMaxLength, kStringMaxLength, Buffer, SlowBuffer }; + +export default { + constants, + kMaxLength, + kStringMaxLength, + Buffer, + SlowBuffer, +}; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/crypto.ts b/JS/wasm/crates/wasmjs-engine/shims/src/crypto.ts new file mode 100644 index 000000000..f176cf637 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/crypto.ts @@ -0,0 +1,321 @@ +import { ERR_METHOD_NOT_IMPLEMENTED } from "./internal/internal_errors"; + +// export const getRandomValues = crypto.getRandomValues; +// export const subtle = crypto.subtle; +// export const timingSafeEqual = (crypto as any).timingSafeEqual; +// export const webcrypto = crypto; + +import { + DiffieHellman, + DiffieHellmanGroup, + createDiffieHellman, + createDiffieHellmanGroup, + getDiffieHellman, +} from "./internal/crypto_dh"; + +import { + randomBytes, + randomFillSync, + randomFill, + randomInt, + randomUUID, + PrimeNum, + GeneratePrimeOptions, + CheckPrimeOptions, + generatePrime, + generatePrimeSync, + checkPrime, + checkPrimeSync, +} from "./internal/crypto_random"; + +import { createHash, createHmac, Hash, HashOptions, Hmac } from "./internal/crypto_hash"; + +import { hkdf, hkdfSync } from "./internal/crypto_hkdf"; + +import { pbkdf2, pbkdf2Sync, ArrayLike } from "./internal/crypto_pbkdf2"; + +import { + KeyObject, + PublicKeyObject, + PrivateKeyObject, + SecretKeyObject, + generateKey, + generateKeyPair, + generateKeyPairSync, + generateKeySync, + createPrivateKey, + createPublicKey, + createSecretKey, +} from "./internal/crypto_keys"; + +export { + // DH + DiffieHellman, + DiffieHellmanGroup, + createDiffieHellman, + createDiffieHellmanGroup, + getDiffieHellman, + // Random + randomBytes, + randomFillSync, + randomFill, + randomInt, + randomUUID, + // Primes + PrimeNum as primeNum, + GeneratePrimeOptions as generatePrimeOptions, + CheckPrimeOptions as checkPrimeOptions, + generatePrime, + generatePrimeSync, + checkPrime, + checkPrimeSync, + // Hash and Hmac + createHash, + createHmac, + Hash, + HashOptions, + Hmac, + // Hkdf + hkdf, + hkdfSync, + // Pbkdf2 + pbkdf2, + pbkdf2Sync, + ArrayLike as arrayLike, + // Keys + KeyObject, + PublicKeyObject, + PrivateKeyObject, + SecretKeyObject, + generateKey, + generateKeyPair, + generateKeyPairSync, + generateKeySync, + createPrivateKey, + createPublicKey, + createSecretKey, +}; + +export function getCiphers() { + return [ + "aes-128-cbc", + "aes-192-cbc", + "aes-256-cbc", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "aes-128-ecb", + "aes-192-ecb", + "aes-256-ecb", + "aes-128-gcm", + "aes-192-gcm", + "aes-256-gcm", + "aes-128-ofb", + "aes-192-ofb", + "aes-256-ofb", + "des-ecb", + "des-ede", + "des-ede-cbc", + "rc2-cbc", + ]; +} + +export function getCurves() { + // Hardcoded list of supported curves. Note that prime256v1 is equivalent to secp256r1, we follow + // OpenSSL's and bssl's nomenclature here. + return ["secp224r1", "prime256v1", "secp384r1", "secp521r1"]; +} + +export function getHashes() { + // Hardcoded list of hashes supported in boringssl, node's approach looks pretty clunky. This is + // expected to change infrequently based of bssl's stability-focused approach. + return [ + "md4", + "md5", + "sha1", + "sha224", + "sha256", + "sha384", + "sha512", + "md5-sha1", + "RSA-MD5", + "RSA-SHA1", + "RSA-SHA224", + "RSA-SHA256", + "RSA-SHA384", + "RSA-SHA512", + "DSA-SHA", + "DSA-SHA1", + "ecdsa-with-SHA1", + ]; +} + +// We do not implement the openssl secure heap. +export function secureHeapUsed() { + return { + total: 0, + used: 0, + utilization: 0, + min: 0, + }; +} + +// We do not allow users to set the engine used. +export function setEngine(_1: string, _2?: number) { + throw new ERR_METHOD_NOT_IMPLEMENTED("setEngine"); +} + +// We do not allow users to modify the FIPS enablement. +export function setFips(_: boolean) { + throw new ERR_METHOD_NOT_IMPLEMENTED("setFips"); +} + +// We always run in FIPS mode. +export const fips = true; +export function getFips() { + return fips; +} + +export default { + // DH + DiffieHellman, + DiffieHellmanGroup, + createDiffieHellman, + createDiffieHellmanGroup, + getDiffieHellman, + // Keys, + KeyObject, + PublicKeyObject, + PrivateKeyObject, + SecretKeyObject, + generateKey, + generateKeyPair, + generateKeyPairSync, + generateKeySync, + createPrivateKey, + createPublicKey, + createSecretKey, + // Random + // getRandomValues, + randomBytes, + randomFillSync, + randomFill, + randomInt, + randomUUID, + generatePrime, + generatePrimeSync, + checkPrime, + checkPrimeSync, + // Hash and Hmac + Hash, + Hmac, + createHash, + createHmac, + getHashes, + // Hkdf + hkdf, + hkdfSync, + // Pbkdf2 + pbkdf2, + pbkdf2Sync, + // Misc + getCiphers, + getCurves, + secureHeapUsed, + setEngine, + // timingSafeEqual, + // Fips + getFips, + setFips, + get fips() { + return getFips(); + }, + set fips(_: boolean) { + setFips(_); + }, + // WebCrypto + // subtle, + // webcrypto, +}; + +// Classes +// * [ ] crypto.Certificate +// * [ ] crypto.Cipher +// * [ ] crypto.Decipher +// * [x] crypto.DiffieHellman +// * [x] crypto.DiffieHellmanGroup +// * [ ] crypto.ECDH +// * [x] crypto.Hash +// * [x] crypto.Hmac +// * [ ] crypto.KeyObject +// * [ ] crypto.Sign +// * [ ] crypto.Verify +// * [ ] crypto.X509Certificate +// * [ ] crypto.constants +// * [ ] crypto.DEFAULT_ENCODING +// * Primes +// * [x] crypto.checkPrime(candidate[, options], callback) +// * [x] crypto.checkPrimeSync(candidate[, options]) +// * [x] crypto.generatePrime(size[, options[, callback]]) +// * [x] crypto.generatePrimeSync(size[, options]) +// * Ciphers +// * [ ] crypto.createCipher(algorithm, password[, options]) +// * [ ] crypto.createCipheriv(algorithm, key, iv[, options]) +// * [ ] crypto.createDecipher(algorithm, password[, options]) +// * [ ] crypto.createDecipheriv(algorithm, key, iv[, options]) +// * [ ] crypto.privateDecrypt(privateKey, buffer) +// * [ ] crypto.privateEncrypt(privateKey, buffer) +// * [ ] crypto.publicDecrypt(key, buffer) +// * [ ] crypto.publicEncrypt(key, buffer) +// * DiffieHellman +// * [x] crypto.createDiffieHellman(prime[, primeEncoding][, generator][, generatorEncoding]) +// * [x] crypto.createDiffieHellman(primeLength[, generator]) +// * [x] crypto.createDiffieHellmanGroup(name) +// * [ ] crypto.createECDH(curveName) +// * [ ] crypto.diffieHellman(options) +// * [x] crypto.getDiffieHellman(groupName) +// * Hash +// * [x] crypto.createHash(algorithm[, options]) +// * [x] crypto.createHmac(algorithm, key[, options]) +// * [x] crypto.getHashes() +// * Keys +// * [ ] crypto.createPrivateKey(key) +// * [ ] crypto.createPublicKey(key) +// * [x] crypto.createSecretKey(key[, encoding]) +// * [x] crypto.generateKey(type, options, callback) +// * [x] crypto.generateKeyPair(type, options, callback) +// * [x] crypto.generateKeyPairSync(type, options) +// * [x] crypto.generateKeySync(type, options) +// * Sign/Verify +// * [ ] crypto.createSign(algorithm[, options]) +// * [ ] crypto.createVerify(algorithm[, options]) +// * [ ] crypto.sign(algorithm, data, key[, callback]) +// * [ ] crypto.verify(algorithm, data, key, signature[, callback]) +// * Misc +// * [ ] crypto.getCipherInfo(nameOrNid[, options]) +// * [x] crypto.getCiphers() +// * [x] crypto.getCurves() +// * [x] crypto.secureHeapUsed() +// * [x] crypto.setEngine(engine[, flags]) +// * [x] crypto.timingSafeEqual(a, b) +// * Fips +// * [x] crypto.getFips() +// * [x] crypto.fips +// * [x] crypto.setFips(bool) +// * Random +// * [x] crypto.getRandomValues(typedArray) +// * [x] crypto.randomBytes(size[, callback]) +// * [x] crypto.randomFillSync(buffer[, offset][, size]) +// * [x] crypto.randomFill(buffer[, offset][, size], callback) +// * [x] crypto.randomInt([min, ]max[, callback]) +// * [x] crypto.randomUUID([options]) +// * Key Derivation +// * [.] crypto.hkdf(digest, ikm, salt, info, keylen, callback) (* still needs KeyObject support) +// * [.] crypto.hkdfSync(digest, ikm, salt, info, keylen) (* still needs KeyObject support) +// * [x] crypto.pbkdf2(password, salt, iterations, keylen, digest, callback) +// * [x] crypto.pbkdf2Sync(password, salt, iterations, keylen, digest) +// * [ ] crypto.scrypt(password, salt, keylen[, options], callback) +// * [ ] crypto.scryptSync(password, salt, keylen[, options]) +// * WebCrypto +// * [x] crypto.subtle +// * [x] crypto.webcrypto diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/events.ts b/JS/wasm/crates/wasmjs-engine/shims/src/events.ts new file mode 100644 index 000000000..77f7b3f46 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/events.ts @@ -0,0 +1,2 @@ +export * from "./internal/events"; +export { default } from "./internal/events"; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/index.js b/JS/wasm/crates/wasmjs-engine/shims/src/index.js new file mode 100644 index 000000000..2fa1129e0 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/index.js @@ -0,0 +1,371 @@ +// import { URLSearchParams } from "@ungap/url-search-params"; +import { TextEncoder, TextDecoder } from "@sinonjs/text-encoding"; +import httpStatus from "http-status"; +import Url from "url-parse"; +import _queryString from "query-string"; + +class URL { + constructor(urlStr, base = undefined) { + let url = Url(urlStr, base); + this.url = url; + this.protocol = url.protocol; + this.slashes = url.slashes; + this.auth = url.auth; + this.username = url.username; + this.password = url.password; + this.host = url.host; + this.port = url.port; + this.pathname = url.pathname; + this.search = url.query; + this.searchParams = new URLSearchParams(this.search); + this.hash = url.hash; + this.href = url.origin; + this.origin = url.origin; + } + + set(key, value) { + this.url.set(key, value); + } + + toString() { + return this.url.toString(); + } + + toJson() { + return this.url.toString(); + } +} + +class URLSearchParams { + queryParams = {}; + + constructor(val) { + this.queryParams = { + ..._queryString.parse(val), + }; + } + append(key, val) { + this.queryParams[key] = val; + } + delete(key) { + delete this.queryParams[key]; + } + entries() { + let arr = []; + Object.entries(this.queryParams).map((o) => { + if (Array.isArray(o[1])) { + o[1].map((k) => { + arr.push([o[0], k]); + }); + } else { + arr.push([o[0], o[1]]); + } + }); + let iterLength = arr.length; + let iterIndex = 0; + return { + next: function () { + return iterIndex < iterLength + ? { value: arr[iterIndex++], done: false } + : { done: true }; + }, + }; + } + get(key) { + let val = this.queryParams[key]; + if (val) { + if (typeof val == "object") { + return val[0]; + } + return val; + } + return null; + } + getAll(key) { + let val = this.queryParams[key]; + if (val) { + return val; + } + return null; + } + has(key) { + return this.queryParams[key] != undefined ? true : false; + } + keys() { + return Object.keys(this.queryParams); + } + set(key, val) { + this.queryParams[key] = val; + } + toString() { + return _queryString.stringify(this.queryParams); + } + values() { + return Object.keys(this.queryParams).map((k) => this.queryParams[k]); + } + [Symbol.iterator]() { + return this.entries(); + } +} + +globalThis.URL = URL; +globalThis.URLSearchParams = URLSearchParams; + +function atob(b64) { + return Buffer.from(b64, "base64").toString(); +} + +function btoa(data) { + return Buffer.from(data).toString("base64"); +} + +globalThis.btoa = btoa; +globalThis.atob = atob; + +function require(path) { + return globalThis[path]; +} + +globalThis.require = require; +class Headers { + constructor(initialHeaders) { + let headers = {}; + + for (const key in initialHeaders) { + let value = initialHeaders[key]; + + if (typeof value === "string") { + headers[key] = value; + } + } + + this.headers = headers; + } + + append(key, value) { + this.headers[key] = value; + return value; + } + + set(key, value) { + this.append(key, value); + return value; + } + + delete(key) { + let dropValue = delete this.headers[key]; + return dropValue; + } + + get(key) { + return this.headers[key]; + } + + toJSON() { + return this.headers; + } +} + +class Request { + constructor(input) { + this.url = input.url; + this.method = input.method; + this.headers = new Headers(input.headers || {}); + this.body = input.body; + this.params = input.params || {}; + this.geo = input.geo || {}; + } + + text() { + return this.body; + } +} + +class Response { + constructor(body, options = {}) { + if (body instanceof String) { + this.body = body.toString(); + } else { + this.body = body; + } + + if (options.headers instanceof Headers) { + this.headers = options.headers; + } else if (options.headers instanceof Object) { + this.headers = new Headers(options.headers); + } else { + this.headers = new Headers({}); + } + + this.status = options.status || 200; + this.statusText = options.statusText || httpStatus[this.status]; + } + + static redirect(url, status = 307) { + return new Response(`Redirecting to ${url}`, { + status, + headers: { + Location: url, + }, + }); + } + + get ok() { + return this.status >= 200 && this.status < 300; + } + + defaultEncoding() { + return "utf-8"; + } + + arrayBuffer() { + let parsedBody = this.body; + + if (typeof this.body === "string") { + try { + parsedBody = new TextEncoder().encode(this.body); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + return parsedBody; + } + + json() { + let parsedBody = this.body; + + if (typeof this.body !== "string") { + try { + parsedBody = new TextDecoder(this.defaultEncoding()).decode(this.body); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + try { + return Promise.resolve(JSON.parse(parsedBody)); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + text() { + let parsedBody = this.body; + + if (typeof this.body !== "string") { + try { + parsedBody = new TextDecoder(this.defaultEncoding()).decode(this.body); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + return parsedBody; + } + + toString() { + return this.body; + } +} + +(function () { + const __send_http_request = globalThis.__send_http_request; + const __console_log = globalThis.__console_log; + + globalThis.fetch = (uri, opts) => { + let optsWithDefault = { + method: "GET", + headers: {}, + body: null, + ...opts, + }; + + if (optsWithDefault.body !== null && typeof optsWithDefault.body !== "string") { + try { + optsWithDefault.body = new TextEncoder().encode(optsWithDefault.body); + } catch (e) { + return Promise.reject(`err: ${e}`); + } + } + + let result = __send_http_request(uri, optsWithDefault); + + if (result.error === true) { + return Promise.reject(new Error(`[${result.type}] ${result.message}`)); + } else { + let response = new Response(result.body, { + headers: result.headers, + status: result.status, + }); + + return Promise.resolve(response); + } + }; + + globalThis.console = { + error(msg) { + this.log(msg); + }, + log(msg) { + __console_log(msg); + }, + info(msg) { + this.log(msg); + }, + debug(msg) { + this.log(msg); + }, + warn(msg) { + this.log(msg); + }, + trace(msg) { + this.log(msg); + }, + }; + + Reflect.deleteProperty(globalThis, "__send_http_request"); + Reflect.deleteProperty(globalThis, "__console_log"); +})(); + +globalThis.TextEncoder = TextEncoder; +globalThis.TextDecoder = TextDecoder; + +let handlerFunction; + +globalThis.addEventListener = (_eventName, handler) => { + handlerFunction = handler; +}; + +const requestToHandler = (input) => { + const request = new Request(input); + const event = { + request, + response: {}, + respondWith(res) { + this.response = res; + }, + }; + + try { + handlerFunction(event); + + Promise.resolve(event.response) + .then((res) => { + result = { + data: res.body, + headers: res.headers.headers, + status: res.status, + }; + }) + .catch((err) => { + error = `err: \n${err}`; + }); + } catch (err) { + error = `err: ${err}\n${err.stack}`; + } +}; + +globalThis.entrypoint = requestToHandler; +globalThis.result = {}; +globalThis.error = null; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/async_hooks.d.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/async_hooks.d.ts new file mode 100644 index 000000000..6f02fb827 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/async_hooks.d.ts @@ -0,0 +1,26 @@ +// Type definitions for c++ implementation. + +export interface AsyncResourceOptions { + triggerAsyncId?: number; +} + +export class AsyncResource { + public constructor(type: string, options?: AsyncResourceOptions); + public runInAsyncScope(fn: (...args: unknown[]) => R, ...args: unknown[]): R; + + public bind unknown>( + fn: Func + ): Func & { asyncResource: AsyncResource }; + + public static bind unknown, ThisArg>( + fn: Func, + type?: string, + thisArg?: ThisArg + ): Func & { asyncResource: AsyncResource }; +} + +export class AsyncLocalStorage { + public run(store: T, fn: (...args: unknown[]) => R, ...args: unknown[]): R; + public exit(fn: (...args: unknown[]) => R, ...args: unknown[]): R; + public getStore(): T; +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/async_hooks.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/async_hooks.ts new file mode 100644 index 000000000..968aa2fc3 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/async_hooks.ts @@ -0,0 +1,30 @@ +export interface AsyncResourceOptions { + triggerAsyncId?: number; +} + +export class AsyncResource { + // @ts-ignore + public constructor(type: string, options?: AsyncResourceOptions); + // @ts-ignore + public runInAsyncScope(fn: (...args: unknown[]) => R, ...args: unknown[]): R; + + public bind unknown>( + fn: Func + ): Func & { asyncResource: AsyncResource }; + + // @ts-ignore + public static bind unknown, ThisArg>( + fn: Func, + type?: string, + thisArg?: ThisArg + ): Func & { asyncResource: AsyncResource }; +} + +export class AsyncLocalStorage { + // @ts-ignore + public run(store: T, fn: (...args: unknown[]) => R, ...args: unknown[]): R; + // @ts-ignore + public exit(fn: (...args: unknown[]) => R, ...args: unknown[]): R; + // @ts-ignore + public getStore(): T; +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/buffer.d.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/buffer.d.ts new file mode 100644 index 000000000..6ba318865 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/buffer.d.ts @@ -0,0 +1,38 @@ +export interface CompareOptions { + aStart?: number; + aEnd?: number; + bStart?: number; + bEnd?: number; +} + +type BufferSource = ArrayBufferView | ArrayBuffer; + +export function byteLength(value: string): number; +export function compare(a: Uint8Array, b: Uint8Array, options?: CompareOptions): number; +export function concat(list: Uint8Array[], length: number): ArrayBuffer; +export function decodeString(value: string, encoding: string): ArrayBuffer; +export function fillImpl( + buffer: Uint8Array, + value: string | BufferSource, + start: number, + end: number, + encoding?: string +): void; +export function indexOf( + buffer: Uint8Array, + value: string | Uint8Array, + byteOffset?: number, + encoding?: string, + findLast?: boolean +): number | undefined; +export function swap(buffer: Uint8Array, size: 16 | 32 | 64): void; +export function toString(buffer: Uint8Array, start: number, end: number, encoding: string): string; +export function write( + buffer: Uint8Array, + value: string, + offset: number, + length: number, + encoding: string +): void; +export function decode(buffer: Uint8Array, state: Uint8Array): string; +export function flush(state: Uint8Array): string; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/buffer.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/buffer.ts new file mode 100644 index 000000000..21fde0761 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/buffer.ts @@ -0,0 +1,521 @@ +import { isInstance } from "./internal_buffer"; +import * as base64 from "base64-js"; +import { TextEncoder, TextDecoder } from "@sinonjs/text-encoding"; + +const hexCharValueTable = { + "0": 0, + "1": 1, + "2": 2, + "3": 3, + "4": 4, + "5": 5, + "6": 6, + "7": 7, + "8": 8, + "9": 9, + a: 10, + b: 11, + c: 12, + d: 13, + e: 14, + f: 15, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15, +}; + +export function byteLength(string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length; + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength; + } + if (typeof string !== "string") { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + "Received type " + + typeof string + ); + } + + const len = string.length; + const mustMatch = arguments.length > 2 && arguments[2] === true; + if (!mustMatch && len === 0) return 0; + + // Use a for loop to avoid recursion + let loweredCase = false; + for (;;) { + switch (encoding) { + case "ascii": + case "latin1": + case "binary": + return len; + case "utf8": + case "utf-8": + return utf8ToBytes(string).length; + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return len * 2; + case "hex": + return len >>> 1; + case "base64": + return base64ToBytes(string).length; + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length; // assume utf8 + } + encoding = ("" + encoding).toLowerCase(); + loweredCase = true; + } + } +} + +// @ts-ignore + +export function compare(a: Uint8Array, b: Uint8Array, options?): number { + const aStart = options?.aStart ?? 0; + const aEnd = options?.aEnd ?? a.length; + const bStart = options?.bStart ?? 0; + const bEnd = options?.bEnd ?? b.length; + + const sliceA = a.slice(aStart, aEnd); + const sliceB = b.slice(bStart, bEnd); + + let x = sliceA.length; + let y = sliceB.length; + + for (let i = 0, len = Math.min(x, y); i < len; ++i) { + if (sliceA[i] !== sliceB[i]) { + x = sliceA[i]; + y = sliceB[i]; + break; + } + } + + if (x < y) return -1; + if (y < x) return 1; + return 0; +} + +export function concat(list: Uint8Array[], length: number): ArrayBuffer { + const result = new Uint8Array(length); + let offset = 0; + for (let i = 0; i < list.length; i++) { + result.set(list[i], offset); + offset += list[i].length; + } + return result.buffer; +} + +export function toString(buffer: Uint8Array, start: number, end: number, encoding: string): string { + const slice = buffer.slice(start, end); + const decoder = new TextDecoder(encoding); + return decoder.decode(slice); +} + +export function swap(buffer: Uint8Array, size: 16 | 32 | 64): void { + const length = buffer.length; + if (length % size !== 0) { + throw new RangeError("Buffer size must be a multiple of " + size); + } + + for (let i = 0; i < length; i += size) { + let left = i; + let right = i + size - 1; + while (left < right) { + const temp = buffer[left]; + buffer[left] = buffer[right]; + buffer[right] = temp; + left++; + right--; + } + } +} + +export function decodeString(value: string, encoding: string): ArrayBuffer { + const encoder = new TextEncoder(); + return encoder.encode(value).buffer; +} + +export function write( + buffer: Uint8Array, + value: string, + offset: number, + length: number, + encoding: string +): void { + let loweredCase = false; + for (;;) { + switch (encoding) { + case "hex": + return hexWrite(buffer, value, offset, length); + + case "utf8": + case "utf-8": + return utf8Write(buffer, value, offset, length); + + case "ascii": + case "latin1": + case "binary": + return asciiWrite(buffer, value, offset, length); + + case "base64": + // Warning: maxLength not taken into account in base64Write + return base64Write(buffer, value, offset, length); + + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return ucs2Write(buffer, value, offset, length); + + default: + if (loweredCase) throw new TypeError("Unknown encoding: " + encoding); + encoding = ("" + encoding).toLowerCase(); + loweredCase = true; + } + } +} + +export function fillImpl( + buffer: Uint8Array, + val: string | BufferSource | number | boolean, + start: number, + end: number, + encoding?: string +): void { + let i; + if (typeof val === "number") { + for (i = start; i < end; ++i) { + buffer[i] = val; + } + } else { + const bytes = Buffer.isBuffer(val) ? val : Buffer.from(val as string, encoding); + const len = bytes.length; + for (i = 0; i < end - start; ++i) { + buffer[i + start] = bytes[i % len]; + } + } +} + +export function indexOf(buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1; + + // Normalize byteOffset + if (typeof byteOffset === "string") { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff; + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000; + } + byteOffset = +byteOffset; // Coerce to Number. + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : buffer.length - 1; + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + if (byteOffset >= buffer.length) { + if (dir) return -1; + else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0; + else return -1; + } + + // Normalize val + if (typeof val === "string") { + val = Buffer.from(val, encoding); + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1; + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir); + } else if (typeof val === "number") { + val = val & 0xff; // Search for a byte value [0-255] + if (typeof Uint8Array.prototype.indexOf === "function") { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset); + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset); + } + } + return arrayIndexOf(buffer, [val], byteOffset, encoding, dir); + } + + throw new TypeError("val must be string, number or Buffer"); +} + +function arrayIndexOf(arr, val, byteOffset, encoding, dir) { + let indexSize = 1; + let arrLength = arr.length; + let valLength = val.length; + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase(); + if ( + encoding === "ucs2" || + encoding === "ucs-2" || + encoding === "utf16le" || + encoding === "utf-16le" + ) { + if (arr.length < 2 || val.length < 2) { + return -1; + } + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + + function read(buf, i) { + if (indexSize === 1) { + return buf[i]; + } else { + return buf.readUInt16BE(i * indexSize); + } + } + + let i; + if (dir) { + let foundIndex = -1; + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize; + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; + for (i = byteOffset; i >= 0; i--) { + let found = true; + for (let j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break; + } + } + if (found) return i; + } + } + + return -1; +} + +function utf8ToBytes(string, units?) { + units = units || Infinity; + let codePoint; + const length = string.length; + let leadSurrogate = null; + const bytes = []; + + for (let i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); + + // is surrogate component + if (codePoint > 0xd7ff && codePoint < 0xe000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xdbff) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xef, 0xbf, 0xbd); + continue; + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xef, 0xbf, 0xbd); + continue; + } + + // valid lead + leadSurrogate = codePoint; + + continue; + } + + // 2 leads in a row + if (codePoint < 0xdc00) { + if ((units -= 3) > -1) bytes.push(0xef, 0xbf, 0xbd); + leadSurrogate = codePoint; + continue; + } + + // valid surrogate pair + codePoint = (((leadSurrogate - 0xd800) << 10) | (codePoint - 0xdc00)) + 0x10000; + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xef, 0xbf, 0xbd); + } + + leadSurrogate = null; + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break; + bytes.push(codePoint); + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break; + bytes.push((codePoint >> 0x6) | 0xc0, (codePoint & 0x3f) | 0x80); + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break; + bytes.push( + (codePoint >> 0xc) | 0xe0, + ((codePoint >> 0x6) & 0x3f) | 0x80, + (codePoint & 0x3f) | 0x80 + ); + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break; + bytes.push( + (codePoint >> 0x12) | 0xf0, + ((codePoint >> 0xc) & 0x3f) | 0x80, + ((codePoint >> 0x6) & 0x3f) | 0x80, + (codePoint & 0x3f) | 0x80 + ); + } else { + throw new Error("Invalid code point"); + } + } + + return bytes; +} + +function hexWrite(buf, string, offset, length) { + offset = Number(offset) || 0; + const remaining = buf.length - offset; + if (!length) { + length = remaining; + } else { + length = Number(length); + if (length > remaining) { + length = remaining; + } + } + + const strLen = string.length; + + if (length > strLen / 2) { + length = strLen / 2; + } + let i; + for (i = 0; i < length; ++i) { + const a = hexCharValueTable[string[i * 2]]; + const b = hexCharValueTable[string[i * 2 + 1]]; + if (a === undefined || b === undefined) { + return i; + } + buf[offset + i] = (a << 4) | b; + } + return i; +} + +function base64ToBytes(str) { + return base64.toByteArray(base64clean(str)); +} + +function utf8Write(buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length); +} + +function asciiWrite(buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length); +} + +function base64Write(buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length); +} + +function ucs2Write(buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length); +} + +function asciiToBytes(str) { + const byteArray = []; + for (let i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xff); + } + return byteArray; +} + +function utf16leToBytes(str, units) { + let c, hi, lo; + const byteArray = []; + for (let i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break; + + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + + return byteArray; +} + +const INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g; + +function base64clean(str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split("=")[0]; + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = str.trim().replace(INVALID_BASE64_RE, ""); + // Node converts strings with length < 2 to '' + if (str.length < 2) return ""; + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + "="; + } + return str; +} + +function blitBuffer(src, dst, offset, length) { + let i; + for (i = 0; i < length; ++i) { + if (i + offset >= dst.length || i >= src.length) break; + dst[i + offset] = src[i]; + } + return i; +} + +function numberIsNaN(obj) { + // For IE11 support + return obj !== obj; // eslint-disable-line no-self-compare +} + +export function flush(state: Uint8Array): string { + // Create a new Uint8Array object from the state. + const buffer = new Uint8Array(state); + return String.fromCharCode.apply(null, buffer); +} + +export function decode(buffer: Uint8Array, state: Uint8Array): string { + let result = ""; + for (let i = 0; i < buffer.length; i++) { + const byte = buffer[i]; + const char = state[byte]; + if (char === undefined) { + throw new Error("Invalid byte"); + } + result += char; + } + return result; +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/constants.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/constants.ts new file mode 100644 index 000000000..2013d207f --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/constants.ts @@ -0,0 +1,44 @@ +export const CHAR_UPPERCASE_A = 65; /* A */ +export const CHAR_LOWERCASE_A = 97; /* a */ +export const CHAR_UPPERCASE_Z = 90; /* Z */ +export const CHAR_LOWERCASE_Z = 122; /* z */ +export const CHAR_UPPERCASE_C = 67; /* C */ +export const CHAR_LOWERCASE_B = 98; /* b */ +export const CHAR_LOWERCASE_E = 101; /* e */ +export const CHAR_LOWERCASE_N = 110; /* n */ +export const CHAR_DOT = 46; /* . */ +export const CHAR_FORWARD_SLASH = 47; /* / */ +export const CHAR_BACKWARD_SLASH = 92; /* \ */ +export const CHAR_VERTICAL_LINE = 124; /* | */ +export const CHAR_COLON = 58; /* : */ +export const CHAR_QUESTION_MARK = 63; /* ? */ +export const CHAR_UNDERSCORE = 95; /* _ */ +export const CHAR_LINE_FEED = 10; /* \n */ +export const CHAR_CARRIAGE_RETURN = 13; /* \r */ +export const CHAR_TAB = 9; /* \t */ +export const CHAR_FORM_FEED = 12; /* \f */ +export const CHAR_EXCLAMATION_MARK = 33; /* ! */ +export const CHAR_HASH = 35; /* # */ +export const CHAR_SPACE = 32; /* */ +export const CHAR_NO_BREAK_SPACE = 160; /* \u00A0 */ +export const CHAR_ZERO_WIDTH_NOBREAK_SPACE = 65279; /* \uFEFF */ +export const CHAR_LEFT_SQUARE_BRACKET = 91; /* [ */ +export const CHAR_RIGHT_SQUARE_BRACKET = 93; /* ] */ +export const CHAR_LEFT_ANGLE_BRACKET = 60; /* < */ +export const CHAR_RIGHT_ANGLE_BRACKET = 62; /* > */ +export const CHAR_LEFT_CURLY_BRACKET = 123; /* { */ +export const CHAR_RIGHT_CURLY_BRACKET = 125; /* } */ +export const CHAR_HYPHEN_MINUS = 45; /* - */ +export const CHAR_PLUS = 43; /* + */ +export const CHAR_DOUBLE_QUOTE = 34; /* " */ +export const CHAR_SINGLE_QUOTE = 39; /* ' */ +export const CHAR_PERCENT = 37; /* % */ +export const CHAR_SEMICOLON = 59; /* ; */ +export const CHAR_CIRCUMFLEX_ACCENT = 94; /* ^ */ +export const CHAR_GRAVE_ACCENT = 96; /* ` */ +export const CHAR_AT = 64; /* @ */ +export const CHAR_AMPERSAND = 38; /* & */ +export const CHAR_EQUAL = 61; /* = */ +export const CHAR_0 = 48; /* 0 */ +export const CHAR_9 = 57; /* 9 */ +export const EOL = ";"; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto.d.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto.d.ts new file mode 100644 index 000000000..afab20186 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto.d.ts @@ -0,0 +1,246 @@ +import { Buffer } from "./internal_buffer"; + +// random +export function checkPrimeSync(candidate: ArrayBufferView, num_checks: number): boolean; +export function randomPrime( + size: number, + safe: boolean, + add?: ArrayBufferView | undefined, + rem?: ArrayBufferView | undefined +): ArrayBuffer; + +// Hash and Hmac +export class HashHandle { + public constructor(algorithm: string, xofLen: number); + public update(data: Buffer | ArrayBufferView): number; + public digest(): ArrayBuffer; + public copy(xofLen: number): HashHandle; +} + +export type ArrayLike = ArrayBuffer | string | Buffer | ArrayBufferView; + +export class HmacHandle { + public constructor(algorithm: string, key: ArrayLike | CryptoKey); + public update(data: Buffer | ArrayBufferView): number; + public digest(): ArrayBuffer; +} + +// hkdf +export function getHkdf( + hash: string, + key: ArrayLike, + salt: ArrayLike, + info: ArrayLike, + length: number +): ArrayBuffer; + +// pbkdf2 +export function getPbkdf( + password: ArrayLike, + salt: ArrayLike, + iterations: number, + keylen: number, + digest: string +): ArrayBuffer; + +// Keys +export function exportKey(key: CryptoKey, options?: InnerExportOptions): KeyExportResult; +export function equals(key: CryptoKey, otherKey: CryptoKey): boolean; +export function getAsymmetricKeyDetail(key: CryptoKey): AsymmetricKeyDetails; +export function getAsymmetricKeyType(key: CryptoKey): AsymmetricKeyType; +export function createSecretKey(key: ArrayBuffer | ArrayBufferView): CryptoKey; +export function createPrivateKey(key: InnerCreateAsymmetricKeyOptions): CryptoKey; +export function createPublicKey(key: InnerCreateAsymmetricKeyOptions): CryptoKey; + +export type KeyData = string | ArrayBuffer | ArrayBufferView; +// +// export interface RsaKeyAlgorithm { +// name: 'rsa' | 'rsa-pss'; +// modulusLength: number; +// publicExponent: Uint8Array; +// hash?: string; +// } +// +// export interface EcKeyAlgorithm { +// name: 'ec'; +// namedCurve: string; +// } +// +// export interface DhKeyAlgorithm { +// name: 'dh'; +// prime: Uint8Array; +// generator: Uint8Array; +// } +// +// export interface DsaKeyAlgorithm { +// name: 'dsa'; +// prime: Uint8Array; +// divisorLength: number; +// } +// +// export interface HmacKeyAlgorithm { +// name: 'hmac'; +// hash: string; +// } +// +// export interface AesKeyAlgorithm { +// name: 'aes'; +// length: number; +// } +// +// export type KeyAlgorithm = RsaKeyAlgorithm | +// EcKeyAlgorithm | +// DhKeyAlgorithm | +// DsaKeyAlgorithm | +// HmacKeyAlgorithm | +// AesKeyAlgorithm; +// +// export interface CryptoKey { +// algorithm: KeyAlgorithm; +// extractable: boolean; +// type: KeyObjectType; +// usages: string[]; +// } +// +// export interface RsaOtherPrimesInfo { +// d?: string; +// r?: string; +// t?: string; +// } +// +// export interface JsonWebKey { +// alg?: string; +// crv?: string; +// d?: string; +// dp?: string; +// dq?: string; +// e?: string; +// ext?: boolean; +// k?: string; +// key_ops?: string[]; +// kty?: string; +// n?: string; +// oth?: Array; +// p?: string; +// q?: string; +// qi?: string; +// use?: string; +// x?: string; +// y?: string; +// } +// +// export interface CryptoKeyPair { +// privateKey: CryptoKey; +// publicKey: CryptoKey; +// } +// +// export type KeyObjectType = 'secret' | 'public' | 'private'; +// +// export type KeyExportResult = string | Buffer | JsonWebKey; +// +// export type SecretKeyFormat = 'buffer' | 'jwk'; +// export type AsymmetricKeyFormat = 'pem' | 'der' | 'jwk'; +// export type PublicKeyEncoding = 'pkcs1' | 'spki'; +// export type PrivateKeyEncoding = 'pkcs1' | 'pkcs8' | 'sec1'; +// export type AsymmetricKeyType = 'rsa' | 'rsa-pss' | 'dsa' | 'ec' | 'x25519' | 'ed25519' | 'dh'; +// export type SecretKeyType = 'hmac' | 'aes'; +// export type ParamEncoding = 'named' | 'explicit'; +// +// export interface SecretKeyExportOptions { +// format?: SecretKeyFormat; +// } +// +// export interface PublicKeyExportOptions { +// type?: PublicKeyEncoding; +// format?: AsymmetricKeyFormat; +// } +// +// export interface PrivateKeyExportOptions { +// type?: PrivateKeyEncoding; +// format?: AsymmetricKeyFormat; +// cipher?: string; +// passphrase?: string | Uint8Array; +// encoding?: string; +// } +// +// export interface InnerPrivateKeyExportOptions { +// type?: PrivateKeyEncoding; +// format?: AsymmetricKeyFormat; +// cipher?: string; +// passphrase?: Uint8Array; +// } +// +// export type ExportOptions = SecretKeyExportOptions | +// PublicKeyExportOptions | +// PrivateKeyExportOptions; +// +// export type InnerExportOptions = SecretKeyExportOptions | +// PublicKeyExportOptions | +// InnerPrivateKeyExportOptions; +// +// export interface AsymmetricKeyDetails { +// modulusLength?: number; +// publicExponent?: bigint; +// hashAlgorithm?: string; +// mgf1HashAlgorithm?: string; +// saltLength?: number; +// divisorLength?: number; +// namedCurve?: string; +// } +// +// export interface CreateAsymmetricKeyOptions { +// key: string | ArrayBuffer | ArrayBufferView | JsonWebKey; +// format?: AsymmetricKeyFormat; +// type?: PublicKeyEncoding | PrivateKeyEncoding; +// passphrase?: string | Uint8Array; +// encoding?: string; +// } +// +// export interface InnerCreateAsymmetricKeyOptions { +// key?: ArrayBuffer | ArrayBufferView | JsonWebKey | CryptoKey; +// format?: AsymmetricKeyFormat; +// type?: PublicKeyEncoding | PrivateKeyEncoding; +// passphrase?: Uint8Array; +// } +// +// export interface GenerateKeyOptions { +// length: number; +// } +// +// export interface GenerateKeyPairOptions { +// modulusLength?: number; +// publicExponent?: number|bigint; +// hashAlgorithm?: string; +// mgf1HashAlgorithm?: string; +// saltLength?: number; +// divisorLength?: number; +// namedCurve?: string; +// prime?: Uint8Array; +// primeLength?: number; +// generator?: number; +// groupName?: string; +// paramEncoding?: ParamEncoding; +// publicKeyEncoding?: PublicKeyExportOptions; +// privateKeyEncoding?: PrivateKeyExportOptions; +// } + +// DiffieHellman +export class DiffieHellmanHandle { + public constructor( + sizeOrKey: number | ArrayBuffer | ArrayBufferView, + generator: number | ArrayBuffer | ArrayBufferView + ); + public setPublicKey(data: ArrayBuffer | ArrayBufferView | Buffer): void; + public setPrivateKey(data: ArrayBuffer | ArrayBufferView | Buffer): void; + public getPublicKey(): ArrayBuffer; + public getPrivateKey(): ArrayBuffer; + public getGenerator(): ArrayBuffer; + public getPrime(): ArrayBuffer; + + public computeSecret(key: ArrayBuffer | ArrayBufferView): ArrayBuffer; + public generateKeys(): ArrayBuffer; + + public getVerifyError(): number; +} + +export function DiffieHellmanGroupHandle(name: string): DiffieHellmanHandle; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto.ts new file mode 100644 index 000000000..12248fd6e --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto.ts @@ -0,0 +1,502 @@ +import * as sjcl from "sjcl"; +import { Buffer } from "./internal_buffer"; + +export type ArrayLike = ArrayBuffer | string | Buffer | ArrayBufferView; +export type KeyData = string | ArrayBuffer | ArrayBufferView; + +/** + * Checks if a number represented by an ArrayBufferView is prime. + * + * @param {ArrayBufferView} candidate - The ArrayBufferView representing the number to check. + * @param {number} num_checks - The number of checks to perform. + * @returns {boolean} - Returns true if the number is prime, false otherwise. + */ +export function checkPrimeSync(candidate: ArrayBufferView, num_checks: number): boolean { + // Convert ArrayBufferView to number + let num = new Uint32Array(candidate.buffer)[0]; + + // Check if num is less than 2 (not a prime number) + if (num < 2) return false; + + // Check if num is divisible by any number up to its square root + for (let i = 2, sqrt = Math.sqrt(num); i <= sqrt; i++) { + if (num % i === 0) return false; + } + + // If no factors found, num is a prime number + return true; +} + +/** + * Generates a random prime number of a given size. + * + * @param {number} size - The size of the prime number to generate. + * @param {boolean} safe - If true, generates a safe prime (a prime number that is 2 less than another prime number). + * @param {ArrayBufferView} [add] - An ArrayBufferView representing a number to add to the generated prime number. + * @param {ArrayBufferView} [rem] - An ArrayBufferView representing a number to take the remainder of the generated prime number. + * @returns {ArrayBuffer} - Returns an ArrayBuffer representing the generated prime number. + */ +export function randomPrime( + size: number, + safe: boolean, + add?: ArrayBufferView, + rem?: ArrayBufferView +): ArrayBuffer { + let prime: number; + do { + prime = sjcl.random.randomWords(1, 0)[0]; + prime = Math.abs(prime) % 2 ** size; + if (safe) { + prime = 2 * prime + 1; + } + if (add) { + prime += new Uint32Array(add.buffer)[0]; + } + if (rem) { + prime %= new Uint32Array(rem.buffer)[0]; + } + } while (!checkPrimeSync(new Uint32Array([prime]), 10)); + + return new Uint32Array([prime]).buffer; +} + +// hkdf +export function getHkdf( + hash: string, + key: ArrayLike, + salt: ArrayLike, + info: ArrayLike, + length: number +): ArrayBuffer { + // Convert key, salt, and info to bitArrays + let keyBits = sjcl.codec.utf8String.toBits(key.toString()); + let saltBits = sjcl.codec.utf8String.toBits(salt.toString()); + let infoBits = sjcl.codec.utf8String.toBits(info.toString()); + + // Use sjcl.misc.hkdf to generate the key + // @ts-ignore + let derivedKeyBits = sjcl.misc.hkdf(keyBits, length, saltBits, hash, infoBits); + + // Convert the derived key to an ArrayBuffer and return it + return sjcl.codec.arrayBuffer.fromBits(derivedKeyBits); +} + +// pbkdf2 +export function getPbkdf( + password: ArrayLike, + salt: ArrayLike, + iterations: number, + keylen: number, + digest: string +): ArrayBuffer { + // Convert password and salt to bitArrays + let passwordBits = sjcl.codec.utf8String.toBits(password.toString()); + let saltBits = sjcl.codec.utf8String.toBits(salt.toString()); + + // Use sjcl.misc.pbkdf2 to generate the key + // @ts-ignore + let derivedKeyBits = sjcl.misc.pbkdf2(passwordBits, saltBits, iterations, keylen * 8, digest); + + // Convert the derived key to an ArrayBuffer and return it + return sjcl.codec.arrayBuffer.fromBits(derivedKeyBits); +} + +export class HashHandle { + private hash: sjcl.SjclHash; + + public constructor(algorithm: string, xofLen: number) { + switch (algorithm) { + case "sha1": + this.hash = new sjcl.hash.sha1(); + break; + case "sha256": + this.hash = new sjcl.hash.sha256(); + break; + case "sha512": + this.hash = new sjcl.hash.sha512(); + break; + default: + throw new Error(`Unsupported hash algorithm: ${algorithm}`); + } + + if (xofLen !== 0) { + throw new Error(`Unsupported xofLen: ${xofLen}`); + } + } + + public update(data: Buffer | ArrayBufferView): number { + let dataBits = sjcl.codec.utf8String.toBits(data.toString()); + this.hash.update(dataBits); + return this.hash.finalize().length; + } + + public digest(): ArrayBuffer { + let digestBits = this.hash.finalize(); + return sjcl.codec.arrayBuffer.fromBits(digestBits); + } + + public copy(xofLen: number): HashHandle { + let algo = ""; + let hash = this.hash; + switch (true) { + case hash instanceof sjcl.hash.sha1: + algo = "sha1"; + break; + case hash instanceof sjcl.hash.sha256: + algo = "sha256"; + break; + case hash instanceof sjcl.hash.sha512: + algo = "sha512"; + break; + default: + throw new Error(`Unsupported hash algorithm: ${algo}`); + } + let copy = new HashHandle(algo, xofLen); // Replace 'sha256' with the actual algorithm + copy.hash = this.hash; + return copy; + } +} + +export class HmacHandle { + private hmac: sjcl.SjclHMAC; + + public constructor(algorithm: string, key: ArrayLike | CryptoKey) { + let keyBits = sjcl.codec.utf8String.toBits(key.toString()); + switch (algorithm) { + case "sha1": + this.hmac = new sjcl.misc.hmac(keyBits, sjcl.hash.sha1); + break; + case "sha256": + this.hmac = new sjcl.misc.hmac(keyBits, sjcl.hash.sha256); + break; + case "sha512": + this.hmac = new sjcl.misc.hmac(keyBits, sjcl.hash.sha512); + break; + default: + throw new Error(`Unsupported hash algorithm: ${algorithm}`); + } + } + + public update(data: Buffer | ArrayBufferView): number { + let dataBits = sjcl.codec.utf8String.toBits(data.toString()); + this.hmac.update(dataBits); + return this.hmac.digest().length; + } + + public digest(): ArrayBuffer { + let digestBits = this.hmac.digest(); + return sjcl.codec.arrayBuffer.fromBits(digestBits); + } +} + +export interface RsaKeyAlgorithm { + name: "rsa" | "rsa-pss"; + modulusLength: number; + publicExponent: Uint8Array; + hash?: string; +} + +export interface EcKeyAlgorithm { + name: "ec"; + namedCurve: string; +} + +export interface DhKeyAlgorithm { + name: "dh"; + prime: Uint8Array; + generator: Uint8Array; +} + +export interface DsaKeyAlgorithm { + name: "dsa"; + prime: Uint8Array; + divisorLength: number; +} + +export interface HmacKeyAlgorithm { + name: "hmac"; + hash: string; +} + +export interface AesKeyAlgorithm { + name: "aes"; + length: number; +} + +export type KeyAlgorithm = + | RsaKeyAlgorithm + | EcKeyAlgorithm + | DhKeyAlgorithm + | DsaKeyAlgorithm + | HmacKeyAlgorithm + | AesKeyAlgorithm; + +export interface CryptoKey { + algorithm: KeyAlgorithm; + extractable: boolean; + type: KeyObjectType; + usages: string[]; +} + +export interface RsaOtherPrimesInfo { + d?: string; + r?: string; + t?: string; +} + +export interface JsonWebKey { + alg?: string; + crv?: string; + d?: string; + dp?: string; + dq?: string; + e?: string; + ext?: boolean; + k?: string; + key_ops?: string[]; + kty?: string; + n?: string; + oth?: Array; + p?: string; + q?: string; + qi?: string; + use?: string; + x?: string; + y?: string; +} + +export interface CryptoKeyPair { + privateKey: CryptoKey; + publicKey: CryptoKey; +} + +export type KeyObjectType = "secret" | "public" | "private"; + +export type KeyExportResult = string | Buffer | JsonWebKey; + +export type SecretKeyFormat = "buffer" | "jwk"; +export type AsymmetricKeyFormat = "pem" | "der" | "jwk"; +export type PublicKeyEncoding = "pkcs1" | "spki"; +export type PrivateKeyEncoding = "pkcs1" | "pkcs8" | "sec1"; +export type AsymmetricKeyType = "rsa" | "rsa-pss" | "dsa" | "ec" | "x25519" | "ed25519" | "dh"; +export type SecretKeyType = "hmac" | "aes"; +export type ParamEncoding = "named" | "explicit"; + +export interface SecretKeyExportOptions { + format?: SecretKeyFormat; +} + +export interface PublicKeyExportOptions { + type?: PublicKeyEncoding; + format?: AsymmetricKeyFormat; +} + +export interface PrivateKeyExportOptions { + type?: PrivateKeyEncoding; + format?: AsymmetricKeyFormat; + cipher?: string; + passphrase?: string | Uint8Array; + encoding?: string; +} + +export interface InnerPrivateKeyExportOptions { + type?: PrivateKeyEncoding; + format?: AsymmetricKeyFormat; + cipher?: string; + passphrase?: Uint8Array; +} + +export type ExportOptions = + | SecretKeyExportOptions + | PublicKeyExportOptions + | PrivateKeyExportOptions; + +export type InnerExportOptions = + | SecretKeyExportOptions + | PublicKeyExportOptions + | InnerPrivateKeyExportOptions; + +export interface AsymmetricKeyDetails { + modulusLength?: number; + publicExponent?: bigint; + hashAlgorithm?: string; + mgf1HashAlgorithm?: string; + saltLength?: number; + divisorLength?: number; + namedCurve?: string; +} + +export interface CreateAsymmetricKeyOptions { + key: string | ArrayBuffer | ArrayBufferView | JsonWebKey; + format?: AsymmetricKeyFormat; + type?: PublicKeyEncoding | PrivateKeyEncoding; + passphrase?: string | Uint8Array; + encoding?: string; +} + +export interface InnerCreateAsymmetricKeyOptions { + key?: ArrayBuffer | ArrayBufferView | JsonWebKey | CryptoKey; + format?: AsymmetricKeyFormat; + type?: PublicKeyEncoding | PrivateKeyEncoding; + passphrase?: Uint8Array; +} + +export interface GenerateKeyOptions { + length: number; +} + +export interface GenerateKeyPairOptions { + modulusLength?: number; + publicExponent?: number | bigint; + hashAlgorithm?: string; + mgf1HashAlgorithm?: string; + saltLength?: number; + divisorLength?: number; + namedCurve?: string; + prime?: Uint8Array; + primeLength?: number; + generator?: number; + groupName?: string; + paramEncoding?: ParamEncoding; + publicKeyEncoding?: PublicKeyExportOptions; + privateKeyEncoding?: PrivateKeyExportOptions; +} + +export function exportKey(key: CryptoKey, options?: InnerExportOptions): KeyExportResult { + // SJCL does not provide a direct method to export keys. + throw new Error("Function exportKey is not implemented yet"); +} + +export function equals(key: CryptoKey, otherKey: CryptoKey): boolean { + // SJCL does not provide a direct method to compare keys. + throw new Error("Function equals is not implemented yet"); +} + +export function getAsymmetricKeyDetail(key: CryptoKey): AsymmetricKeyDetails { + // SJCL does not provide a direct method to get asymmetric key details. + throw new Error("Function getAsymmetricKeyDetail is not implemented yet"); +} + +export function getAsymmetricKeyType(key: CryptoKey): AsymmetricKeyType { + // SJCL does not provide a direct method to get asymmetric key type. + throw new Error("Function getAsymmetricKeyType is not implemented yet"); +} + +export function createSecretKey(key: ArrayBuffer | ArrayBufferView): CryptoKey { + let keyArray: Uint8Array; + if (key instanceof ArrayBuffer) { + keyArray = new Uint8Array(key); + } else { + keyArray = new Uint8Array(key.buffer, key.byteOffset, key.byteLength); + } + + let keyBits = sjcl.codec.bytes.toBits(Array.from(keyArray)); + + let cipher = new sjcl.cipher.aes(keyBits); + + return { + algorithm: { + name: "aes", + length: key.byteLength * 8, + }, + extractable: true, + type: "secret", + usages: ["encrypt", "decrypt"], + }; +} + +export function createPrivateKey(key: InnerCreateAsymmetricKeyOptions): CryptoKey { + // SJCL does not provide a direct method to create private keys. + throw new Error("Function createPrivateKey is not implemented yet"); +} + +export function createPublicKey(key: InnerCreateAsymmetricKeyOptions): CryptoKey { + // SJCL does not provide a direct method to create public keys. + throw new Error("Function createPublicKey is not implemented yet"); +} + +export class DiffieHellmanHandle { + private prime: sjcl.BigNumber; + private generator: sjcl.BigNumber; + private privateKey: sjcl.BigNumber; + private publicKey: sjcl.BigNumber; + + public constructor( + sizeOrKey: number | ArrayBuffer | ArrayBufferView, + generator: number | ArrayBuffer | ArrayBufferView + ) { + // Convert sizeOrKey and generator to sjcl.bn + this.prime = new sjcl.bn(sizeOrKey.toString()); + this.generator = new sjcl.bn(generator.toString()); + + // Generate a random private key + this.privateKey = sjcl.bn.random(this.prime.sub(2), 10).add(1); + + // Calculate the public key + this.publicKey = this.generator.powermod(this.privateKey, this.prime); + } + + public setPublicKey(data: ArrayBuffer | ArrayBufferView | Buffer): void { + this.publicKey = new sjcl.bn(data.toString()); + } + + public setPrivateKey(data: ArrayBuffer | ArrayBufferView | Buffer): void { + this.privateKey = new sjcl.bn(data.toString()); + } + + public getPublicKey(): ArrayBuffer { + return sjcl.codec.arrayBuffer.fromBits(this.publicKey.toBits()); + } + + public getPrivateKey(): ArrayBuffer { + return sjcl.codec.arrayBuffer.fromBits(this.privateKey.toBits()); + } + + public getGenerator(): ArrayBuffer { + return sjcl.codec.arrayBuffer.fromBits(this.generator.toBits()); + } + + public getPrime(): ArrayBuffer { + return sjcl.codec.arrayBuffer.fromBits(this.prime.toBits()); + } + + public computeSecret(key: ArrayBuffer | ArrayBufferView): ArrayBuffer { + let otherPublicKey = new sjcl.bn(key.toString()); + let secret = otherPublicKey.powermod(this.privateKey, this.prime); + return sjcl.codec.arrayBuffer.fromBits(secret.toBits()); + } + + public generateKeys(): ArrayBuffer { + // Generate a new private key + this.privateKey = sjcl.bn.random(this.prime.sub(2), 10).add(1); + + // Calculate the new public key + this.publicKey = this.generator.powermod(this.privateKey, this.prime); + + return this.getPublicKey(); + } + + public getVerifyError(): number { + // This method is not applicable to the Diffie-Hellman protocol + throw new Error("Method getVerifyError is not applicable to the Diffie-Hellman protocol"); + } +} + +export function DiffieHellmanGroupHandle(name: string): DiffieHellmanHandle { + // Define some named groups with their prime and generator values + const groups: { [name: string]: { prime: number; generator: number } } = { + modp1: { prime: 2, generator: 2 }, + modp2: { prime: 3, generator: 2 }, + modp5: { prime: 5, generator: 2 }, + // Add more named groups here + }; + + // Get the named group + const group = groups[name]; + if (!group) { + throw new Error(`Unknown group name: ${name}`); + } + + // Create a DiffieHellmanHandle with the prime and generator of the named group + return new DiffieHellmanHandle(group.prime, group.generator); +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_dh.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_dh.ts new file mode 100644 index 000000000..762f512f9 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_dh.ts @@ -0,0 +1,198 @@ +/* eslint-disable */ + +"use strict"; + +import { Buffer } from "./internal_buffer"; + +import * as cryptoImpl from "./crypto"; +type ArrayLike = cryptoImpl.ArrayLike; + +import { ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY, ERR_INVALID_ARG_TYPE } from "./internal_errors"; + +import { validateInt32 } from "./validators"; + +import { isArrayBufferView, isAnyArrayBuffer } from "./internal_types"; + +import { getArrayBufferOrView, toBuf, kHandle } from "./crypto_util"; + +const DH_GENERATOR = 2; + +interface DiffieHellman { + [kHandle]: cryptoImpl.DiffieHellmanHandle; +} + +let DiffieHellman = function ( + this: DiffieHellman, + sizeOrKey: number | ArrayLike, + keyEncoding?: number | string, + generator?: number | ArrayLike, + genEncoding?: string +): DiffieHellman { + if (!(this instanceof DiffieHellman)) + return new DiffieHellman(sizeOrKey, keyEncoding, generator, genEncoding); + if ( + typeof sizeOrKey !== "number" && + typeof sizeOrKey !== "string" && + !isArrayBufferView(sizeOrKey) && + !isAnyArrayBuffer(sizeOrKey) + ) { + throw new ERR_INVALID_ARG_TYPE( + "sizeOrKey", + ["number", "string", "ArrayBuffer", "Buffer", "TypedArray", "DataView"], + sizeOrKey + ); + } + + // Sizes < 0 don't make sense but they _are_ accepted (and subsequently + // rejected with ERR_OSSL_BN_BITS_TOO_SMALL) by OpenSSL. The glue code + // in node_crypto.cc accepts values that are IsInt32() for that reason + // and that's why we do that here too. + if (typeof sizeOrKey === "number") validateInt32(sizeOrKey, "sizeOrKey"); + + if (keyEncoding && !Buffer.isEncoding(keyEncoding) && keyEncoding !== "buffer") { + genEncoding = generator as any; + generator = keyEncoding; + keyEncoding = "utf-8"; // default encoding + } + + keyEncoding ??= "utf-8"; + genEncoding ??= "utf-8"; + + if (typeof sizeOrKey !== "number") sizeOrKey = toBuf(sizeOrKey, keyEncoding as string); + + if (!generator) { + generator = DH_GENERATOR; + } else if (typeof generator === "number") { + validateInt32(generator, "generator"); + } else if (typeof generator === "string") { + generator = toBuf(generator, genEncoding); + } else if (!isArrayBufferView(generator) && !isAnyArrayBuffer(generator)) { + throw new ERR_INVALID_ARG_TYPE( + "generator", + ["number", "string", "ArrayBuffer", "Buffer", "TypedArray", "DataView"], + generator + ); + } + + this[kHandle] = new cryptoImpl.DiffieHellmanHandle(sizeOrKey as any, generator as any); + Object.defineProperty(DiffieHellman.prototype, "verifyError", { + get: function () { + return this[kHandle].getVerifyError(); + }, + configurable: true, + enumerable: true, + }); + return this; +} as any as { + new ( + sizeOrKey: number | ArrayLike, + keyEncoding?: number | string, + generator?: number | ArrayLike, + genEncoding?: string + ): DiffieHellman; +}; + +interface DiffieHellmanGroup { + [kHandle]: cryptoImpl.DiffieHellmanHandle; +} + +let DiffieHellmanGroup = function (this: DiffieHellmanGroup, name: string): DiffieHellmanGroup { + if (!(this instanceof DiffieHellmanGroup)) return new DiffieHellmanGroup(name); + + // The C++-based handle is shared between both classes, so DiffieHellmanGroupHandle() is merely + // a different constructor for a DiffieHellmanHandle. + this[kHandle] = cryptoImpl.DiffieHellmanGroupHandle(name); + Object.defineProperty(DiffieHellmanGroup.prototype, "verifyError", { + get: function () { + return this[kHandle].getVerifyError(); + }, + configurable: true, + enumerable: true, + }); + return this; +} as any as { new (name: string): DiffieHellmanGroup }; + +DiffieHellmanGroup.prototype.generateKeys = DiffieHellman.prototype.generateKeys = dhGenerateKeys; +DiffieHellmanGroup.prototype.computeSecret = DiffieHellman.prototype.computeSecret = + dhComputeSecret; +DiffieHellmanGroup.prototype.getPrime = DiffieHellman.prototype.getPrime = dhGetPrime; +DiffieHellmanGroup.prototype.getGenerator = DiffieHellman.prototype.getGenerator = dhGetGenerator; +DiffieHellmanGroup.prototype.getPublicKey = DiffieHellman.prototype.getPublicKey = dhGetPublicKey; +DiffieHellmanGroup.prototype.getPrivateKey = DiffieHellman.prototype.getPrivateKey = + dhGetPrivateKey; +DiffieHellman.prototype.setPublicKey = dhSetPublicKey; +DiffieHellman.prototype.setPrivateKey = dhSetPrivateKey; + +export { DiffieHellman, DiffieHellmanGroup }; + +type DHLike = DiffieHellman | DiffieHellmanGroup; +function dhGenerateKeys(this: DHLike, encoding?: string): Buffer | string { + const keys = this[kHandle].generateKeys(); + return encode(keys, encoding); +} + +function dhComputeSecret( + this: DHLike, + key: ArrayLike, + inEnc?: string, + outEnc?: string +): Buffer | string { + key = getArrayBufferOrView(key, "key", inEnc); + const ret = this[kHandle].computeSecret(key); + if (typeof ret === "string") throw new ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY(); + return encode(ret, outEnc); +} + +function dhGetPrime(this: DHLike, encoding?: string): Buffer | string { + const prime = this[kHandle].getPrime(); + return encode(prime, encoding); +} + +function dhGetGenerator(this: DHLike, encoding?: string): Buffer | string { + const generator = this[kHandle].getGenerator(); + return encode(generator, encoding); +} + +function dhGetPublicKey(this: DHLike, encoding?: string): Buffer | string { + const key = this[kHandle].getPublicKey(); + return encode(key, encoding); +} + +function dhGetPrivateKey(this: DHLike, encoding?: string): Buffer | string { + const key = this[kHandle].getPrivateKey(); + return encode(key, encoding); +} + +function dhSetPublicKey(this: DiffieHellman, key: ArrayLike, encoding?: string): DiffieHellman { + key = getArrayBufferOrView(key, "key", encoding); + this[kHandle].setPublicKey(key); + return this; +} + +function dhSetPrivateKey(this: DiffieHellman, key: ArrayLike, encoding?: string): DiffieHellman { + key = getArrayBufferOrView(key, "key", encoding); + this[kHandle].setPrivateKey(key); + return this; +} + +function encode(buffer: ArrayBuffer, encoding?: string): Buffer | string { + if (encoding && encoding !== "buffer") return Buffer.from(buffer).toString(encoding); + return Buffer.from(buffer); +} + +export function createDiffieHellman( + sizeOrKey: number | ArrayLike, + keyEncoding?: number | string, + generator?: number | ArrayLike, + genEncoding?: string +): DiffieHellman { + return new DiffieHellman(sizeOrKey, keyEncoding, generator, genEncoding); +} + +export function createDiffieHellmanGroup(name: string): DiffieHellmanGroup { + return new DiffieHellmanGroup(name); +} + +export function getDiffieHellman(name: string): DiffieHellmanGroup { + return createDiffieHellmanGroup(name); +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_hash.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_hash.ts new file mode 100644 index 000000000..296bd2013 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_hash.ts @@ -0,0 +1,230 @@ +/* eslint-disable */ + +import * as cryptoImpl from "./crypto"; +type ArrayLike = cryptoImpl.ArrayLike; + +import { kFinalized, kHandle, kState, getArrayBufferOrView, getStringOption } from "./crypto_util"; + +import { Buffer } from "./internal_buffer"; + +import { + ERR_CRYPTO_HASH_FINALIZED, + ERR_CRYPTO_HASH_UPDATE_FAILED, + ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE, + ERR_INVALID_ARG_TYPE, +} from "./internal_errors"; + +import { validateEncoding, validateString, validateUint32 } from "./validators"; + +import { normalizeEncoding } from "./internal_utils"; + +import { isArrayBufferView, isCryptoKey, isAnyArrayBuffer } from "./internal_types"; + +import { Transform, TransformOptions, TransformCallback } from "./streams_transform"; + +import { KeyObject } from "./crypto_keys"; + +export interface HashOptions extends TransformOptions { + outputLength?: number; +} + +interface _kState { + [kFinalized]: boolean; +} + +interface Hash extends Transform { + [kHandle]: cryptoImpl.HashHandle; + [kState]: _kState; +} + +// These helper functions are needed because the constructors can +// use new, in which case V8 cannot inline the recursive constructor call +export function createHash(algorithm: string, options?: HashOptions): Hash { + return new Hash(algorithm, options); +} + +let Hash = function ( + this: Hash, + algorithm: string | cryptoImpl.HashHandle, + options?: HashOptions +): Hash { + if (!(this instanceof Hash)) return new Hash(algorithm, options); + + const xofLen = typeof options === "object" ? options.outputLength : undefined; + if (xofLen !== undefined) validateUint32(xofLen, "options.outputLength"); + if (algorithm instanceof cryptoImpl.HashHandle) { + this[kHandle] = algorithm.copy(xofLen as number); + } else { + validateString(algorithm, "algorithm"); + this[kHandle] = new cryptoImpl.HashHandle(algorithm, xofLen as number); + } + this[kState] = { + [kFinalized]: false, + }; + + Transform.call(this, options); + return this; +} as any as { new (algorithm: string | cryptoImpl.HashHandle, options?: HashOptions): Hash }; + +Object.setPrototypeOf(Hash.prototype, Transform.prototype); +Object.setPrototypeOf(Hash, Transform); + +Hash.prototype.copy = function (this: Hash, options?: HashOptions): Hash { + const state = this[kState]; + if (state[kFinalized]) throw new ERR_CRYPTO_HASH_FINALIZED(); + + return new Hash(this[kHandle], options); +}; + +Hash.prototype._transform = function ( + this: Hash | Hmac, + chunk: string | Buffer | ArrayBufferView, + encoding: string, + callback: TransformCallback +): void { + if (typeof chunk === "string") { + encoding ??= "utf-8"; + validateEncoding(chunk, encoding); + encoding = normalizeEncoding(encoding)!; + chunk = Buffer.from(chunk, encoding); + } + this[kHandle].update(chunk); + callback(); +}; + +Hash.prototype._flush = function (this: Hash | Hmac, callback: TransformCallback): void { + this.push(Buffer.from(this[kHandle].digest())); + callback(); +}; + +Hash.prototype.update = function ( + this: Hash | Hmac, + data: string | Buffer | ArrayBufferView, + encoding?: string +): Hash | Hmac { + encoding ??= "utf8"; + if (encoding === "buffer") { + encoding = undefined; + } + + const state = this[kState]; + if (state[kFinalized]) throw new ERR_CRYPTO_HASH_FINALIZED(); + + if (typeof data === "string") { + validateEncoding(data, encoding!); + encoding = normalizeEncoding(encoding); + data = Buffer.from(data, encoding); + } else if (!isArrayBufferView(data)) { + throw new ERR_INVALID_ARG_TYPE( + "data", + ["string", "Buffer", "TypedArray", "DataView"], + data + ); + } + + if (!this[kHandle].update(data)) throw new ERR_CRYPTO_HASH_UPDATE_FAILED(); + return this; +}; + +Hash.prototype.digest = function (this: Hash, outputEncoding?: string): Buffer | string { + const state = this[kState]; + if (state[kFinalized]) throw new ERR_CRYPTO_HASH_FINALIZED(); + + // Explicit conversion for backward compatibility. + const ret = Buffer.from(this[kHandle].digest()); + state[kFinalized] = true; + if (outputEncoding !== undefined && outputEncoding !== "buffer") { + return ret.toString(outputEncoding); + } else { + return ret; + } +}; + +/////////////////////////// + +interface Hmac extends Transform { + [kHandle]: cryptoImpl.HmacHandle; + [kState]: _kState; +} + +export function createHmac( + hmac: string, + key: ArrayLike | KeyObject | CryptoKey, + options?: TransformOptions +): Hmac { + return new Hmac(hmac, key, options); +} + +let Hmac = function ( + this: Hmac, + hmac: string, + key: ArrayLike | KeyObject | cryptoImpl.CryptoKey, + options?: TransformOptions +): Hmac { + if (!(this instanceof Hmac)) { + return new Hmac(hmac, key, options); + } + validateString(hmac, "hmac"); + const encoding = getStringOption(options, "encoding"); + + if (key instanceof KeyObject) { + if (key.type !== "secret") { + throw new ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE(key.type, "secret"); + } + this[kHandle] = new cryptoImpl.HmacHandle(hmac, key[kHandle]); + } else if (isCryptoKey(key)) { + if ((key as cryptoImpl.CryptoKey).type !== "secret") { + throw new ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE( + (key as cryptoImpl.CryptoKey).type, + "secret" + ); + } + this[kHandle] = new cryptoImpl.HmacHandle(hmac, key); + } else if (typeof key !== "string" && !isArrayBufferView(key) && !isAnyArrayBuffer(key)) { + throw new ERR_INVALID_ARG_TYPE( + "key", + ["ArrayBuffer", "Buffer", "ArrayBufferView", "string", "KeyObject", "CryptoKey"], + key + ); + } else { + this[kHandle] = new cryptoImpl.HmacHandle( + hmac, + getArrayBufferOrView(key as ArrayLike, "key", encoding) + ); + } + + this[kState] = { + [kFinalized]: false, + }; + Transform.call(this, options); + return this; +} as any as { + new (hmac: string, key: ArrayLike | KeyObject | CryptoKey, options?: TransformOptions): Hmac; +}; + +Object.setPrototypeOf(Hmac.prototype, Transform.prototype); +Object.setPrototypeOf(Hmac, Transform); + +Hmac.prototype.update = Hash.prototype.update; + +Hmac.prototype.digest = function (this: Hmac, outputEncoding?: string): Buffer | string { + const state = this[kState]; + if (state[kFinalized]) { + const buf = Buffer.from(""); + return outputEncoding === "buffer" ? buf : buf.toString(outputEncoding); + } + + // Explicit conversion for backward compatibility. + const ret = Buffer.from(this[kHandle].digest()); + state[kFinalized] = true; + if (outputEncoding !== undefined && outputEncoding !== "buffer") { + return ret.toString(outputEncoding); + } else { + return ret; + } +}; + +Hmac.prototype._flush = Hash.prototype._flush; +Hmac.prototype._transform = Hash.prototype._transform; + +export { Hash, Hmac }; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_hkdf.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_hkdf.ts new file mode 100644 index 000000000..7196bea89 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_hkdf.ts @@ -0,0 +1,110 @@ +/* eslint-disable */ + +"use strict"; + +import * as cryptoImpl from "./crypto"; + +import { validateFunction, validateInteger, validateString } from "./validators"; + +import { KeyObject } from "./crypto_keys"; + +type ArrayLike = cryptoImpl.ArrayLike; + +import { kMaxLength } from "./internal_buffer"; + +import { toBuf, validateByteSource } from "./crypto_util"; + +import { isAnyArrayBuffer, isArrayBufferView } from "./internal_types"; + +import { NodeError, ERR_INVALID_ARG_TYPE, ERR_OUT_OF_RANGE } from "./internal_errors"; + +function validateParameters( + hash: string, + key: ArrayLike | KeyObject, + salt: ArrayLike, + info: ArrayLike, + length: number +) { + // TODO(soon): Add support for KeyObject input. + if (key instanceof KeyObject) { + throw new NodeError( + "ERR_METHOD_NOT_IMPLEMENTED", + "KeyObject support for hkdf() and " + + "hkdfSync() is not yet implemented. Use ArrayBuffer, TypedArray, " + + "DataView, or Buffer instead." + ); + } + + validateString(hash, "digest"); + key = prepareKey(key as unknown as ArrayLike); + salt = validateByteSource(salt, "salt"); + info = validateByteSource(info, "info"); + + validateInteger(length, "length", 0, kMaxLength); + + if (info.byteLength > 1024) { + throw new ERR_OUT_OF_RANGE( + "info", + "must not contain more than 1024 bytes", + info.byteLength + ); + } + + return { + hash, + key, + salt, + info, + length, + }; +} + +function prepareKey(key: ArrayLike): ArrayLike { + key = toBuf(key); + + if (!isAnyArrayBuffer(key) && !isArrayBufferView(key)) { + throw new ERR_INVALID_ARG_TYPE( + "ikm", + ["string", "SecretKeyObject", "ArrayBuffer", "TypedArray", "DataView", "Buffer"], + key + ); + } + + return key; +} + +export function hkdf( + hash: string, + key: ArrayLike | KeyObject, + salt: ArrayLike, + info: ArrayLike, + length: number, + callback: (err: Error | null, derivedKey?: ArrayBuffer) => void +): void { + ({ hash, key, salt, info, length } = validateParameters(hash, key, salt, info, length)); + + validateFunction(callback, "callback"); + + new Promise((res, rej) => { + try { + res(cryptoImpl.getHkdf(hash, key as ArrayLike, salt, info, length)); + } catch (err) { + rej(err); + } + }).then( + (val: ArrayBuffer) => callback(null, val), + (err) => callback(err) + ); +} + +export function hkdfSync( + hash: string, + key: ArrayLike | KeyObject, + salt: ArrayLike, + info: ArrayLike, + length: number +): ArrayBuffer { + ({ hash, key, salt, info, length } = validateParameters(hash, key, salt, info, length)); + + return cryptoImpl.getHkdf(hash, key, salt, info, length); +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_keys.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_keys.ts new file mode 100644 index 000000000..488d7b8d6 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_keys.ts @@ -0,0 +1,406 @@ +/* eslint-disable */ + +import { Buffer } from "./internal_buffer"; + +import * as cryptoImpl from "./crypto"; + +const { + CryptoKey, + KeyData, + KeyObjectType, + KeyExportResult, + SecretKeyType, + SecretKeyExportOptions, + PublicKeyExportOptions, + PrivateKeyExportOptions, + ExportOptions, + AsymmetricKeyDetails, + AsymmetricKeyType, + CreateAsymmetricKeyOptions, + GenerateKeyOptions, + GenerateKeyPairOptions, + InnerExportOptions, + // TODO(soon): Uncomment these once createPrivateKey/createPublicKey are implemented. + // JsonWebKey, + // InnerCreateAsymmetricKeyOptions, +} = cryptoImpl; + +import { arrayBufferToUnsignedBigInt, kHandle } from "./crypto_util"; + +import { + isAnyArrayBuffer, + isArrayBuffer, + isArrayBufferView, + isUint8Array, + // TODO(soon): Uncomment these once createPrivateKey/createPublicKey are implemented. + // isSharedArrayBuffer, +} from "./internal_types"; + +import { + ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED, + // TODO(soon): Uncomment these once createPrivateKey/createPublicKey are implemented. + // ERR_INVALID_ARG_VALUE, +} from "./internal_errors"; + +import { validateObject, validateString } from "./validators"; + +export abstract class KeyObject { + [kHandle]: CryptoKey; + + constructor() { + // KeyObjects cannot be created with new ... use one of the + // create or generate methods, or use from to get from a + // CryptoKey. + throw new Error("Illegal constructor"); + } + + static from(key: CryptoKey): KeyObject { + if (!(key instanceof CryptoKey)) { + throw new ERR_INVALID_ARG_TYPE("key", "CryptoKey", key); + } + switch (key.type) { + case "secret": + return Reflect.construct( + function (this: SecretKeyObject) { + this[kHandle] = key; + }, + [], + SecretKeyObject + ); + case "private": + return Reflect.construct( + function (this: PrivateKeyObject) { + this[kHandle] = key; + }, + [], + PrivateKeyObject + ); + case "public": + return Reflect.construct( + function (this: PublicKeyObject) { + this[kHandle] = key; + }, + [], + PublicKeyObject + ); + } + } + + export(options: ExportOptions = {}): KeyExportResult { + validateObject(options, "options", {}); + + // Yes, converting to any is a bit of a cheat, but it allows us to check + // each option individually without having to do a bunch of type guards. + const opts = options as any; + if (opts.format !== undefined) validateString(opts.format, "options.format"); + if (opts.type !== undefined) validateString(opts.type, "options.type"); + if (this.type === "private") { + if (opts.cipher !== undefined) { + validateString(opts.cipher, "options.cipher"); + if (typeof opts.passphrase === "string") { + opts.passphrase = Buffer.from(opts.passphrase, opts.encoding); + } + if (!isUint8Array(opts.passphrase)) { + throw new ERR_INVALID_ARG_TYPE( + "options.passphrase", + ["string", "Uint8Array"], + opts.passphrase + ); + } + } + } + + const ret = cryptoImpl.exportKey(this[kHandle], options as InnerExportOptions); + if (typeof ret === "string") return ret; + if (isUint8Array(ret)) { + return Buffer.from( + (ret as Uint8Array).buffer, + ret.byteOffset, + ret.byteLength + ) as KeyExportResult; + } else if (isArrayBuffer(ret)) { + return Buffer.from(ret as ArrayBuffer, 0, (ret as ArrayBuffer).byteLength); + } + return ret; + } + + equals(otherKeyObject: KeyObject): boolean { + if (this === otherKeyObject || this[kHandle] === otherKeyObject[kHandle]) return true; + if (this.type !== otherKeyObject.type) return false; + if (!(otherKeyObject[kHandle] instanceof CryptoKey)) { + throw new ERR_INVALID_ARG_TYPE("otherKeyObject", "KeyObject", otherKeyObject); + } + return cryptoImpl.equals(this[kHandle], otherKeyObject[kHandle]); + } + + abstract get type(): KeyObjectType; +} + +abstract class AsymmetricKeyObject extends KeyObject { + get asymmetricKeyDetails(): AsymmetricKeyDetails { + let detail = cryptoImpl.getAsymmetricKeyDetail(this[kHandle]); + if (isArrayBuffer(detail.publicExponent)) { + detail.publicExponent = arrayBufferToUnsignedBigInt(detail.publicExponent as any); + } + return detail; + } + + get asymmetricKeyType(): AsymmetricKeyType { + return cryptoImpl.getAsymmetricKeyType(this[kHandle]); + } +} + +export class PublicKeyObject extends AsymmetricKeyObject { + override export(options?: PublicKeyExportOptions): KeyExportResult { + return super.export(options); + } + + get type(): KeyObjectType { + return "public"; + } +} + +export class PrivateKeyObject extends AsymmetricKeyObject { + override export(options?: PrivateKeyExportOptions): KeyExportResult { + return super.export(options); + } + + get type(): KeyObjectType { + return "private"; + } +} + +export class SecretKeyObject extends KeyObject { + get symmetricKeySize(): number { + return (this[kHandle].algorithm as any).length | 0; + } + + override export(options?: SecretKeyExportOptions): KeyExportResult { + return super.export(options); + } + + get type(): KeyObjectType { + return "secret"; + } +} + +type ValidateKeyDataOptions = { + allowObject?: boolean; +}; +function validateKeyData( + key: unknown, + name: string, + options: ValidateKeyDataOptions = { + allowObject: false, + } +) { + if ( + key == null || + (typeof key !== "string" && + options.allowObject && + typeof key !== "object" && + !isArrayBufferView(key) && + !isAnyArrayBuffer(key)) + ) { + const expected = ["string", "ArrayBuffer", "TypedArray", "DataView"]; + if (options.allowObject) expected.push("object"); + throw new ERR_INVALID_ARG_TYPE(name, expected, key); + } +} + +export function createSecretKey(key: string, encoding?: string): SecretKeyObject; +export function createSecretKey(key: ArrayBuffer | ArrayBufferView): SecretKeyObject; +export function createSecretKey(key: KeyData, encoding?: string): SecretKeyObject { + validateKeyData(key, "key"); + if (typeof key === "string") key = Buffer.from(key as string, encoding); + return KeyObject.from(cryptoImpl.createSecretKey(key)) as SecretKeyObject; +} + +// TODO(soon): Fully implement createPrivateKey/createPublicKey. These are the +// equivalent of the WebCrypto API's importKey() method but operate synchronously +// and support a range of options not currently supported by WebCrypto. Implementing +// these will require either duplicating or significantly refactoring the current +// import key logic that supports Web Crypto now as the import logic is spread out +// over several locations and makes a number of assumptions that Web Crypto is being +// used. +// +// For now, users can use Web Crypto to import a CryptoKey then convert that into +// a KeyObject using KeyObject.from(). +// +// const kPrivateKey = Symbol('privateKey'); +// const kPublicKey = Symbol('publicKey'); + +// function validateAsymmetricKeyOptions( +// key: CreateAsymmetricKeyOptions | KeyData | CryptoKey | KeyObject, +// type: Symbol) { +// validateKeyData(key, 'key', { allowObject: true }); +// let inner : InnerCreateAsymmetricKeyOptions = {}; +// inner.format = 'pem'; +// if (typeof key === 'string') { +// inner.key = Buffer.from(key as string); +// } else if (isArrayBufferView(key)) { +// inner.key = key as ArrayBufferView; +// } else if (isArrayBuffer(key)) { +// inner.key = key as ArrayBuffer; +// } else if (isSharedArrayBuffer(key)) { +// inner.key = key as SharedArrayBuffer; +// } else if (type === kPublicKey && key instanceof KeyObject) { +// // Covers deriving public key from a private key. +// if (key.type !== 'private') { +// throw new ERR_INVALID_ARG_VALUE('key', key, 'must be a private key'); +// } +// inner.key = (key as KeyObject)[kHandle]; +// } else if (type === kPublicKey && key instanceof CryptoKey) { +// // Covers deriving public key from a private key. +// if ((key as CryptoKey).type !== 'private') { +// throw new ERR_INVALID_ARG_VALUE('key', key, 'must be a private key'); +// } +// inner.key = key as CryptoKey; +// } else { +// const options = key as CreateAsymmetricKeyOptions; +// if (typeof options.key === 'string') { +// inner.key = Buffer.from(options.key as string, options.encoding); +// } else if (isArrayBufferView(options.key)) { +// inner.key = options.key as ArrayBufferView; +// } else if (isArrayBuffer(options.key)) { +// inner.key = options.key as ArrayBuffer; +// } else if (isSharedArrayBuffer(options.key)) { +// inner.key = options.key as SharedArrayBuffer; +// } else if (type === kPublicKey && key instanceof KeyObject) { +// if ((options.key as KeyObject).type !== 'private') { +// throw new ERR_INVALID_ARG_VALUE('options.key', options.key, 'must be a private key'); +// } +// inner.key = (options.key as KeyObject)[kHandle]; +// } else if (type === kPublicKey && key instanceof CryptoKey) { +// if ((options.key as CryptoKey).type !== 'private') { +// throw new ERR_INVALID_ARG_VALUE('options.key', options.key, 'must be a private key'); +// } +// inner.key = options.key as CryptoKey; +// } else { +// inner.key = key as JsonWebKey; +// } +// validateKeyData(inner.key, 'options.key', { allowObject: true }); + +// if (options.format !== undefined) { +// validateString(options.format, 'options.format'); +// inner.format = options.format; +// } +// if (options.type !== undefined) { +// validateString(options.type, 'options.type'); +// inner.type = options.type; +// } +// if (options.passphrase !== undefined) { +// if (typeof options.passphrase === 'string') { +// inner.passphrase = Buffer.from(options.passphrase, options.encoding); +// } else { +// if (!isUint8Array(options.passphrase)) { +// throw new ERR_INVALID_ARG_TYPE('options.passphrase', [ +// 'string', 'Uint8Array' +// ], options.passphrase); +// } +// inner.passphrase = options.passphrase; +// } +// if (inner.passphrase.byteLength > 1024) { +// throw new ERR_INVALID_ARG_VALUE('options.passphrase', options.passphrase.length, '<= 1024'); +// } +// } +// } +// return inner; +// } + +export function createPrivateKey(key: string): PrivateKeyObject; +export function createPrivateKey(key: ArrayBuffer | ArrayBufferView): PrivateKeyObject; +export function createPrivateKey(key: CreateAsymmetricKeyOptions): PrivateKeyObject; +export function createPrivateKey(_key: CreateAsymmetricKeyOptions | KeyData): PrivateKeyObject { + // The options here are fairly complex. The key data can be a string, + // ArrayBuffer, or ArrayBufferView. The first argument can be one of + // these or an object with a key property that is one of these. If the + // key data is a string, then it will be decoded using an encoding + // (defaults to UTF8). + throw new ERR_METHOD_NOT_IMPLEMENTED("crypto.createPrivateKey"); + // return KeyObject.from(cryptoImpl.createPrivateKey( + // validateAsymmetricKeyOptions(key, kPrivateKey))) as PrivateKeyObject; +} + +export function createPublicKey(key: string): PublicKeyObject; +export function createPublicKey(key: ArrayBuffer): PublicKeyObject; +export function createPublicKey(key: ArrayBufferView): PublicKeyObject; + +export function createPublicKey(key: KeyObject): PublicKeyObject; +export function createPublicKey(key: CryptoKey): PublicKeyObject; +export function createPublicKey(key: CreateAsymmetricKeyOptions): PublicKeyObject; +export function createPublicKey( + _key: CreateAsymmetricKeyOptions | KeyData | CryptoKey | KeyObject +): PublicKeyObject { + // The options here are a bit complicated. The key material itself can + // either be a string, ArrayBuffer, or ArrayBufferView. It is also + // possible to pass a private key in the form of either a CryptoKey + // or KeyObject. The first argument can be one of these, or an object + // whose key value is one of these. If the key data is a string, then + // it will be decoded using an encoding (defaults to UTF8). If a + // CryptoKey or KeyObject is passed, it will be used to derived the + // public key. + throw new ERR_METHOD_NOT_IMPLEMENTED("crypto.createPublicKey"); + // return KeyObject.from(cryptoImpl.createPublicKey( + // validateAsymmetricKeyOptions(key, kPublicKey))) as PublicKeyObject; +} + +// ====================================================================================== + +export type PublicKeyResult = KeyExportResult | PublicKeyObject; +export type PrivateKeyResult = KeyExportResult | PrivateKeyObject; +export type GenerateKeyCallback = (err?: any, key?: KeyObject) => void; +export type GenerateKeyPairCallback = ( + err?: any, + publicKey?: PublicKeyResult, + privateKey?: PrivateKeyResult +) => void; + +export interface KeyObjectPair { + publicKey: PublicKeyResult; + privateKey: PrivateKeyResult; +} + +export function generateKey( + _type: SecretKeyType, + _options: GenerateKeyOptions, + callback: GenerateKeyCallback +) { + // We intentionally have not implemented key generation up to this point. + // The reason is that generation of cryptographically safe keys is a CPU + // intensive operation that can often exceed limits on the amount of CPU + // time a worker is allowed. + callback(new ERR_METHOD_NOT_IMPLEMENTED("crypto.generateKeySync")); +} + +export function generateKeySync(_type: SecretKeyType, _options: GenerateKeyOptions) { + // We intentionally have not implemented key generation up to this point. + // The reason is that generation of cryptographically safe keys is a CPU + // intensive operation that can often exceed limits on the amount of CPU + // time a worker is allowed. + throw new ERR_METHOD_NOT_IMPLEMENTED("crypto.generateKeySync"); +} + +export function generateKeyPair( + _type: AsymmetricKeyType, + _options: GenerateKeyPairOptions, + callback: GenerateKeyPairCallback +) { + // We intentionally have not implemented key generation up to this point. + // The reason is that generation of cryptographically safe keys is a CPU + // intensive operation that can often exceed limits on the amount of CPU + // time a worker is allowed. + callback(new ERR_METHOD_NOT_IMPLEMENTED("crypto.generateKeyPair")); +} + +export function generateKeyPairSync( + _type: AsymmetricKeyType, + _options: GenerateKeyPairOptions +): KeyObjectPair { + // We intentionally have not implemented key generation up to this point. + // The reason is that generation of cryptographically safe keys is a CPU + // intensive operation that can often exceed limits on the amount of CPU + // time a worker is allowed. + throw new ERR_METHOD_NOT_IMPLEMENTED("crypto.generateKeyPairSync"); +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_pbkdf2.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_pbkdf2.ts new file mode 100644 index 000000000..3d575b53a --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_pbkdf2.ts @@ -0,0 +1,85 @@ +/* eslint-disable */ + +"use strict"; + +import * as cryptoImpl from "./crypto"; +type ArrayLike = cryptoImpl.ArrayLike; +export { ArrayLike }; + +import { Buffer } from "./internal_buffer"; + +import { validateInt32, validateFunction, validateString } from "./validators"; + +import { getArrayBufferOrView } from "./crypto_util"; + +export function pbkdf2Sync( + password: ArrayLike, + salt: ArrayLike, + iterations: number, + keylen: number, + digest: string +): Buffer { + ({ password, salt, iterations, keylen, digest } = check( + password, + salt, + iterations, + keylen, + digest + )); + + const result = cryptoImpl.getPbkdf(password, salt, iterations, keylen, digest); + return Buffer.from(result); +} + +export type Pbkdf2Callback = (err?: Error | null, result?: Buffer) => void; +export function pbkdf2( + password: ArrayLike, + salt: ArrayLike, + iterations: number, + keylen: number, + digest: string, + callback: Pbkdf2Callback +): void { + if (typeof digest === "function") { + // Appease node test cases + validateString(undefined, "digest"); + } + validateFunction(callback, "callback"); + ({ password, salt, iterations, keylen, digest } = check( + password, + salt, + iterations, + keylen, + digest + )); + + new Promise((res, rej) => { + try { + res(cryptoImpl.getPbkdf(password, salt, iterations, keylen, digest)); + } catch (err) { + rej(err); + } + }).then( + (val) => callback(null, Buffer.from(val)), + (err) => callback(err) + ); +} + +function check( + password: ArrayLike | ArrayBufferView, + salt: ArrayLike | ArrayBufferView, + iterations: number, + keylen: number, + digest: string +): any { + validateString(digest, "digest"); + + password = getArrayBufferOrView(password, "password"); + salt = getArrayBufferOrView(salt, "salt"); + // OpenSSL uses a signed int to represent these values, so we are restricted + // to the 31-bit range here (which is plenty). + validateInt32(iterations, "iterations", 1); + validateInt32(keylen, "keylen", 0); + + return { password, salt, iterations, keylen, digest }; +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_random.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_random.ts new file mode 100644 index 000000000..ac49474c8 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_random.ts @@ -0,0 +1,393 @@ +/* eslint-disable */ + +import * as cryptoImpl from "./crypto"; + +import { + validateObject, + validateBoolean, + validateFunction, + validateInt32, + validateInteger, +} from "./validators"; + +import { isAnyArrayBuffer, isArrayBufferView } from "./internal_types"; + +import { ERR_INVALID_ARG_TYPE, ERR_OUT_OF_RANGE } from "./internal_errors"; + +import { Buffer, kMaxLength } from "./internal_buffer"; + +import { arrayBufferToUnsignedBigInt } from "./crypto_util"; + +export type RandomBytesCallback = (err: any | null, buffer: Uint8Array) => void; +export function randomBytes(size: number, callback: RandomBytesCallback): void; +export function randomBytes(size: number): Uint8Array; +export function randomBytes(size: number, callback?: RandomBytesCallback): Uint8Array | void { + validateInteger(size, "size", 0, kMaxLength); + const buf = Buffer.alloc(size); + if (callback !== undefined) { + randomFill(buf, callback as RandomFillCallback); + } else { + randomFillSync(buf); + return buf; + } +} + +export function randomFillSync( + buffer: ArrayBufferView | ArrayBuffer, + offset?: number, + size?: number +) { + if (!isAnyArrayBuffer(buffer) && !isArrayBufferView(buffer)) { + throw new ERR_INVALID_ARG_TYPE( + "buffer", + ["TypedArray", "DataView", "ArrayBuffer", "SharedArrayBuffer"], + buffer + ); + } + const maxLength = (buffer as Uint8Array).length; + if (offset !== undefined) { + validateInteger(offset!, "offset", 0, kMaxLength); + } else offset = 0; + if (size !== undefined) { + validateInteger(size!, "size", 0, maxLength - offset); + } else size = maxLength; + if (isAnyArrayBuffer(buffer)) { + buffer = Buffer.from(buffer as ArrayBuffer); + } + buffer = (buffer as Buffer).subarray(offset, offset + size); + return crypto.getRandomValues(buffer as ArrayBufferView); +} + +export type RandomFillCallback = (err: any | null, buf?: ArrayBufferView | ArrayBuffer) => void; +export function randomFill( + buffer: ArrayBufferView | ArrayBuffer, + callback?: RandomFillCallback +): void; +export function randomFill( + buffer: ArrayBufferView | ArrayBuffer, + offset: number, + callback?: RandomFillCallback +): void; +export function randomFill( + buffer: ArrayBufferView | ArrayBuffer, + offset: number, + size: number, + callback?: RandomFillCallback +): void; +export function randomFill( + buffer: ArrayBufferView | ArrayBuffer, + offsetOrCallback?: number | RandomFillCallback, + sizeOrCallback?: number | RandomFillCallback, + callback?: RandomFillCallback +) { + if (!isAnyArrayBuffer(buffer) && !isArrayBufferView(buffer)) { + throw new ERR_INVALID_ARG_TYPE( + "buffer", + ["TypedArray", "DataView", "ArrayBuffer", "SharedArrayBuffer"], + buffer + ); + } + + let offset = 0; + let size = 0; + const maxLength = (buffer as Uint8Array).length; + if (typeof callback === "function") { + validateInteger(offsetOrCallback, "offset", 0, maxLength); + offset = offsetOrCallback as number; + + validateInteger(sizeOrCallback, "size", 0, maxLength - offset); + size = sizeOrCallback as number; + } else if (typeof sizeOrCallback === "function") { + validateInteger(offsetOrCallback, "offset", 0, maxLength); + offset = offsetOrCallback as number; + size = maxLength - offset; + callback = sizeOrCallback as RandomFillCallback; + } else if (typeof offsetOrCallback === "function") { + offset = 0; + size = maxLength; + callback = offsetOrCallback as RandomFillCallback; + } + validateFunction(callback, "callback"); + + // We're currently not actually implementing the fill itself asynchronously, + // so we defer to randomFillSync here, but we invoke the callback asynchronously. + new Promise((res) => { + randomFillSync(buffer, offset, size); + res(); + }).then( + () => callback!(null, buffer), + (err: any) => callback!(err) + ); +} + +const RAND_MAX = 0xffff_ffff_ffff; +// Cache random data to use in randomInt. The cache size must be evenly +// divisible by 6 because each attempt to obtain a random int uses 6 bytes. +const randomCache = Buffer.alloc(6 * 1024); +let randomCacheOffset = 0; +let initialized = false; + +function getRandomInt(min: number, max: number) { + if (!initialized) { + randomFillSync(randomCache); + initialized = true; + } + // First we generate a random int between [0..range) + const range = max - min; + + if (!(range <= RAND_MAX)) { + throw new ERR_OUT_OF_RANGE(`max${max ? "" : " - min"}`, `<= ${RAND_MAX}`, range); + } + + // For (x % range) to produce an unbiased value greater than or equal to 0 and + // less than range, x must be drawn randomly from the set of integers greater + // than or equal to 0 and less than randLimit. + const randLimit = RAND_MAX - (RAND_MAX % range); + + // If we don't have a callback, or if there is still data in the cache, we can + // do this synchronously, which is super fast. + while (randomCacheOffset <= randomCache.length) { + if (randomCacheOffset === randomCache.length) { + // This might block the thread for a bit, but we are in sync mode. + randomFillSync(randomCache); + randomCacheOffset = 0; + } + + const x = randomCache.readUIntBE(randomCacheOffset, 6); + randomCacheOffset += 6; + if (x < randLimit) { + const n = (x % range) + min; + return n; + } + } + return 0; // Should be unreachable. +} + +export type RandomIntCallback = (err: any | null, n?: number) => void; +export function randomInt(max: number): number; +export function randomInt(min: number, max: number): number; +export function randomInt(max: number, callback: RandomIntCallback): void; +export function randomInt(min: number, max: number, callback: RandomIntCallback): void; +export function randomInt( + minOrMax: number, + maxOrCallback?: number | RandomIntCallback, + callback?: RandomIntCallback +) { + let min = 0; + let max = 0; + if (typeof callback === "function") { + validateInteger(minOrMax, "min"); + validateInteger(maxOrCallback, "max"); + min = minOrMax as number; + max = maxOrCallback as number; + } else if (typeof maxOrCallback === "function") { + min = 0; + validateInteger(minOrMax, "max"); + max = minOrMax as number; + callback = maxOrCallback as RandomIntCallback; + } else if (arguments.length === 2) { + validateInteger(minOrMax, "min"); + validateInteger(maxOrCallback, "max"); + min = minOrMax as number; + max = maxOrCallback as number; + } else { + min = 0; + validateInteger(minOrMax, "max"); + max = minOrMax; + } + + if (min > max) { + throw new ERR_OUT_OF_RANGE("min", "min <= max", min); + } + + if (callback !== undefined) { + new Promise((res) => { + res(getRandomInt(min, max)); + }).then( + (n: number) => callback!(null, n), + (err: any) => callback!(err) + ); + return; + } else { + return getRandomInt(min, max); + } +} + +export function randomUUID(options?: any) { + // While we do not actually use the entropy cache, we go ahead and validate + // the input parameters as Node.js does. + if (options !== undefined) { + validateObject(options, "options", options); + if (options.disableEntropyCache !== undefined) { + validateBoolean(options.disableEntropyCache, "options.disableEntropyCache"); + } + } + return crypto.randomUUID(); +} + +export type PrimeNum = ArrayBuffer | ArrayBufferView | Buffer | bigint; +export interface GeneratePrimeOptions { + add?: PrimeNum; + rem?: PrimeNum; + safe?: boolean; + bigint?: boolean; +} + +export interface CheckPrimeOptions { + checks?: number; +} + +export type GeneratePrimeCallback = (err?: any, prime?: bigint | ArrayBuffer) => void; +export type CheckPrimeCallback = (err?: any, prime?: boolean) => void; + +function processGeneratePrimeOptions(options: GeneratePrimeOptions): { + add: ArrayBufferView; + rem: ArrayBufferView; + safe: boolean; + bigint: boolean; +} { + validateObject(options, "options", {}); + const { safe = false, bigint = false } = options; + let { add, rem } = options; + validateBoolean(safe, "options.safe"); + validateBoolean(bigint, "options.bigint"); + + if (add !== undefined) { + if (typeof add === "bigint") { + add = unsignedBigIntToBuffer(add, "options.add"); + } else if (!isAnyArrayBuffer(add) && !isArrayBufferView(add)) { + throw new ERR_INVALID_ARG_TYPE( + "options.add", + ["ArrayBuffer", "TypedArray", "Buffer", "DataView", "bigint"], + add + ); + } + } + + if (rem !== undefined) { + if (typeof rem === "bigint") { + rem = unsignedBigIntToBuffer(rem, "options.rem"); + } else if (!isAnyArrayBuffer(rem) && !isArrayBufferView(rem)) { + throw new ERR_INVALID_ARG_TYPE( + "options.rem", + ["ArrayBuffer", "TypedArray", "Buffer", "DataView", "bigint"], + rem + ); + } + } + + return { + safe, + bigint, + add: add as ArrayBufferView, + rem: rem as ArrayBufferView, + }; +} + +export function generatePrimeSync(size: number, options: GeneratePrimeOptions = {}) { + validateInt32(size, "size", 1); + const { safe, bigint, add, rem } = processGeneratePrimeOptions(options); + + let primeBuf = cryptoImpl.randomPrime(size, safe, add, rem); + return bigint ? arrayBufferToUnsignedBigInt(primeBuf) : primeBuf; +} + +export function generatePrime( + size: number, + options: GeneratePrimeOptions, + callback: GeneratePrimeCallback +): void; +export function generatePrime(size: number, callback: GeneratePrimeCallback): void; +export function generatePrime( + size: number, + options: GeneratePrimeOptions | GeneratePrimeCallback, + callback?: GeneratePrimeCallback +): void { + validateInt32(size, "size", 1); + if (typeof options === "function") { + callback = options; + options = {}; + } + validateFunction(callback, "callback"); + + const { safe, bigint, add, rem } = processGeneratePrimeOptions(options as GeneratePrimeOptions); + + new Promise((res, rej) => { + try { + const primeBuf = cryptoImpl.randomPrime(size, safe, add, rem); + res(bigint ? arrayBufferToUnsignedBigInt(primeBuf) : primeBuf); + } catch (err) { + rej(err); + } + }).then( + (val) => callback!(null, val), + (err) => callback!(err) + ); +} + +function unsignedBigIntToBuffer(bigint: bigint, name: string) { + if (bigint < 0) { + throw new ERR_OUT_OF_RANGE(name, ">= 0", bigint); + } + + const hex = bigint.toString(16); + const padded = hex.padStart(hex.length + (hex.length % 2), "0"); + return Buffer.from(padded, "hex"); +} + +function validateCandidate(candidate: PrimeNum): Buffer { + if (typeof candidate === "bigint") candidate = unsignedBigIntToBuffer(candidate, "candidate"); + if (!isAnyArrayBuffer(candidate) && !isArrayBufferView(candidate)) { + throw new ERR_INVALID_ARG_TYPE( + "candidate", + ["ArrayBuffer", "TypedArray", "Buffer", "DataView", "bigint"], + candidate + ); + } + return candidate as Buffer; +} + +function validateChecks(options: CheckPrimeOptions): number { + const { checks = 0 } = options; + // The checks option is unsigned but must fit into a signed 32-bit integer for OpenSSL. + validateInt32(checks, "options.checks", 0); + return checks; +} + +export function checkPrimeSync(candidate: PrimeNum, options: CheckPrimeOptions = {}) { + candidate = validateCandidate(candidate); + validateObject(options, "options", {}); + const checks = validateChecks(options); + return cryptoImpl.checkPrimeSync(candidate as ArrayBufferView, checks); +} + +export function checkPrime( + candidate: PrimeNum, + options: CheckPrimeOptions, + callback: CheckPrimeCallback +): void; +export function checkPrime(candidate: PrimeNum, callback: CheckPrimeCallback): void; +export function checkPrime( + candidate: PrimeNum, + options: CheckPrimeOptions | CheckPrimeCallback, + callback?: CheckPrimeCallback +): void { + candidate = validateCandidate(candidate); + if (typeof options === "function") { + callback = options; + options = {}; + } + validateObject(options, "options", {}); + validateFunction(callback, "callback"); + const checks = validateChecks(options); + new Promise((res, rej) => { + try { + res(cryptoImpl.checkPrimeSync(candidate as ArrayBufferView, checks)); + } catch (err) { + rej(err); + } + }).then( + (val) => callback!(null, val), + (err) => callback!(err) + ); +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_util.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_util.ts new file mode 100644 index 000000000..9b268df0b --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/crypto_util.ts @@ -0,0 +1,102 @@ +/* eslint-disable */ + +"use strict"; + +import { Buffer } from "./internal_buffer"; + +import { isAnyArrayBuffer, isArrayBufferView } from "./internal_types"; + +import { ERR_INVALID_ARG_TYPE } from "./internal_errors"; + +import { validateString } from "./validators"; + +import * as cryptoImpl from "./crypto"; +type ArrayLike = cryptoImpl.ArrayLike; + +export const kHandle = Symbol("kHandle"); +export const kFinalized = Symbol("kFinalized"); +export const kState = Symbol("kFinalized"); + +export function getStringOption(options: any, key: string) { + let value; + if (options && (value = options[key]) != null) validateString(value, `options.${key}`); + return value; +} + +export function getArrayBufferOrView( + buffer: Buffer | ArrayBuffer | ArrayBufferView | string, + name: string, + encoding?: string +): Buffer | ArrayBuffer | ArrayBufferView { + if (isAnyArrayBuffer(buffer)) return buffer as ArrayBuffer; + if (typeof buffer === "string") { + if (encoding === undefined || encoding === "buffer") { + encoding = "utf8"; + } + return Buffer.from(buffer, encoding); + } + if (!isArrayBufferView(buffer)) { + throw new ERR_INVALID_ARG_TYPE( + name, + ["string", "ArrayBuffer", "Buffer", "TypedArray", "DataView"], + buffer + ); + } + return buffer; +} + +/** + * 48 is the ASCII code for '0', 97 is the ASCII code for 'a'. + * @param {number} number An integer between 0 and 15. + * @returns {number} corresponding to the ASCII code of the hex representation + * of the parameter. + */ +export const numberToHexCharCode = (number: number): number => (number < 10 ? 48 : 87) + number; + +/** + * @param {ArrayBuffer} buf An ArrayBuffer. + * @return {bigint} + */ +export function arrayBufferToUnsignedBigInt(buf: ArrayBuffer): bigint { + const length = buf.byteLength; + const chars = Array(length * 2); + const view = new DataView(buf); + + for (let i = 0; i < length; i++) { + const val = view.getUint8(i); + chars[2 * i] = numberToHexCharCode(val >> 4); + chars[2 * i + 1] = numberToHexCharCode(val & 0xf); + } + + return BigInt(`0x${String.fromCharCode.apply(null, chars)}`); +} + +// This is here because many functions accepted binary strings without +// any explicit encoding in older versions of node, and we don't want +// to break them unnecessarily. +export function toBuf(val: ArrayLike, encoding?: string): Buffer | ArrayBuffer | ArrayBufferView { + if (typeof val === "string") { + if (encoding === "buffer") { + encoding = "utf8"; + } + return Buffer.from(val, encoding); + } + return val; +} + +export function validateByteSource( + val: ArrayLike, + name: string +): Buffer | ArrayBuffer | ArrayBufferView { + val = toBuf(val); + + if (isAnyArrayBuffer(val) || isArrayBufferView(val)) { + return val; + } + + throw new ERR_INVALID_ARG_TYPE( + name, + ["string", "ArrayBuffer", "TypedArray", "DataView", "Buffer"], + val + ); +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/events.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/events.ts new file mode 100644 index 000000000..83f86114d --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/events.ts @@ -0,0 +1,888 @@ +import { + AbortError, + ERR_INVALID_ARG_TYPE, + ERR_INVALID_THIS, + ERR_OUT_OF_RANGE, + ERR_UNHANDLED_ERROR, +} from "./internal_errors"; + +import { validateAbortSignal, validateBoolean, validateFunction } from "./validators"; + +import * as process from "./process"; + +import { spliceOne } from "./internal_utils"; + +import * as async_hooks from "./async_hooks"; +const { AsyncResource } = async_hooks; + +import { inspect } from "./internal_inspect"; + +const kRejection = Symbol.for("nodejs.rejection"); +const kCapture = Symbol("kCapture"); +const kErrorMonitor = Symbol("events.errorMonitor"); +const kMaxEventTargetListeners = Symbol("events.maxEventTargetListeners"); +const kMaxEventTargetListenersWarned = Symbol("events.maxEventTargetListenersWarned"); + +export interface EventEmitterOptions { + captureRejections?: boolean; +} + +export type EventName = string | symbol; +export type EventCallback = (...args: any[]) => unknown; +export interface EventEmitter { + addListener(eventName: EventName, listener: EventCallback): EventEmitter; + emit(eventName: EventName, ...args: unknown[]): void; + eventNames(): EventName[]; + getMaxListeners(): number; + listenerCount(eventName: EventName): number; + listeners(eventName: EventName): EventCallback[]; + off(eventName: EventName, listener: EventCallback): EventEmitter; + on(eventName: EventName, listener: EventCallback): EventEmitter; + once(eventName: EventName, listener: EventCallback): EventEmitter; + prependListener(eventName: EventName, listener: EventCallback): EventEmitter; + prependOnceListener(eventName: EventName, listener: EventCallback): EventEmitter; + removeAllListeners(eventName?: EventName): EventEmitter; + removeListener(eventName: EventName, listener: EventCallback): EventEmitter; + setMaxListeners(n: number): EventEmitter; + rawListeners(eventName: EventName): EventCallback[]; + [kRejection](err: unknown, eventName: EventName, ...args: unknown[]): void; +} + +type AsyncResource = typeof AsyncResource; + +declare var EventTarget: Function; + +export function EventEmitter(this: EventEmitter, opts?: EventEmitterOptions) { + EventEmitter.init.call(this, opts); +} + +class EventEmitterReferencingAsyncResource extends AsyncResource { + #eventEmitter: EventEmitter; + constructor(emitter: EventEmitter) { + super(""); + this.#eventEmitter = emitter; + } + + get eventEmitter() { + if (this.#eventEmitter === undefined) + throw new ERR_INVALID_THIS("EventEmitterReferencingAsyncResource"); + return this.#eventEmitter; + } +} + +// @ts-ignore -- TODO(soon) Properly handle the extends EventEmitter here +export class EventEmitterAsyncResource extends EventEmitter { + #asyncResource: EventEmitterReferencingAsyncResource; + + constructor(options?: EventEmitterOptions) { + super(options); + // @ts-ignore + this.#asyncResource = new EventEmitterReferencingAsyncResource(this); + } + + get asyncResource(): AsyncResource { + if (this.#asyncResource === undefined) + throw new ERR_INVALID_THIS("EventEmitterAsyncResource"); + // @ts-ignore + return this.#asyncResource; + } + + emit(event: string | symbol, ...args: any[]): void { + if (this.#asyncResource === undefined) + throw new ERR_INVALID_THIS("EventEmitterAsyncResource"); + args.unshift(super.emit, this, event); + Reflect.apply(this.#asyncResource.runInAsyncScope, this.#asyncResource, args); + } +} + +export default EventEmitter; +EventEmitter.on = on; +EventEmitter.once = once; +EventEmitter.getEventListeners = getEventListeners; +EventEmitter.setMaxListeners = setMaxListeners; +EventEmitter.listenerCount = listenerCount; +EventEmitter.EventEmitter = EventEmitter; +EventEmitter.usingDomains = false; +EventEmitter.captureRejectionSymbol = kRejection; +EventEmitter.errorMonitor = kErrorMonitor; +EventEmitter.EventEmitterAsyncResource = EventEmitterAsyncResource; + +export const captureRejectionSymbol = EventEmitter.captureRejectionSymbol; +export const errorMonitor = EventEmitter.errorMonitor; +export let defaultMaxListeners = 10; + +Object.defineProperties(EventEmitter, { + captureRejections: { + get() { + return EventEmitter.prototype[kCapture]; + }, + set(value) { + validateBoolean(value, "EventEmitter.captureRejections"); + + EventEmitter.prototype[kCapture] = value; + }, + enumerable: true, + }, + defaultMaxListeners: { + enumerable: true, + get: function () { + return defaultMaxListeners; + }, + set: function (arg) { + if (typeof arg !== "number" || arg < 0 || Number.isNaN(arg)) { + throw new ERR_OUT_OF_RANGE("defaultMaxListeners", "a non-negative number", arg); + } + defaultMaxListeners = arg; + }, + }, + kMaxEventTargetListeners: { + value: kMaxEventTargetListeners, + enumerable: false, + configurable: false, + writable: false, + }, + kMaxEventTargetListenersWarned: { + value: kMaxEventTargetListenersWarned, + enumerable: false, + configurable: false, + writable: false, + }, +}); + +// The default for captureRejections is false +Object.defineProperty(EventEmitter.prototype, kCapture, { + value: false, + writable: true, + enumerable: false, +}); + +EventEmitter.init = function (this: any, opts?: EventEmitterOptions) { + if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + (this as any)._maxListeners ??= undefined; + + if (opts?.captureRejections) { + validateBoolean(opts.captureRejections, "options.captureRejections"); + (this as any)[kCapture] = Boolean(opts.captureRejections); + } else { + // Assigning the kCapture property directly saves an expensive + // prototype lookup in a very sensitive hot path. + (this as any)[kCapture] = EventEmitter.prototype[kCapture]; + } +}; + +export function setMaxListeners(n = defaultMaxListeners, ...eventTargets: any[]) { + if (typeof n !== "number" || n < 0 || Number.isNaN(n)) { + throw new ERR_OUT_OF_RANGE("n", "a non-negative number", n); + } + if (eventTargets.length === 0) { + defaultMaxListeners = n; + } else { + for (let i = 0; i < eventTargets.length; i++) { + const target = eventTargets[i]; + if (target instanceof EventTarget) { + (target as any)[kMaxEventTargetListeners] = n; + (target as any)[kMaxEventTargetListenersWarned] = false; + } else if (typeof target.setMaxListeners === "function") { + target.setMaxListeners(n); + } else { + throw new ERR_INVALID_ARG_TYPE( + "eventTargets", + ["EventEmitter", "EventTarget"], + target + ); + } + } + } +} + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; + +function addCatch(that: any, promise: Promise, type: string | symbol, args: any[]) { + if (!that[kCapture]) { + return; + } + + // Handle Promises/A+ spec, then could be a getter + // that throws on second use. + try { + const then = promise.then; + + if (typeof then === "function") { + then.call(promise, undefined, function (err) { + // The callback is called with nextTick to avoid a follow-up + // rejection from this promise. + process.nextTick(emitUnhandledRejectionOrErr, that, err, type, args); + }); + } + } catch (err) { + that.emit("error", err); + } +} + +function emitUnhandledRejectionOrErr(ee: any, err: any, type: string | symbol, args: any[]) { + if (typeof ee[kRejection] === "function") { + ee[kRejection](err, type, ...args); + } else { + // We have to disable the capture rejections mechanism, otherwise + // we might end up in an infinite loop. + const prev = ee[kCapture]; + + // If the error handler throws, it is not catcheable and it + // will end up in 'uncaughtException'. We restore the previous + // value of kCapture in case the uncaughtException is present + // and the exception is handled. + try { + ee[kCapture] = false; + ee.emit("error", err); + } finally { + ee[kCapture] = prev; + } + } +} + +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n: number) { + if (typeof n !== "number" || n < 0 || Number.isNaN(n)) { + throw new ERR_OUT_OF_RANGE("n", "a non-negative number", n); + } + this._maxListeners = n; + return this; +}; + +function _getMaxListeners(that: any) { + if (that._maxListeners === undefined) { + return (EventEmitter as any).defaultMaxListeners; + } + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); +}; + +EventEmitter.prototype.emit = function emit(type: string | symbol, ...args: any[]) { + let doError = type === "error"; + + const events = this._events; + if (events !== undefined) { + if (doError && events[kErrorMonitor] !== undefined) { + this.emit(kErrorMonitor, ...args); + } + doError = doError && events.error === undefined; + } else if (!doError) { + return false; + } + + // If there is no 'error' event listener then throw. + if (doError) { + let er; + if (args.length > 0) { + er = args[0]; + } + if (er instanceof Error) { + try { + const capture = {}; + (Error as any).captureStackTrace(capture, EventEmitter.prototype.emit); + } catch { + // pass + } + + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + + let stringifiedEr; + try { + stringifiedEr = inspect(er); + } catch { + stringifiedEr = er; + } + + // At least give some kind of context to the user + const err = new ERR_UNHANDLED_ERROR(stringifiedEr); + (err as any).context = er; + throw err; // Unhandled 'error' event + } + + const handler = events[type]; + + if (handler === undefined) { + return false; + } + + if (typeof handler === "function") { + const result = handler.apply(this, args); + + // We check if result is undefined first because that + // is the most common case so we do not pay any perf + // penalty + if (result !== undefined && result !== null) { + addCatch(this, result, type, args); + } + } else { + const len = handler.length; + const listeners = arrayClone(handler); + for (let i = 0; i < len; ++i) { + const result = listeners[i].apply(this, args); + + // We check if result is undefined first because that + // is the most common case so we do not pay any perf + // penalty. + // This code is duplicated because extracting it away + // would make it non-inlineable. + if (result !== undefined && result !== null) { + addCatch(this, result, type, args); + } + } + } + + return true; +}; + +function _addListener(target: any, type: string | symbol, listener: unknown, prepend: boolean) { + let m; + let events; + let existing; + + validateFunction(listener, "listener"); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit("newListener", type, (listener as any).listener ?? listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === "function") { + // Adding the second element, need to change to array. + existing = events[type] = prepend ? [listener, existing] : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + console.log( + "Possible EventEmitter memory leak detected. " + + `${existing.length} ${String(type)} listeners ` + + `added to an EventEmitter. Use ` + + "emitter.setMaxListeners() to increase limit" + ); + // TODO(soon): Implement process.emitWarning and inspect + // // No error code for this since it is a Warning + // // eslint-disable-next-line no-restricted-syntax + // const w = new Error( + // "Possible EventEmitter memory leak detected. " + + // `${existing.length} ${String(type)} listeners ` + + // `added to ${inspect(target, { depth: -1 })}. Use ` + + // "emitter.setMaxListeners() to increase limit", + // ); + // w.name = "MaxListenersExceededWarning"; + // w.emitter = target; + // w.type = type; + // w.count = existing.length; + // process.emitWarning(w); + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener( + type: string | symbol, + listener: unknown +) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = function prependListener( + type: string | symbol, + listener: unknown +) { + return _addListener(this, type, listener, true); +}; + +function onceWrapper(this: any) { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) { + return this.listener.call(this.target); + } + return this.listener.apply(this.target, arguments); + } +} + +function _onceWrap(target: any, type: string | symbol, listener: unknown) { + const state = { fired: false, wrapFn: undefined, target, type, listener }; + const wrapped = onceWrapper.bind(state); + (wrapped as any).listener = listener; + (state as any).wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type: string | symbol, listener: unknown) { + validateFunction(listener, "listener"); + + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = function prependOnceListener( + type: string | symbol, + listener: unknown +) { + validateFunction(listener, "listener"); + + this.prependListener(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.removeListener = function removeListener( + type: string | symbol, + listener: unknown +) { + validateFunction(listener, "listener"); + + const events = this._events; + if (events === undefined) { + return this; + } + + const list = events[type]; + if (list === undefined) { + return this; + } + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) { + this._events = Object.create(null); + } else { + delete events[type]; + if (events.removeListener) { + this.emit("removeListener", type, list.listener || listener); + } + } + } else if (typeof list !== "function") { + let position = -1; + + for (let i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + position = i; + break; + } + } + + if (position < 0) { + return this; + } + + if (position === 0) { + list.shift(); + } else { + spliceOne(list, position); + } + + if (list.length === 1) { + events[type] = list[0]; + } + + if (events.removeListener !== undefined) { + this.emit("removeListener", type, listener); + } + } + + return this; +}; + +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + +EventEmitter.prototype.removeAllListeners = function removeAllListeners(type: string | symbol) { + const events = this._events; + if (events === undefined) { + return this; + } + + // Not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) { + this._events = Object.create(null); + } else { + delete events[type]; + } + } + return this; + } + + // Emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (const key of Reflect.ownKeys(events)) { + if (key === "removeListener") continue; + this.removeAllListeners(key); + } + this.removeAllListeners("removeListener"); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + const listeners = events[type]; + + if (typeof listeners === "function") { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (let i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; +}; + +function _listeners(target: any, type: string | symbol, unwrap: boolean) { + const events = target._events; + + if (events === undefined) { + return []; + } + + const evlistener = events[type]; + if (evlistener === undefined) { + return []; + } + + if (typeof evlistener === "function") { + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + } + + return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener); +} + +EventEmitter.prototype.listeners = function listeners(type: string | symbol) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type: string | symbol) { + return _listeners(this, type, false); +}; + +const _listenerCount = function listenerCount(this: any, type: string | symbol) { + const events = this._events; + + if (events !== undefined) { + const evlistener = events[type]; + + if (typeof evlistener === "function") { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; +}; + +EventEmitter.prototype.listenerCount = _listenerCount; + +export function listenerCount(emitter: any, type: string | symbol) { + if (typeof emitter.listenerCount === "function") { + return emitter.listenerCount(type); + } + return _listenerCount.call(emitter, type); +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; +}; + +function arrayClone(arr: any[]) { + // At least since V8 8.3, this implementation is faster than the previous + // which always used a simple for-loop + switch (arr.length) { + case 2: + return [arr[0], arr[1]]; + case 3: + return [arr[0], arr[1], arr[2]]; + case 4: + return [arr[0], arr[1], arr[2], arr[3]]; + case 5: + return [arr[0], arr[1], arr[2], arr[3], arr[4]]; + case 6: + return [arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]]; + } + return arr.slice(); +} + +function unwrapListeners(arr: any[]) { + const ret = arrayClone(arr); + for (let i = 0; i < ret.length; ++i) { + const orig = ret[i].listener; + if (typeof orig === "function") { + ret[i] = orig; + } + } + return ret; +} + +export function getEventListeners(emitterOrTarget: any, type: string | symbol) { + // First check if EventEmitter + if (typeof emitterOrTarget.listeners === "function") { + return emitterOrTarget.listeners(type); + } + if (emitterOrTarget instanceof EventTarget) { + // Workers does not implement the ability to get the event listeners on an + // EventTarget the way that Node.js does. We simply return empty here. + return []; + } + throw new ERR_INVALID_ARG_TYPE("emitter", ["EventEmitter", "EventTarget"], emitterOrTarget); +} + +export interface OnceOptions { + signal?: AbortSignal; +} + +export async function once(emitter: any, name: string | symbol, options: OnceOptions = {}) { + const signal = options?.signal; + validateAbortSignal(signal, "options.signal"); + if (signal?.aborted) { + throw new AbortError(); + } + return new Promise((resolve, reject) => { + const errorListener = (err: any) => { + emitter.removeListener(name, resolver); + if (signal != null) { + eventTargetAgnosticRemoveListener(signal, "abort", abortListener); + } + reject(err); + }; + const resolver = (...args: any[]) => { + if (typeof emitter.removeListener === "function") { + emitter.removeListener("error", errorListener); + } + if (signal != null) { + eventTargetAgnosticRemoveListener(signal, "abort", abortListener); + } + resolve(args); + }; + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== "error" && typeof emitter.once === "function") { + emitter.once("error", errorListener); + } + function abortListener() { + eventTargetAgnosticRemoveListener(emitter, name, resolver); + eventTargetAgnosticRemoveListener(emitter, "error", errorListener); + reject(new AbortError()); + } + if (signal != null) { + eventTargetAgnosticAddListener(signal, "abort", abortListener, { once: true }); + } + }); +} + +const AsyncIteratorPrototype = Object.getPrototypeOf( + Object.getPrototypeOf(async function* () {}).prototype +); + +function createIterResult(value: any, done: boolean) { + return { value, done }; +} + +function eventTargetAgnosticRemoveListener( + emitter: any, + name: string | symbol, + listener: unknown, + flags: unknown = undefined +) { + if (typeof emitter.removeListener === "function") { + emitter.removeListener(name, listener); + } else if (typeof emitter.removeEventListener === "function") { + emitter.removeEventListener(name, listener, flags); + } else { + throw new ERR_INVALID_ARG_TYPE("emitter", "EventEmitter", emitter); + } +} + +interface AddListenerFlags { + once?: boolean; +} + +function eventTargetAgnosticAddListener( + emitter: any, + name: string | symbol, + listener: unknown, + flags: AddListenerFlags = {} +) { + if (typeof emitter.on === "function") { + if (flags?.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === "function") { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen to `error` events here. + emitter.addEventListener( + name, + (arg: unknown) => { + (listener as any)(arg); + }, + flags + ); + } else { + throw new ERR_INVALID_ARG_TYPE("emitter", "EventEmitter", emitter); + } +} + +interface OnOptions { + signal?: AbortSignal; +} + +export function on(emitter: any, event: string | symbol, options: OnOptions = {}) { + const signal = options?.signal; + validateAbortSignal(signal, "options.signal"); + if (signal?.aborted) { + throw new AbortError(); + } + + const unconsumedEvents: any[] = []; + const unconsumedPromises: any[] = []; + let error: any = null; + let finished = false; + + const iterator = Object.setPrototypeOf( + { + next() { + // First, we consume all unread events + const value = unconsumedEvents.shift(); + if (value) { + return Promise.resolve(createIterResult(value, false)); + } + + // Then we error, if an error happened + // This happens one time if at all, because after 'error' + // we stop listening + if (error) { + const p = Promise.reject(error); + // Only the first element errors + error = null; + return p; + } + + // If the iterator is finished, resolve to done + if (finished) { + return Promise.resolve(createIterResult(undefined, true)); + } + + // Wait until an event happens + return new Promise(function (resolve, reject) { + unconsumedPromises.push({ resolve, reject }); + }); + }, + + return() { + eventTargetAgnosticRemoveListener(emitter, event, eventHandler); + eventTargetAgnosticRemoveListener(emitter, "error", errorHandler); + + if (signal) { + eventTargetAgnosticRemoveListener(signal, "abort", abortListener, { + once: true, + }); + } + + finished = true; + + for (const promise of unconsumedPromises) { + promise.resolve(createIterResult(undefined, true)); + } + + return Promise.resolve(createIterResult(undefined, true)); + }, + + throw(err: any) { + if (!err || !(err instanceof Error)) { + throw new ERR_INVALID_ARG_TYPE("EventEmitter.AsyncIterator", "Error", err); + } + error = err; + eventTargetAgnosticRemoveListener(emitter, event, eventHandler); + eventTargetAgnosticRemoveListener(emitter, "error", errorHandler); + }, + + [Symbol.asyncIterator]() { + return this; + }, + }, + AsyncIteratorPrototype + ); + + eventTargetAgnosticAddListener(emitter, event, eventHandler); + if (event !== "error" && typeof emitter.on === "function") { + emitter.on("error", errorHandler); + } + + if (signal) { + eventTargetAgnosticAddListener(signal, "abort", abortListener, { once: true }); + } + + return iterator; + + function abortListener() { + errorHandler(new AbortError()); + } + + function eventHandler(...args: any[]) { + const promise = unconsumedPromises.shift(); + if (promise) { + promise.resolve(createIterResult(args, false)); + } else { + unconsumedEvents.push(args); + } + } + + function errorHandler(err: any) { + finished = true; + + const toError = unconsumedPromises.shift(); + + if (toError) { + toError.reject(err); + } else { + // The next time we call next() + error = err; + } + + iterator.return(); + } +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_buffer.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_buffer.ts new file mode 100644 index 000000000..e2487edc5 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_buffer.ts @@ -0,0 +1,2274 @@ +import { + ERR_BUFFER_OUT_OF_BOUNDS, + ERR_OUT_OF_RANGE, + ERR_INVALID_ARG_TYPE, + ERR_INVALID_ARG_VALUE, + ERR_INVALID_BUFFER_SIZE, + ERR_UNKNOWN_ENCODING, +} from "./internal_errors"; + +import * as bufferUtil from "./buffer"; + +import { isAnyArrayBuffer, isArrayBufferView, isUint8Array } from "./internal_types"; + +import { normalizeEncoding } from "./internal_utils"; + +import { validateString } from "./validators"; + +import * as internalUtil from "./util"; +import { InspectOptionsStylized, inspect as utilInspect } from "./internal_inspect"; + +// Temporary buffers to convert numbers. +const float32Array = new Float32Array(1); +const uInt8Float32Array = new Uint8Array(float32Array.buffer); +const float64Array = new Float64Array(1); +const uInt8Float64Array = new Uint8Array(float64Array.buffer); + +// Check endianness. +float32Array[0] = -1; // 0xBF800000 +// Either it is [0, 0, 128, 191] or [191, 128, 0, 0]. It is not possible to +// check this with `os.endianness()` because that is determined at compile time. +export const bigEndian = uInt8Float32Array[3] === 0; + +// Node.js caps it's max length at uint32_t max, we are very intentionally more +// conservative here, capping at int32_t max. +export const kMaxLength = 2147483647; +export const kStringMaxLength = 536870888; +const MAX_UINT32 = 2 ** 32; +const kIsBuffer = Symbol("kIsBuffer"); + +const customInspectSymbol = + typeof Symbol === "function" && typeof Symbol["for"] === "function" + ? Symbol["for"]("nodejs.util.inspect.custom") + : null; + +const INSPECT_MAX_BYTES = 50; + +export const constants = { + MAX_LENGTH: kMaxLength, + MAX_STRING_LENGTH: kStringMaxLength, +}; + +function createBuffer(length: number): Buffer { + if (length > kMaxLength) { + throw new ERR_OUT_OF_RANGE("The given length is invalid", `0 to ${kMaxLength}`, length); + } + const buf = new Uint8Array(length); + Object.setPrototypeOf(buf, Buffer.prototype); + return buf as Buffer; +} + +type WithImplicitCoercion = T | { valueOf(): T }; +type StringLike = WithImplicitCoercion | { [Symbol.toPrimitive](hint: "string"): string }; +type ArrayBufferLike = WithImplicitCoercion; +type BufferSource = StringLike | ArrayBufferLike | Uint8Array | ReadonlyArray; + +export interface Buffer extends Uint8Array { + readonly buffer: ArrayBuffer; + readonly parent: ArrayBuffer; + readonly byteOffset: number; + readonly length: number; + compare( + target: Uint8Array, + targetStart?: number, + targetEnd?: number, + sourceStart?: number, + sourceEnd?: number + ): number; + copy( + target: Uint8Array, + targetStart?: number, + sourceStart?: number, + sourceEnd?: number + ): number; + equals(other: Uint8Array): boolean; + fill(value: number, offset?: number, end?: number): this; + fill(value: string, encoding?: string): this; + fill(value: string, offset?: number, end?: number, encoding?: string): this; + fill(value: Uint8Array, offset?: number, end?: number): this; + includes(value: number, byteOffset?: number): boolean; + includes(value: string, encoding?: string): boolean; + includes(value: string, byteOffset?: number, encoding?: string): boolean; + includes(value: Uint8Array, byteOffset?: number): boolean; + indexOf(value: number, byteOffset?: number): number; + indexOf(value: string, encoding?: string): number; + indexOf(value: string, byteOffset?: number, encoding?: string): number; + indexOf(value: Uint8Array, byteOffset?: number): number; + lastIndexOf(value: number, byteOffset?: number): number; + lastIndexOf(value: string, encoding?: string): number; + lastIndexOf(value: string, byteOffset?: number, encoding?: string): number; + lastIndexOf(value: Uint8Array, byteOffset?: number): number; + readBigInt64BE(offset?: number): bigint; + readBigInt64LE(offset?: number): bigint; + readBigUInt64BE(offset?: number): bigint; + readBigUInt64LE(offset?: number): bigint; + readDoubleBE(offset?: number): number; + readDoubleLE(offset?: number): number; + readFloatBE(offset?: number): number; + readFloatLE(offset?: number): number; + readInt8(offset?: number): number; + readInt16BE(offset?: number): number; + readInt16LE(offset?: number): number; + readInt32BE(offset?: number): number; + readInt32LE(offset?: number): number; + readIntBE(offset?: number, byteLength?: number): number; + readIntLE(offset?: number, byteLength?: number): number; + readUInt8(offset?: number): number; + readUInt16BE(offset?: number): number; + readUInt16LE(offset?: number): number; + readUInt32BE(offset?: number): number; + readUInt32LE(offset?: number): number; + readUIntBE(offset?: number, byteLength?: number): number; + readUIntLE(offset?: number, byteLength?: number): number; + swap16(): this; + swap32(): this; + swap64(): this; + toJSON(): { type: "Buffer"; data: number[] }; + toString(encoding?: string, start?: number, end?: number): string; + write(string: string, encoding?: string): number; + write(string: string, offset?: number, encoding?: string): number; + write(string: string, offset?: number, length?: number, encoding?: string): number; + writeBigInt64BE(value: bigint, offset?: number): number; + writeBigInt64LE(value: bigint, offset?: number): number; + writeBigUInt64BE(value: bigint, offset?: number): number; + writeBigUInt64LE(value: bigint, offset?: number): number; + writeDoubleBE(value: number, offset?: number): number; + writeDoubleLE(value: number, offset?: number): number; + writeFloatBE(value: number, offset?: number): number; + writeFloatLE(value: number, offset?: number): number; + writeInt8(value: number, offset?: number): number; + writeInt16BE(value: number, offset?: number): number; + writeInt16LE(value: number, offset?: number): number; + writeInt32BE(value: number, offset?: number): number; + writeInt32LE(value: number, offset?: number): number; + writeIntBE(value: number, offset?: number, byteLength?: number): number; + writeIntLE(value: number, offset?: number, byteLength?: number): number; + writeUInt8(value: number, offset?: number): number; + writeUInt16BE(value: number, offset?: number): number; + writeUInt16LE(value: number, offset?: number): number; + writeUInt32BE(value: number, offset?: number): number; + writeUInt32LE(value: number, offset?: number): number; + writeUIntBE(value: number, offset?: number, byteLength?: number): number; + writeUIntLE(value: number, offset?: number, byteLength?: number): number; + new (array: Iterable): Buffer; + new (arrayBuffer: ArrayBufferLike, byteOffset?: number, length?: number): Buffer; + new (buffer: ArrayBufferView): Buffer; + new (size: number): Buffer; + new (string: string, encoding?: string): Buffer; +} + +type FillValue = string | number | ArrayBufferView; + +export function Buffer(value: number): Buffer; +export function Buffer(value: StringLike, encoding?: string): Buffer; +export function Buffer(value: ArrayBufferLike, byteOffset?: number, length?: number): Buffer; +export function Buffer( + value: Uint8Array | ReadonlyArray, + byteOffset?: number, + length?: number +): Buffer; +export function Buffer(value: StringLike, encoding?: string): Buffer; +export function Buffer( + value: number | BufferSource, + encodingOrOffset?: string | number, + length?: number +): Buffer { + if (typeof value === "number") { + if (typeof encodingOrOffset === "string") { + throw new ERR_INVALID_ARG_TYPE("string", "string", value); + } + return allocUnsafe(value); + } + + return _from(value, encodingOrOffset, length); +} + +Object.setPrototypeOf(Buffer.prototype, Uint8Array.prototype); +Object.setPrototypeOf(Buffer, Uint8Array); + +Object.defineProperties(Buffer, { + // By default, Node.js allocates Buffers from a shared slab allocation + // as a performance optimization. While this is fast, it's not ideal + // in our environment as it could potentially be used to leak buffer + // data across multiple requests. We always want our Buffer instances + // to be distinct allocations. To signal this, we keep our poolSize + // always set to 0. + poolSize: { + enumerable: true, + value: 0, + writable: false, + }, +}); + +Object.defineProperties(Buffer.prototype, { + parent: { + enumerable: true, + get() { + if (!Buffer.isBuffer(this)) { + return void 0; + } + return this.buffer; + }, + }, + offset: { + enumerable: true, + get() { + if (!Buffer.isBuffer(this)) { + return void 0; + } + return this.byteOffset; + }, + }, + [kIsBuffer]: { + enumerable: false, + configurable: false, + value: true, + }, +}); + +function _from(value: BufferSource, encodingOrOffset?: string | number, length?: number): Buffer { + if (typeof value === "string") { + return fromString(value, encodingOrOffset as string | undefined) as Buffer; + } + + if (typeof value === "object" && value != null) { + if (isAnyArrayBuffer(value)) { + return fromArrayBuffer( + value as ArrayBufferLike, + encodingOrOffset as number, + length + ) as Buffer; + } + + const valueOf = value?.valueOf(); + if ( + valueOf != null && + valueOf !== value && + (typeof valueOf === "string" || typeof valueOf === "object") + ) { + return _from(valueOf as BufferSource, encodingOrOffset, length); + } + + if ((value as any).length !== undefined || isAnyArrayBuffer((value as any).buffer)) { + if (typeof (value as any).length !== "number") { + return createBuffer(0); + } + + return fromArrayLike(value as any) as Buffer; + } + + if ((value as any).type === "Buffer" && Array.isArray((value as any).data)) { + return fromArrayLike((value as any).data) as Buffer; + } + + const toPrimitive = (value as any)[Symbol.toPrimitive]; + if (typeof toPrimitive === "function") { + const primitive = toPrimitive("string"); + if (typeof primitive === "string") { + return fromString(primitive, encodingOrOffset as string | undefined) as Buffer; + } + } + } + + throw new ERR_INVALID_ARG_TYPE( + "first argument", + [ + "string", + "Buffer", + "TypedArray", + "ArrayBuffer", + "SharedArrayBuffer", + "Array", + "Array-like Object", + ], + value + ); +} + +function from(value: StringLike, encoding?: string): Buffer; +function from(value: ArrayBufferLike, byteOffset?: number, length?: number): Buffer; +function from( + value: Uint8Array | ReadonlyArray, + byteOffset?: number, + length?: number +): Buffer; +function from(value: BufferSource, encodingOrOffset?: string | number, length?: number) { + return _from(value, encodingOrOffset, length); +} + +function fromString(string: StringLike, encoding?: string) { + if (typeof encoding !== "string" || encoding === "") { + encoding = "utf8"; + } + const normalizedEncoding = normalizeEncoding(encoding); + if (!Buffer.isEncoding(normalizedEncoding)) { + throw new ERR_UNKNOWN_ENCODING(encoding); + } + + const ab = bufferUtil.decodeString(`${string}`, normalizedEncoding as string); + if (ab === undefined) { + throw new ERR_INVALID_ARG_VALUE( + "string", + string, + `Unable to decode string using encoding ${encoding}` + ); + } + return fromArrayBuffer(ab, 0, ab.byteLength); +} + +function fromArrayLike(array: Uint8Array | ReadonlyArray) { + const u8 = Uint8Array.from(array); + return fromArrayBuffer(u8.buffer, u8.byteOffset, u8.byteLength); +} + +function fromArrayBuffer(obj: ArrayBufferLike, byteOffset: number, length?: number) { + // Convert byteOffset to integer + if (byteOffset === undefined) { + byteOffset = 0; + } else { + byteOffset = +byteOffset; + if (Number.isNaN(byteOffset)) { + byteOffset = 0; + } + } + + const maxLength = (obj as ArrayBuffer).byteLength - byteOffset; + + if (maxLength < 0) { + throw new ERR_BUFFER_OUT_OF_BOUNDS("offset"); + } + + if (length === undefined) { + length = maxLength; + } else { + // Convert length to non-negative integer. + length = +length; + if (length > 0) { + if (length > maxLength) { + throw new ERR_BUFFER_OUT_OF_BOUNDS("length"); + } + } else { + length = 0; + } + } + + const buffer = new Uint8Array(obj as ArrayBuffer, byteOffset, length); + Object.setPrototypeOf(buffer, Buffer.prototype); + return buffer; +} + +Buffer.from = from; + +function of(...args: number[]) { + const buf = Buffer.alloc(args.length); + for (let k = 0; k < args.length; k++) buf[k] = args[k]!; + return buf; +} + +Buffer.of = of; + +function alloc(size: number, fill?: FillValue, encoding?: string): Buffer { + validateNumber(size, "size"); + if (Number.isNaN(size)) { + throw new ERR_INVALID_ARG_VALUE.RangeError("size", size); + } + if (size >= kMaxLength) { + throw new ERR_OUT_OF_RANGE("size", `0 to ${kMaxLength}`, size); + } + + const buffer = createBuffer(size); + if (fill !== undefined) { + if (encoding !== undefined) { + validateString(encoding, "encoding"); + } + return buffer.fill(fill as any, encoding); + } + return buffer; +} + +Buffer.alloc = alloc; + +function allocUnsafe(size: number): Buffer { + return alloc(size); +} + +Buffer.allocUnsafe = allocUnsafe; +Buffer.allocUnsafeSlow = allocUnsafe; + +export function SlowBuffer(length: number) { + return alloc(+length); +} + +Object.setPrototypeOf(SlowBuffer.prototype, Uint8Array.prototype); +Object.setPrototypeOf(SlowBuffer, Uint8Array); + +Buffer.isBuffer = function isBuffer(b: unknown) { + return b != null && (b as any)[kIsBuffer] && b !== Buffer.prototype; +}; + +export function compare(a: Buffer | Uint8Array, b: Buffer | Uint8Array) { + if (isInstance(a, Uint8Array)) { + const buf = a as Uint8Array; + a = fromArrayBuffer(buf.buffer, buf.byteOffset, buf.byteLength); + } + if (isInstance(b, Uint8Array)) { + const buf = b as Uint8Array; + b = fromArrayBuffer(buf.buffer, buf.byteOffset, buf.byteLength); + } + if (!Buffer.isBuffer(a)) { + throw new ERR_INVALID_ARG_TYPE("a", ["Buffer", "Uint8Array"], typeof a); + } + if (!Buffer.isBuffer(b)) { + throw new ERR_INVALID_ARG_TYPE("b", ["Buffer", "Uint8Array"], typeof b); + } + if (a === b) return 0; + + return bufferUtil.compare(a, b); +} + +Buffer.compare = compare; + +export function isEncoding(encoding: unknown) { + return ( + typeof encoding === "string" && + encoding.length !== 0 && + normalizeEncoding(encoding) !== undefined + ); +} + +Buffer.isEncoding = isEncoding; + +Buffer.concat = function concat(list: (Buffer | Uint8Array)[], length?: number) { + if (!Array.isArray(list)) { + throw new ERR_INVALID_ARG_TYPE("list", "(Buffer|Uint8Array)[]", list); + } + + if (list.length === 0) return alloc(0); + + if (length === undefined) { + length = 0; + for (let i = 0; i < list.length; i++) { + if (list[i]!.length !== undefined) { + length += list[i]!.length; + } else { + throw new ERR_INVALID_ARG_TYPE("list", "(Buffer|Uint8Array)[]", list[i]); + } + } + } + validateOffset(length, "length"); + + const ab = bufferUtil.concat(list, length as number); + return fromArrayBuffer(ab, 0, length); +}; + +function base64ByteLength(str: string) { + let len = str.length; + if (str.charCodeAt(len - 1) === 0x3d) { + len--; + } + if (len > 1 && str.charCodeAt(len - 1) === 0x3d) len--; + + // Base64 ratio: 3/4 + return (len * 3) >>> 2; +} + +function byteLength( + string: string | ArrayBufferView | ArrayBuffer | SharedArrayBuffer, + encoding?: string +) { + if (typeof string !== "string") { + if (isArrayBufferView(string) || isAnyArrayBuffer(string)) { + return string.byteLength; + } + + throw new ERR_INVALID_ARG_TYPE("string", ["string", "Buffer", "ArrayBuffer"], string); + } + + string = `${string}`; + let normalizedEncoding = normalizeEncoding(encoding); + if (!Buffer.isEncoding(normalizedEncoding)) { + normalizedEncoding = "utf8"; + } + + switch (normalizedEncoding) { + case "ascii": + // Fall through + case "latin1": + return (string as string).length; + case "utf16le": + return (string as string).length * 2; + case "base64": + // Fall through + case "base64url": + return base64ByteLength(string as string); + case "hex": + return (string as string).length >>> 1; + case "utf8": + // Fall-through + default: + return bufferUtil.byteLength(string as string, normalizedEncoding as string); + } +} + +Buffer.byteLength = byteLength; + +Buffer.prototype.swap16 = function swap16() { + const len = this.length; + if (len % 2 !== 0) { + throw new ERR_INVALID_BUFFER_SIZE(16); + } + bufferUtil.swap(this, 16); + return this; +}; + +Buffer.prototype.swap32 = function swap32() { + const len = this.length; + if (len % 4 !== 0) { + throw new ERR_INVALID_BUFFER_SIZE(32); + } + bufferUtil.swap(this, 32); + return this; +}; + +Buffer.prototype.swap64 = function swap64() { + const len = this.length; + if (len % 8 !== 0) { + throw new ERR_INVALID_BUFFER_SIZE(64); + } + bufferUtil.swap(this, 64); + return this; +}; + +Buffer.prototype.toString = function toString(encoding?: string, start?: number, end?: number) { + if (arguments.length === 0) { + return bufferUtil.toString(this, 0, this.length, "utf8"); + } + + const len = this.length; + + if (start === undefined || start <= 0) { + start = 0; + } else if (start >= len) { + return ""; + } else { + start |= 0; + } + + if (end === undefined || end > len) { + end = len; + } else { + end |= 0; + } + + if ((end as number) <= start) { + return ""; + } + + const normalizedEncoding = normalizeEncoding(`${encoding}`); + if (!Buffer.isEncoding(normalizedEncoding)) { + throw new ERR_UNKNOWN_ENCODING(encoding as string); + } + + return bufferUtil.toString(this, start as number, end as number, normalizedEncoding as string); +}; + +Buffer.prototype.toLocaleString = Buffer.prototype.toString; + +Buffer.prototype.equals = function equals(b: Buffer | Uint8Array) { + return compare(this, b) === 0; +}; + +Buffer.prototype.inspect = function inspect(_recurseTimes: number, ctx: InspectOptionsStylized) { + let str = ""; + const max = INSPECT_MAX_BYTES; + str = this.toString("hex", 0, max) + .replace(/(.{2})/g, "$1 ") + .trim(); + const remaining = this.length - max; + if (remaining > 0) { + str += ` ... ${remaining} more byte${remaining > 1 ? "s" : ""}`; + } + // Inspect special properties as well, if possible. + if (ctx) { + let extras = false; + const filter = ctx.showHidden ? internalUtil.ALL_PROPERTIES : internalUtil.ONLY_ENUMERABLE; + const obj: Record = { __proto__: null }; + internalUtil.getOwnNonIndexProperties(this, filter).forEach((key) => { + extras = true; + obj[key] = this[key]; + }); + if (extras) { + if (this.length !== 0) str += ", "; + // '[Object: null prototype] {'.length === 26 + // This is guarded with a test. + str += utilInspect(obj, { + ...ctx, + breakLength: Infinity, + compact: true, + }).slice(27, -2); + } + } + return ""; +}; + +if (customInspectSymbol) { + Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect; +} + +Buffer.prototype.compare = function compare( + target: Buffer | Uint8Array, + start?: number, + end?: number, + thisStart?: number, + thisEnd?: number +) { + if (isInstance(target, Uint8Array)) { + target = fromArrayBuffer(target.buffer, target.byteOffset, target.byteLength); + } + if (!Buffer.isBuffer(target)) { + throw new ERR_INVALID_ARG_TYPE("target", ["Buffer", "Uint8Array"], target); + } + + if (start === undefined) { + start = 0; + } else { + validateOffset(start, "targetStart", 0, kMaxLength); + } + + if (end === undefined) { + end = target.length; + } else { + validateOffset(end, "targetEnd", 0, target.length); + } + + if (thisStart === undefined) { + thisStart = 0; + } else { + validateOffset(thisStart as number, "sourceStart", 0, kMaxLength); + } + + if (thisEnd === undefined) { + thisEnd = this.length; + } else { + validateOffset(thisEnd as number, "sourceEnd", 0, this.length); + } + + return bufferUtil.compare(this, target, { + aStart: thisStart as number, + aEnd: thisEnd as number, + bStart: start as number, + bEnd: end as number, + }); +}; + +function includes( + this: Buffer, + val: string | number | Buffer | Uint8Array, + byteOffset?: number, + encoding?: string +) { + return this.indexOf(val as any, byteOffset, encoding) !== -1; +} + +Buffer.prototype.includes = includes; + +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant if val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf( + buffer: Uint8Array, + val: string | number | Buffer | Uint8Array, + byteOffset: number | string | undefined, + encoding: string | undefined, + dir: boolean | undefined +) { + if (Buffer.isBuffer(val) && !isUint8Array(val)) { + throw new ERR_INVALID_ARG_TYPE("val", ["string", "number", "Buffer", "Uint8Array"], val); + } + + if (typeof byteOffset === "string") { + encoding = byteOffset; + byteOffset = undefined; + } else if ((byteOffset as number) > 0x7fffffff) { + byteOffset = 0x7fffffff; + } else if ((byteOffset as number) < -0x80000000) { + byteOffset = -0x80000000; + } + // Coerce to Number. Values like null and [] become 0. + byteOffset = +(byteOffset as number); + // If the offset is undefined, "foo", {}, coerces to NaN, search whole buffer. + if (Number.isNaN(byteOffset)) { + byteOffset = dir ? 0 : buffer.length || buffer.byteLength; + } + dir = !!dir; // Cast to bool. + + if (typeof val === "number") { + val = (val >>> 0) & 0xff; + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset); + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset); + } + } + + if (typeof val !== "string" && !isUint8Array(val) && !Buffer.isBuffer(val)) { + throw new ERR_INVALID_ARG_TYPE("value", ["number", "string", "Buffer", "Uint8Array"], val); + } + + let normalizedEncoding = normalizeEncoding(encoding); + if (!Buffer.isEncoding(normalizedEncoding)) { + throw new ERR_UNKNOWN_ENCODING(encoding as string); + } + + const result = bufferUtil.indexOf(buffer, val, byteOffset, normalizedEncoding, dir); + return result == null ? -1 : result; +} + +Buffer.prototype.indexOf = function indexOf( + val: string | number | Buffer | Uint8Array, + byteOffset?: number | string, + encoding?: string +) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true); +}; + +Buffer.prototype.lastIndexOf = function lastIndexOf( + val: string | number | Buffer | Uint8Array, + byteOffset?: number | string, + encoding?: string +) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false); +}; + +Buffer.prototype.asciiSlice = function asciiSlice(offset: number, length: number) { + validateOffset(offset, "offset", 0, this.length); + validateOffset(length, "length", 0, this.length - offset); + return bufferUtil.toString(this, offset, offset + length, "ascii"); +}; + +Buffer.prototype.base64Slice = function base64Slice(offset: number, length: number) { + validateOffset(offset, "offset", 0, this.length); + validateOffset(length, "length", 0, this.length - offset); + return bufferUtil.toString(this, offset, offset + length, "base64"); +}; + +Buffer.prototype.base64urlSlice = function base64urlSlice(offset: number, length: number) { + validateOffset(offset, "offset", 0, this.length); + validateOffset(length, "length", 0, this.length - offset); + return bufferUtil.toString(this, offset, offset + length, "base64url"); +}; + +Buffer.prototype.hexSlice = function hexSlice(offset: number, length: number) { + validateOffset(offset, "offset", 0, this.length); + validateOffset(length, "length", 0, this.length - offset); + return bufferUtil.toString(this, offset, offset + length, "hex"); +}; + +Buffer.prototype.latin1Slice = function latin1Slice(offset: number, length: number) { + validateOffset(offset, "offset", 0, this.length); + validateOffset(length, "length", 0, this.length - offset); + return bufferUtil.toString(this, offset, offset + length, "latin1"); +}; + +Buffer.prototype.ucs2Slice = function ucs2Slice(offset: number, length: number) { + validateOffset(offset, "offset", 0, this.length); + validateOffset(length, "length", 0, this.length - offset); + return bufferUtil.toString(this, offset, offset + length, "utf16le"); +}; + +Buffer.prototype.utf8Slice = function utf8Slice(offset: number, length: number) { + validateOffset(offset, "offset", 0, this.length); + validateOffset(length, "length", 0, this.length - offset); + return bufferUtil.toString(this, offset, offset + length, "utf8"); +}; + +Buffer.prototype.asciiWrite = function asciiWrite( + string: StringLike, + offset?: number, + length?: number +) { + offset ??= 0; + length ??= this.length; + validateOffset(offset as number, "offset", 0, this.length); + validateOffset(length as number, "length", 0, this.length - offset); + return bufferUtil.write(this, `${string}`, offset as number, length as number, "ascii"); +}; + +Buffer.prototype.base64Write = function base64Write( + string: StringLike, + offset?: number, + length?: number +) { + offset ??= 0; + length ??= this.length; + validateOffset(offset as number, "offset", 0, this.length); + validateOffset(length as number, "length", 0, this.length - offset); + return bufferUtil.write(this, `${string}`, offset as number, length as number, "base64"); +}; + +Buffer.prototype.base64urlWrite = function base64urlWrite( + string: StringLike, + offset?: number, + length?: number +) { + offset ??= 0; + length ??= this.length; + validateOffset(offset as number, "offset", 0, this.length); + validateOffset(length as number, "length", 0, this.length - offset); + return bufferUtil.write(this, `${string}`, offset as number, length as number, "base64url"); +}; + +Buffer.prototype.hexWrite = function hexWrite(string: StringLike, offset: number, length: number) { + offset ??= 0; + length ??= this.length; + validateOffset(offset as number, "offset", 0, this.length); + validateOffset(length as number, "length", 0, this.length - offset); + return bufferUtil.write(this, `${string}`, offset as number, length as number, "hex"); +}; + +Buffer.prototype.latin1Write = function latin1Write( + string: StringLike, + offset: number, + length: number +) { + offset ??= 0; + length ??= this.length; + validateOffset(offset as number, "offset", 0, this.length); + validateOffset(length as number, "length", 0, this.length - offset); + return bufferUtil.write(this, `${string}`, offset as number, length as number, "latin1"); +}; + +Buffer.prototype.ucs2Write = function ucs2Write( + string: StringLike, + offset: number, + length: number +) { + offset ??= 0; + length ??= this.length; + validateOffset(offset as number, "offset", 0, this.length); + validateOffset(length as number, "length", 0, this.length - offset); + return bufferUtil.write(this, `${string}`, offset as number, length as number, "utf16le"); +}; + +Buffer.prototype.utf8Write = function utf8Write( + string: StringLike, + offset: number, + length: number +) { + offset ??= 0; + length ??= this.length; + validateOffset(offset as number, "offset", 0, this.length); + validateOffset(length as number, "length", 0, this.length - offset); + return bufferUtil.write(this, `${string}`, offset as number, length as number, "utf8"); +}; + +Buffer.prototype.write = function write( + string: StringLike, + offset?: number | string, + length?: number | string, + encoding?: string +) { + string = `${string}`; + if (offset === undefined) { + // Buffer#write(string) + return bufferUtil.write(this, string as string, 0, this.length, "utf8"); + } + + if (length === undefined && typeof offset === "string") { + // Buffer#write(string, encoding) + encoding = offset; + length = this.length; + offset = 0; + } else { + // Buffer#write(string, offset[, length][, encoding]) + validateOffset(offset as number, "offset", 0, this.length); + + const remaining = this.length - (offset as number); + + if (length === undefined) { + length = remaining; + } else if (typeof length === "string") { + encoding = length; + length = remaining; + } else { + validateOffset(length, "length", 0, this.length); + if (length > remaining) { + length = remaining; + } + } + } + + if (!encoding) { + return bufferUtil.write(this, string as string, offset as number, length as number, "utf8"); + } + + const normalizedEncoding = normalizeEncoding(encoding); + if (!Buffer.isEncoding(normalizedEncoding)) { + throw new ERR_UNKNOWN_ENCODING(encoding as string); + } + + return bufferUtil.write( + this, + string as string, + offset as number, + length as number, + normalizedEncoding as string + ); +}; + +Buffer.prototype.toJSON = function toJSON() { + return { + type: "Buffer", + data: Array.prototype.slice.call(this._arr || this, 0), + }; +}; + +Buffer.prototype.slice = function slice(start: number, end?: number) { + const len = this.length; + start = ~~start; + end = end === void 0 ? len : ~~end; + if (start < 0) { + start += len; + if (start < 0) { + start = 0; + } + } else if (start > len) { + start = len; + } + if (end === undefined) { + end = this.byteLength; + } else if (end < 0) { + end += len; + if (end < 0) { + end = 0; + } + } else if (end > len) { + end = len; + } + if ((end as number) < start) { + end = start; + } + const newBuf = this.subarray(start, end); + Object.setPrototypeOf(newBuf, Buffer.prototype); + return newBuf; +}; + +Buffer.prototype.readUintLE = Buffer.prototype.readUIntLE = function readUIntLE( + offset: number, + byteLength: number +) { + if (offset === undefined) { + throw new ERR_INVALID_ARG_TYPE("offset", "number", offset); + } + switch (byteLength) { + case 1: + return this.readUInt8(offset); + case 2: + return this.readUInt16LE(offset); + case 3: + return readUInt24LE(this, offset); + case 4: + return this.readUInt32LE(offset); + case 5: + return readUInt40LE(this, offset); + case 6: + return readUInt48LE(this, offset); + default: + boundsError(byteLength, 6, "byteLength"); + } +}; + +Buffer.prototype.readUintBE = Buffer.prototype.readUIntBE = function readUIntBE( + offset: number, + byteLength: number +) { + if (offset === undefined) { + throw new ERR_INVALID_ARG_TYPE("offset", "number", offset); + } + switch (byteLength) { + case 1: + return this.readUInt8(offset); + case 2: + return this.readUInt16BE(offset); + case 3: + return readUInt24BE(this, offset); + case 4: + return this.readUInt32BE(offset); + case 5: + return readUInt40BE(this, offset); + case 6: + return readUInt48BE(this, offset); + default: + boundsError(byteLength, 6, "byteLength"); + } +}; + +Buffer.prototype.readUint8 = Buffer.prototype.readUInt8 = function readUInt8(offset: number = 0) { + validateOffset(offset, "offset", 0, this.length); + const val = this[offset]; + if (val === undefined) { + boundsError(offset, this.length - 1); + } + + return val; +}; + +Buffer.prototype.readUint16BE = Buffer.prototype.readUInt16BE = readUInt16BE; + +Buffer.prototype.readUint16LE = Buffer.prototype.readUInt16LE = function readUInt16LE( + offset: number = 0 +) { + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 1]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 2); + } + + return first + last * 2 ** 8; +}; + +Buffer.prototype.readUint32LE = Buffer.prototype.readUInt32LE = function readUInt32LE( + this: Buffer, + offset: number = 0 +) { + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 3]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 4); + } + + return first + this[++offset]! * 2 ** 8 + this[++offset]! * 2 ** 16 + last * 2 ** 24; +}; + +Buffer.prototype.readUint32BE = Buffer.prototype.readUInt32BE = readUInt32BE; + +Buffer.prototype.readBigUint64LE = Buffer.prototype.readBigUInt64LE = function readBigUInt64LE( + this: Buffer, + offset: number = 0 +) { + offset = offset >>> 0; + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 7]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 8); + } + const lo = + first + this[++offset]! * 2 ** 8 + this[++offset]! * 2 ** 16 + this[++offset]! * 2 ** 24; + const hi = + this[++offset]! + this[++offset]! * 2 ** 8 + this[++offset]! * 2 ** 16 + last * 2 ** 24; + return BigInt(lo) + (BigInt(hi) << BigInt(32)); +}; + +Buffer.prototype.readBigUint64BE = Buffer.prototype.readBigUInt64BE = function readBigUInt64BE( + this: Buffer, + offset: number = 0 +) { + offset = offset >>> 0; + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 7]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 8); + } + const hi = + first * 2 ** 24 + this[++offset]! * 2 ** 16 + this[++offset]! * 2 ** 8 + this[++offset]!; + const lo = + this[++offset]! * 2 ** 24 + this[++offset]! * 2 ** 16 + this[++offset]! * 2 ** 8 + last; + return (BigInt(hi) << BigInt(32)) + BigInt(lo); +}; + +Buffer.prototype.readIntLE = function readIntLE(offset: number, byteLength: number) { + if (offset === undefined) { + throw new ERR_INVALID_ARG_TYPE("offset", "number", offset); + } + switch (byteLength) { + case 1: + return this.readInt8(offset); + case 2: + return this.readInt16LE(offset); + case 3: + return readInt24LE(this, offset); + case 4: + return this.readInt32LE(offset); + case 5: + return readInt40LE(this, offset); + case 6: + return readInt48LE(this, offset); + default: + boundsError(byteLength, 6, "byteLength"); + } +}; + +Buffer.prototype.readIntBE = function readIntBE(offset: number, byteLength: number) { + if (offset === undefined) { + throw new ERR_INVALID_ARG_TYPE("offset", "number", offset); + } + switch (byteLength) { + case 1: + return this.readInt8(offset); + case 2: + return this.readInt16BE(offset); + case 3: + return readInt24BE(this, offset); + case 4: + return this.readInt32BE(offset); + case 5: + return readInt40BE(this, offset); + case 6: + return readInt48BE(this, offset); + default: + boundsError(byteLength, 6, "byteLength"); + } +}; + +Buffer.prototype.readInt8 = function readInt8(offset: number = 0) { + validateOffset(offset, "offset", 0, this.length); + const val = this[offset]; + if (val === undefined) { + boundsError(offset, this.length - 1); + } + + return val | ((val & (2 ** 7)) * 0x1fffffe); +}; + +Buffer.prototype.readInt16LE = function readInt16LE(offset: number = 0) { + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 1]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 2); + } + + const val = first + last * 2 ** 8; + return val | ((val & (2 ** 15)) * 0x1fffe); +}; + +Buffer.prototype.readInt16BE = function readInt16BE(offset: number = 0) { + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 1]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 2); + } + + const val = first * 2 ** 8 + last; + return val | ((val & (2 ** 15)) * 0x1fffe); +}; + +Buffer.prototype.readInt32LE = function readInt32LE(offset: number = 0) { + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 3]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 4); + } + + return first + this[++offset] * 2 ** 8 + this[++offset] * 2 ** 16 + (last << 24); // Overflow +}; + +Buffer.prototype.readInt32BE = function readInt32BE(offset: number = 0) { + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 3]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 4); + } + + return ( + (first << 24) + // Overflow + this[++offset] * 2 ** 16 + + this[++offset] * 2 ** 8 + + last + ); +}; + +Buffer.prototype.readBigInt64LE = function readBigInt64LE(this: Buffer, offset: number = 0) { + offset = offset >>> 0; + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 7]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 8); + } + const val = + this[offset + 4]! + this[offset + 5]! * 2 ** 8 + this[offset + 6]! * 2 ** 16 + (last << 24); + return ( + (BigInt(val) << BigInt(32)) + + BigInt( + first + this[++offset]! * 2 ** 8 + this[++offset]! * 2 ** 16 + this[++offset]! * 2 ** 24 + ) + ); +}; + +Buffer.prototype.readBigInt64BE = function readBigInt64BE(this: Buffer, offset: number = 0) { + offset = offset >>> 0; + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 7]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 8); + } + const val = + (first << 24) + this[++offset]! * 2 ** 16 + this[++offset]! * 2 ** 8 + this[++offset]!; + return ( + (BigInt(val) << BigInt(32)) + + BigInt( + this[++offset]! * 2 ** 24 + this[++offset]! * 2 ** 16 + this[++offset]! * 2 ** 8 + last + ) + ); +}; + +Buffer.prototype.readFloatLE = function readFloatLE(offset: number = 0) { + return bigEndian ? readFloatBackwards(this, offset) : readFloatForwards(this, offset); +}; + +Buffer.prototype.readFloatBE = function readFloatBE(offset: number = 0) { + return bigEndian ? readFloatForwards(this, offset) : readFloatBackwards(this, offset); +}; + +Buffer.prototype.readDoubleLE = function readDoubleLE(offset: number = 0) { + return bigEndian ? readDoubleBackwards(this, offset) : readDoubleForwards(this, offset); +}; + +Buffer.prototype.readDoubleBE = function readDoubleBE(offset: number = 0) { + return bigEndian ? readDoubleForwards(this, offset) : readDoubleBackwards(this, offset); +}; + +Buffer.prototype.writeUintLE = Buffer.prototype.writeUIntLE = function writeUIntLE( + value: number, + offset: number, + byteLength: number +) { + switch (byteLength) { + case 1: + return writeU_Int8(this, value, offset, 0, 0xff); + case 2: + return writeU_Int16LE(this, value, offset, 0, 0xffff); + case 3: + return writeU_Int24LE(this, value, offset, 0, 0xffffff); + case 4: + return writeU_Int32LE(this, value, offset, 0, 0xffffffff); + case 5: + return writeU_Int40LE(this, value, offset, 0, 0xffffffffff); + case 6: + return writeU_Int48LE(this, value, offset, 0, 0xffffffffffff); + default: + boundsError(byteLength, 6, "byteLength"); + } +}; + +Buffer.prototype.writeUintBE = Buffer.prototype.writeUIntBE = function writeUIntBE( + value: number, + offset: number, + byteLength: number +) { + switch (byteLength) { + case 1: + return writeU_Int8(this, value, offset, 0, 0xff); + case 2: + return writeU_Int16BE(this, value, offset, 0, 0xffff); + case 3: + return writeU_Int24BE(this, value, offset, 0, 0xffffff); + case 4: + return writeU_Int32BE(this, value, offset, 0, 0xffffffff); + case 5: + return writeU_Int40BE(this, value, offset, 0, 0xffffffffff); + case 6: + return writeU_Int48BE(this, value, offset, 0, 0xffffffffffff); + default: + boundsError(byteLength, 6, "byteLength"); + } +}; + +Buffer.prototype.writeUint8 = Buffer.prototype.writeUInt8 = function writeUInt8( + value: number, + offset: number = 0 +) { + return writeU_Int8(this, value, offset, 0, 0xff); +}; + +Buffer.prototype.writeUint16LE = Buffer.prototype.writeUInt16LE = function writeUInt16LE( + value: number, + offset: number = 0 +) { + return writeU_Int16LE(this, value, offset, 0, 0xffff); +}; + +Buffer.prototype.writeUint16BE = Buffer.prototype.writeUInt16BE = function writeUInt16BE( + value: number, + offset: number = 0 +) { + return writeU_Int16BE(this, value, offset, 0, 0xffff); +}; + +Buffer.prototype.writeUint32LE = Buffer.prototype.writeUInt32LE = function writeUInt32LE( + value: number, + offset: number = 0 +) { + return _writeUInt32LE(this, value, offset, 0, 0xffffffff); +}; + +Buffer.prototype.writeUint32BE = Buffer.prototype.writeUInt32BE = function writeUInt32BE( + value: number, + offset: number = 0 +) { + return _writeUInt32BE(this, value, offset, 0, 0xffffffff); +}; + +function wrtBigUInt64LE(buf: Buffer, value: bigint, offset: number, min: bigint, max: bigint) { + checkIntBI(value, min, max, buf, offset, 7); + let lo = Number(value & BigInt(4294967295)); + buf[offset++] = lo; + lo = lo >> 8; + buf[offset++] = lo; + lo = lo >> 8; + buf[offset++] = lo; + lo = lo >> 8; + buf[offset++] = lo; + let hi = Number((value >> BigInt(32)) & BigInt(4294967295)); + buf[offset++] = hi; + hi = hi >> 8; + buf[offset++] = hi; + hi = hi >> 8; + buf[offset++] = hi; + hi = hi >> 8; + buf[offset++] = hi; + return offset; +} + +function wrtBigUInt64BE(buf: Buffer, value: bigint, offset: number, min: bigint, max: bigint) { + checkIntBI(value, min, max, buf, offset, 7); + let lo = Number(value & BigInt(4294967295)); + buf[offset + 7] = lo; + lo = lo >> 8; + buf[offset + 6] = lo; + lo = lo >> 8; + buf[offset + 5] = lo; + lo = lo >> 8; + buf[offset + 4] = lo; + let hi = Number((value >> BigInt(32)) & BigInt(4294967295)); + buf[offset + 3] = hi; + hi = hi >> 8; + buf[offset + 2] = hi; + hi = hi >> 8; + buf[offset + 1] = hi; + hi = hi >> 8; + buf[offset] = hi; + return offset + 8; +} + +Buffer.prototype.writeBigUint64LE = Buffer.prototype.writeBigUInt64LE = function writeBigUInt64LE( + this: Buffer, + value: bigint, + offset: number = 0 +) { + return wrtBigUInt64LE(this, value, offset, 0n, 0xffffffffffffffffn); +}; + +Buffer.prototype.writeBigUint64BE = Buffer.prototype.writeBigUInt64BE = function writeBigUInt64BE( + this: Buffer, + value: bigint, + offset: number = 0 +) { + return wrtBigUInt64BE(this, value, offset, 0n, 0xffffffffffffffffn); +}; + +Buffer.prototype.writeIntLE = function writeIntLE( + value: number, + offset: number, + byteLength: number +) { + switch (byteLength) { + case 1: + return writeU_Int8(this, value, offset, -0x80, 0x7f); + case 2: + return writeU_Int16LE(this, value, offset, -0x8000, 0x7fff); + case 3: + return writeU_Int24LE(this, value, offset, -0x800000, 0x7fffff); + case 4: + return writeU_Int32LE(this, value, offset, -0x80000000, 0x7fffffff); + case 5: + return writeU_Int40LE(this, value, offset, -0x8000000000, 0x7fffffffff); + case 6: + return writeU_Int48LE(this, value, offset, -0x800000000000, 0x7fffffffffff); + default: + boundsError(byteLength, 6, "byteLength"); + } +}; + +Buffer.prototype.writeIntBE = function writeIntBE( + value: number, + offset: number, + byteLength: number +) { + switch (byteLength) { + case 1: + return writeU_Int8(this, value, offset, -0x80, 0x7f); + case 2: + return writeU_Int16BE(this, value, offset, -0x8000, 0x7fff); + case 3: + return writeU_Int24BE(this, value, offset, -0x800000, 0x7fffff); + case 4: + return writeU_Int32BE(this, value, offset, -0x80000000, 0x7fffffff); + case 5: + return writeU_Int40BE(this, value, offset, -0x8000000000, 0x7fffffffff); + case 6: + return writeU_Int48BE(this, value, offset, -0x800000000000, 0x7fffffffffff); + default: + boundsError(byteLength, 6, "byteLength"); + } +}; + +Buffer.prototype.writeInt8 = function writeInt8(value: number, offset: number = 0) { + return writeU_Int8(this, value, offset, -0x80, 0x7f); +}; + +Buffer.prototype.writeInt16LE = function writeInt16LE(value: number, offset: number = 0) { + return writeU_Int16LE(this, value, offset, -0x8000, 0x7fff); +}; + +Buffer.prototype.writeInt16BE = function writeInt16BE(value: number, offset: number = 0) { + return writeU_Int16BE(this, value, offset, -0x8000, 0x7fff); +}; + +Buffer.prototype.writeInt32LE = function writeInt32LE(value: number, offset: number = 0) { + return writeU_Int32LE(this, value, offset, -0x80000000, 0x7fffffff); +}; + +Buffer.prototype.writeInt32BE = function writeInt32BE(value: number, offset: number = 0) { + return writeU_Int32BE(this, value, offset, -0x80000000, 0x7fffffff); +}; + +Buffer.prototype.writeBigInt64LE = function writeBigInt64LE( + this: Buffer, + value: bigint, + offset: number = 0 +) { + return wrtBigUInt64LE(this, value, offset, -0x8000000000000000n, 0x7fffffffffffffffn); +}; + +Buffer.prototype.writeBigInt64BE = function writeBigInt64BE( + this: Buffer, + value: bigint, + offset: number = 0 +) { + return wrtBigUInt64BE(this, value, offset, -0x8000000000000000n, 0x7fffffffffffffffn); +}; + +Buffer.prototype.writeFloatLE = function writeFloatLE(value: number, offset: number) { + return bigEndian + ? writeFloatBackwards(this, value, offset) + : writeFloatForwards(this, value, offset); +}; + +Buffer.prototype.writeFloatBE = function writeFloatBE(value: number, offset: number) { + return bigEndian + ? writeFloatForwards(this, value, offset) + : writeFloatBackwards(this, value, offset); +}; + +Buffer.prototype.writeDoubleLE = function writeDoubleLE(value: number, offset: number) { + return bigEndian + ? writeDoubleBackwards(this, value, offset) + : writeDoubleForwards(this, value, offset); +}; + +Buffer.prototype.writeDoubleBE = function writeDoubleBE(value: number, offset: number) { + return bigEndian + ? writeDoubleForwards(this, value, offset) + : writeDoubleBackwards(this, value, offset); +}; + +Buffer.prototype.copy = function copy( + target: Buffer | Uint8Array, + targetStart?: number, + sourceStart?: number, + sourceEnd?: number +) { + if (!isUint8Array(target)) { + throw new ERR_INVALID_ARG_TYPE("target", ["Buffer", "Uint8Array"], target); + } + + targetStart = toInteger(targetStart, 0); + if ((targetStart as number) < 0) { + throw new ERR_OUT_OF_RANGE("targetStart", ">= 0", targetStart); + } + + sourceStart = toInteger(sourceStart, 0); + if ((sourceStart as number) < 0) { + throw new ERR_OUT_OF_RANGE("sourceStart", ">= 0", sourceStart); + } + if ((sourceStart as number) >= MAX_UINT32) { + throw new ERR_OUT_OF_RANGE("sourceStart", `< ${MAX_UINT32}`, sourceStart); + } + + sourceEnd ??= this.length; + sourceEnd = toInteger(sourceEnd, 0); + if ((sourceEnd as number) < 0) { + throw new ERR_OUT_OF_RANGE("sourceEnd", ">= 0", sourceEnd); + } + if ((sourceEnd as number) >= MAX_UINT32) { + throw new ERR_OUT_OF_RANGE("sourceEnd", `< ${MAX_UINT32}`, sourceEnd); + } + + if ((targetStart as number) >= target.length) { + return 0; + } + + if ((sourceEnd as number) > 0 && (sourceEnd as number) < (sourceStart as number)) { + sourceEnd = sourceStart; + } + if (sourceEnd === sourceStart) { + return 0; + } + if (target.length === 0 || this.length === 0) { + return 0; + } + + if ((sourceEnd as number) > this.length) { + sourceEnd = this.length; + } + + if (target.length - (targetStart as number) < (sourceEnd as number) - (sourceStart as number)) { + sourceEnd = target.length - (targetStart as number) + (sourceStart as number); + } + + const len = (sourceEnd as number) - (sourceStart as number); + if (this === target) { + this.copyWithin(targetStart as number, sourceStart as number, sourceEnd as number); + } else { + const sub = this.subarray(sourceStart, sourceEnd); + target.set(sub, targetStart); + } + + return len; +}; + +Buffer.prototype.fill = function fill( + val: string | number | Buffer | Uint8Array, + start?: number | string, + end?: number, + encoding?: string +) { + let normalizedEncoding: string | undefined; + if (typeof val === "string") { + if (typeof start === "string") { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === "string") { + encoding = end; + end = this.length; + } + normalizedEncoding = normalizeEncoding(encoding); + if (!Buffer.isEncoding(normalizedEncoding)) { + throw new ERR_UNKNOWN_ENCODING(encoding as string); + } + if (val.length === 1) { + const code = val.charCodeAt(0); + if ((encoding === "utf8" && code < 128) || encoding === "latin1") { + val = code; + } + } + } + + if (start !== undefined) { + validateNumber(start, "start"); + } + if (end !== undefined) { + validateNumber(end, "end"); + } + + if ((end as number) < 0 || (end as number) > this.length) { + throw new ERR_OUT_OF_RANGE("end", `0 to ${this.length}`, end); + } + if ((start as number) < 0 || this.length < (start as number) || this.length < (end as number)) { + throw new ERR_OUT_OF_RANGE("start", "0 to end", start); + } + if ((end as number) <= (start as number)) { + return this; + } + start = (start as number) >>> 0; + end = end === void 0 ? this.length : end >>> 0; + + if (typeof val === "string") { + bufferUtil.fillImpl( + this, + val as string, + start as number, + end as number, + normalizedEncoding + ); + return this; + } + + if (isArrayBufferView(val)) { + if ((val as ArrayBufferView).byteLength === 0) { + throw new ERR_INVALID_ARG_VALUE("value", "zero-length"); + } + bufferUtil.fillImpl(this, val as ArrayBufferView, start as number, end as number); + return this; + } + + if (typeof val === "number") { + val = val & 255; + } else if (typeof val === "boolean") { + val = Number(val); + } + val ??= 0; + + Uint8Array.prototype.fill.call(this, val as number, start, end); + + return this; +}; + +function checkBounds(buf: Buffer, offset: number, byteLength2: number) { + validateOffset(offset, "offset", 0, buf.length); + if (buf[offset] === undefined || buf[offset + byteLength2] === undefined) { + boundsError(offset, buf.length - (byteLength2 + 1)); + } +} + +function checkIntBI( + value: bigint | number, + min: bigint | number, + max: bigint | number, + buf: Buffer, + offset: number, + byteLength2: number +) { + if (value > max || value < min) { + const n = typeof min === "bigint" ? "n" : ""; + let range; + if (byteLength2 > 3) { + if (min === 0 || min === BigInt(0)) { + range = `>= 0${n} and < 2${n} ** ${(byteLength2 + 1) * 8}${n}`; + } else { + range = `>= -(2${n} ** ${(byteLength2 + 1) * 8 - 1}${n}) and < 2 ** ${ + (byteLength2 + 1) * 8 - 1 + }${n}`; + } + } else { + range = `>= ${min}${n} and <= ${max}${n}`; + } + throw new ERR_OUT_OF_RANGE("value", range, value); + } + checkBounds(buf, offset, byteLength2); +} + +export function isInstance(obj: unknown, type: Function) { + return ( + obj instanceof type || + (obj != null && + obj.constructor != null && + obj.constructor.name != null && + obj.constructor.name === type.name) + ); +} + +function readUInt48LE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 5]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 6); + } + + return ( + first + + buf[++offset]! * 2 ** 8 + + buf[++offset]! * 2 ** 16 + + buf[++offset]! * 2 ** 24 + + (buf[++offset]! + last * 2 ** 8) * 2 ** 32 + ); +} + +function readUInt40LE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 4]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 5); + } + + return ( + first + + buf[++offset]! * 2 ** 8 + + buf[++offset]! * 2 ** 16 + + buf[++offset]! * 2 ** 24 + + last * 2 ** 32 + ); +} + +function readUInt24LE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 2]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 3); + } + + return first + buf[++offset]! * 2 ** 8 + last * 2 ** 16; +} + +function readUInt48BE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 5]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 6); + } + + return ( + (first * 2 ** 8 + buf[++offset]!) * 2 ** 32 + + buf[++offset]! * 2 ** 24 + + buf[++offset]! * 2 ** 16 + + buf[++offset]! * 2 ** 8 + + last + ); +} + +function readUInt40BE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 4]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 5); + } + + return ( + first * 2 ** 32 + + buf[++offset]! * 2 ** 24 + + buf[++offset]! * 2 ** 16 + + buf[++offset]! * 2 ** 8 + + last + ); +} + +function readUInt24BE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 2]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 3); + } + + return first * 2 ** 16 + buf[++offset]! * 2 ** 8 + last; +} + +function readUInt16BE(this: Buffer, offset: number = 0) { + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 1]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 2); + } + + return first * 2 ** 8 + last; +} + +function readUInt32BE(this: Buffer, offset: number = 0) { + validateOffset(offset, "offset", 0, this.length); + const first = this[offset]; + const last = this[offset + 3]; + if (first === undefined || last === undefined) { + boundsError(offset, this.length - 4); + } + + return first * 2 ** 24 + this[++offset]! * 2 ** 16 + this[++offset]! * 2 ** 8 + last; +} + +function readDoubleBackwards(buffer: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buffer.length); + const first = buffer[offset]; + const last = buffer[offset + 7]; + if (first === undefined || last === undefined) { + boundsError(offset, buffer.length - 8); + } + + uInt8Float64Array[7] = first; + uInt8Float64Array[6] = buffer[++offset]!; + uInt8Float64Array[5] = buffer[++offset]!; + uInt8Float64Array[4] = buffer[++offset]!; + uInt8Float64Array[3] = buffer[++offset]!; + uInt8Float64Array[2] = buffer[++offset]!; + uInt8Float64Array[1] = buffer[++offset]!; + uInt8Float64Array[0] = last; + return float64Array[0]; +} + +function readDoubleForwards(buffer: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buffer.length); + const first = buffer[offset]; + const last = buffer[offset + 7]; + if (first === undefined || last === undefined) { + boundsError(offset, buffer.length - 8); + } + + uInt8Float64Array[0] = first; + uInt8Float64Array[1] = buffer[++offset]!; + uInt8Float64Array[2] = buffer[++offset]!; + uInt8Float64Array[3] = buffer[++offset]!; + uInt8Float64Array[4] = buffer[++offset]!; + uInt8Float64Array[5] = buffer[++offset]!; + uInt8Float64Array[6] = buffer[++offset]!; + uInt8Float64Array[7] = last; + return float64Array[0]; +} + +function writeDoubleForwards(buffer: Buffer | Uint8Array, val: number, offset: number = 0) { + val = +val; + checkBounds(buffer as any, offset, 7); + + float64Array[0] = val; + buffer[offset++] = uInt8Float64Array[0]!; + buffer[offset++] = uInt8Float64Array[1]!; + buffer[offset++] = uInt8Float64Array[2]!; + buffer[offset++] = uInt8Float64Array[3]!; + buffer[offset++] = uInt8Float64Array[4]!; + buffer[offset++] = uInt8Float64Array[5]!; + buffer[offset++] = uInt8Float64Array[6]!; + buffer[offset++] = uInt8Float64Array[7]!; + return offset; +} + +function writeDoubleBackwards(buffer: Buffer | Uint8Array, val: number, offset: number = 0) { + val = +val; + checkBounds(buffer as any, offset, 7); + + float64Array[0] = val; + buffer[offset++] = uInt8Float64Array[7]!; + buffer[offset++] = uInt8Float64Array[6]!; + buffer[offset++] = uInt8Float64Array[5]!; + buffer[offset++] = uInt8Float64Array[4]!; + buffer[offset++] = uInt8Float64Array[3]!; + buffer[offset++] = uInt8Float64Array[2]!; + buffer[offset++] = uInt8Float64Array[1]!; + buffer[offset++] = uInt8Float64Array[0]!; + return offset; +} + +function readFloatBackwards(buffer: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buffer.length); + const first = buffer[offset]; + const last = buffer[offset + 3]; + if (first === undefined || last === undefined) { + boundsError(offset, buffer.length - 4); + } + + uInt8Float32Array[3] = first; + uInt8Float32Array[2] = buffer[++offset]!; + uInt8Float32Array[1] = buffer[++offset]!; + uInt8Float32Array[0] = last; + return float32Array[0]; +} + +function readFloatForwards(buffer: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buffer.length); + const first = buffer[offset]; + const last = buffer[offset + 3]; + if (first === undefined || last === undefined) { + boundsError(offset, buffer.length - 4); + } + + uInt8Float32Array[0] = first; + uInt8Float32Array[1] = buffer[++offset]!; + uInt8Float32Array[2] = buffer[++offset]!; + uInt8Float32Array[3] = last; + return float32Array[0]; +} + +function writeFloatForwards(buffer: Buffer | Uint8Array, val: number, offset: number = 0) { + val = +val; + checkBounds(buffer as any, offset, 3); + + float32Array[0] = val; + buffer[offset++] = uInt8Float32Array[0]!; + buffer[offset++] = uInt8Float32Array[1]!; + buffer[offset++] = uInt8Float32Array[2]!; + buffer[offset++] = uInt8Float32Array[3]!; + return offset; +} + +function writeFloatBackwards(buffer: Buffer | Uint8Array, val: number, offset: number = 0) { + val = +val; + checkBounds(buffer as any, offset, 3); + + float32Array[0] = val; + buffer[offset++] = uInt8Float32Array[3]!; + buffer[offset++] = uInt8Float32Array[2]!; + buffer[offset++] = uInt8Float32Array[1]!; + buffer[offset++] = uInt8Float32Array[0]!; + return offset; +} + +function readInt24LE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 2]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 3); + } + + const val = first + buf[++offset]! * 2 ** 8 + last * 2 ** 16; + return val | ((val & (2 ** 23)) * 0x1fe); +} + +function readInt40LE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 4]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 5); + } + + return ( + (last | ((last & (2 ** 7)) * 0x1fffffe)) * 2 ** 32 + + first + + buf[++offset]! * 2 ** 8 + + buf[++offset]! * 2 ** 16 + + buf[++offset]! * 2 ** 24 + ); +} + +function readInt48LE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 5]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 6); + } + + const val = buf[offset + 4]! + last * 2 ** 8; + return ( + (val | ((val & (2 ** 15)) * 0x1fffe)) * 2 ** 32 + + first + + buf[++offset]! * 2 ** 8 + + buf[++offset]! * 2 ** 16 + + buf[++offset]! * 2 ** 24 + ); +} + +function readInt24BE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 2]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 3); + } + + const val = first * 2 ** 16 + buf[++offset]! * 2 ** 8 + last; + return val | ((val & (2 ** 23)) * 0x1fe); +} + +function readInt48BE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 5]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 6); + } + + const val = buf[++offset]! + first * 2 ** 8; + return ( + (val | ((val & (2 ** 15)) * 0x1fffe)) * 2 ** 32 + + buf[++offset]! * 2 ** 24 + + buf[++offset]! * 2 ** 16 + + buf[++offset]! * 2 ** 8 + + last + ); +} + +function readInt40BE(buf: Buffer | Uint8Array, offset: number = 0) { + validateOffset(offset, "offset", 0, buf.length); + const first = buf[offset]; + const last = buf[offset + 4]; + if (first === undefined || last === undefined) { + boundsError(offset, buf.length - 5); + } + + return ( + (first | ((first & (2 ** 7)) * 0x1fffffe)) * 2 ** 32 + + buf[++offset]! * 2 ** 24 + + buf[++offset]! * 2 ** 16 + + buf[++offset]! * 2 ** 8 + + last + ); +} + +function boundsError(value: number, length: number, type?: string): never { + if (Math.floor(value) !== value) { + throw new ERR_OUT_OF_RANGE(type || "offset", "an integer", value); + } + + if (length < 0) { + throw new ERR_BUFFER_OUT_OF_BOUNDS(); + } + + throw new ERR_OUT_OF_RANGE(type || "offset", `>= ${type ? 1 : 0} and <= ${length}`, value); +} + +function validateNumber(value: unknown, name: string) { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE(name, "number", value); + } +} + +function checkInt( + value: number | bigint, + min: number | bigint, + max: number | bigint, + buf: Buffer, + offset: number, + byteLength: number +) { + if (value > max || value < min) { + const n = typeof min === "bigint" ? "n" : ""; + let range; + if (byteLength > 3) { + if (min === 0 || min === 0n) { + range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`; + } else { + range = + `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and ` + + `< 2${n} ** ${(byteLength + 1) * 8 - 1}${n}`; + } + } else { + range = `>= ${min}${n} and <= ${max}${n}`; + } + throw new ERR_OUT_OF_RANGE("value", range, value); + } + checkBounds(buf, offset, byteLength); +} + +function toInteger(n: number | undefined, defaultVal: number) { + if (n === undefined) n = 0; + n = +(n as number); + if (!Number.isNaN(n) && n >= Number.MIN_SAFE_INTEGER && n <= Number.MAX_SAFE_INTEGER) { + return n % 1 === 0 ? n : Math.floor(n); + } + return defaultVal; +} + +function writeU_Int8(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + if (value > max || value < min) { + throw new ERR_OUT_OF_RANGE("value", `>= ${min} and <= ${max}`, value); + } + if (buf[offset] === undefined) { + boundsError(offset, buf.length - 1); + } + + buf[offset] = value; + return offset + 1; +} + +function writeU_Int16BE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 1); + + buf[offset++] = value >>> 8; + buf[offset++] = value; + return offset; +} + +function _writeUInt32LE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 3); + + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + return offset; +} + +function writeU_Int16LE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 1); + + buf[offset++] = value; + buf[offset++] = value >>> 8; + return offset; +} + +function _writeUInt32BE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 3); + + buf[offset + 3] = value; + value = value >>> 8; + buf[offset + 2] = value; + value = value >>> 8; + buf[offset + 1] = value; + value = value >>> 8; + buf[offset] = value; + return offset + 4; +} + +function writeU_Int48BE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 5); + + const newVal = Math.floor(value * 2 ** -32); + buf[offset++] = newVal >>> 8; + buf[offset++] = newVal; + buf[offset + 3] = value; + value = value >>> 8; + buf[offset + 2] = value; + value = value >>> 8; + buf[offset + 1] = value; + value = value >>> 8; + buf[offset] = value; + return offset + 4; +} + +function writeU_Int40BE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 4); + + buf[offset++] = Math.floor(value * 2 ** -32); + buf[offset + 3] = value; + value = value >>> 8; + buf[offset + 2] = value; + value = value >>> 8; + buf[offset + 1] = value; + value = value >>> 8; + buf[offset] = value; + return offset + 4; +} + +function writeU_Int32BE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 3); + + buf[offset + 3] = value; + value = value >>> 8; + buf[offset + 2] = value; + value = value >>> 8; + buf[offset + 1] = value; + value = value >>> 8; + buf[offset] = value; + return offset + 4; +} + +function writeU_Int24BE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 2); + + buf[offset + 2] = value; + value = value >>> 8; + buf[offset + 1] = value; + value = value >>> 8; + buf[offset] = value; + return offset + 3; +} + +function validateOffset( + value: number, + name: string, + min: number = 0, + max: number = Number.MAX_SAFE_INTEGER +) { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE(name, "number", value); + } + if (!Number.isInteger(value)) { + throw new ERR_OUT_OF_RANGE(name, "an integer", value); + } + if (value < min || value > max) { + throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value); + } +} + +function writeU_Int48LE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 5); + + const newVal = Math.floor(value * 2 ** -32); + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + buf[offset++] = newVal; + buf[offset++] = newVal >>> 8; + return offset; +} + +function writeU_Int40LE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 4); + + const newVal = value; + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + buf[offset++] = Math.floor(newVal * 2 ** -32); + return offset; +} + +function writeU_Int32LE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 3); + + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + return offset; +} + +function writeU_Int24LE(buf: Buffer, value: number, offset: number, min: number, max: number) { + value = +value; + validateOffset(offset, "offset", 0, buf.length); + checkInt(value, min, max, buf, offset, 2); + + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + value = value >>> 8; + buf[offset++] = value; + return offset; +} + +export default { + Buffer, + constants, + kMaxLength, + kStringMaxLength, + SlowBuffer, +}; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_errors.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_errors.ts new file mode 100644 index 000000000..ab8e66830 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_errors.ts @@ -0,0 +1,473 @@ +import { inspect } from "./internal_inspect"; + +const classRegExp = /^([A-Z][a-z0-9]*)+$/; + +const kTypes = [ + "string", + "function", + "number", + "object", + "Function", + "Object", + "boolean", + "bigint", + "symbol", +]; + +export class NodeErrorAbstraction extends Error { + code: string; + + constructor(name: string, code: string, message: string) { + super(message); + this.code = code; + this.name = name; + //This number changes depending on the name of this class + //20 characters as of now + (this as any).stack = this.stack && `${name} [${this.code}]${this.stack.slice(20)}`; + } + + override toString() { + return `${this.name} [${this.code}]: ${this.message}`; + } +} + +export class NodeError extends NodeErrorAbstraction { + constructor(code: string, message: string) { + super(Error.prototype.name, code, message); + } +} + +export class NodeRangeError extends NodeErrorAbstraction { + constructor(code: string, message: string) { + super(RangeError.prototype.name, code, message); + Object.setPrototypeOf(this, RangeError.prototype); + this.toString = function () { + return `${this.name} [${this.code}]: ${this.message}`; + }; + } +} + +export class NodeTypeError extends NodeErrorAbstraction implements TypeError { + constructor(code: string, message: string) { + super(TypeError.prototype.name, code, message); + Object.setPrototypeOf(this, TypeError.prototype); + this.toString = function () { + return `${this.name} [${this.code}]: ${this.message}`; + }; + } +} + +function createInvalidArgType(name: string, expected: string | string[]): string { + // https://github.com/nodejs/node/blob/f3eb224/lib/internal/errors.js#L1037-L1087 + expected = Array.isArray(expected) ? expected : [expected]; + let msg = "The "; + if (name.endsWith(" argument")) { + // For cases like 'first argument' + msg += `${name} `; + } else { + const type = name.includes(".") ? "property" : "argument"; + msg += `"${name}" ${type} `; + } + msg += "must be "; + + const types = []; + const instances = []; + const other = []; + for (const value of expected) { + if (kTypes.includes(value)) { + types.push(value.toLocaleLowerCase()); + } else if (classRegExp.test(value)) { + instances.push(value); + } else { + other.push(value); + } + } + + // Special handle `object` in case other instances are allowed to outline + // the differences between each other. + if (instances.length > 0) { + const pos = types.indexOf("object"); + if (pos !== -1) { + types.splice(pos, 1); + instances.push("Object"); + } + } + + if (types.length > 0) { + if (types.length > 2) { + const last = types.pop(); + msg += `one of type ${types.join(", ")}, or ${last}`; + } else if (types.length === 2) { + msg += `one of type ${types[0]} or ${types[1]}`; + } else { + msg += `of type ${types[0]}`; + } + if (instances.length > 0 || other.length > 0) { + msg += " or "; + } + } + + if (instances.length > 0) { + if (instances.length > 2) { + const last = instances.pop(); + msg += `an instance of ${instances.join(", ")}, or ${last}`; + } else { + msg += `an instance of ${instances[0]}`; + if (instances.length === 2) { + msg += ` or ${instances[1]}`; + } + } + if (other.length > 0) { + msg += " or "; + } + } + + if (other.length > 0) { + if (other.length > 2) { + const last = other.pop(); + msg += `one of ${other.join(", ")}, or ${last}`; + } else if (other.length === 2) { + msg += `one of ${other[0]} or ${other[1]}`; + } else { + // @ts-ignore + if (other[0].toLowerCase() !== other[0]) { + msg += "an "; + } + msg += `${other[0]}`; + } + } + + return msg; +} + +function invalidArgTypeHelper(input: any) { + if (input == null) { + return ` Received ${input}`; + } + if (typeof input === "function" && input.name) { + return ` Received function ${input.name}`; + } + if (typeof input === "object") { + if (input.constructor && input.constructor.name) { + return ` Received an instance of ${input.constructor.name}`; + } + return ` Received ${inspect(input, { depth: -1 })}`; + } + let inspected = inspect(input, { colors: false }); + if (inspected.length > 25) { + inspected = `${inspected.slice(0, 25)}...`; + } + return ` Received type ${typeof input} (${inspected})`; +} + +function addNumericalSeparator(val: string) { + let res = ""; + let i = val.length; + const start = val[0] === "-" ? 1 : 0; + for (; i >= start + 4; i -= 3) { + res = `_${val.slice(i - 3, i)}${res}`; + } + return `${val.slice(0, i)}${res}`; +} + +export class ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY extends NodeError { + constructor() { + super("ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY", "Public key is not valid for specified curve"); + } +} + +export class ERR_CRYPTO_HASH_FINALIZED extends NodeError { + constructor() { + super("ERR_CRYPTO_HASH_FINALIZED", "Digest already called"); + } +} + +export class ERR_CRYPTO_HASH_UPDATE_FAILED extends NodeError { + constructor() { + super("ERR_CRYPTO_HASH_UPDATE_FAILED", "Hash update failed"); + } +} + +export class ERR_CRYPTO_INCOMPATIBLE_KEY extends NodeError { + constructor(name: string, msg: string) { + super("ERR_CRYPTO_INCOMPATIBLE_KEY", `Incompatible ${name}: ${msg}`); + } +} + +export class ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE extends NodeError { + constructor(actual: string, expected: string) { + super( + "ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE", + `Invalid key object type ${actual}, expected ${expected}.` + ); + } +} + +export class ERR_INVALID_ARG_TYPE_RANGE extends NodeRangeError { + constructor(name: string, expected: string | string[], actual: unknown) { + const msg = createInvalidArgType(name, expected); + + super("ERR_INVALID_ARG_TYPE", `${msg}.${invalidArgTypeHelper(actual)}`); + } +} + +export class ERR_INVALID_ARG_TYPE extends NodeTypeError { + constructor(name: string, expected: string | string[], actual: unknown) { + const msg = createInvalidArgType(name, expected); + + super("ERR_INVALID_ARG_TYPE", `${msg}.${invalidArgTypeHelper(actual)}`); + } + + static RangeError = ERR_INVALID_ARG_TYPE_RANGE; +} + +export class ERR_INVALID_ARG_VALUE_RANGE extends NodeRangeError { + constructor(name: string, value: unknown, reason: string = "is invalid") { + const type = name.includes(".") ? "property" : "argument"; + const inspected = inspect(value); + + super("ERR_INVALID_ARG_VALUE", `The ${type} '${name}' ${reason}. Received ${inspected}`); + } +} + +export class ERR_INVALID_ARG_VALUE extends NodeTypeError { + constructor(name: string, value: unknown, reason: string = "is invalid") { + const type = name.includes(".") ? "property" : "argument"; + const inspected = inspect(value); + + super("ERR_INVALID_ARG_VALUE", `The ${type} '${name}' ${reason}. Received ${inspected}`); + } + + static RangeError = ERR_INVALID_ARG_VALUE_RANGE; +} + +export class ERR_OUT_OF_RANGE extends RangeError { + code = "ERR_OUT_OF_RANGE"; + + constructor(str: string, range: string, input: unknown, replaceDefaultBoolean = false) { + // TODO(later): Implement internal assert? + // assert(range, 'Missing "range" argument'); + let msg = replaceDefaultBoolean ? str : `The value of "${str}" is out of range.`; + let received; + if (Number.isInteger(input) && Math.abs(input as number) > 2 ** 32) { + received = addNumericalSeparator(String(input)); + } else if (typeof input === "bigint") { + received = String(input); + if (input > 2n ** 32n || input < -(2n ** 32n)) { + received = addNumericalSeparator(received); + } + received += "n"; + } else { + received = inspect(input); + } + msg += ` It must be ${range}. Received ${received}`; + + super(msg); + + const { name } = this; + // Add the error code to the name to include it in the stack trace. + this.name = `${name} [${this.code}]`; + // Access the stack to generate the error message including the error code from the name. + this.stack; + // Reset the name to the actual name. + this.name = name; + } +} + +export class ERR_UNHANDLED_ERROR extends NodeError { + constructor(x: string) { + super("ERR_UNHANDLED_ERROR", `Unhandled error. (${x})`); + } +} + +export class ERR_INVALID_THIS extends NodeTypeError { + constructor(x: string) { + super("ERR_INVALID_THIS", `Value of "this" must be of type ${x}`); + } +} + +export class ERR_BUFFER_OUT_OF_BOUNDS extends NodeRangeError { + constructor(name?: string) { + super( + "ERR_BUFFER_OUT_OF_BOUNDS", + name + ? `"${name}" is outside of buffer bounds` + : "Attempt to access memory outside buffer bounds" + ); + } +} + +export class ERR_INVALID_BUFFER_SIZE extends NodeRangeError { + constructor(size: number) { + super("ERR_INVALID_BUFFER_SIZE", `Buffer size must be a multiple of ${size}-bits`); + } +} + +export class ERR_UNKNOWN_ENCODING extends NodeTypeError { + constructor(x: string) { + super("ERR_UNKNOWN_ENCODING", `Unknown encoding: ${x}`); + } +} + +export class ERR_STREAM_PREMATURE_CLOSE extends NodeTypeError { + constructor() { + super("ERR_STREAM_PREMATURE_CLOSE", "Premature close"); + } +} + +export class AbortError extends Error { + code: string; + + constructor(message = "The operation was aborted", options?: ErrorOptions) { + if (options !== undefined && typeof options !== "object") { + throw new ERR_INVALID_ARG_TYPE("options", "Object", options); + } + super(message, options); + this.code = "ABORT_ERR"; + this.name = "AbortError"; + } +} + +function determineSpecificType(value: any) { + if (value == null) { + return "" + value; + } + if (typeof value === "function" && value.name) { + return `function ${value.name}`; + } + if (typeof value === "object") { + if (value.constructor?.name) { + return `an instance of ${value.constructor.name}`; + } + return `${inspect(value, { depth: -1 })}`; + } + let inspected = inspect(value, { colors: false }); + if (inspected.length > 28) inspected = `${inspected.slice(0, 25)}...`; + + return `type ${typeof value} (${inspected})`; +} + +export class ERR_AMBIGUOUS_ARGUMENT extends NodeTypeError { + constructor(x: string, y: string) { + super("ERR_AMBIGUOUS_ARGUMENT", `The "${x}" argument is ambiguous. ${y}`); + } +} + +export class ERR_INVALID_RETURN_VALUE extends NodeTypeError { + constructor(input: string, name: string, value: unknown) { + super( + "ERR_INVALID_RETURN_VALUE", + `Expected ${input} to be returned from the "${name}" function but got ${determineSpecificType( + value + )}.` + ); + } +} + +export class ERR_MULTIPLE_CALLBACK extends NodeError { + constructor() { + super("ERR_MULTIPLE_CALLBACK", "Callback called multiple times"); + } +} + +export class ERR_MISSING_ARGS extends NodeTypeError { + constructor(...args: (string | string[])[]) { + let msg = "The "; + + const len = args.length; + + const wrap = (a: unknown) => `"${a}"`; + + args = args.map((a) => (Array.isArray(a) ? a.map(wrap).join(" or ") : wrap(a))); + + switch (len) { + case 1: + msg += `${args[0]} argument`; + break; + case 2: + msg += `${args[0]} and ${args[1]} arguments`; + break; + default: + msg += args.slice(0, len - 1).join(", "); + msg += `, and ${args[len - 1]} arguments`; + break; + } + + super("ERR_MISSING_ARGS", `${msg} must be specified`); + } +} + +export class ERR_FALSY_VALUE_REJECTION extends NodeError { + reason: string; + constructor(reason: string) { + super("ERR_FALSY_VALUE_REJECTION", "Promise was rejected with falsy value"); + this.reason = reason; + } +} + +export class ERR_METHOD_NOT_IMPLEMENTED extends NodeError { + constructor(name: string | symbol) { + if (typeof name === "symbol") { + name = (name as symbol).description!; + } + super("ERR_METHOD_NOT_IMPLEMENTED", `The ${name} method is not implemented`); + } +} + +export class ERR_STREAM_CANNOT_PIPE extends NodeError { + constructor() { + super("ERR_STREAM_CANNOT_PIPE", "Cannot pipe, not readable"); + } +} +export class ERR_STREAM_DESTROYED extends NodeError { + constructor(name: string | symbol) { + if (typeof name === "symbol") { + name = (name as symbol).description!; + } + super("ERR_STREAM_DESTROYED", `Cannot call ${name} after a stream was destroyed`); + } +} +export class ERR_STREAM_ALREADY_FINISHED extends NodeError { + constructor(name: string | symbol) { + if (typeof name === "symbol") { + name = (name as symbol).description!; + } + super("ERR_STREAM_ALREADY_FINISHED", `Cannot call ${name} after a stream was finished`); + } +} +export class ERR_STREAM_NULL_VALUES extends NodeTypeError { + constructor() { + super("ERR_STREAM_NULL_VALUES", "May not write null values to stream"); + } +} +export class ERR_STREAM_WRITE_AFTER_END extends NodeError { + constructor() { + super("ERR_STREAM_WRITE_AFTER_END", "write after end"); + } +} + +export class ERR_STREAM_PUSH_AFTER_EOF extends NodeError { + constructor() { + super("ERR_STREAM_PUSH_AFTER_EOF", "stream.push() after EOF"); + } +} + +export class ERR_STREAM_UNSHIFT_AFTER_END_EVENT extends NodeError { + constructor() { + super("ERR_STREAM_UNSHIFT_AFTER_END_EVENT", "stream.unshift() after end event"); + } +} + +export function aggregateTwoErrors(innerError: any, outerError: any) { + if (innerError && outerError && innerError !== outerError) { + if (Array.isArray(outerError.errors)) { + // If `outerError` is already an `AggregateError`. + outerError.errors.push(innerError); + return outerError; + } + const err = new AggregateError([outerError, innerError], outerError.message); + (err as any).code = outerError.code; + return err; + } + return innerError || outerError; +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_inspect.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_inspect.ts new file mode 100644 index 000000000..4e5c8c797 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_inspect.ts @@ -0,0 +1,2772 @@ +import * as internal from "./util"; + +import { Buffer } from "./internal_buffer"; +import { + isAsyncFunction, + isGeneratorFunction, + isAnyArrayBuffer, + isArrayBuffer, + isArgumentsObject, + isBoxedPrimitive, + isDataView, + isMap, + isMapIterator, + isModuleNamespaceObject, + isNativeError, + isPromise, + isSet, + isSetIterator, + isWeakMap, + isWeakSet, + isRegExp, + isDate, + isTypedArray, + isStringObject, + isNumberObject, + isBooleanObject, + isBigIntObject, +} from "./internal_types"; +// import { ALL_PROPERTIES, ONLY_ENUMERABLE, getOwnNonIndexProperties } from "node-internal:internal_utils"; +import { validateObject, validateString } from "./validators"; + +// // Simplified assertions to avoid `Assertions require every name in the call target to be +// declared with an explicit type` TypeScript error +function assert(value: boolean, message = "Assertion failed"): asserts value { + if (!value) throw new Error(message); +} +assert.fail = function (message = "Assertion failed"): never { + throw new Error(message); +}; + +function isError(e: unknown): e is Error { + // An error could be an instance of Error while not being a native error + // or could be from a different realm and not be instance of Error but still + // be a native error. + return isNativeError(e) || e instanceof Error; +} + +const typedArrayPrototype = Object.getPrototypeOf(Uint8Array).prototype; +const typedArrayPrototypeLength: (this: internal.TypedArray) => number = + Object.getOwnPropertyDescriptor(typedArrayPrototype, "length")!.get!; +const typedArrayPrototypeToStringTag: (this: internal.TypedArray) => string = + Object.getOwnPropertyDescriptor(typedArrayPrototype, Symbol.toStringTag)!.get!; + +const setPrototypeSize: (this: Set) => number = Object.getOwnPropertyDescriptor( + Set.prototype, + "size" +)!.get!; +const mapPrototypeSize: (this: Map) => number = Object.getOwnPropertyDescriptor( + Map.prototype, + "size" +)!.get!; + +let maxStack_ErrorName: string; +let maxStack_ErrorMessage: string; +function isStackOverflowError(err: Error): boolean { + if (maxStack_ErrorMessage === undefined) { + try { + function overflowStack() { + overflowStack(); + } + overflowStack(); + } catch (err) { + assert(isError(err)); + maxStack_ErrorMessage = err.message; + maxStack_ErrorName = err.name; + } + } + + return err && err.name === maxStack_ErrorName && err.message === maxStack_ErrorMessage; +} + +export const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom"); + +const colorRegExp = /\u001b\[\d\d?m/g; + +function removeColors(str: string): string { + return str.replace(colorRegExp, ""); +} + +export interface InspectOptions { + /** + * If `true`, object's non-enumerable symbols and properties are included in the formatted result. + * `WeakMap` and `WeakSet` entries are also included as well as user defined prototype properties (excluding method properties). + * @default false + */ + showHidden?: boolean; + /** + * Specifies the number of times to recurse while formatting object. + * This is useful for inspecting large objects. + * To recurse up to the maximum call stack size pass `Infinity` or `null`. + * @default 2 + */ + depth?: number | null; + /** + * If `true`, the output is styled with ANSI color codes. Colors are customizable. + */ + colors?: boolean; + /** + * If `false`, `[util.inspect.custom](depth, opts, inspect)` functions are not invoked. + * @default true + */ + customInspect?: boolean; + /** + * If `true`, `Proxy` inspection includes the target and handler objects. + * @default false + */ + showProxy?: boolean; + /** + * Specifies the maximum number of `Array`, `TypedArray`, `WeakMap`, and `WeakSet` elements + * to include when formatting. Set to `null` or `Infinity` to show all elements. + * Set to `0` or negative to show no elements. + * @default 100 + */ + maxArrayLength?: number | null; + /** + * Specifies the maximum number of characters to + * include when formatting. Set to `null` or `Infinity` to show all elements. + * Set to `0` or negative to show no characters. + * @default 10000 + */ + maxStringLength?: number | null; + /** + * The length at which input values are split across multiple lines. + * Set to `Infinity` to format the input as a single line + * (in combination with `compact` set to `true` or any number >= `1`). + * @default 80 + */ + breakLength?: number; + /** + * Setting this to `false` causes each object key + * to be displayed on a new line. It will also add new lines to text that is + * longer than `breakLength`. If set to a number, the most `n` inner elements + * are united on a single line as long as all properties fit into + * `breakLength`. Short array elements are also grouped together. Note that no + * text will be reduced below 16 characters, no matter the `breakLength` size. + * For more information, see the example below. + * @default true + */ + compact?: boolean | number; + /** + * If set to `true` or a function, all properties of an object, and `Set` and `Map` + * entries are sorted in the resulting string. + * If set to `true` the default sort is used. + * If set to a function, it is used as a compare function. + */ + sorted?: boolean | ((a: string, b: string) => number); + /** + * If set to `true`, getters are going to be + * inspected as well. If set to `'get'` only getters without setter are going + * to be inspected. If set to `'set'` only getters having a corresponding + * setter are going to be inspected. This might cause side effects depending on + * the getter function. + * @default false + */ + getters?: "get" | "set" | boolean; + /** + * If set to `true`, an underscore is used to separate every three digits in all bigints and numbers. + * @default false + */ + numericSeparator?: boolean; +} +export type Style = + | "special" + | "number" + | "bigint" + | "boolean" + | "undefined" + | "null" + | "string" + | "symbol" + | "date" + | "regexp" + | "module" + | "name"; +export type CustomInspectFunction = (depth: number, options: InspectOptionsStylized) => any; // TODO: , inspect: inspect +export interface InspectOptionsStylized extends InspectOptions { + stylize(text: string, styleType: Style): string; +} + +const builtInObjects = new Set( + Object.getOwnPropertyNames(globalThis).filter((e) => /^[A-Z][a-zA-Z0-9]+$/.exec(e) !== null) +); + +// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot +const isUndetectableObject = (v: unknown): boolean => typeof v === "undefined" && v !== undefined; + +// These options must stay in sync with `getUserOptions`. So if any option will +// be added or removed, `getUserOptions` must also be updated accordingly. +export const inspectDefaultOptions = Object.seal({ + showHidden: false, + depth: 2, + colors: false, + customInspect: true, + showProxy: false, + maxArrayLength: 100, + maxStringLength: 10000, + breakLength: 80, + compact: 3, + sorted: false, + getters: false, + numericSeparator: false, +} as const); + +const kObjectType = 0; +const kArrayType = 1; +const kArrayExtrasType = 2; + +const strEscapeSequencesRegExp = + /[\x00-\x1f\x27\x5c\x7f-\x9f]|[\ud800-\udbff](?![\udc00-\udfff])|(?<~]))"; +const ansi = new RegExp(ansiPattern, "g"); + +interface Context extends Required { + maxArrayLength: number; + maxStringLength: number; + budget: Record; + indentationLvl: number; + seen: unknown[]; + currentDepth: number; + userOptions?: InspectOptions; + circular?: Map; +} + +function getUserOptions(ctx: Context, isCrossContext: boolean): InspectOptionsStylized { + const ret: InspectOptionsStylized = { + stylize: ctx.stylize, + showHidden: ctx.showHidden, + depth: ctx.depth, + colors: ctx.colors, + customInspect: ctx.customInspect, + showProxy: ctx.showProxy, + maxArrayLength: ctx.maxArrayLength, + maxStringLength: ctx.maxStringLength, + breakLength: ctx.breakLength, + compact: ctx.compact, + sorted: ctx.sorted, + getters: ctx.getters, + numericSeparator: ctx.numericSeparator, + ...ctx.userOptions, + }; + + // Typically, the target value will be an instance of `Object`. If that is + // *not* the case, the object may come from another vm.Context, and we want + // to avoid passing it objects from this Context in that case, so we remove + // the prototype from the returned object itself + the `stylize()` function, + // and remove all other non-primitives, including non-primitive user options. + if (isCrossContext) { + Object.setPrototypeOf(ret, null); + for (const key of Object.keys(ret) as (keyof InspectOptionsStylized)[]) { + if ( + (typeof ret[key] === "object" || typeof ret[key] === "function") && + ret[key] !== null + ) { + delete ret[key]; + } + } + ret.stylize = Object.setPrototypeOf((value: string, flavour: Style) => { + let stylized; + try { + stylized = `${ctx.stylize(value, flavour)}`; + } catch { + // Continue regardless of error. + } + + if (typeof stylized !== "string") return value; + // `stylized` is a string as it should be, which is safe to pass along. + return stylized; + }, null); + } + + return ret; +} + +/** + * Echos the value of any input. Tries to print the value out + * in the best way possible given the different types. + * @param {any} value The value to print out. + * @param {object} opts Optional options object that alters the output. + */ +/* Legacy: value, showHidden, depth, colors */ +export function inspect( + value: unknown, + showHidden?: boolean, + depth?: number | null, + color?: boolean +): string; +export function inspect(value: unknown, opts?: InspectOptions): string; +export function inspect(value: unknown, opts?: Partial | boolean): string { + // Default options + const ctx: Context = { + budget: {}, + indentationLvl: 0, + seen: [], + currentDepth: 0, + stylize: stylizeNoColor, + showHidden: inspectDefaultOptions.showHidden, + depth: inspectDefaultOptions.depth, + colors: inspectDefaultOptions.colors, + customInspect: inspectDefaultOptions.customInspect, + showProxy: inspectDefaultOptions.showProxy, + maxArrayLength: inspectDefaultOptions.maxArrayLength, + maxStringLength: inspectDefaultOptions.maxStringLength, + breakLength: inspectDefaultOptions.breakLength, + compact: inspectDefaultOptions.compact, + sorted: inspectDefaultOptions.sorted, + getters: inspectDefaultOptions.getters, + numericSeparator: inspectDefaultOptions.numericSeparator, + }; + if (arguments.length > 1) { + // Legacy... + if (arguments.length > 2) { + if (arguments[2] !== undefined) { + ctx.depth = arguments[2]; + } + if (arguments.length > 3 && arguments[3] !== undefined) { + ctx.colors = arguments[3]; + } + } + // Set user-specified options + if (typeof opts === "boolean") { + ctx.showHidden = opts; + } else if (opts) { + const optKeys = Object.keys(opts) as (keyof InspectOptionsStylized)[]; + for (let i = 0; i < optKeys.length; ++i) { + const key = optKeys[i]!; + // TODO(BridgeAR): Find a solution what to do about stylize. Either make + // this function public or add a new API with a similar or better + // functionality. + if ( + Object.prototype.hasOwnProperty.call(inspectDefaultOptions, key) || + key === "stylize" + ) { + (ctx as Record)[key] = opts[key]; + } else if (ctx.userOptions === undefined) { + // This is required to pass through the actual user input. + ctx.userOptions = opts; + } + } + } + } + if (ctx.colors) ctx.stylize = stylizeWithColor; + if (ctx.maxArrayLength === null) ctx.maxArrayLength = Infinity; + if (ctx.maxStringLength === null) ctx.maxStringLength = Infinity; + return formatValue(ctx, value, 0); +} +inspect.custom = customInspectSymbol; + +Object.defineProperty(inspect, "defaultOptions", { + get() { + return inspectDefaultOptions; + }, + set(options) { + validateObject(options, "options"); + return Object.assign(inspectDefaultOptions, options); + }, +}); + +// Set Graphics Rendition https://en.wikipedia.org/wiki/ANSI_escape_code#graphics +// Each color consists of an array with the color code as first entry and the +// reset code as second entry. +const defaultFG = 39; +const defaultBG = 49; +inspect.colors = { + __proto__: null, + reset: [0, 0], + bold: [1, 22], + dim: [2, 22], // Alias: faint + italic: [3, 23], + underline: [4, 24], + blink: [5, 25], + // Swap foreground and background colors + inverse: [7, 27], // Alias: swapcolors, swapColors + hidden: [8, 28], // Alias: conceal + strikethrough: [9, 29], // Alias: strikeThrough, crossedout, crossedOut + doubleunderline: [21, 24], // Alias: doubleUnderline + black: [30, defaultFG], + red: [31, defaultFG], + green: [32, defaultFG], + yellow: [33, defaultFG], + blue: [34, defaultFG], + magenta: [35, defaultFG], + cyan: [36, defaultFG], + white: [37, defaultFG], + bgBlack: [40, defaultBG], + bgRed: [41, defaultBG], + bgGreen: [42, defaultBG], + bgYellow: [43, defaultBG], + bgBlue: [44, defaultBG], + bgMagenta: [45, defaultBG], + bgCyan: [46, defaultBG], + bgWhite: [47, defaultBG], + framed: [51, 54], + overlined: [53, 55], + gray: [90, defaultFG], // Alias: grey, blackBright + redBright: [91, defaultFG], + greenBright: [92, defaultFG], + yellowBright: [93, defaultFG], + blueBright: [94, defaultFG], + magentaBright: [95, defaultFG], + cyanBright: [96, defaultFG], + whiteBright: [97, defaultFG], + bgGray: [100, defaultBG], // Alias: bgGrey, bgBlackBright + bgRedBright: [101, defaultBG], + bgGreenBright: [102, defaultBG], + bgYellowBright: [103, defaultBG], + bgBlueBright: [104, defaultBG], + bgMagentaBright: [105, defaultBG], + bgCyanBright: [106, defaultBG], + bgWhiteBright: [107, defaultBG], +}; + +function defineColorAlias(target: string, alias: string) { + Object.defineProperty(inspect.colors, alias, { + get() { + return this[target]; + }, + set(value) { + this[target] = value; + }, + configurable: true, + enumerable: false, + }); +} + +defineColorAlias("gray", "grey"); +defineColorAlias("gray", "blackBright"); +defineColorAlias("bgGray", "bgGrey"); +defineColorAlias("bgGray", "bgBlackBright"); +defineColorAlias("dim", "faint"); +defineColorAlias("strikethrough", "crossedout"); +defineColorAlias("strikethrough", "strikeThrough"); +defineColorAlias("strikethrough", "crossedOut"); +defineColorAlias("hidden", "conceal"); +defineColorAlias("inverse", "swapColors"); +defineColorAlias("inverse", "swapcolors"); +defineColorAlias("doubleunderline", "doubleUnderline"); + +// TODO(BridgeAR): Add function style support for more complex styles. +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + __proto__: null, + special: "cyan", + number: "yellow", + bigint: "yellow", + boolean: "yellow", + undefined: "grey", + null: "bold", + string: "green", + symbol: "green", + date: "magenta", + name: undefined, + // TODO(BridgeAR): Highlight regular expressions properly. + regexp: "red", + module: "underline", +}; + +function addQuotes(str: string, quotes: number): string { + if (quotes === -1) { + return `"${str}"`; + } + if (quotes === -2) { + return `\`${str}\``; + } + return `'${str}'`; +} + +function escapeFn(str: string): string { + const charCode = str.charCodeAt(0); + return meta.length > charCode ? meta[charCode]! : `\\u${charCode.toString(16)}`; +} + +// Escape control characters, single quotes and the backslash. +// This is similar to JSON stringify escaping. +function strEscape(str: string): string { + let escapeTest = strEscapeSequencesRegExp; + let escapeReplace = strEscapeSequencesReplacer; + let singleQuote = 39; + + // Check for double quotes. If not present, do not escape single quotes and + // instead wrap the text in double quotes. If double quotes exist, check for + // backticks. If they do not exist, use those as fallback instead of the + // double quotes. + if (str.includes("'")) { + // This invalidates the charCode and therefore can not be matched for + // anymore. + if (!str.includes('"')) { + singleQuote = -1; + } else if (!str.includes("`") && !str.includes("${")) { + singleQuote = -2; + } + if (singleQuote !== 39) { + escapeTest = strEscapeSequencesRegExpSingle; + escapeReplace = strEscapeSequencesReplacerSingle; + } + } + + // Some magic numbers that worked out fine while benchmarking with v8 6.0 + if (str.length < 5000 && escapeTest.exec(str) === null) return addQuotes(str, singleQuote); + if (str.length > 100) { + str = str.replace(escapeReplace, escapeFn); + return addQuotes(str, singleQuote); + } + + let result = ""; + let last = 0; + for (let i = 0; i < str.length; i++) { + const point = str.charCodeAt(i); + if (point === singleQuote || point === 92 || point < 32 || (point > 126 && point < 160)) { + if (last === i) { + result += meta[point]; + } else { + result += `${str.slice(last, i)}${meta[point]}`; + } + last = i + 1; + } else if (point >= 0xd800 && point <= 0xdfff) { + if (point <= 0xdbff && i + 1 < str.length) { + const point = str.charCodeAt(i + 1); + if (point >= 0xdc00 && point <= 0xdfff) { + i++; + continue; + } + } + result += `${str.slice(last, i)}\\u${point.toString(16)}`; + last = i + 1; + } + } + + if (last !== str.length) { + result += str.slice(last); + } + return addQuotes(result, singleQuote); +} + +function stylizeWithColor(str: string, styleType: Style): string { + const style = inspect.styles[styleType]; + if (style !== undefined) { + const color = (inspect.colors as unknown as Record)[style]; + if (color !== undefined) return `\u001b[${color[0]}m${str}\u001b[${color[1]}m`; + } + return str; +} + +function stylizeNoColor(str: string): string { + return str; +} + +// Return a new empty array to push in the results of the default formatter. +function getEmptyFormatArray(): string[] { + return []; +} + +function isInstanceof(object: unknown, proto: Function): boolean { + try { + return object instanceof proto; + } catch { + return false; + } +} + +function getConstructorName( + obj: object, + ctx: Context, + recurseTimes: number, + protoProps?: string[] +): string | null { + let firstProto: unknown; + const tmp = obj; + while (obj || isUndetectableObject(obj)) { + const descriptor = Object.getOwnPropertyDescriptor(obj, "constructor"); + if ( + descriptor !== undefined && + typeof descriptor.value === "function" && + descriptor.value.name !== "" && + isInstanceof(tmp, descriptor.value) + ) { + if ( + protoProps !== undefined && + (firstProto !== obj || !builtInObjects.has(descriptor.value.name)) + ) { + addPrototypeProperties(ctx, tmp, firstProto || tmp, recurseTimes, protoProps); + } + return String(descriptor.value.name); + } + + obj = Object.getPrototypeOf(obj); + if (firstProto === undefined) { + firstProto = obj; + } + } + + if (firstProto === null) { + return null; + } + + const res = internal.getConstructorName(tmp); + + if (ctx.depth !== null && recurseTimes > ctx.depth) { + return `${res} `; + } + + const protoConstr = getConstructorName(firstProto!, ctx, recurseTimes + 1, protoProps); + + if (protoConstr === null) { + return `${res} <${inspect(firstProto, { + ...ctx, + customInspect: false, + depth: -1, + })}>`; + } + + return `${res} <${protoConstr}>`; +} + +// This function has the side effect of adding prototype properties to the +// `output` argument (which is an array). This is intended to highlight user +// defined prototype properties. +function addPrototypeProperties( + ctx: Context, + main: object, + obj: Object, + recurseTimes: number, + output: string[] +): void { + let depth = 0; + let keys: PropertyKey[] | undefined; + let keySet: Set | undefined; + do { + if (depth !== 0 || main === obj) { + obj = Object.getPrototypeOf(obj); + // Stop as soon as a null prototype is encountered. + if (obj === null) { + return; + } + // Stop as soon as a built-in object type is detected. + const descriptor = Object.getOwnPropertyDescriptor(obj, "constructor"); + if ( + descriptor !== undefined && + typeof descriptor.value === "function" && + builtInObjects.has(descriptor.value.name) + ) { + return; + } + } + + if (depth === 0) { + keySet = new Set(); + } else { + keys!.forEach((key) => keySet!.add(key)); + } + // Get all own property names and symbols. + keys = Reflect.ownKeys(obj); + ctx.seen.push(main); + for (const key of keys) { + // Ignore the `constructor` property and keys that exist on layers above. + if ( + key === "constructor" || + Object.prototype.hasOwnProperty.call(main, key) || + (depth !== 0 && keySet!.has(key)) + ) { + continue; + } + const desc = Object.getOwnPropertyDescriptor(obj, key); + if (typeof desc?.value === "function") { + continue; + } + const value = formatProperty(ctx, obj, recurseTimes, key, kObjectType, desc, main); + if (ctx.colors) { + // Faint! + output.push(`\u001b[2m${value}\u001b[22m`); + } else { + output.push(value); + } + } + ctx.seen.pop(); + // Limit the inspection to up to three prototype layers. Using `recurseTimes` + // is not a good choice here, because it's as if the properties are declared + // on the current object from the users perspective. + } while (++depth !== 3); +} + +function getPrefix(constructor: string | null, tag: string, fallback: string, size = ""): string { + if (constructor === null) { + if (tag !== "" && fallback !== tag) { + return `[${fallback}${size}: null prototype] [${tag}] `; + } + return `[${fallback}${size}: null prototype] `; + } + + if (tag !== "" && constructor !== tag) { + return `${constructor}${size} [${tag}] `; + } + return `${constructor}${size} `; +} + +// Look up the keys of the object. +function getKeys(value: object, showHidden: boolean): PropertyKey[] { + let keys: PropertyKey[]; + const symbols = Object.getOwnPropertySymbols(value); + if (showHidden) { + keys = Object.getOwnPropertyNames(value); + if (symbols.length !== 0) keys.push(...symbols); + } else { + // This might throw if `value` is a Module Namespace Object from an + // unevaluated module, but we don't want to perform the actual type + // check because it's expensive. + // TODO(devsnek): track https://github.com/tc39/ecma262/issues/1209 + // and modify this logic as needed. + try { + keys = Object.keys(value); + } catch (err: any) { + assert( + isNativeError(err) && + err.name === "ReferenceError" && + isModuleNamespaceObject(value) + ); + keys = Object.getOwnPropertyNames(value); + } + if (symbols.length !== 0) { + const filter = (key: PropertyKey) => + Object.prototype.propertyIsEnumerable.call(value, key); + keys.push(...symbols.filter(filter)); + } + } + return keys; +} + +function getCtxStyle(value: unknown, constructor: string | null, tag: string): string { + let fallback = ""; + if (constructor === null) { + fallback = internal.getConstructorName(value); + if (fallback === tag) { + fallback = "Object"; + } + } + return getPrefix(constructor, tag, fallback); +} + +function formatProxy(ctx: Context, proxy: internal.ProxyDetails, recurseTimes: number): string { + if (ctx.depth !== null && recurseTimes > ctx.depth) { + return ctx.stylize("Proxy [Array]", "special"); + } + recurseTimes += 1; + ctx.indentationLvl += 2; + const res: string[] = [ + formatValue(ctx, proxy.target, recurseTimes), + formatValue(ctx, proxy.handler, recurseTimes), + ]; + ctx.indentationLvl -= 2; + return reduceToSingleString(ctx, res, "", ["Proxy [", "]"], kArrayExtrasType, recurseTimes); +} + +// Note: using `formatValue` directly requires the indentation level to be +// corrected by setting `ctx.indentationLvL += diff` and then to decrease the +// value afterwards again. +function formatValue( + ctx: Context, + value: unknown, + recurseTimes: number, + typedArray?: unknown +): string { + // Primitive types cannot have properties. + if (typeof value !== "object" && typeof value !== "function" && !isUndetectableObject(value)) { + return formatPrimitive(ctx.stylize, value as Primitive, ctx); + } + if (value === null) { + return ctx.stylize("null", "null"); + } + + // Memorize the context for custom inspection on proxies. + const context = value; + // Always check for proxies to prevent side effects and to prevent triggering + // any proxy handlers. + const proxy = internal.getProxyDetails(value); + if (proxy !== undefined) { + if (proxy === null || proxy.target === null) { + return ctx.stylize("", "special"); + } + if (ctx.showProxy) { + return formatProxy(ctx, proxy, recurseTimes); + } + value = proxy.target; + } + + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it. + if (ctx.customInspect) { + let maybeCustom = (value as Record)[customInspectSymbol]; + + // WORKERD SPECIFIC PATCH: if `value` is a JSG resource type, use a well-known custom inspect + const maybeResourceTypeInspect = (value as Record)[ + internal.kResourceTypeInspect + ]; + if (typeof maybeResourceTypeInspect === "object") { + maybeCustom = formatJsgResourceType.bind( + context as Record, + maybeResourceTypeInspect as Record + ); + } + + if ( + typeof maybeCustom === "function" && + // Filter out the util module, its inspect function is special. + maybeCustom !== inspect && + // Also filter out any prototype objects using the circular check. + !((value as object).constructor && (value as object).constructor.prototype === value) + ) { + // This makes sure the recurseTimes are reported as before while using + // a counter internally. + const depth = ctx.depth === null ? null : ctx.depth - recurseTimes; + const isCrossContext = proxy !== undefined || !(context instanceof Object); + const ret = Function.prototype.call.call( + maybeCustom, + context, + depth, + getUserOptions(ctx, isCrossContext), + inspect + ); + // If the custom inspection method returned `this`, don't go into + // infinite recursion. + if (ret !== context) { + if (typeof ret !== "string") { + return formatValue(ctx, ret, recurseTimes); + } + return ret.replaceAll("\n", `\n${" ".repeat(ctx.indentationLvl)}`); + } + } + } + + // Using an array here is actually better for the average case than using + // a Set. `seen` will only check for the depth and will never grow too large. + if (ctx.seen.includes(value)) { + let index: number | undefined = 1; + if (ctx.circular === undefined) { + ctx.circular = new Map(); + ctx.circular.set(value, index); + } else { + index = ctx.circular.get(value); + if (index === undefined) { + index = ctx.circular.size + 1; + ctx.circular.set(value, index); + } + } + return ctx.stylize(`[Circular *${index}]`, "special"); + } + + return formatRaw(ctx, value, recurseTimes, typedArray); +} + +function formatRaw( + ctx: Context, + value: unknown, + recurseTimes: number, + typedArray: unknown +): string { + let keys: PropertyKey[] | undefined; + let protoProps: string[] | undefined; + if (ctx.showHidden && (ctx.depth === null || recurseTimes <= ctx.depth)) { + protoProps = []; + } + + const constructor = getConstructorName(value as object, ctx, recurseTimes, protoProps); + // Reset the variable to check for this later on. + if (protoProps !== undefined && protoProps.length === 0) { + protoProps = undefined; + } + + let tag = (value as { [Symbol.toStringTag]?: string })[Symbol.toStringTag]; + // Only list the tag in case it's non-enumerable / not an own property. + // Otherwise we'd print this twice. + if ( + typeof tag !== "string" || + (tag !== "" && + (ctx.showHidden + ? Object.prototype.hasOwnProperty + : Object.prototype.propertyIsEnumerable + ).call(value, Symbol.toStringTag)) + ) { + tag = ""; + } + let base = ""; + let formatter: (ctx: Context, value: any, recurseTimes: number) => string[] = + getEmptyFormatArray; + let braces: [string, string] | undefined; + let noIterator = true; + let i = 0; + const filter = ctx.showHidden ? internal.ALL_PROPERTIES : internal.ONLY_ENUMERABLE; + + let extrasType = kObjectType; + + // Iterators and the rest are split to reduce checks. + // We have to check all values in case the constructor is set to null. + // Otherwise it would not possible to identify all types properly. + + const isEntriesObject = hasEntries(value); + if (Symbol.iterator in (value as object) || constructor === null || isEntriesObject) { + noIterator = false; + if (isEntriesObject) { + // WORKERD SPECIFIC PATCH: if `value` is an object with entries, format them like a map + const size = value[kEntries].length; + const prefix = getPrefix(constructor, tag, "Object", `(${size})`); + keys = getKeys(value, ctx.showHidden); + + // Remove `kEntries` and `size` from keys + keys.splice(keys.indexOf(kEntries), 1); + const sizeIndex = keys.indexOf("size"); + if (sizeIndex !== -1) keys.splice(sizeIndex, 1); + + formatter = formatMap.bind(null, value[kEntries][Symbol.iterator]()); + if (size === 0 && keys.length === 0 && protoProps === undefined) return `${prefix}{}`; + braces = [`${prefix}{`, "}"]; + } else if (Array.isArray(value)) { + // Only set the constructor for non ordinary ("Array [...]") arrays. + const prefix = + constructor !== "Array" || tag !== "" + ? getPrefix(constructor, tag, "Array", `(${value.length})`) + : ""; + keys = internal.getOwnNonIndexProperties(value, filter); + braces = [`${prefix}[`, "]"]; + if (value.length === 0 && keys.length === 0 && protoProps === undefined) + return `${braces[0]}]`; + extrasType = kArrayExtrasType; + formatter = formatArray; + } else if (isSet(value)) { + const size = setPrototypeSize.call(value); + const prefix = getPrefix(constructor, tag, "Set", `(${size})`); + keys = getKeys(value, ctx.showHidden); + formatter = + constructor !== null + ? formatSet.bind(null, value) + : formatSet.bind(null, Set.prototype.values.call(value)); + if (size === 0 && keys.length === 0 && protoProps === undefined) return `${prefix}{}`; + braces = [`${prefix}{`, "}"]; + } else if (isMap(value)) { + const size = mapPrototypeSize.call(value); + const prefix = getPrefix(constructor, tag, "Map", `(${size})`); + keys = getKeys(value, ctx.showHidden); + formatter = + constructor !== null + ? formatMap.bind(null, value) + : formatMap.bind(null, Map.prototype.entries.call(value)); + if (size === 0 && keys.length === 0 && protoProps === undefined) return `${prefix}{}`; + braces = [`${prefix}{`, "}"]; + } else if (isTypedArray(value)) { + keys = internal.getOwnNonIndexProperties(value, filter); + let bound = value; + let fallback = ""; + if (constructor === null) { + fallback = typedArrayPrototypeToStringTag.call(value); + // Reconstruct the array information. + bound = new ( + globalThis as unknown as Record< + string, + { new (value: NodeJS.TypedArray): NodeJS.TypedArray } + > + )[fallback]!(value); + } + const size = typedArrayPrototypeLength.call(value); + const prefix = getPrefix(constructor, tag, fallback, `(${size})`); + braces = [`${prefix}[`, "]"]; + if (value.length === 0 && keys.length === 0 && !ctx.showHidden) return `${braces[0]}]`; + // Special handle the value. The original value is required below. The + // bound function is required to reconstruct missing information. + formatter = formatTypedArray.bind(null, bound, size); + extrasType = kArrayExtrasType; + } else if (isMapIterator(value)) { + keys = getKeys(value, ctx.showHidden); + braces = getIteratorBraces("Map", tag); + // Add braces to the formatter parameters. + formatter = formatIterator.bind(null, braces); + } else if (isSetIterator(value)) { + keys = getKeys(value, ctx.showHidden); + braces = getIteratorBraces("Set", tag); + // Add braces to the formatter parameters. + formatter = formatIterator.bind(null, braces); + } else { + noIterator = true; + } + } + if (noIterator) { + keys = getKeys(value as object, ctx.showHidden); + braces = ["{", "}"]; + if (constructor === "Object") { + if (isArgumentsObject(value)) { + braces[0] = "[Arguments] {"; + } else if (tag !== "") { + braces[0] = `${getPrefix(constructor, tag, "Object")}{`; + } + if (keys.length === 0 && protoProps === undefined) { + return `${braces[0]}}`; + } + } else if (typeof value === "function") { + base = getFunctionBase(value, constructor, tag); + if (keys.length === 0 && protoProps === undefined) return ctx.stylize(base, "special"); + } else if (isRegExp(value)) { + // Make RegExps say that they are RegExps + base = RegExp.prototype.toString.call(constructor !== null ? value : new RegExp(value)); + const prefix = getPrefix(constructor, tag, "RegExp"); + if (prefix !== "RegExp ") base = `${prefix}${base}`; + if ( + (keys.length === 0 && protoProps === undefined) || + (ctx.depth !== null && recurseTimes > ctx.depth) + ) { + return ctx.stylize(base, "regexp"); + } + } else if (isDate(value)) { + // Make dates with properties first say the date + base = Number.isNaN(Date.prototype.getTime.call(value)) + ? Date.prototype.toString.call(value) + : Date.prototype.toISOString.call(value); + const prefix = getPrefix(constructor, tag, "Date"); + if (prefix !== "Date ") base = `${prefix}${base}`; + if (keys.length === 0 && protoProps === undefined) { + return ctx.stylize(base, "date"); + } + } else if (isError(value)) { + base = formatError(value, constructor, tag, ctx, keys); + if (keys.length === 0 && protoProps === undefined) return base; + } else if (isAnyArrayBuffer(value)) { + // Fast path for ArrayBuffer and SharedArrayBuffer. + // Can't do the same for DataView because it has a non-primitive + // .buffer property that we need to recurse for. + const arrayType = isArrayBuffer(value) ? "ArrayBuffer" : "SharedArrayBuffer"; + const prefix = getPrefix(constructor, tag, arrayType); + if (typedArray === undefined) { + formatter = formatArrayBuffer; + } else if (keys.length === 0 && protoProps === undefined) { + return ( + prefix + `{ byteLength: ${formatNumber(ctx.stylize, value.byteLength, false)} }` + ); + } + braces[0] = `${prefix}{`; + keys.unshift("byteLength"); + } else if (isDataView(value)) { + braces[0] = `${getPrefix(constructor, tag, "DataView")}{`; + // .buffer goes last, it's not a primitive like the others. + keys.unshift("byteLength", "byteOffset", "buffer"); + } else if (isPromise(value)) { + braces[0] = `${getPrefix(constructor, tag, "Promise")}{`; + formatter = formatPromise; + } else if (isWeakSet(value)) { + braces[0] = `${getPrefix(constructor, tag, "WeakSet")}{`; + formatter = ctx.showHidden ? formatWeakSet : formatWeakCollection; + } else if (isWeakMap(value)) { + braces[0] = `${getPrefix(constructor, tag, "WeakMap")}{`; + formatter = ctx.showHidden ? formatWeakMap : formatWeakCollection; + } else if (isModuleNamespaceObject(value)) { + braces[0] = `${getPrefix(constructor, tag, "Module")}{`; + // Special handle keys for namespace objects. + formatter = formatNamespaceObject.bind(null, keys); + } else if (isBoxedPrimitive(value)) { + base = getBoxedBase(value, ctx, keys, constructor, tag); + if (keys.length === 0 && protoProps === undefined) { + return base; + } + } else { + if (keys.length === 0 && protoProps === undefined) { + return `${getCtxStyle(value, constructor, tag)}{}`; + } + braces[0] = `${getCtxStyle(value, constructor, tag)}{`; + } + } + + if (ctx.depth !== null && recurseTimes > ctx.depth) { + let constructorName = getCtxStyle(value, constructor, tag).slice(0, -1); + if (constructor !== null) constructorName = `[${constructorName}]`; + return ctx.stylize(constructorName, "special"); + } + recurseTimes += 1; + + ctx.seen.push(value); + ctx.currentDepth = recurseTimes; + let output; + const indentationLvl = ctx.indentationLvl; + try { + output = formatter(ctx, value, recurseTimes); + for (i = 0; i < keys!.length; i++) { + output.push(formatProperty(ctx, value as object, recurseTimes, keys![i]!, extrasType)); + } + if (protoProps !== undefined) { + output.push(...protoProps); + } + } catch (err) { + const constructorName = getCtxStyle(value, constructor, tag).slice(0, -1); + return handleMaxCallStackSize(ctx, err as Error, constructorName, indentationLvl); + } + if (ctx.circular !== undefined) { + const index = ctx.circular.get(value); + if (index !== undefined) { + const reference = ctx.stylize(``, "special"); + // Add reference always to the very beginning of the output. + if (ctx.compact !== true) { + base = base === "" ? reference : `${reference} ${base}`; + } else { + braces![0] = `${reference} ${braces![0]}`; + } + } + } + ctx.seen.pop(); + + if (ctx.sorted) { + const comparator = ctx.sorted === true ? undefined : ctx.sorted; + if (extrasType === kObjectType) { + output.sort(comparator); + } else if (keys!.length > 1) { + const sorted = output.slice(output.length - keys!.length).sort(comparator); + output.splice(output.length - keys!.length, keys!.length, ...sorted); + } + } + + const res = reduceToSingleString(ctx, output, base, braces!, extrasType, recurseTimes, value); + const budget = ctx.budget[ctx.indentationLvl] || 0; + const newLength = budget + res.length; + ctx.budget[ctx.indentationLvl] = newLength; + // If any indentationLvl exceeds this limit, limit further inspecting to the + // minimum. Otherwise the recursive algorithm might continue inspecting the + // object even though the maximum string size (~2 ** 28 on 32 bit systems and + // ~2 ** 30 on 64 bit systems) exceeded. The actual output is not limited at + // exactly 2 ** 27 but a bit higher. This depends on the object shape. + // This limit also makes sure that huge objects don't block the event loop + // significantly. + if (newLength > 2 ** 27) { + ctx.depth = -1; + } + return res; +} + +function getIteratorBraces(type: string, tag: string): [string, string] { + if (tag !== `${type} Iterator`) { + if (tag !== "") tag += "] ["; + tag += `${type} Iterator`; + } + return [`[${tag}] {`, "}"]; +} + +function getBoxedBase( + value: unknown, + ctx: Context, + keys: PropertyKey[], + constructor: string | null, + tag: string +): string { + let fn: (this: unknown) => Primitive; + let type: Capitalize> | "BigInt"; + if (isNumberObject(value)) { + fn = Number.prototype.valueOf; + type = "Number"; + } else if (isStringObject(value)) { + fn = String.prototype.valueOf; + type = "String"; + // For boxed Strings, we have to remove the 0-n indexed entries, + // since they just noisy up the output and are redundant + // Make boxed primitive Strings look like such + keys.splice(0, value.length); + } else if (isBooleanObject(value)) { + fn = Boolean.prototype.valueOf; + type = "Boolean"; + } else if (isBigIntObject(value)) { + fn = BigInt.prototype.valueOf; + type = "BigInt"; + } else { + fn = Symbol.prototype.valueOf; + type = "Symbol"; + } + let base = `[${type}`; + if (type !== constructor) { + if (constructor === null) { + base += " (null prototype)"; + } else { + base += ` (${constructor})`; + } + } + base += `: ${formatPrimitive(stylizeNoColor, fn.call(value), ctx)}]`; + if (tag !== "" && tag !== constructor) { + base += ` [${tag}]`; + } + if (keys.length !== 0 || ctx.stylize === stylizeNoColor) return base; + return ctx.stylize(base, type.toLowerCase() as Style); +} + +function getClassBase(value: any, constructor: string | null, tag: string): string { + const hasName = Object.prototype.hasOwnProperty.call(value, "name"); + const name = (hasName && value.name) || "(anonymous)"; + let base = `class ${name}`; + if (constructor !== "Function" && constructor !== null) { + base += ` [${constructor}]`; + } + if (tag !== "" && constructor !== tag) { + base += ` [${tag}]`; + } + if (constructor !== null) { + const superName = Object.getPrototypeOf(value).name; + if (superName) { + base += ` extends ${superName}`; + } + } else { + base += " extends [null prototype]"; + } + return `[${base}]`; +} + +function getFunctionBase(value: Function, constructor: string | null, tag: string): string { + const stringified = Function.prototype.toString.call(value); + if (stringified.startsWith("class") && stringified.endsWith("}")) { + const slice = stringified.slice(5, -1); + const bracketIndex = slice.indexOf("{"); + if ( + bracketIndex !== -1 && + (!slice.slice(0, bracketIndex).includes("(") || + // Slow path to guarantee that it's indeed a class. + classRegExp.exec(slice.replace(stripCommentsRegExp, "")) !== null) + ) { + return getClassBase(value, constructor, tag); + } + } + let type = "Function"; + if (isGeneratorFunction(value)) { + type = `Generator${type}`; + } + if (isAsyncFunction(value)) { + type = `Async${type}`; + } + let base = `[${type}`; + if (constructor === null) { + base += " (null prototype)"; + } + if (value.name === "") { + base += " (anonymous)"; + } else { + base += `: ${value.name}`; + } + base += "]"; + if (constructor !== type && constructor !== null) { + base += ` ${constructor}`; + } + if (tag !== "" && constructor !== tag) { + base += ` [${tag}]`; + } + return base; +} + +export function identicalSequenceRange( + a: unknown[], + b: unknown[] +): { len: number; offset: number } { + for (let i = 0; i < a.length - 3; i++) { + // Find the first entry of b that matches the current entry of a. + const pos = b.indexOf(a[i]); + if (pos !== -1) { + const rest = b.length - pos; + if (rest > 3) { + let len = 1; + const maxLen = Math.min(a.length - i, rest); + // Count the number of consecutive entries. + while (maxLen > len && a[i + len] === b[pos + len]) { + len++; + } + if (len > 3) { + return { len, offset: i }; + } + } + } + } + + return { len: 0, offset: 0 }; +} + +function getStackString(error: Error): string { + return error.stack ? String(error.stack) : Error.prototype.toString.call(error); +} + +function getStackFrames(ctx: Context, err: Error, stack: string): string[] { + const frames = stack.split("\n"); + + let cause; + try { + ({ cause } = err); + } catch { + // If 'cause' is a getter that throws, ignore it. + } + + // Remove stack frames identical to frames in cause. + if (cause != null && isError(cause)) { + const causeStack = getStackString(cause); + const causeStackStart = causeStack.indexOf("\n at"); + if (causeStackStart !== -1) { + const causeFrames = causeStack.slice(causeStackStart + 1).split("\n"); + const { len, offset } = identicalSequenceRange(frames, causeFrames); + if (len > 0) { + const skipped = len - 2; + const msg = ` ... ${skipped} lines matching cause stack trace ...`; + frames.splice(offset + 1, skipped, ctx.stylize(msg, "undefined")); + } + } + } + return frames; +} + +function improveStack( + stack: string, + constructor: string | null, + name: string, + tag: string +): string { + // A stack trace may contain arbitrary data. Only manipulate the output + // for "regular errors" (errors that "look normal") for now. + let len = name.length; + + if ( + constructor === null || + (name.endsWith("Error") && + stack.startsWith(name) && + (stack.length === len || stack[len] === ":" || stack[len] === "\n")) + ) { + let fallback = "Error"; + if (constructor === null) { + const start = + /^([A-Z][a-z_ A-Z0-9[\]()-]+)(?::|\n {4}at)/.exec(stack) || + /^([a-z_A-Z0-9-]*Error)$/.exec(stack); + fallback = (start && start[1]) || ""; + len = fallback.length; + fallback = fallback || "Error"; + } + const prefix = getPrefix(constructor, tag, fallback).slice(0, -1); + if (name !== prefix) { + if (prefix.includes(name)) { + if (len === 0) { + stack = `${prefix}: ${stack}`; + } else { + stack = `${prefix}${stack.slice(len)}`; + } + } else { + stack = `${prefix} [${name}]${stack.slice(len)}`; + } + } + } + return stack; +} + +function removeDuplicateErrorKeys( + ctx: Context, + keys: PropertyKey[], + err: Error, + stack: string +): void { + if (!ctx.showHidden && keys.length !== 0) { + for (const name of ["name", "message", "stack"] as const) { + const index = keys.indexOf(name); + // Only hide the property in case it's part of the original stack + if (index !== -1 && stack.includes(err[name]!)) { + keys.splice(index, 1); + } + } + } +} + +function markNodeModules(ctx: Context, line: string): string { + let tempLine = ""; + let nodeModule; + let pos = 0; + while ((nodeModule = nodeModulesRegExp.exec(line)) !== null) { + // '/node_modules/'.length === 14 + tempLine += line.slice(pos, nodeModule.index + 14); + tempLine += ctx.stylize(nodeModule[1]!, "module"); + pos = nodeModule.index + nodeModule[0].length; + } + if (pos !== 0) { + line = tempLine + line.slice(pos); + } + return line; +} + +function formatError( + err: Error, + constructor: string | null, + tag: string, + ctx: Context, + keys: PropertyKey[] +): string { + const name = err.name != null ? String(err.name) : "Error"; + let stack = getStackString(err); + + removeDuplicateErrorKeys(ctx, keys, err, stack); + + if ("cause" in err && (keys.length === 0 || !keys.includes("cause"))) { + keys.push("cause"); + } + + // Print errors aggregated into AggregateError + if ( + Array.isArray((err as { errors?: unknown }).errors) && + (keys.length === 0 || !keys.includes("errors")) + ) { + keys.push("errors"); + } + + stack = improveStack(stack, constructor, name, tag); + + // Ignore the error message if it's contained in the stack. + let pos = (err.message && stack.indexOf(err.message)) || -1; + if (pos !== -1) pos += err.message.length; + // Wrap the error in brackets in case it has no stack trace. + const stackStart = stack.indexOf("\n at", pos); + if (stackStart === -1) { + stack = `[${stack}]`; + } else { + let newStack = stack.slice(0, stackStart); + const stackFramePart = stack.slice(stackStart + 1); + const lines = getStackFrames(ctx, err, stackFramePart); + if (ctx.colors) { + // Highlight userland code and node modules. + for (let line of lines) { + newStack += "\n"; + + line = markNodeModules(ctx, line); + + newStack += line; + } + } else { + newStack += `\n${lines.join("\n")}`; + } + stack = newStack; + } + // The message and the stack have to be indented as well! + if (ctx.indentationLvl !== 0) { + const indentation = " ".repeat(ctx.indentationLvl); + stack = stack.replaceAll("\n", `\n${indentation}`); + } + return stack; +} + +function groupArrayElements( + ctx: Context, + output: string[], + value: unknown[] | undefined +): string[] { + let totalLength = 0; + let maxLength = 0; + let i = 0; + let outputLength = output.length; + if (ctx.maxArrayLength !== null && ctx.maxArrayLength < output.length) { + // This makes sure the "... n more items" part is not taken into account. + outputLength--; + } + const separatorSpace = 2; // Add 1 for the space and 1 for the separator. + const dataLen = new Array(outputLength); + // Calculate the total length of all output entries and the individual max + // entries length of all output entries. We have to remove colors first, + // otherwise the length would not be calculated properly. + for (; i < outputLength; i++) { + const len = getStringWidth(output[i]!, ctx.colors); + dataLen[i] = len; + totalLength += len + separatorSpace; + if (maxLength < len) maxLength = len; + } + // Add two to `maxLength` as we add a single whitespace character plus a comma + // in-between two entries. + const actualMax = maxLength + separatorSpace; + // Check if at least three entries fit next to each other and prevent grouping + // of arrays that contains entries of very different length (i.e., if a single + // entry is longer than 1/5 of all other entries combined). Otherwise the + // space in-between small entries would be enormous. + if ( + actualMax * 3 + ctx.indentationLvl < ctx.breakLength && + (totalLength / actualMax > 5 || maxLength <= 6) + ) { + const approxCharHeights = 2.5; + const averageBias = Math.sqrt(actualMax - totalLength / output.length); + const biasedMax = Math.max(actualMax - 3 - averageBias, 1); + // Dynamically check how many columns seem possible. + const columns = Math.min( + // Ideally a square should be drawn. We expect a character to be about 2.5 + // times as high as wide. This is the area formula to calculate a square + // which contains n rectangles of size `actualMax * approxCharHeights`. + // Divide that by `actualMax` to receive the correct number of columns. + // The added bias increases the columns for short entries. + Math.round(Math.sqrt(approxCharHeights * biasedMax * outputLength) / biasedMax), + // Do not exceed the breakLength. + Math.floor((ctx.breakLength - ctx.indentationLvl) / actualMax), + // Limit array grouping for small `compact` modes as the user requested + // minimal grouping. + (ctx.compact === false + ? 0 + : ctx.compact === true + ? inspectDefaultOptions.compact + : ctx.compact) * 4, + // Limit the columns to a maximum of fifteen. + 15 + ); + // Return with the original output if no grouping should happen. + if (columns <= 1) { + return output; + } + const tmp: string[] = []; + const maxLineLength: number[] = []; + for (let i = 0; i < columns; i++) { + let lineMaxLength = 0; + for (let j = i; j < output.length; j += columns) { + if (dataLen[j] > lineMaxLength) lineMaxLength = dataLen[j]; + } + lineMaxLength += separatorSpace; + maxLineLength[i] = lineMaxLength; + } + let order = String.prototype.padStart; + if (value !== undefined) { + for (let i = 0; i < output.length; i++) { + if (typeof value[i] !== "number" && typeof value[i] !== "bigint") { + order = String.prototype.padEnd; + break; + } + } + } + // Each iteration creates a single line of grouped entries. + for (let i = 0; i < outputLength; i += columns) { + // The last lines may contain less entries than columns. + const max = Math.min(i + columns, outputLength); + let str = ""; + let j = i; + for (; j < max - 1; j++) { + // Calculate extra color padding in case it's active. This has to be + // done line by line as some lines might contain more colors than + // others. + const padding = maxLineLength[j - i]! + output[j]!.length - dataLen[j]; + str += order.call(`${output[j]}, `, padding, " "); + } + if (order === String.prototype.padStart) { + const padding = + maxLineLength[j - i]! + output[j]!.length - dataLen[j] - separatorSpace; + str += output[j]!.padStart(padding, " "); + } else { + str += output[j]; + } + tmp.push(str); + } + if (ctx.maxArrayLength !== null && ctx.maxArrayLength < output.length) { + tmp.push(output[outputLength]!); + } + output = tmp; + } + return output; +} + +function handleMaxCallStackSize( + ctx: Context, + err: Error, + constructorName: string, + indentationLvl: number +): string { + if (isStackOverflowError(err)) { + ctx.seen.pop(); + ctx.indentationLvl = indentationLvl; + return ctx.stylize( + `[${constructorName}: Inspection interrupted ` + + "prematurely. Maximum call stack size exceeded.]", + "special" + ); + } + /* c8 ignore next */ + assert.fail(err.stack); +} + +function addNumericSeparator(integerString: string): string { + let result = ""; + let i = integerString.length; + const start = integerString.startsWith("-") ? 1 : 0; + for (; i >= start + 4; i -= 3) { + result = `_${integerString.slice(i - 3, i)}${result}`; + } + return i === integerString.length ? integerString : `${integerString.slice(0, i)}${result}`; +} + +function addNumericSeparatorEnd(integerString: string): string { + let result = ""; + let i = 0; + for (; i < integerString.length - 3; i += 3) { + result += `${integerString.slice(i, i + 3)}_`; + } + return i === 0 ? integerString : `${result}${integerString.slice(i)}`; +} + +const remainingText = (remaining: number) => + `... ${remaining} more item${remaining > 1 ? "s" : ""}`; + +function formatNumber( + fn: InspectOptionsStylized["stylize"], + number: number, + numericSeparator?: boolean +): string { + if (!numericSeparator) { + // Format -0 as '-0'. Checking `number === -0` won't distinguish 0 from -0. + if (Object.is(number, -0)) { + return fn("-0", "number"); + } + return fn(`${number}`, "number"); + } + const integer = Math.trunc(number); + const string = String(integer); + if (integer === number) { + if (!Number.isFinite(number) || string.includes("e")) { + return fn(string, "number"); + } + return fn(`${addNumericSeparator(string)}`, "number"); + } + if (Number.isNaN(number)) { + return fn(string, "number"); + } + return fn( + `${addNumericSeparator(string)}.${addNumericSeparatorEnd( + String(number).slice(string.length + 1) + )}`, + "number" + ); +} + +function formatBigInt( + fn: InspectOptionsStylized["stylize"], + bigint: bigint, + numericSeparator?: boolean +): string { + const string = String(bigint); + if (!numericSeparator) { + return fn(`${string}n`, "bigint"); + } + return fn(`${addNumericSeparator(string)}n`, "bigint"); +} + +type Primitive = string | number | bigint | boolean | undefined | symbol; +function formatPrimitive( + fn: InspectOptionsStylized["stylize"], + value: Primitive, + ctx: Context +): string { + if (typeof value === "string") { + let trailer = ""; + if (ctx.maxStringLength !== null && value.length > ctx.maxStringLength) { + const remaining = value.length - ctx.maxStringLength; + value = value.slice(0, ctx.maxStringLength); + trailer = `... ${remaining} more character${remaining > 1 ? "s" : ""}`; + } + if ( + ctx.compact !== true && + // We do not support handling unicode characters width with + // the readline getStringWidth function as there are + // performance implications. + value.length > kMinLineLength && + value.length > ctx.breakLength - ctx.indentationLvl - 4 + ) { + return ( + value + .split(/(?<=\n)/) + .map((line) => fn(strEscape(line), "string")) + .join(` +\n${" ".repeat(ctx.indentationLvl + 2)}`) + trailer + ); + } + return fn(strEscape(value), "string") + trailer; + } + if (typeof value === "number") return formatNumber(fn, value, ctx.numericSeparator); + if (typeof value === "bigint") return formatBigInt(fn, value, ctx.numericSeparator); + if (typeof value === "boolean") return fn(`${value}`, "boolean"); + if (typeof value === "undefined") return fn("undefined", "undefined"); + // es6 symbol primitive + return fn(Symbol.prototype.toString.call(value), "symbol"); +} + +function formatNamespaceObject( + keys: PropertyKey[], + ctx: Context, + value: object, + recurseTimes: number +): string[] { + const output = new Array(keys.length); + for (let i = 0; i < keys.length; i++) { + try { + output[i] = formatProperty(ctx, value, recurseTimes, keys[i]!, kObjectType); + } catch (err) { + assert(isNativeError(err) && err.name === "ReferenceError"); + // Use the existing functionality. This makes sure the indentation and + // line breaks are always correct. Otherwise it is very difficult to keep + // this aligned, even though this is a hacky way of dealing with this. + const tmp = { [keys[i]!]: "" }; + output[i] = formatProperty(ctx, tmp, recurseTimes, keys[i]!, kObjectType); + const pos = output[i]!.lastIndexOf(" "); + // We have to find the last whitespace and have to replace that value as + // it will be visualized as a regular string. + output[i] = output[i]!.slice(0, pos + 1) + ctx.stylize("", "special"); + } + } + // Reset the keys to an empty array. This prevents duplicated inspection. + keys.length = 0; + return output; +} + +// The array is sparse and/or has extra keys +function formatSpecialArray( + ctx: Context, + value: unknown[], + recurseTimes: number, + maxLength: number, + output: string[], + i: number +): string[] { + const keys = Object.keys(value); + let index = i; + for (; i < keys.length && output.length < maxLength; i++) { + const key = keys[i]!; + const tmp = +key; + // Arrays can only have up to 2^32 - 1 entries + if (tmp > 2 ** 32 - 2) { + break; + } + if (`${index}` !== key) { + if (numberRegExp.exec(key) === null) { + break; + } + const emptyItems = tmp - index; + const ending = emptyItems > 1 ? "s" : ""; + const message = `<${emptyItems} empty item${ending}>`; + output.push(ctx.stylize(message, "undefined")); + index = tmp; + if (output.length === maxLength) { + break; + } + } + output.push(formatProperty(ctx, value, recurseTimes, key, kArrayType)); + index++; + } + const remaining = value.length - index; + if (output.length !== maxLength) { + if (remaining > 0) { + const ending = remaining > 1 ? "s" : ""; + const message = `<${remaining} empty item${ending}>`; + output.push(ctx.stylize(message, "undefined")); + } + } else if (remaining > 0) { + output.push(remainingText(remaining)); + } + return output; +} + +function formatArrayBuffer(ctx: Context, value: ArrayBuffer): string[] { + let buffer; + try { + buffer = new Uint8Array(value); + } catch { + return [ctx.stylize("(detached)", "special")]; + } + const maxArrayLength = ctx.maxArrayLength; + let str = Buffer.prototype.hexSlice + .call(buffer, 0, Math.min(maxArrayLength, buffer.length)) + .replace(/(.{2})/g, "$1 ") + .trim(); + const remaining = buffer.length - maxArrayLength; + if (remaining > 0) str += ` ... ${remaining} more byte${remaining > 1 ? "s" : ""}`; + return [`${ctx.stylize("[Uint8Contents]", "special")}: <${str}>`]; +} + +function formatArray(ctx: Context, value: unknown[], recurseTimes: number): string[] { + const valLen = value.length; + const len = Math.min(Math.max(0, ctx.maxArrayLength), valLen); + + const remaining = valLen - len; + const output: string[] = []; + for (let i = 0; i < len; i++) { + // Special handle sparse arrays. + if (!Object.prototype.hasOwnProperty.call(value, i)) { + return formatSpecialArray(ctx, value, recurseTimes, len, output, i); + } + output.push(formatProperty(ctx, value, recurseTimes, i, kArrayType)); + } + if (remaining > 0) { + output.push(remainingText(remaining)); + } + return output; +} + +function formatTypedArray( + value: internal.TypedArray, + length: number, + ctx: Context, + _ignored: unknown, + recurseTimes: number +): string[] { + const maxLength = Math.min(Math.max(0, ctx.maxArrayLength), length); + const remaining = value.length - maxLength; + const output = new Array(maxLength); + const elementFormatter = + value.length > 0 && typeof value[0] === "number" ? formatNumber : formatBigInt; + for (let i = 0; i < maxLength; ++i) { + // @ts-expect-error `value[i]` assumed to be of correct numeric type + output[i] = elementFormatter(ctx.stylize, value[i], ctx.numericSeparator); + } + if (remaining > 0) { + output[maxLength] = remainingText(remaining); + } + if (ctx.showHidden) { + // .buffer goes last, it's not a primitive like the others. + // All besides `BYTES_PER_ELEMENT` are actually getters. + ctx.indentationLvl += 2; + for (const key of [ + "BYTES_PER_ELEMENT", + "length", + "byteLength", + "byteOffset", + "buffer", + ] as const) { + const str = formatValue(ctx, value[key], recurseTimes, true); + output.push(`[${key}]: ${str}`); + } + ctx.indentationLvl -= 2; + } + return output; +} + +function formatSet( + value: Set | IterableIterator, + ctx: Context, + _ignored: unknown, + recurseTimes: number +): string[] { + const length = isSet(value) ? value.size : NaN; + const maxLength = Math.min(Math.max(0, ctx.maxArrayLength), length); + const remaining = length - maxLength; + const output: string[] = []; + ctx.indentationLvl += 2; + let i = 0; + for (const v of value) { + if (i >= maxLength) break; + output.push(formatValue(ctx, v, recurseTimes)); + i++; + } + if (remaining > 0) { + output.push(remainingText(remaining)); + } + ctx.indentationLvl -= 2; + return output; +} + +function formatMap( + value: Map | IterableIterator<[unknown, unknown]>, + ctx: Context, + _ignored: unknown, + recurseTimes: number +): string[] { + const length = isMap(value) ? value.size : NaN; + const maxLength = Math.min(Math.max(0, ctx.maxArrayLength), length); + const remaining = length - maxLength; + const output: string[] = []; + ctx.indentationLvl += 2; + let i = 0; + for (const { 0: k, 1: v } of value) { + if (i >= maxLength) break; + output.push(`${formatValue(ctx, k, recurseTimes)} => ${formatValue(ctx, v, recurseTimes)}`); + i++; + } + if (remaining > 0) { + output.push(remainingText(remaining)); + } + ctx.indentationLvl -= 2; + return output; +} + +function formatSetIterInner( + ctx: Context, + recurseTimes: number, + entries: unknown[], + state: number +): string[] { + const maxArrayLength = Math.max(ctx.maxArrayLength, 0); + const maxLength = Math.min(maxArrayLength, entries.length); + const output = new Array(maxLength); + ctx.indentationLvl += 2; + for (let i = 0; i < maxLength; i++) { + output[i] = formatValue(ctx, entries[i], recurseTimes); + } + ctx.indentationLvl -= 2; + if (state === kWeak && !ctx.sorted) { + // Sort all entries to have a halfway reliable output (if more entries than + // retrieved ones exist, we can not reliably return the same output) if the + // output is not sorted anyway. + output.sort(); + } + const remaining = entries.length - maxLength; + if (remaining > 0) { + output.push(remainingText(remaining)); + } + return output; +} + +function formatMapIterInner( + ctx: Context, + recurseTimes: number, + entries: unknown[], + state: number +): string[] { + const maxArrayLength = Math.max(ctx.maxArrayLength, 0); + // Entries exist as [key1, val1, key2, val2, ...] + const len = entries.length / 2; + const remaining = len - maxArrayLength; + const maxLength = Math.min(maxArrayLength, len); + const output = new Array(maxLength); + let i = 0; + ctx.indentationLvl += 2; + if (state === kWeak) { + for (; i < maxLength; i++) { + const pos = i * 2; + output[i] = `${formatValue(ctx, entries[pos], recurseTimes)} => ${formatValue( + ctx, + entries[pos + 1], + recurseTimes + )}`; + } + // Sort all entries to have a halfway reliable output (if more entries than + // retrieved ones exist, we can not reliably return the same output) if the + // output is not sorted anyway. + if (!ctx.sorted) output.sort(); + } else { + for (; i < maxLength; i++) { + const pos = i * 2; + const res = [ + formatValue(ctx, entries[pos], recurseTimes), + formatValue(ctx, entries[pos + 1], recurseTimes), + ]; + output[i] = reduceToSingleString( + ctx, + res, + "", + ["[", "]"], + kArrayExtrasType, + recurseTimes + ); + } + } + ctx.indentationLvl -= 2; + if (remaining > 0) { + output.push(remainingText(remaining)); + } + return output; +} + +function formatWeakCollection(ctx: Context): string[] { + return [ctx.stylize("", "special")]; +} + +function formatWeakSet(ctx: Context, value: WeakSet, recurseTimes: number): string[] { + const { entries } = internal.previewEntries(value)!; + return formatSetIterInner(ctx, recurseTimes, entries, kWeak); +} + +function formatWeakMap(ctx: Context, value: WeakMap, recurseTimes: number): string[] { + const { entries } = internal.previewEntries(value)!; + return formatMapIterInner(ctx, recurseTimes, entries, kWeak); +} + +function formatIterator( + braces: [string, string], + ctx: Context, + value: Iterator, + recurseTimes: number +): string[] { + const { entries, isKeyValue } = internal.previewEntries(value)!; + if (isKeyValue) { + // Mark entry iterators as such. + braces[0] = braces[0].replace(/ Iterator] {$/, " Entries] {"); + return formatMapIterInner(ctx, recurseTimes, entries, kMapEntries); + } + + return formatSetIterInner(ctx, recurseTimes, entries, kIterator); +} + +function formatPromise(ctx: Context, value: Promise, recurseTimes: number): string[] { + let output: string[]; + const { state, result } = internal.getPromiseDetails(value)!; + if (state === internal.kPending) { + output = [ctx.stylize("", "special")]; + } else { + ctx.indentationLvl += 2; + const str = formatValue(ctx, result, recurseTimes); + ctx.indentationLvl -= 2; + output = [ + state === internal.kRejected ? `${ctx.stylize("", "special")} ${str}` : str, + ]; + } + return output; +} + +function formatProperty( + ctx: Context, + value: object, + recurseTimes: number, + key: PropertyKey, + type: number, + desc?: PropertyDescriptor, + original = value +): string { + let name: string, str: string; + let extra = " "; + desc = desc || + Object.getOwnPropertyDescriptor(value, key) || { + value: (value as Record)[key], + enumerable: true, + }; + if (desc.value !== undefined) { + const diff = ctx.compact !== true || type !== kObjectType ? 2 : 3; + ctx.indentationLvl += diff; + str = formatValue(ctx, desc.value, recurseTimes); + if (diff === 3 && ctx.breakLength < getStringWidth(str, ctx.colors)) { + extra = `\n${" ".repeat(ctx.indentationLvl)}`; + } + ctx.indentationLvl -= diff; + } else if (desc.get !== undefined) { + const label = desc.set !== undefined ? "Getter/Setter" : "Getter"; + const s = ctx.stylize; + const sp = "special"; + if ( + ctx.getters && + (ctx.getters === true || + (ctx.getters === "get" && desc.set === undefined) || + (ctx.getters === "set" && desc.set !== undefined)) + ) { + try { + const tmp = desc.get.call(original); + ctx.indentationLvl += 2; + if (tmp === null) { + str = `${s(`[${label}:`, sp)} ${s("null", "null")}${s("]", sp)}`; + } else if (typeof tmp === "object") { + str = `${s(`[${label}]`, sp)} ${formatValue(ctx, tmp, recurseTimes)}`; + } else { + const primitive = formatPrimitive(s, tmp, ctx); + str = `${s(`[${label}:`, sp)} ${primitive}${s("]", sp)}`; + } + ctx.indentationLvl -= 2; + } catch (err) { + const message = ``; + str = `${s(`[${label}:`, sp)} ${message}${s("]", sp)}`; + } + } else { + str = ctx.stylize(`[${label}]`, sp); + } + } else if (desc.set !== undefined) { + str = ctx.stylize("[Setter]", "special"); + } else { + str = ctx.stylize("undefined", "undefined"); + } + if (type === kArrayType) { + return str; + } + if (typeof key === "symbol") { + const tmp = Symbol.prototype.toString + .call(key) + .replace(strEscapeSequencesReplacer, escapeFn); + name = `[${ctx.stylize(tmp, "symbol")}]`; + } else if (key === "__proto__") { + name = "['__proto__']"; + } else if (desc.enumerable === false) { + const tmp = String(key).replace(strEscapeSequencesReplacer, escapeFn); + name = `[${tmp}]`; + } else if (keyStrRegExp.exec(String(key)) !== null) { + name = ctx.stylize(String(key), "name"); + } else { + name = ctx.stylize(strEscape(String(key)), "string"); + } + return `${name}:${extra}${str}`; +} + +function isBelowBreakLength(ctx: Context, output: string[], start: number, base: string): boolean { + // Each entry is separated by at least a comma. Thus, we start with a total + // length of at least `output.length`. In addition, some cases have a + // whitespace in-between each other that is added to the total as well. + // TODO(BridgeAR): Add unicode support. Use the readline getStringWidth + // function. Check the performance overhead and make it an opt-in in case it's + // significant. + let totalLength = output.length + start; + if (totalLength + output.length > ctx.breakLength) return false; + for (let i = 0; i < output.length; i++) { + if (ctx.colors) { + totalLength += removeColors(output[i]!).length; + } else { + totalLength += output[i]!.length; + } + if (totalLength > ctx.breakLength) { + return false; + } + } + // Do not line up properties on the same line if `base` contains line breaks. + return base === "" || !base.includes("\n"); +} + +function reduceToSingleString( + ctx: Context, + output: string[], + base: string, + braces: [string, string], + extrasType: number, + recurseTimes: number, + value?: unknown +): string { + if (ctx.compact !== true) { + if (typeof ctx.compact === "number" && ctx.compact >= 1) { + // Memorize the original output length. In case the output is grouped, + // prevent lining up the entries on a single line. + const entries = output.length; + // Group array elements together if the array contains at least six + // separate entries. + if (extrasType === kArrayExtrasType && entries > 6) { + output = groupArrayElements(ctx, output, value as unknown[]); + } + // `ctx.currentDepth` is set to the most inner depth of the currently + // inspected object part while `recurseTimes` is the actual current depth + // that is inspected. + // + // Example: + // + // const a = { first: [ 1, 2, 3 ], second: { inner: [ 1, 2, 3 ] } } + // + // The deepest depth of `a` is 2 (a.second.inner) and `a.first` has a max + // depth of 1. + // + // Consolidate all entries of the local most inner depth up to + // `ctx.compact`, as long as the properties are smaller than + // `ctx.breakLength`. + if (ctx.currentDepth - recurseTimes < ctx.compact && entries === output.length) { + // Line up all entries on a single line in case the entries do not + // exceed `breakLength`. Add 10 as constant to start next to all other + // factors that may reduce `breakLength`. + const start = + output.length + ctx.indentationLvl + braces[0].length + base.length + 10; + if (isBelowBreakLength(ctx, output, start, base)) { + const joinedOutput = output.join(", "); + if (!joinedOutput.includes("\n")) { + return ( + `${base ? `${base} ` : ""}${braces[0]} ${joinedOutput}` + + ` ${braces[1]}` + ); + } + } + } + } + // Line up each entry on an individual line. + const indentation = `\n${" ".repeat(ctx.indentationLvl)}`; + return ( + `${base ? `${base} ` : ""}${braces[0]}${indentation} ` + + `${output.join(`,${indentation} `)}${indentation}${braces[1]}` + ); + } + // Line up all entries on a single line in case the entries do not exceed + // `breakLength`. + if (isBelowBreakLength(ctx, output, 0, base)) { + return `${braces[0]}${base ? ` ${base}` : ""} ${output.join(", ")} ` + braces[1]; + } + const indentation = " ".repeat(ctx.indentationLvl); + // If the opening "brace" is too large, like in the case of "Set {", + // we need to force the first item to be on the next line or the + // items will not line up correctly. + const ln = + base === "" && braces[0].length === 1 ? " " : `${base ? ` ${base}` : ""}\n${indentation} `; + // Line up each entry on an individual line. + return `${braces[0]}${ln}${output.join(`,\n${indentation} `)} ${braces[1]}`; +} + +function hasBuiltInToString(value: object): boolean { + // Prevent triggering proxy traps. + const proxyTarget = internal.getProxyDetails(value); + if (proxyTarget !== undefined) { + if (proxyTarget === null) { + return true; + } + value = proxyTarget.target as object; + } + + // Count objects that have no `toString` function as built-in. + if (typeof value?.toString !== "function") { + return true; + } + + // The object has a own `toString` property. Thus it's not not a built-in one. + if (Object.prototype.hasOwnProperty.call(value, "toString")) { + return false; + } + + // Find the object that has the `toString` property as own property in the + // prototype chain. + let pointer = value; + do { + pointer = Object.getPrototypeOf(pointer); + } while (!Object.prototype.hasOwnProperty.call(pointer, "toString")); + + // Check closer if the object is a built-in. + const descriptor = Object.getOwnPropertyDescriptor(pointer, "constructor"); + return ( + descriptor !== undefined && + typeof descriptor.value === "function" && + builtInObjects.has(descriptor.value.name) + ); +} + +const firstErrorLine = (error: unknown) => + (isError(error) ? error.message : String(error)).split("\n", 1)[0]; +let CIRCULAR_ERROR_MESSAGE: string | undefined; +function tryStringify(arg: unknown): string { + try { + return JSON.stringify(arg); + } catch (err) { + // Populate the circular error message lazily + if (!CIRCULAR_ERROR_MESSAGE) { + try { + const a: { a?: unknown } = {}; + a.a = a; + JSON.stringify(a); + } catch (circularError) { + CIRCULAR_ERROR_MESSAGE = firstErrorLine(circularError); + } + } + if ( + typeof err === "object" && + err !== null && + "name" in err && + err.name === "TypeError" && + firstErrorLine(err) === CIRCULAR_ERROR_MESSAGE + ) { + return "[Circular]"; + } + throw err; + } +} + +export function format(...args: unknown[]): string { + return formatWithOptionsInternal(undefined, args); +} + +export function formatWithOptions(inspectOptions: InspectOptions, ...args: unknown[]): string { + validateObject(inspectOptions, "inspectOptions", { allowArray: true }); + return formatWithOptionsInternal(inspectOptions, args); +} + +function formatNumberNoColor(number: number, options?: InspectOptions): string { + return formatNumber( + stylizeNoColor, + number, + options?.numericSeparator ?? inspectDefaultOptions.numericSeparator + ); +} + +function formatBigIntNoColor(bigint: bigint, options?: InspectOptions): string { + return formatBigInt( + stylizeNoColor, + bigint, + options?.numericSeparator ?? inspectDefaultOptions.numericSeparator + ); +} + +function formatWithOptionsInternal( + inspectOptions: InspectOptions | undefined, + args: unknown[] +): string { + const first = args[0]; + let a = 0; + let str = ""; + let join = ""; + + if (typeof first === "string") { + if (args.length === 1) { + return first; + } + let tempStr; + let lastPos = 0; + + for (let i = 0; i < first.length - 1; i++) { + if (first.charCodeAt(i) === 37) { + // '%' + const nextChar = first.charCodeAt(++i); + if (a + 1 !== args.length) { + switch (nextChar) { + case 115: { + // 's' + const tempArg = args[++a]; + if (typeof tempArg === "number") { + tempStr = formatNumberNoColor(tempArg, inspectOptions); + } else if (typeof tempArg === "bigint") { + tempStr = formatBigIntNoColor(tempArg, inspectOptions); + } else if ( + typeof tempArg !== "object" || + tempArg === null || + !hasBuiltInToString(tempArg) + ) { + tempStr = String(tempArg); + } else { + tempStr = inspect(tempArg, { + ...inspectOptions, + compact: 3, + colors: false, + depth: 0, + }); + } + break; + } + case 106: // 'j' + tempStr = tryStringify(args[++a]); + break; + case 100: { + // 'd' + const tempNum = args[++a]; + if (typeof tempNum === "bigint") { + tempStr = formatBigIntNoColor(tempNum, inspectOptions); + } else if (typeof tempNum === "symbol") { + tempStr = "NaN"; + } else { + tempStr = formatNumberNoColor(Number(tempNum), inspectOptions); + } + break; + } + case 79: // 'O' + tempStr = inspect(args[++a], inspectOptions); + break; + case 111: // 'o' + tempStr = inspect(args[++a], { + ...inspectOptions, + showHidden: true, + showProxy: true, + depth: 4, + }); + break; + case 105: { + // 'i' + const tempInteger = args[++a]; + if (typeof tempInteger === "bigint") { + tempStr = formatBigIntNoColor(tempInteger, inspectOptions); + } else if (typeof tempInteger === "symbol") { + tempStr = "NaN"; + } else { + tempStr = formatNumberNoColor( + Number.parseInt(tempInteger as unknown as string), + inspectOptions + ); + } + break; + } + case 102: { + // 'f' + const tempFloat = args[++a]; + if (typeof tempFloat === "symbol") { + tempStr = "NaN"; + } else { + tempStr = formatNumberNoColor( + Number.parseFloat(tempFloat as unknown as string), + inspectOptions + ); + } + break; + } + case 99: // 'c' + a += 1; + tempStr = ""; + break; + case 37: // '%' + str += first.slice(lastPos, i); + lastPos = i + 1; + continue; + default: // Any other character is not a correct placeholder + continue; + } + if (lastPos !== i - 1) { + str += first.slice(lastPos, i - 1); + } + str += tempStr; + lastPos = i + 1; + } else if (nextChar === 37) { + str += first.slice(lastPos, i); + lastPos = i + 1; + } + } + } + if (lastPos !== 0) { + a++; + join = " "; + if (lastPos < first.length) { + str += first.slice(lastPos); + } + } + } + + while (a < args.length) { + const value = args[a]; + str += join; + str += typeof value !== "string" ? inspect(value, inspectOptions) : value; + join = " "; + a++; + } + return str; +} + +export function isZeroWidthCodePoint(code: number): boolean { + return ( + code <= 0x1f || // C0 control codes + (code >= 0x7f && code <= 0x9f) || // C1 control codes + (code >= 0x300 && code <= 0x36f) || // Combining Diacritical Marks + (code >= 0x200b && code <= 0x200f) || // Modifying Invisible Characters + // Combining Diacritical Marks for Symbols + (code >= 0x20d0 && code <= 0x20ff) || + (code >= 0xfe00 && code <= 0xfe0f) || // Variation Selectors + (code >= 0xfe20 && code <= 0xfe2f) || // Combining Half Marks + (code >= 0xe0100 && code <= 0xe01ef) + ); // Variation Selectors +} + +/** + * Returns the number of columns required to display the given string. + */ +export function getStringWidth(str: string, removeControlChars = true): number { + let width = 0; + + if (removeControlChars) str = stripVTControlCharacters(str); + str = str.normalize("NFC"); + for (const char of str) { + const code = char.codePointAt(0)!; + if (isFullWidthCodePoint(code)) { + width += 2; + } else if (!isZeroWidthCodePoint(code)) { + width++; + } + } + + return width; +} + +/** + * Returns true if the character represented by a given + * Unicode code point is full-width. Otherwise returns false. + */ +const isFullWidthCodePoint = (code: number) => { + // Code points are partially derived from: + // https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt + return ( + code >= 0x1100 && + (code <= 0x115f || // Hangul Jamo + code === 0x2329 || // LEFT-POINTING ANGLE BRACKET + code === 0x232a || // RIGHT-POINTING ANGLE BRACKET + // CJK Radicals Supplement .. Enclosed CJK Letters and Months + (code >= 0x2e80 && code <= 0x3247 && code !== 0x303f) || + // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A + (code >= 0x3250 && code <= 0x4dbf) || + // CJK Unified Ideographs .. Yi Radicals + (code >= 0x4e00 && code <= 0xa4c6) || + // Hangul Jamo Extended-A + (code >= 0xa960 && code <= 0xa97c) || + // Hangul Syllables + (code >= 0xac00 && code <= 0xd7a3) || + // CJK Compatibility Ideographs + (code >= 0xf900 && code <= 0xfaff) || + // Vertical Forms + (code >= 0xfe10 && code <= 0xfe19) || + // CJK Compatibility Forms .. Small Form Variants + (code >= 0xfe30 && code <= 0xfe6b) || + // Halfwidth and Fullwidth Forms + (code >= 0xff01 && code <= 0xff60) || + (code >= 0xffe0 && code <= 0xffe6) || + // Kana Supplement + (code >= 0x1b000 && code <= 0x1b001) || + // Enclosed Ideographic Supplement + (code >= 0x1f200 && code <= 0x1f251) || + // Miscellaneous Symbols and Pictographs 0x1f300 - 0x1f5ff + // Emoticons 0x1f600 - 0x1f64f + (code >= 0x1f300 && code <= 0x1f64f) || + // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane + (code >= 0x20000 && code <= 0x3fffd)) + ); +}; + +/** + * Remove all VT control characters. Use to estimate displayed string width. + */ +export function stripVTControlCharacters(str: string): string { + validateString(str, "str"); + + return str.replace(ansi, ""); +} + +// ================================================================================================ +// WORKERD SPECIFIC CODE + +// Called from C++ on `console.log()`s to format values +export function formatLog(...args: [...values: unknown[], colors: boolean]): string { + const inspectOptions: InspectOptions = { colors: args.pop() as boolean }; + try { + return formatWithOptions(inspectOptions, ...args); + } catch (err) { + return ``; + } +} + +function isBuiltinPrototype(proto: unknown) { + if (proto === null) return true; + const descriptor = Object.getOwnPropertyDescriptor(proto, "constructor"); + return ( + descriptor !== undefined && + typeof descriptor.value === "function" && + builtInObjects.has(descriptor.value.name) + ); +} + +function isEntry(value: unknown): value is [unknown, unknown] { + return Array.isArray(value) && value.length === 2; +} +function maybeGetEntries(value: Record): [unknown, unknown][] | undefined { + const entriesFunction = value["entries"]; + if (typeof entriesFunction !== "function") return; + const entriesIterator: unknown = entriesFunction.call(value); + if (typeof entriesIterator !== "object" || entriesIterator === null) return; + if (!(Symbol.iterator in entriesIterator)) return; + const entries = Array.from(entriesIterator as Iterable); + if (!entries.every(isEntry)) return; + return entries; +} + +const kEntries = Symbol("kEntries"); +function hasEntries(value: unknown): value is { [kEntries]: [unknown, unknown][] } { + return typeof value === "object" && value !== null && kEntries in value; +} + +// Default custom inspect implementation for JSG resource types +function formatJsgResourceType( + this: Record, + additionalProperties: Record, + depth: number, + options: InspectOptionsStylized +): unknown { + const name = this.constructor.name; + if (depth < 0) return options.stylize(`[${name}]`, "special"); + + // Build a plain object for inspection. If this value has an `entries()` function, add those + // entries for map-like `K => V` formatting. Note we can't use a `Map` here as a key may have + // multiple values (e.g. URLSearchParams). + const record: Record = {}; + const maybeEntries = maybeGetEntries(this); + if (maybeEntries !== undefined) record[kEntries] = maybeEntries; + + // Add all instance and prototype non-function-valued properties + let current: object = this; + do { + for (const key of Object.getOwnPropertyNames(current)) { + // `Object.getOwnPropertyDescriptor()` throws `Illegal Invocation` for our prototypes here + const value = this[key]; + // Ignore function-valued and static properties + if (typeof value === "function" || this.constructor.propertyIsEnumerable(key)) continue; + record[key] = value; + } + } while (!isBuiltinPrototype((current = Object.getPrototypeOf(current)))); + + // Add additional inspect-only properties as non-enumerable so they appear in square brackets + for (const [key, symbol] of Object.entries(additionalProperties)) { + Object.defineProperty(record, key, { value: this[symbol], enumerable: false }); + } + + // Format the plain object + const inspected = inspect(record, { + ...options, + depth: options.depth == null ? null : depth, + showHidden: true, // Show non-enumerable inspect-only properties + }); + + if (maybeEntries === undefined) { + return `${name} ${inspected}`; + } else { + // Inspecting a entries object gives something like `Object(1) { 'a' => '1' }`, whereas we want + // something like `Headers(1) { 'a' => '1' }`. + return `${name}${inspected.replace("Object", "")}`; + } +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_path.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_path.ts new file mode 100644 index 000000000..174193c23 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_path.ts @@ -0,0 +1,583 @@ +import { CHAR_DOT, CHAR_FORWARD_SLASH } from "./constants"; + +import { validateObject, validateString } from "./validators"; + +function isPosixPathSeparator(code: number) { + return code === CHAR_FORWARD_SLASH; +} + +// Resolves . and .. elements in a path with directory names +function normalizeString( + path: string, + allowAboveRoot: boolean, + separator: string, + isPathSeparator: (code: number) => boolean +) { + let res = ""; + let lastSegmentLength = 0; + let lastSlash = -1; + let dots = 0; + let code = 0; + for (let i = 0; i <= path.length; ++i) { + if (i < path.length) code = path.charCodeAt(i); + else if (isPathSeparator(code)) break; + else code = CHAR_FORWARD_SLASH; + + if (isPathSeparator(code)) { + if (lastSlash === i - 1 || dots === 1) { + // NOOP + } else if (dots === 2) { + if ( + res.length < 2 || + lastSegmentLength !== 2 || + res.charCodeAt(res.length - 1) !== CHAR_DOT || + res.charCodeAt(res.length - 2) !== CHAR_DOT + ) { + if (res.length > 2) { + const lastSlashIndex = res.lastIndexOf(separator); + if (lastSlashIndex === -1) { + res = ""; + lastSegmentLength = 0; + } else { + res = res.slice(0, lastSlashIndex); + lastSegmentLength = res.length - 1 - res.lastIndexOf(separator); + } + lastSlash = i; + dots = 0; + continue; + } else if (res.length !== 0) { + res = ""; + lastSegmentLength = 0; + lastSlash = i; + dots = 0; + continue; + } + } + if (allowAboveRoot) { + res += res.length > 0 ? `${separator}..` : ".."; + lastSegmentLength = 2; + } + } else { + if (res.length > 0) res += `${separator}${path.slice(lastSlash + 1, i)}`; + else res = path.slice(lastSlash + 1, i); + lastSegmentLength = i - lastSlash - 1; + } + lastSlash = i; + dots = 0; + } else if (code === CHAR_DOT && dots !== -1) { + ++dots; + } else { + dots = -1; + } + } + return res; +} + +function formatExt(ext: string) { + return ext ? `${ext[0] === "." ? "" : "."}${ext}` : ""; +} + +/** + * @param {string} sep + * @param {{ + * dir?: string; + * root?: string; + * base?: string; + * name?: string; + * ext?: string; + * }} pathObject + * @returns {string} + */ + +type PathObject = { + dir?: string; + root?: string; + base?: string; + name?: string; + ext?: string; +}; + +function _format(sep: string, pathObject: PathObject) { + validateObject(pathObject, "pathObject", {}); + const dir = pathObject.dir || pathObject.root; + const base = pathObject.base || `${pathObject.name || ""}${formatExt(pathObject.ext!)}`; + if (!dir) { + return base; + } + return dir === pathObject.root ? `${dir}${base}` : `${dir}${sep}${base}`; +} + +// We currently do not implement the path.win32 subset. +const win32 = { + resolve(..._: [string[], string]) { + throw new Error("path.win32.resolve() is not implemented."); + }, + + normalize(_: string) { + throw new Error("path.win32.normalize() is not implemented."); + }, + + isAbsolute(_: string) { + throw new Error("path.win32.isAbsolute() is not implemented."); + }, + + join(..._: string[]) { + throw new Error("path.win32.join() is not implemented."); + }, + + relative(_0: string, _1: string) { + throw new Error("path.win32.relative() is not implemented."); + }, + + toNamespacedPath(_: string) { + throw new Error("path.win32.toNamedspacedPath() is not implemented."); + }, + + dirname(_: string) { + throw new Error("path.win32.dirname() is not implemented."); + }, + + basename(_0: string, _1?: string) { + throw new Error("path.win32.basename() is not implemented."); + }, + + extname(_: string) { + throw new Error("path.win32.extname() is not implemented."); + }, + + format(_: PathObject) { + throw new Error("path.win32.format() is not implemented."); + }, + + parse(_: string) { + throw new Error("path.win32.parse() is not implemented."); + }, + + sep: "\\", + delimiter: ";", + win32: null as Object | null, + posix: null as Object | null, +}; + +const posix = { + /** + * path.resolve([from ...], to) + * @param {...string} args + * @returns {string} + */ + resolve(...args: string[]) { + let resolvedPath = ""; + let resolvedAbsolute = false; + + for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + const path = i >= 0 ? args[i] : "/"; + + validateString(path, "path"); + + // Skip empty entries + if (path!.length === 0) { + continue; + } + + resolvedPath = `${path}/${resolvedPath}`; + resolvedAbsolute = path!.charCodeAt(0) === CHAR_FORWARD_SLASH; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, "/", isPosixPathSeparator); + + if (resolvedAbsolute) { + return `/${resolvedPath}`; + } + return resolvedPath.length > 0 ? resolvedPath : "."; + }, + + /** + * @param {string} path + * @returns {string} + */ + normalize(path: string) { + validateString(path, "path"); + + if (path.length === 0) return "."; + + const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + const trailingSeparator = path.charCodeAt(path.length - 1) === CHAR_FORWARD_SLASH; + + // Normalize the path + path = normalizeString(path, !isAbsolute, "/", isPosixPathSeparator); + + if (path.length === 0) { + if (isAbsolute) return "/"; + return trailingSeparator ? "./" : "."; + } + if (trailingSeparator) path += "/"; + + return isAbsolute ? `/${path}` : path; + }, + + /** + * @param {string} path + * @returns {boolean} + */ + isAbsolute(path: string) { + validateString(path, "path"); + return path.length > 0 && path.charCodeAt(0) === CHAR_FORWARD_SLASH; + }, + + /** + * @param {...string} args + * @returns {string} + */ + join(...args: string[]) { + if (args.length === 0) return "."; + let joined; + for (let i = 0; i < args.length; ++i) { + const arg = args[i]; + validateString(arg, "path"); + if (arg!.length > 0) { + if (joined === undefined) joined = arg; + else joined += `/${arg}`; + } + } + if (joined === undefined) return "."; + return posix.normalize(joined); + }, + + /** + * @param {string} from + * @param {string} to + * @returns {string} + */ + relative(from: string, to: string) { + validateString(from, "from"); + validateString(to, "to"); + + if (from === to) return ""; + + // Trim leading forward slashes. + from = posix.resolve(from); + to = posix.resolve(to); + + if (from === to) return ""; + + const fromStart = 1; + const fromEnd = from.length; + const fromLen = fromEnd - fromStart; + const toStart = 1; + const toLen = to.length - toStart; + + // Compare paths to find the longest common path from root + const length = fromLen < toLen ? fromLen : toLen; + let lastCommonSep = -1; + let i = 0; + for (; i < length; i++) { + const fromCode = from.charCodeAt(fromStart + i); + if (fromCode !== to.charCodeAt(toStart + i)) break; + else if (fromCode === CHAR_FORWARD_SLASH) lastCommonSep = i; + } + if (i === length) { + if (toLen > length) { + if (to.charCodeAt(toStart + i) === CHAR_FORWARD_SLASH) { + // We get here if `from` is the exact base path for `to`. + // For example: from='/foo/bar'; to='/foo/bar/baz' + return to.slice(toStart + i + 1); + } + if (i === 0) { + // We get here if `from` is the root + // For example: from='/'; to='/foo' + return to.slice(toStart + i); + } + } else if (fromLen > length) { + if (from.charCodeAt(fromStart + i) === CHAR_FORWARD_SLASH) { + // We get here if `to` is the exact base path for `from`. + // For example: from='/foo/bar/baz'; to='/foo/bar' + lastCommonSep = i; + } else if (i === 0) { + // We get here if `to` is the root. + // For example: from='/foo/bar'; to='/' + lastCommonSep = 0; + } + } + } + + let out = ""; + // Generate the relative path based on the path difference between `to` + // and `from`. + for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) { + if (i === fromEnd || from.charCodeAt(i) === CHAR_FORWARD_SLASH) { + out += out.length === 0 ? ".." : "/.."; + } + } + + // Lastly, append the rest of the destination (`to`) path that comes after + // the common path parts. + return `${out}${to.slice(toStart + lastCommonSep)}`; + }, + + /** + * @param {string} path + * @returns {string} + */ + toNamespacedPath(path: string) { + // Non-op on posix systems + return path; + }, + + /** + * @param {string} path + * @returns {string} + */ + dirname(path: string) { + validateString(path, "path"); + if (path.length === 0) return "."; + const hasRoot = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + let end = -1; + let matchedSlash = true; + for (let i = path.length - 1; i >= 1; --i) { + if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) { + if (!matchedSlash) { + end = i; + break; + } + } else { + // We saw the first non-path separator + matchedSlash = false; + } + } + + if (end === -1) return hasRoot ? "/" : "."; + if (hasRoot && end === 1) return "//"; + return path.slice(0, end); + }, + + /** + * @param {string} path + * @param {string} [suffix] + * @returns {string} + */ + basename(path: string, suffix?: string) { + if (suffix !== undefined) validateString(suffix, "ext"); + validateString(path, "path"); + + let start = 0; + let end = -1; + let matchedSlash = true; + + if (suffix !== undefined && suffix.length > 0 && suffix.length <= path.length) { + if (suffix === path) return ""; + let extIdx = suffix.length - 1; + let firstNonSlashEnd = -1; + for (let i = path.length - 1; i >= 0; --i) { + const code = path.charCodeAt(i); + if (code === CHAR_FORWARD_SLASH) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + start = i + 1; + break; + } + } else { + if (firstNonSlashEnd === -1) { + // We saw the first non-path separator, remember this index in case + // we need it if the extension ends up not matching + matchedSlash = false; + firstNonSlashEnd = i + 1; + } + if (extIdx >= 0) { + // Try to match the explicit extension + if (code === suffix.charCodeAt(extIdx)) { + if (--extIdx === -1) { + // We matched the extension, so mark this as the end of our path + // component + end = i; + } + } else { + // Extension does not match, so our result is the entire path + // component + extIdx = -1; + end = firstNonSlashEnd; + } + } + } + } + + if (start === end) end = firstNonSlashEnd; + else if (end === -1) end = path.length; + return path.slice(start, end); + } + for (let i = path.length - 1; i >= 0; --i) { + if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + start = i + 1; + break; + } + } else if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // path component + matchedSlash = false; + end = i + 1; + } + } + + if (end === -1) return ""; + return path.slice(start, end); + }, + + /** + * @param {string} path + * @returns {string} + */ + extname(path: string) { + validateString(path, "path"); + let startDot = -1; + let startPart = 0; + let end = -1; + let matchedSlash = true; + // Track the state of characters (if any) we see before our first dot and + // after any path separator we find + let preDotState = 0; + for (let i = path.length - 1; i >= 0; --i) { + const code = path.charCodeAt(i); + if (code === CHAR_FORWARD_SLASH) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // extension + matchedSlash = false; + end = i + 1; + } + if (code === CHAR_DOT) { + // If this is our first dot, mark it as the start of our extension + if (startDot === -1) startDot = i; + else if (preDotState !== 1) preDotState = 1; + } else if (startDot !== -1) { + // We saw a non-dot and non-path separator before our dot, so we should + // have a good chance at having a non-empty extension + preDotState = -1; + } + } + + if ( + startDot === -1 || + end === -1 || + // We saw a non-dot character immediately before the dot + preDotState === 0 || + // The (right-most) trimmed path component is exactly '..' + (preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) + ) { + return ""; + } + return path.slice(startDot, end); + }, + + format: _format.bind(null, "/"), + + /** + * @param {string} path + * @returns {{ + * dir: string; + * root: string; + * base: string; + * name: string; + * ext: string; + * }} + */ + parse(path: string): PathObject { + validateString(path, "path"); + + const ret = { root: "", dir: "", base: "", ext: "", name: "" }; + if (path.length === 0) return ret; + const isAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + let start; + if (isAbsolute) { + ret.root = "/"; + start = 1; + } else { + start = 0; + } + let startDot = -1; + let startPart = 0; + let end = -1; + let matchedSlash = true; + let i = path.length - 1; + + // Track the state of characters (if any) we see before our first dot and + // after any path separator we find + let preDotState = 0; + + // Get non-dir info + for (; i >= start; --i) { + const code = path.charCodeAt(i); + if (code === CHAR_FORWARD_SLASH) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // extension + matchedSlash = false; + end = i + 1; + } + if (code === CHAR_DOT) { + // If this is our first dot, mark it as the start of our extension + if (startDot === -1) startDot = i; + else if (preDotState !== 1) preDotState = 1; + } else if (startDot !== -1) { + // We saw a non-dot and non-path separator before our dot, so we should + // have a good chance at having a non-empty extension + preDotState = -1; + } + } + + if (end !== -1) { + const start = startPart === 0 && isAbsolute ? 1 : startPart; + if ( + startDot === -1 || + // We saw a non-dot character immediately before the dot + preDotState === 0 || + // The (right-most) trimmed path component is exactly '..' + (preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) + ) { + ret.base = ret.name = path.slice(start, end); + } else { + ret.name = path.slice(start, startDot); + ret.base = path.slice(start, end); + ret.ext = path.slice(startDot, end); + } + } + + if (startPart > 0) ret.dir = path.slice(0, startPart - 1); + else if (isAbsolute) ret.dir = "/"; + + return ret; + }, + + sep: "/", + delimiter: ":", + win32: null as Object | null, + posix: null as Object | null, +}; + +posix.win32 = win32.win32 = win32; +posix.posix = win32.posix = posix; + +export default posix; +export { posix, win32 }; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_stringdecoder.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_stringdecoder.ts new file mode 100644 index 000000000..0ed5a1db5 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_stringdecoder.ts @@ -0,0 +1,135 @@ +import { Buffer, isEncoding } from "./internal_buffer"; +import { normalizeEncoding } from "./internal_utils"; +import { ERR_INVALID_ARG_TYPE, ERR_INVALID_THIS, ERR_UNKNOWN_ENCODING } from "./internal_errors"; + +import * as bufferUtil from "./buffer"; + +const kIncompleteCharactersStart = 0; +const kIncompleteCharactersEnd = 4; +const kMissingBytes = 4; +const kBufferedBytes = 5; +const kEncoding = 6; +const kSize = 7; + +const encodings: Record = { + ascii: 0, + latin1: 1, + utf8: 2, + utf16le: 3, + base64: 4, + base64url: 5, + hex: 6, +}; + +const kNativeDecoder = Symbol("kNativeDecoder"); + +export interface StringDecoder { + encoding: string; + readonly lastChar: Uint8Array; + readonly lastNeed: number; + readonly lastTotal: number; + new (encoding?: string): StringDecoder; + write(buf: ArrayBufferView | DataView | string): string; + end(buf?: ArrayBufferView | DataView | string): string; + text(buf: ArrayBufferView | DataView | string, offset?: number): string; + new (encoding?: string): StringDecoder; +} + +interface InternalDecoder extends StringDecoder { + [kNativeDecoder]: Buffer; +} + +export function StringDecoder(this: StringDecoder, encoding: string = "utf8") { + const normalizedEncoding = normalizeEncoding(encoding); + if (!isEncoding(normalizedEncoding)) { + throw new ERR_UNKNOWN_ENCODING(encoding); + } + (this as InternalDecoder)[kNativeDecoder] = Buffer.alloc(kSize); + (this as InternalDecoder)[kNativeDecoder][kEncoding] = encodings[normalizedEncoding!]!; + this.encoding = normalizedEncoding!; +} + +function write(this: StringDecoder, buf: ArrayBufferView | DataView | string): string { + if ((this as InternalDecoder)[kNativeDecoder] === undefined) { + throw new ERR_INVALID_THIS("StringDecoder"); + } + if (typeof buf === "string") { + return buf; + } + if (!ArrayBuffer.isView(buf)) { + throw new ERR_INVALID_ARG_TYPE("buf", ["Buffer", "TypedArray", "DataView", "string"], buf); + } + const buffer = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); + return bufferUtil.decode(buffer, (this as InternalDecoder)[kNativeDecoder]); +} + +function end(this: StringDecoder, buf?: ArrayBufferView | DataView | string): string { + if ((this as InternalDecoder)[kNativeDecoder] === undefined) { + throw new ERR_INVALID_THIS("StringDecoder"); + } + let ret = ""; + if (buf !== undefined) { + ret = this.write(buf); + } + if ((this as InternalDecoder)[kNativeDecoder][kBufferedBytes]! > 0) { + ret += bufferUtil.flush((this as InternalDecoder)[kNativeDecoder]); + } + return ret; +} + +function text( + this: StringDecoder, + buf: ArrayBufferView | DataView | string, + offset?: number +): string { + if ((this as InternalDecoder)[kNativeDecoder] === undefined) { + throw new ERR_INVALID_THIS("StringDecoder"); + } + (this as InternalDecoder)[kNativeDecoder][kMissingBytes] = 0; + (this as InternalDecoder)[kNativeDecoder][kBufferedBytes] = 0; + return this.write((buf as any).slice(offset)); +} + +StringDecoder.prototype.write = write; +StringDecoder.prototype.end = end; +StringDecoder.prototype.text = text; + +Object.defineProperties(StringDecoder.prototype, { + lastChar: { + enumerable: true, + get(this: StringDecoder): Buffer { + if ((this as InternalDecoder)[kNativeDecoder] === undefined) { + throw new ERR_INVALID_THIS("StringDecoder"); + } + return (this as InternalDecoder)[kNativeDecoder].subarray( + kIncompleteCharactersStart, + kIncompleteCharactersEnd + ) as Buffer; + }, + }, + lastNeed: { + enumerable: true, + get(this: StringDecoder): number { + if ((this as InternalDecoder)[kNativeDecoder] === undefined) { + throw new ERR_INVALID_THIS("StringDecoder"); + } + return (this as InternalDecoder)[kNativeDecoder][kMissingBytes]!; + }, + }, + lastTotal: { + enumerable: true, + get(this: StringDecoder): number { + if ((this as InternalDecoder)[kNativeDecoder] === undefined) { + throw new ERR_INVALID_THIS("StringDecoder"); + } + return ( + (this as InternalDecoder)[kNativeDecoder][kBufferedBytes]! + + (this as InternalDecoder)[kNativeDecoder][kMissingBytes]! + ); + }, + }, +}); + +export default { + StringDecoder, +}; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_types.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_types.ts new file mode 100644 index 000000000..5fd751258 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_types.ts @@ -0,0 +1,96 @@ +import * as internal from "./util"; + +export function isCryptoKey(value: unknown): boolean { + return value instanceof CryptoKey; +} + +export function isKeyObject(_value: unknown): boolean { + // TODO(nodecompat): We currently do not implement KeyObject + return false; +} + +export const isAsyncFunction = internal.isAsyncFunction.bind(internal); +export const isGeneratorFunction = internal.isGeneratorFunction.bind(internal); +export const isGeneratorObject = internal.isGeneratorObject.bind(internal); +export const isAnyArrayBuffer = internal.isAnyArrayBuffer.bind(internal); +export const isArrayBuffer = internal.isArrayBuffer.bind(internal); +export const isArgumentsObject = internal.isArgumentsObject.bind(internal); +export const isBoxedPrimitive = internal.isBoxedPrimitive.bind(internal); +export const isDataView = internal.isDataView.bind(internal); +export const isMap = internal.isMap.bind(internal); +export const isMapIterator = internal.isMapIterator.bind(internal); +export const isModuleNamespaceObject = internal.isModuleNamespaceObject.bind(internal); +export const isNativeError = internal.isNativeError.bind(internal); +export const isPromise = internal.isPromise.bind(internal); +export const isProxy = internal.isProxy.bind(internal); +export const isSet = internal.isSet.bind(internal); +export const isSetIterator = internal.isSetIterator.bind(internal); +export const isSharedArrayBuffer = internal.isSharedArrayBuffer.bind(internal); +export const isWeakMap = internal.isWeakMap.bind(internal); +export const isWeakSet = internal.isWeakSet.bind(internal); +export const isRegExp = internal.isRegExp.bind(internal); +export const isDate = internal.isDate.bind(internal); +export const isStringObject = internal.isStringObject.bind(internal); +export const isSymbolObject = internal.isSymbolObject.bind(internal); +export const isNumberObject = internal.isNumberObject.bind(internal); +export const isBooleanObject = internal.isBooleanObject.bind(internal); +export const isBigIntObject = internal.isBigIntObject.bind(internal); +export const isArrayBufferView = internal.isArrayBufferView.bind(internal); +export const isBigInt64Array = internal.isBigInt64Array.bind(internal); +export const isBigUint64Array = internal.isBigUint64Array.bind(internal); +export const isFloat32Array = internal.isFloat32Array.bind(internal); +export const isFloat64Array = internal.isFloat64Array.bind(internal); +export const isInt8Array = internal.isInt8Array.bind(internal); +export const isInt16Array = internal.isInt16Array.bind(internal); +export const isInt32Array = internal.isInt32Array.bind(internal); +export const isTypedArray = internal.isTypedArray.bind(internal); +export const isUint8Array = internal.isUint8Array.bind(internal); +export const isUint8ClampedArray = internal.isUint8ClampedArray.bind(internal); +export const isUint16Array = internal.isUint16Array.bind(internal); +export const isUint32Array = internal.isUint32Array.bind(internal); + +export default { + isCryptoKey, + isKeyObject, + + isAsyncFunction, + isGeneratorFunction, + isGeneratorObject, + isAnyArrayBuffer, + isArrayBuffer, + isArgumentsObject, + isBoxedPrimitive, + isDataView, + isMap, + isMapIterator, + isModuleNamespaceObject, + isNativeError, + isPromise, + isProxy, + isSet, + isSetIterator, + isSharedArrayBuffer, + isWeakMap, + isWeakSet, + isRegExp, + isDate, + isStringObject, + isSymbolObject, + isNumberObject, + isBooleanObject, + isBigIntObject, + isArrayBufferView, + isBigInt64Array, + isBigUint64Array, + isFloat32Array, + isFloat64Array, + isInt8Array, + isInt16Array, + isInt32Array, + isTypedArray, + isUint8Array, + isUint8ClampedArray, + isUint16Array, + isUint32Array, + // TODO(soon): isExternal +}; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_utils.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_utils.ts new file mode 100644 index 000000000..6cf8b3848 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/internal_utils.ts @@ -0,0 +1,167 @@ +export function normalizeEncoding(enc?: string): string | undefined { + if (enc == null || enc === "utf8" || enc === "utf-8" || enc === "UTF8" || enc === "UTF-8") + return "utf8"; + return slowCases(enc); +} + +export function slowCases(enc: string): string | undefined { + switch (enc.length) { + case 4: + if (enc === "UTF8") return "utf8"; + if (enc === "ucs2" || enc === "UCS2") return "utf16le"; + enc = `${enc}`.toLowerCase(); + if (enc === "utf8") return "utf8"; + if (enc === "ucs2") return "utf16le"; + break; + case 3: + if (enc === "hex" || enc === "HEX" || `${enc}`.toLowerCase() === "hex") { + return "hex"; + } + break; + case 5: + if (enc === "ascii") return "ascii"; + if (enc === "ucs-2") return "utf16le"; + if (enc === "UTF-8") return "utf8"; + if (enc === "ASCII") return "ascii"; + if (enc === "UCS-2") return "utf16le"; + enc = `${enc}`.toLowerCase(); + if (enc === "utf-8") return "utf8"; + if (enc === "ascii") return "ascii"; + if (enc === "ucs-2") return "utf16le"; + break; + case 6: + if (enc === "base64") return "base64"; + if (enc === "latin1" || enc === "binary") return "latin1"; + if (enc === "BASE64") return "base64"; + if (enc === "LATIN1" || enc === "BINARY") return "latin1"; + enc = `${enc}`.toLowerCase(); + if (enc === "base64") return "base64"; + if (enc === "latin1" || enc === "binary") return "latin1"; + break; + case 7: + if (enc === "utf16le" || enc === "UTF16LE" || `${enc}`.toLowerCase() === "utf16le") { + return "utf16le"; + } + break; + case 8: + if (enc === "utf-16le" || enc === "UTF-16LE" || `${enc}`.toLowerCase() === "utf-16le") { + return "utf16le"; + } + break; + case 9: + if ( + enc === "base64url" || + enc === "BASE64URL" || + `${enc}`.toLowerCase() === "base64url" + ) { + return "base64url"; + } + break; + default: + if (enc === "") return "utf8"; + } + return undefined; +} + +export function spliceOne(list: (string | undefined)[], index: number) { + for (; index + 1 < list.length; index++) list[index] = list[index + 1]; + list.pop(); +} + +export const ALL_PROPERTIES = 0; +export const ONLY_WRITABLE = 1; +export const ONLY_ENUMERABLE = 2; +export const ONLY_CONFIGURABLE = 4; +export const ONLY_ENUM_WRITABLE = 6; +export const SKIP_STRINGS = 8; +export const SKIP_SYMBOLS = 16; + +const isNumericLookup: Record = {}; +export function isArrayIndex(value: unknown): value is number | string { + switch (typeof value) { + case "number": + return value >= 0 && (value | 0) === value; + case "string": { + const result = isNumericLookup[value]; + if (result !== void 0) { + return result; + } + const length = value.length; + if (length === 0) { + return (isNumericLookup[value] = false); + } + let ch = 0; + let i = 0; + for (; i < length; ++i) { + ch = value.charCodeAt(i); + if ( + (i === 0 && ch === 0x30 && length > 1) /* must not start with 0 */ || + ch < 0x30 /* 0 */ || + ch > 0x39 /* 9 */ + ) { + return (isNumericLookup[value] = false); + } + } + return (isNumericLookup[value] = true); + } + default: + return false; + } +} + +export function getOwnNonIndexProperties( + // deno-lint-ignore ban-types + obj: object, + filter: number +): (string | symbol)[] { + let allProperties = [...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj)]; + + if (Array.isArray(obj)) { + allProperties = allProperties.filter((k) => !isArrayIndex(k)); + } + + if (filter === ALL_PROPERTIES) { + return allProperties; + } + + const result: (string | symbol)[] = []; + for (const key of allProperties) { + const desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc === undefined) { + continue; + } + if (filter & ONLY_WRITABLE && !desc.writable) { + continue; + } + if (filter & ONLY_ENUMERABLE && !desc.enumerable) { + continue; + } + if (filter & ONLY_CONFIGURABLE && !desc.configurable) { + continue; + } + if (filter & SKIP_STRINGS && typeof key === "string") { + continue; + } + if (filter & SKIP_SYMBOLS && typeof key === "symbol") { + continue; + } + result.push(key); + } + return result; +} + +export function createDeferredPromise() { + let resolve; + let reject; + + // eslint-disable-next-line promise/param-names + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { + promise, + resolve, + reject, + }; +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/process.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/process.ts new file mode 100644 index 000000000..522a74ecd --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/process.ts @@ -0,0 +1,80 @@ +import { validateObject } from "./validators"; + +import { ERR_INVALID_ARG_VALUE } from "./internal_errors"; + +export function nextTick(cb: Function, ...args: unknown[]) { + queueMicrotask(() => { + cb(...args); + }); +} + +// Note that there is no process-level environment in workers so the process.env +// object is initially empty. This is different from Node.js where process.env +// picks up values from the operating system environment. The configured bindings +// for the worker are accessible from the env argument passed into the fetch +// handler and have no impact here. + +export const env = new Proxy( + {}, + { + // Per Node.js rules. process.env values must be coerced to strings. + // When defined using defineProperty, the property descriptor must be writable, + // configurable, and enumerable using just a falsy check. Getters and setters + // are not permitted. + set(obj: object, prop: PropertyKey, value: any) { + return Reflect.set(obj, prop, `${value}`); + }, + defineProperty(obj: object, prop: PropertyKey, descriptor: PropertyDescriptor) { + validateObject(descriptor, "descriptor", {}); + if (Reflect.has(descriptor, "get") || Reflect.has(descriptor, "set")) { + throw new ERR_INVALID_ARG_VALUE( + "descriptor", + descriptor, + "process.env value must not have getter/setter" + ); + } + if (!descriptor.configurable) { + throw new ERR_INVALID_ARG_VALUE( + "descriptor.configurable", + descriptor, + "process.env value must be configurable" + ); + } + if (!descriptor.enumerable) { + throw new ERR_INVALID_ARG_VALUE( + "descriptor.enumerable", + descriptor, + "process.env value must be enumerable" + ); + } + if (!descriptor.writable) { + throw new ERR_INVALID_ARG_VALUE( + "descriptor.writable", + descriptor, + "process.env value must be writable" + ); + } + if (Reflect.has(descriptor, "value")) { + Reflect.set(descriptor, "value", `${descriptor.value}`); + } else { + throw new ERR_INVALID_ARG_VALUE( + "descriptor.value", + descriptor, + "process.env value must be specified explicitly" + ); + } + return Reflect.defineProperty(obj, prop, descriptor); + }, + } +); + +export const argv = []; + +export const platform = "wasm"; + +export default { + nextTick, + env, + argv, + platform, +}; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_adapters.js b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_adapters.js new file mode 100644 index 000000000..819808333 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_adapters.js @@ -0,0 +1,687 @@ +/* eslint-disable */ +import { Readable } from "./streams_readable"; + +import { TextEncoder, TextDecoder } from "@sinonjs/text-encoding"; + +import { Writable } from "./streams_writable"; + +import { Duplex } from "./streams_duplex"; + +import { + destroy, + eos as finished, + isDestroyed, + isReadable, + isWritable, + isWritableEnded, +} from "./streams_util"; + +import { Buffer } from "./internal_buffer"; + +import { + ERR_INVALID_ARG_TYPE, + ERR_INVALID_ARG_VALUE, + ERR_STREAM_PREMATURE_CLOSE, + AbortError, +} from "./internal_errors"; + +import { createDeferredPromise, normalizeEncoding } from "./internal_utils"; + +import { validateBoolean, validateObject } from "./validators"; + +import * as process from "./process"; + +const encoder = new TextEncoder(); + +/** + * @param {Writable} streamWritable + * @returns {WritableStream} + */ +export function newWritableStreamFromStreamWritable(streamWritable) { + // Not using the internal/streams/utils isWritableNodeStream utility + // here because it will return false if streamWritable is a Duplex + // whose writable option is false. For a Duplex that is not writable, + // we want it to pass this check but return a closed WritableStream. + // We check if the given stream is a stream.Writable or http.OutgoingMessage + const checkIfWritableOrOutgoingMessage = + streamWritable && + typeof streamWritable?.write === "function" && + typeof streamWritable?.on === "function"; + if (!checkIfWritableOrOutgoingMessage) { + throw new ERR_INVALID_ARG_TYPE("streamWritable", "stream.Writable", streamWritable); + } + + if (isDestroyed(streamWritable) || !isWritable(streamWritable)) { + const writable = new WritableStream(); + writable.close(); + return writable; + } + + const highWaterMark = streamWritable.writableHighWaterMark; + const strategy = streamWritable.writableObjectMode + ? new CountQueuingStrategy({ highWaterMark }) + : { highWaterMark }; + + let controller; + let backpressurePromise; + let closed; + + function onDrain() { + if (backpressurePromise !== undefined) backpressurePromise.resolve(); + } + + const cleanup = finished(streamWritable, (error) => { + if (error?.code === "ERR_STREAM_PREMATURE_CLOSE") { + const err = new AbortError(undefined, { cause: error }); + error = err; + } + + cleanup(); + // This is a protection against non-standard, legacy streams + // that happen to emit an error event again after finished is called. + streamWritable.on("error", () => {}); + if (error != null) { + if (backpressurePromise !== undefined) backpressurePromise.reject(error); + // If closed is not undefined, the error is happening + // after the WritableStream close has already started. + // We need to reject it here. + if (closed !== undefined) { + closed.reject(error); + closed = undefined; + } + controller.error(error); + controller = undefined; + return; + } + + if (closed !== undefined) { + closed.resolve(); + closed = undefined; + return; + } + controller.error(new AbortError()); + controller = undefined; + }); + + streamWritable.on("drain", onDrain); + + return new WritableStream( + { + start(c) { + controller = c; + }, + + async write(chunk) { + if (streamWritable.writableNeedDrain || !streamWritable.write(chunk)) { + backpressurePromise = createDeferredPromise(); + return backpressurePromise.promise.finally(() => { + backpressurePromise = undefined; + }); + } + }, + + abort(reason) { + destroy(streamWritable, reason); + }, + + close() { + if (closed === undefined && !isWritableEnded(streamWritable)) { + closed = createDeferredPromise(); + streamWritable.end(); + return closed.promise; + } + + controller = undefined; + return Promise.resolve(); + }, + }, + strategy + ); +} + +/** + * @param {WritableStream} writableStream + * @param {{ + * decodeStrings? : boolean, + * highWaterMark? : number, + * objectMode? : boolean, + * signal? : AbortSignal, + * }} [options] + * @returns {Writable} + */ +export function newStreamWritableFromWritableStream(writableStream, options = {}) { + if (!(writableStream instanceof WritableStream)) { + throw new ERR_INVALID_ARG_TYPE("writableStream", "WritableStream", writableStream); + } + + validateObject(options, "options"); + const { highWaterMark, decodeStrings = true, objectMode = false, signal } = options; + + validateBoolean(objectMode, "options.objectMode"); + validateBoolean(decodeStrings, "options.decodeStrings"); + + const writer = writableStream.getWriter(); + let closed = false; + + const writable = new Writable({ + highWaterMark, + objectMode, + decodeStrings, + signal, + + writev(chunks, callback) { + function done(error) { + error = error.filter((e) => e); + try { + callback(error.length === 0 ? undefined : error); + } catch (error) { + // In a next tick because this is happening within + // a promise context, and if there are any errors + // thrown we don't want those to cause an unhandled + // rejection. Let's just escape the promise and + // handle it separately. + process.nextTick(() => destroy(writable, error)); + } + } + + writer.ready.then(() => { + return Promise.all(chunks.map((data) => writer.write(data))).then(done, done); + }, done); + }, + + write(chunk, encoding, callback) { + if (typeof chunk === "string" && decodeStrings && !objectMode) { + const enc = normalizeEncoding(encoding); + + if (enc === "utf8") { + chunk = encoder.encode(chunk); + } else { + chunk = Buffer.from(chunk, encoding); + chunk = new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength); + } + } + + function done(error) { + try { + callback(error); + } catch (error) { + destroy(writable, error); + } + } + + writer.ready.then(() => { + return writer.write(chunk).then(done, done); + }, done); + }, + + destroy(error, callback) { + function done() { + try { + callback(error); + } catch (error) { + // In a next tick because this is happening within + // a promise context, and if there are any errors + // thrown we don't want those to cause an unhandled + // rejection. Let's just escape the promise and + // handle it separately. + process.nextTick(() => { + throw error; + }); + } + } + + if (!closed) { + if (error != null) { + writer.abort(error).then(done, done); + } else { + writer.close().then(done, done); + } + return; + } + + done(); + }, + + final(callback) { + function done(error) { + try { + callback(error); + } catch (error) { + // In a next tick because this is happening within + // a promise context, and if there are any errors + // thrown we don't want those to cause an unhandled + // rejection. Let's just escape the promise and + // handle it separately. + process.nextTick(() => destroy(writable, error)); + } + } + + if (!closed) { + writer.close().then(done, done); + } + }, + }); + + writer.closed.then( + () => { + // If the WritableStream closes before the stream.Writable has been + // ended, we signal an error on the stream.Writable. + closed = true; + if (!isWritableEnded(writable)) destroy(writable, new ERR_STREAM_PREMATURE_CLOSE()); + }, + (error) => { + // If the WritableStream errors before the stream.Writable has been + // destroyed, signal an error on the stream.Writable. + closed = true; + destroy(writable, error); + } + ); + + return writable; +} + +/** + * @typedef {import('./queuingstrategies').QueuingStrategy} QueuingStrategy + * @param {Readable} streamReadable + * @param {{ + * strategy : QueuingStrategy + * }} [options] + * @returns {ReadableStream} + */ +export function newReadableStreamFromStreamReadable(streamReadable, options = {}) { + // Not using the internal/streams/utils isReadableNodeStream utility + // here because it will return false if streamReadable is a Duplex + // whose readable option is false. For a Duplex that is not readable, + // we want it to pass this check but return a closed ReadableStream. + if (typeof streamReadable?._readableState !== "object") { + throw new ERR_INVALID_ARG_TYPE("streamReadable", "stream.Readable", streamReadable); + } + + if (isDestroyed(streamReadable) || !isReadable(streamReadable)) { + const readable = new ReadableStream(); + readable.cancel(); + return readable; + } + + const objectMode = streamReadable.readableObjectMode; + const highWaterMark = streamReadable.readableHighWaterMark; + + const evaluateStrategyOrFallback = (strategy) => { + // If there is a strategy available, use it + if (strategy) return strategy; + + if (objectMode) { + // When running in objectMode explicitly but no strategy, we just fall + // back to CountQueuingStrategy + return new CountQueuingStrategy({ highWaterMark }); + } + + // When not running in objectMode explicitly, we just fall + // back to a minimal strategy that just specifies the highWaterMark + // and no size algorithm. Using a ByteLengthQueuingStrategy here + // is unnecessary. + return { highWaterMark }; + }; + + const strategy = evaluateStrategyOrFallback(options?.strategy); + + let controller; + + function onData(chunk) { + // Copy the Buffer to detach it from the pool. + if (Buffer.isBuffer(chunk) && !objectMode) chunk = new Uint8Array(chunk); + controller.enqueue(chunk); + if (controller.desiredSize <= 0) streamReadable.pause(); + } + + streamReadable.pause(); + + const cleanup = finished(streamReadable, (error) => { + if (error?.code === "ERR_STREAM_PREMATURE_CLOSE") { + const err = new AbortError(undefined, { cause: error }); + error = err; + } + + cleanup(); + // This is a protection against non-standard, legacy streams + // that happen to emit an error event again after finished is called. + streamReadable.on("error", () => {}); + if (error) return controller.error(error); + controller.close(); + }); + + streamReadable.on("data", onData); + + return new ReadableStream( + { + start(c) { + controller = c; + }, + + pull() { + streamReadable.resume(); + }, + + cancel(reason) { + destroy(streamReadable, reason); + }, + }, + strategy + ); +} + +/** + * @param {ReadableStream} readableStream + * @param {{ + * highWaterMark? : number, + * encoding? : string, + * objectMode? : boolean, + * signal? : AbortSignal, + * }} [options] + * @returns {Readable} + */ +export function newStreamReadableFromReadableStream(readableStream, options = {}) { + if (!(readableStream instanceof ReadableStream)) { + throw new ERR_INVALID_ARG_TYPE("readableStream", "ReadableStream", readableStream); + } + + validateObject(options, "options"); + const { highWaterMark, encoding, objectMode = false, signal } = options; + + if (encoding !== undefined && !Buffer.isEncoding(encoding)) + throw new ERR_INVALID_ARG_VALUE(encoding, "options.encoding"); + validateBoolean(objectMode, "options.objectMode"); + + const reader = readableStream.getReader(); + let closed = false; + + const readable = new Readable({ + objectMode, + highWaterMark, + encoding, + signal, + + read() { + reader.read().then( + (chunk) => { + if (chunk.done) { + // Value should always be undefined here. + readable.push(null); + } else { + readable.push(chunk.value); + } + }, + (error) => destroy(readable, error) + ); + }, + + destroy(error, callback) { + function done() { + try { + callback(error); + } catch (error) { + // In a next tick because this is happening within + // a promise context, and if there are any errors + // thrown we don't want those to cause an unhandled + // rejection. Let's just escape the promise and + // handle it separately. + process.nextTick(() => { + throw error; + }); + } + } + + if (!closed) { + reader.cancel(error).then(done, done); + return; + } + done(); + }, + }); + + reader.closed.then( + () => { + closed = true; + }, + (error) => { + closed = true; + destroy(readable, error); + } + ); + + return readable; +} + +/** + * @typedef {import('./readablestream').ReadableWritablePair + * } ReadableWritablePair + * @typedef {import('../../stream').Duplex} Duplex + */ + +/** + * @param {Duplex} duplex + * @returns {ReadableWritablePair} + */ +export function newReadableWritablePairFromDuplex(duplex) { + // Not using the internal/streams/utils isWritableNodeStream and + // isReadableNodeStream utilities here because they will return false + // if the duplex was created with writable or readable options set to + // false. Instead, we'll check the readable and writable state after + // and return closed WritableStream or closed ReadableStream as + // necessary. + if (typeof duplex?._writableState !== "object" || typeof duplex?._readableState !== "object") { + throw new ERR_INVALID_ARG_TYPE("duplex", "stream.Duplex", duplex); + } + + if (isDestroyed(duplex)) { + const writable = new WritableStream(); + const readable = new ReadableStream(); + writable.close(); + readable.cancel(); + return { readable, writable }; + } + + const writable = isWritable(duplex) + ? newWritableStreamFromStreamWritable(duplex) + : new WritableStream(); + + if (!isWritable(duplex)) writable.close(); + + const readable = isReadable(duplex) + ? newReadableStreamFromStreamReadable(duplex) + : new ReadableStream(); + + if (!isReadable(duplex)) readable.cancel(); + + return { writable, readable }; +} + +/** + * @param {ReadableWritablePair} pair + * @param {{ + * allowHalfOpen? : boolean, + * decodeStrings? : boolean, + * encoding? : string, + * highWaterMark? : number, + * objectMode? : boolean, + * signal? : AbortSignal, + * }} [options] + * @returns {Duplex} + */ +export function newStreamDuplexFromReadableWritablePair(pair = {}, options = {}) { + validateObject(pair, "pair"); + const { readable: readableStream, writable: writableStream } = pair; + + if (!(readableStream instanceof ReadableStream)) { + throw new ERR_INVALID_ARG_TYPE("pair.readable", "ReadableStream", readableStream); + } + if (!(writableStream instanceof WritableStream)) { + throw new ERR_INVALID_ARG_TYPE("pair.writable", "WritableStream", writableStream); + } + + validateObject(options, "options"); + const { + allowHalfOpen = false, + objectMode = false, + encoding, + decodeStrings = true, + highWaterMark, + signal, + } = options; + + validateBoolean(objectMode, "options.objectMode"); + if (encoding !== undefined && !Buffer.isEncoding(encoding)) + throw new ERR_INVALID_ARG_VALUE(encoding, "options.encoding"); + + const writer = writableStream.getWriter(); + const reader = readableStream.getReader(); + let writableClosed = false; + let readableClosed = false; + + const duplex = new Duplex({ + allowHalfOpen, + highWaterMark, + objectMode, + encoding, + decodeStrings, + signal, + + writev(chunks, callback) { + function done(error) { + error = error.filter((e) => e); + try { + callback(error.length === 0 ? undefined : error); + } catch (error) { + // In a next tick because this is happening within + // a promise context, and if there are any errors + // thrown we don't want those to cause an unhandled + // rejection. Let's just escape the promise and + // handle it separately. + process.nextTick(() => destroy(duplex, error)); + } + } + + writer.ready.then(() => { + return Promise.all( + chunks.map((data) => { + return writer.write(data); + }) + ).then(done, done); + }, done); + }, + + write(chunk, encoding, callback) { + if (typeof chunk === "string" && decodeStrings && !objectMode) { + const enc = normalizeEncoding(encoding); + + if (enc === "utf8") { + chunk = encoder.encode(chunk); + } else { + chunk = Buffer.from(chunk, encoding); + chunk = new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength); + } + } + + function done(error) { + try { + callback(error); + } catch (error) { + destroy(duplex, error); + } + } + + writer.ready.then(() => { + return writer.write(chunk).then(done, done); + }, done); + }, + + final(callback) { + function done(error) { + try { + callback(error); + } catch (error) { + // In a next tick because this is happening within + // a promise context, and if there are any errors + // thrown we don't want those to cause an unhandled + // rejection. Let's just escape the promise and + // handle it separately. + process.nextTick(() => destroy(duplex, error)); + } + } + + if (!writableClosed) { + writer.close().then(done, done); + } + }, + + read() { + reader.read().then( + (chunk) => { + if (chunk.done) { + duplex.push(null); + } else { + duplex.push(chunk.value); + } + }, + (error) => destroy(duplex, error) + ); + }, + + destroy(error, callback) { + function done() { + try { + callback(error); + } catch (error) { + // In a next tick because this is happening within + // a promise context, and if there are any errors + // thrown we don't want those to cause an unhandled + // rejection. Let's just escape the promise and + // handle it separately. + process.nextTick(() => { + throw error; + }); + } + } + + async function closeWriter() { + if (!writableClosed) await writer.abort(error); + } + + async function closeReader() { + if (!readableClosed) await reader.cancel(error); + } + + if (!writableClosed || !readableClosed) { + Promise.all([closeWriter(), closeReader()]).then(done, done); + return; + } + + done(); + }, + }); + + writer.closed.then( + () => { + writableClosed = true; + if (!isWritableEnded(duplex)) destroy(duplex, new ERR_STREAM_PREMATURE_CLOSE()); + }, + (error) => { + writableClosed = true; + readableClosed = true; + destroy(duplex, error); + } + ); + + reader.closed.then( + () => { + readableClosed = true; + }, + (error) => { + writableClosed = true; + readableClosed = true; + destroy(duplex, error); + } + ); + + return duplex; +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_duplex.js b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_duplex.js new file mode 100644 index 000000000..61439b173 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_duplex.js @@ -0,0 +1,475 @@ +import { Readable, from } from "./streams_readable"; + +import { Writable } from "./streams_writable"; + +import { + newStreamDuplexFromReadableWritablePair, + newReadableWritablePairFromDuplex, +} from "./streams_adapters"; + +import { createDeferredPromise } from "./internal_utils"; + +import * as process from "./process"; + +import { + destroyer, + eos, + isReadable, + isWritable, + isIterable, + isNodeStream, + isReadableNodeStream, + isWritableNodeStream, + isDuplexNodeStream, +} from "./streams_util"; + +import { AbortError, ERR_INVALID_ARG_TYPE, ERR_INVALID_RETURN_VALUE } from "./internal_errors"; + +Object.setPrototypeOf(Duplex.prototype, Readable.prototype); +Object.setPrototypeOf(Duplex, Readable); +{ + const keys = Object.keys(Writable.prototype); + // Allow the keys array to be GC'ed. + for (let i = 0; i < keys.length; i++) { + const method = keys[i]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +export function isDuplexInstance(obj) { + return obj instanceof Duplex; +} + +export function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + Readable.call(this, options); + Writable.call(this, options); + if (options) { + this.allowHalfOpen = options.allowHalfOpen !== false; + if (options.readable === false) { + this._readableState.readable = false; + this._readableState.ended = true; + this._readableState.endEmitted = true; + } + if (options.writable === false) { + this._writableState.writable = false; + this._writableState.ending = true; + this._writableState.ended = true; + this._writableState.finished = true; + } + } else { + this.allowHalfOpen = true; + } +} +Object.defineProperties(Duplex.prototype, { + writable: { + ...Object.getOwnPropertyDescriptor(Writable.prototype, "writable"), + }, + writableHighWaterMark: { + ...Object.getOwnPropertyDescriptor(Writable.prototype, "writableHighWaterMark"), + }, + writableObjectMode: { + ...Object.getOwnPropertyDescriptor(Writable.prototype, "writableObjectMode"), + }, + writableBuffer: { + ...Object.getOwnPropertyDescriptor(Writable.prototype, "writableBuffer"), + }, + writableLength: { + ...Object.getOwnPropertyDescriptor(Writable.prototype, "writableLength"), + }, + writableFinished: { + ...Object.getOwnPropertyDescriptor(Writable.prototype, "writableFinished"), + }, + writableCorked: { + ...Object.getOwnPropertyDescriptor(Writable.prototype, "writableCorked"), + }, + writableEnded: { + ...Object.getOwnPropertyDescriptor(Writable.prototype, "writableEnded"), + }, + writableNeedDrain: { + ...Object.getOwnPropertyDescriptor(Writable.prototype, "writableNeedDrain"), + }, + destroyed: { + get() { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set(value) { + // Backward compatibility, the user is explicitly + // managing destroyed. + if (this._readableState && this._writableState) { + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } + }, + }, +}); + +Duplex.fromWeb = function (pair, options) { + return newStreamDuplexFromReadableWritablePair(pair, options); +}; +Duplex.toWeb = function (duplex) { + return newReadableWritablePairFromDuplex(duplex); +}; + +// ====================================================================================== + +Duplex.from = function (body) { + return duplexify(body, "body"); +}; + +function isBlob(b) { + return b instanceof Blob; +} + +// This is needed for pre node 17. +class Duplexify extends Duplex { + constructor(options) { + super(options); + // https://github.com/nodejs/node/pull/34385 + + if ((options === null || options === undefined ? undefined : options.readable) === false) { + this["_readableState"].readable = false; + this["_readableState"].ended = true; + this["_readableState"].endEmitted = true; + } + if ((options === null || options === undefined ? undefined : options.writable) === false) { + this["_readableState"].writable = false; + this["_readableState"].ending = true; + this["_readableState"].ended = true; + this["_readableState"].finished = true; + } + } +} + +function duplexify(body, name) { + if (isDuplexNodeStream(body)) { + return body; + } + if (isReadableNodeStream(body)) { + return _duplexify({ + readable: body, + }); + } + if (isWritableNodeStream(body)) { + return _duplexify({ + writable: body, + }); + } + if (isNodeStream(body)) { + return _duplexify({ + writable: false, + readable: false, + }); + } + + // TODO: Webstreams + // if (isReadableStream(body)) { + // return _duplexify({ readable: Readable.fromWeb(body) }); + // } + + // TODO: Webstreams + // if (isWritableStream(body)) { + // return _duplexify({ writable: Writable.fromWeb(body) }); + // } + + if (typeof body === "function") { + const { value, write, final, destroy } = fromAsyncGen(body); + if (isIterable(value)) { + return from(Duplexify, value, { + // TODO (ronag): highWaterMark? + objectMode: true, + write, + final, + destroy, + }); + } + const then = value.then; + if (typeof then === "function") { + let d; + const promise = Reflect.apply(then, value, [ + (val) => { + if (val != null) { + throw new ERR_INVALID_RETURN_VALUE("nully", "body", val); + } + }, + (err) => { + destroyer(d, err); + }, + ]); + + return (d = new Duplexify({ + // TODO (ronag): highWaterMark? + objectMode: true, + readable: false, + write, + final(cb) { + final(async () => { + try { + await promise; + process.nextTick(cb, null); + } catch (err) { + process.nextTick(cb, err); + } + }); + }, + destroy, + })); + } + throw new ERR_INVALID_RETURN_VALUE("Iterable, AsyncIterable or AsyncFunction", name, value); + } + if (isBlob(body)) { + return duplexify(body.arrayBuffer(), name); + } + if (isIterable(body)) { + return from(Duplexify, body, { + // TODO (ronag): highWaterMark? + objectMode: true, + writable: false, + }); + } + + // TODO: Webstreams. + // if ( + // isReadableStream(body?.readable) && + // isWritableStream(body?.writable) + // ) { + // return Duplexify.fromWeb(body); + // } + + if ( + typeof (body === null || body === undefined ? undefined : body.writable) === "object" || + typeof (body === null || body === undefined ? undefined : body.readable) === "object" + ) { + const readable = + body !== null && body !== undefined && body.readable + ? isReadableNodeStream( + body === null || body === undefined ? undefined : body.readable + ) + ? body === null || body === undefined + ? undefined + : body.readable + : duplexify(body.readable, name) + : undefined; + const writable = + body !== null && body !== undefined && body.writable + ? isWritableNodeStream( + body === null || body === undefined ? undefined : body.writable + ) + ? body === null || body === undefined + ? undefined + : body.writable + : duplexify(body.writable, name) + : undefined; + return _duplexify({ + readable, + writable, + }); + } + const then = body?.then; + if (typeof then === "function") { + let d; + Reflect.apply(then, body, [ + (val) => { + if (val != null) { + d.push(val); + } + d.push(null); + }, + (err) => { + destroyer(d, err); + }, + ]); + + return (d = new Duplexify({ + objectMode: true, + writable: false, + read() {}, + })); + } + throw new ERR_INVALID_ARG_TYPE( + name, + [ + "Blob", + "ReadableStream", + "WritableStream", + "Stream", + "Iterable", + "AsyncIterable", + "Function", + "{ readable, writable } pair", + "Promise", + ], + body + ); +} + +function fromAsyncGen(fn) { + let { promise, resolve } = createDeferredPromise(); + const ac = new AbortController(); + const signal = ac.signal; + const value = fn( + (async function* () { + while (true) { + const _promise = promise; + promise = null; + const { chunk, done, cb } = await _promise; + process.nextTick(cb); + if (done) return; + if (signal.aborted) + throw new AbortError(undefined, { + cause: signal.reason, + }); + ({ promise, resolve } = createDeferredPromise()); + yield chunk; + } + })(), + { + signal, + } + ); + return { + value, + write(chunk, _encoding, cb) { + const _resolve = resolve; + resolve = null; + _resolve({ + chunk, + done: false, + cb, + }); + }, + final(cb) { + const _resolve = resolve; + resolve = null; + _resolve({ + done: true, + cb, + }); + }, + destroy(err, cb) { + ac.abort(); + cb(err); + }, + }; +} + +function _duplexify(pair) { + const r = + pair.readable && typeof pair.readable.read !== "function" + ? Readable.wrap(pair.readable) + : pair.readable; + const w = pair.writable; + let readable = !!isReadable(r); + let writable = !!isWritable(w); + let ondrain; + let onfinish; + let onreadable; + let onclose; + let d; + function onfinished(err) { + const cb = onclose; + onclose = null; + if (cb) { + cb(err); + } else if (err) { + d.destroy(err); + } else if (!readable && !writable) { + d.destroy(); + } + } + + // TODO(ronag): Avoid double buffering. + // Implement Writable/Readable/Duplex traits. + // See, https://github.com/nodejs/node/pull/33515. + d = new Duplexify({ + // TODO (ronag): highWaterMark? + readableObjectMode: !!(r !== null && r !== undefined && r.readableObjectMode), + writableObjectMode: !!(w !== null && w !== undefined && w.writableObjectMode), + readable, + writable, + }); + if (writable) { + eos(w, (err) => { + writable = false; + if (err) { + destroyer(r, err); + } + onfinished(err); + }); + d._write = function (chunk, encoding, callback) { + if (w.write(chunk, encoding)) { + callback(); + } else { + ondrain = callback; + } + }; + d._final = function (callback) { + w.end(); + onfinish = callback; + }; + w.on("drain", function () { + if (ondrain) { + const cb = ondrain; + ondrain = null; + cb(); + } + }); + w.on("finish", function () { + if (onfinish) { + const cb = onfinish; + onfinish = null; + cb(); + } + }); + } + if (readable) { + eos(r, (err) => { + readable = false; + if (err) { + destroyer(r, err); + } + onfinished(err); + }); + r.on("readable", function () { + if (onreadable) { + const cb = onreadable; + onreadable = null; + cb(); + } + }); + r.on("end", function () { + d.push(null); + }); + d._read = function () { + while (true) { + const buf = r.read(); + if (buf === null) { + onreadable = d._read; + return; + } + if (!d.push(buf)) { + return; + } + } + }; + } + d._destroy = function (err, callback) { + if (!err && onclose !== null) { + err = new AbortError(); + } + onreadable = null; + ondrain = null; + onfinish = null; + if (onclose === null) { + callback(err); + } else { + onclose = callback; + destroyer(w, err); + destroyer(r, err); + } + }; + return d; +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_legacy.js b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_legacy.js new file mode 100644 index 000000000..1f859aae7 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_legacy.js @@ -0,0 +1,83 @@ +import EventEmitter from "./events"; + +import { Buffer } from "./internal_buffer"; + +export function Stream(opts) { + EventEmitter.call(this, opts || {}); +} + +Object.setPrototypeOf(Stream.prototype, EventEmitter.prototype); +Object.setPrototypeOf(Stream, EventEmitter); + +Stream.prototype.pipe = function (dest, options) { + const source = this; + function ondata(chunk) { + if (dest.writable && dest.write(chunk) === false && source.pause) { + source.pause(); + } + } + source.on("data", ondata); + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + dest.on("drain", ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on("end", onend); + source.on("close", onclose); + } + let didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + dest.end(); + } + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + if (typeof dest.destroy === "function") dest.destroy(); + } + + // Don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EventEmitter.listenerCount(this, "error") === 0) { + this.emit("error", er); + } + } + source.prependListener("error", onerror); + dest.prependListener("error", onerror); + + // Remove all the event listeners that were added. + function cleanup() { + source.removeListener("data", ondata); + dest.removeListener("drain", ondrain); + source.removeListener("end", onend); + source.removeListener("close", onclose); + source.removeListener("error", onerror); + dest.removeListener("error", onerror); + source.removeListener("end", cleanup); + source.removeListener("close", cleanup); + dest.removeListener("close", cleanup); + } + source.on("end", cleanup); + source.on("close", cleanup); + dest.on("close", cleanup); + dest.emit("pipe", source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; +Stream._isUint8Array = function isUint8Array(value) { + return value instanceof Uint8Array; +}; +Stream._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); +}; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_readable.js b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_readable.js new file mode 100644 index 000000000..af1d687b6 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_readable.js @@ -0,0 +1,1767 @@ +/* eslint-disable */ + +import { + nop, + getHighWaterMark, + getDefaultHighWaterMark, + kPaused, + addAbortSignal, + BufferList, + eos, + construct, + destroy, + destroyer, + undestroy, + errorOrDestroy, + finished, +} from "./streams_util"; + +import * as process from "./process"; + +import EventEmitter from "./events"; + +import { Stream } from "./streams_legacy"; + +import { + newStreamReadableFromReadableStream, + newReadableStreamFromStreamReadable, +} from "./streams_adapters"; + +import { Buffer } from "./internal_buffer"; + +import { + AbortError, + aggregateTwoErrors, + ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED, + ERR_MISSING_ARGS, + ERR_OUT_OF_RANGE, + ERR_STREAM_PUSH_AFTER_EOF, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT, + ERR_STREAM_NULL_VALUES, +} from "./internal_errors"; + +import { validateObject, validateAbortSignal, validateInteger } from "./validators"; + +import { StringDecoder } from "./internal_stringdecoder"; + +import { isDuplexInstance } from "./streams_duplex"; + +// ====================================================================================== +// ReadableState + +function ReadableState(options, stream, isDuplex) { + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + if (typeof isDuplex !== "boolean") isDuplex = isDuplexInstance(stream); + + // Object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away. + this.objectMode = !!options?.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options?.readableObjectMode; + + // The point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + this.highWaterMark = options + ? getHighWaterMark(this, options, "readableHighWaterMark", isDuplex) + : getDefaultHighWaterMark(false); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift(). + this.buffer = new BufferList(); + this.length = 0; + this.pipes = []; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // Stream is still being constructed and cannot be + // destroyed until construction finished or failed. + // Async construction is opt in, therefore we start as + // constructed. + this.constructed = true; + + // A flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // Whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + this[kPaused] = null; + + // True if the error was already emitted and should not be thrown again. + this.errorEmitted = false; + + // Should close be emitted on destroy. Defaults to true. + this.emitClose = !options || options.emitClose !== false; + + // Should .destroy() be called after 'end' (and potentially 'finish'). + this.autoDestroy = !options || options.autoDestroy !== false; + + // Has it been destroyed. + this.destroyed = false; + + // Indicates whether the stream has errored. When true no further + // _read calls, 'data' or 'readable' events should occur. This is needed + // since when autoDestroy is disabled we need a way to tell whether the + // stream has failed. + this.errored = null; + + // Indicates whether the stream has finished destroying. + this.closed = false; + + // True if close has been emitted or would have been emitted + // depending on emitClose. + this.closeEmitted = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options?.defaultEncoding || "utf8"; + + // Ref the piped dest which we need a drain event on it + // type: null | Writable | Set. + this.awaitDrainWriters = null; + this.multiAwaitDrain = false; + + // If true, a maybeReadMore has been scheduled. + this.readingMore = false; + this.dataEmitted = false; + this.decoder = null; + this.encoding = null; + if (options && options.encoding) { + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +// ====================================================================================== +// Readable + +Readable.ReadableState = ReadableState; + +Object.setPrototypeOf(Readable.prototype, Stream.prototype); +Object.setPrototypeOf(Readable, Stream); + +export function Readable(options) { + if (!(this instanceof Readable)) return new Readable(options); + + // Checking for a Stream.Duplex instance is faster here instead of inside + // the ReadableState constructor, at least with V8 6.5. + const isDuplex = isDuplexInstance(this); + this._readableState = new ReadableState(options, this, isDuplex); + if (options) { + if (typeof options.read === "function") this._read = options.read; + if (typeof options.destroy === "function") this._destroy = options.destroy; + if (typeof options.construct === "function") this._construct = options.construct; + if (options.signal && !isDuplex) addAbortSignal(options.signal, this); + } + Stream.call(this, options); + construct(this, () => { + if (this._readableState.needReadable) { + maybeReadMore(this, this._readableState); + } + }); +} +Readable.prototype.destroy = destroy; +Readable.prototype._undestroy = undestroy; +Readable.prototype._destroy = function (err, cb) { + if (cb) cb(err); +}; + +Readable.prototype[EventEmitter.captureRejectionSymbol] = function (err) { + this.destroy(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + return readableAddChunk(this, chunk, encoding, false); +}; + +// Unshift should *always* be something directly out of read(). +Readable.prototype.unshift = function (chunk, encoding) { + return readableAddChunk(this, chunk, encoding, true); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront) { + const state = stream._readableState; + let err; + if (!state.objectMode) { + if (typeof chunk === "string") { + encoding ||= state.defaultEncoding; + if (state.encoding !== encoding) { + if (addToFront && state.encoding) { + // When unshifting, if state.encoding is set, we have to save + // the string in the BufferList with the state encoding. + chunk = Buffer.from(chunk, encoding).toString(state.encoding); + } else { + chunk = Buffer.from(chunk, encoding); + encoding = ""; + } + } + } else if (chunk instanceof Buffer) { + encoding = ""; + } else if (Stream._isUint8Array(chunk)) { + chunk = Stream._uint8ArrayToBuffer(chunk); + encoding = ""; + } else if (chunk != null) { + err = new ERR_INVALID_ARG_TYPE("chunk", ["string", "Buffer", "Uint8Array"], chunk); + } + } + if (err) { + errorOrDestroy(stream, err); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || (chunk && chunk.length > 0)) { + if (addToFront) { + if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT()); + else if (state.destroyed || state.errored) return false; + else addChunk(stream, state, chunk, true); + } else if (state.ended) { + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state.destroyed || state.errored) { + return false; + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false); + else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + maybeReadMore(stream, state); + } + + // We can push more data if we are below the highWaterMark. + // Also, if we have no data yet, we can stand some more bytes. + // This is to work around cases where hwm=0, such as the repl. + return !state.ended && (state.length < state.highWaterMark || state.length === 0); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync && stream.listenerCount("data") > 0) { + // Use the guard to avoid creating `Set()` repeatedly + // when we have multiple pipes. + if (state.multiAwaitDrain) { + state.awaitDrainWriters.clear(); + } else { + state.awaitDrainWriters = null; + state.multiAwaitDrain = false; + } + state.dataEmitted = true; + stream.emit("data", chunk); + } else { + // Update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk); + else state.buffer.push(chunk); + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +Readable.prototype.isPaused = function () { + const state = this._readableState; + return state[kPaused] === true || state.flowing === false; +}; + +// Backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + const decoder = new StringDecoder(enc); + this._readableState.decoder = decoder; + // If setEncoding(null), decoder.encoding equals utf8. + this._readableState.encoding = decoder.encoding; + const buffer = this._readableState.buffer; + // Iterate over current buffer to convert already stored Buffers: + let content = ""; + for (const data of buffer) { + content += decoder.write(data); + } + buffer.clear(); + if (content !== "") buffer.push(content); + this._readableState.length = content.length; + return this; +}; + +// Don't raise the hwm > 1GB. +const MAX_HWM = 0x40000000; +function computeNewHighWaterMark(n) { + if (n > MAX_HWM) { + throw new ERR_OUT_OF_RANGE("size", "<= 1GiB", n); + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts. + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || (state.length === 0 && state.ended)) return 0; + if (state.objectMode) return 1; + if (Number.isNaN(n)) { + // Only flow one buffer at a time. + if (state.flowing && state.length) return state.buffer.first().length; + return state.length; + } + if (n <= state.length) return n; + return state.ended ? state.length : 0; +} + +// You can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + // Same as parseInt(undefined, 10), however V8 7.3 performance regressed + // in this scenario, so we are doing it manually. + if (n === undefined) { + n = NaN; + } else if (!Number.isInteger(n)) { + n = Number.parseInt(`${n}`, 10); + } + const state = this._readableState; + const nOrig = n; + + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n !== 0) state.emittedReadable = false; + + // If we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if ( + n === 0 && + state.needReadable && + ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || + state.ended) + ) { + if (state.length === 0 && state.ended) endReadable(this); + else emitReadable(this); + return null; + } + n = howMuchToRead(n, state); + + // If we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + let doRead = state.needReadable; + + // If we currently have less than the highWaterMark, then also read some. + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + } + + // However, if we've ended, then there's no point, if we're already + // reading, then it's unnecessary, if we're constructing we have to wait, + // and if we're destroyed or errored, then it's not allowed, + if (state.ended || state.reading || state.destroyed || state.errored || !state.constructed) { + doRead = false; + } else if (doRead) { + state.reading = true; + state.sync = true; + // If the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + + // Call internal read method + try { + this._read(state.highWaterMark); + } catch (err) { + errorOrDestroy(this, err); + } + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + let ret; + if (n > 0) ret = fromList(n, state); + else ret = null; + if (ret === null) { + state.needReadable = state.length <= state.highWaterMark; + n = 0; + } else { + state.length -= n; + if (state.multiAwaitDrain) { + state.awaitDrainWriters.clear(); + } else { + state.awaitDrainWriters = null; + state.multiAwaitDrain = false; + } + } + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + if (ret !== null && !state.errorEmitted && !state.closeEmitted) { + state.dataEmitted = true; + this.emit("data", ret); + } + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + const chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + if (state.sync) { + // If we are sync, wait until next tick to emit the data. + // Otherwise we risk emitting data in the flow() + // the readable code triggers during a read() call. + emitReadable(stream); + } else { + // Emit 'readable' now to make sure it gets picked up. + state.needReadable = false; + state.emittedReadable = true; + // We have to emit readable now that we are EOF. Modules + // in the ecosystem (e.g. dicer) rely on this event being sync. + emitReadable_(stream); + } +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + const state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + state.emittedReadable = true; + process.nextTick(emitReadable_, stream); + } +} + +function emitReadable_(stream) { + const state = stream._readableState; + if (!state.destroyed && !state.errored && (state.length || state.ended)) { + stream.emit("readable"); + state.emittedReadable = false; + } + + // The stream needs another readable event if: + // 1. It is not flowing, as the flow mechanism will take + // care of it. + // 2. It is not ended. + // 3. It is below the highWaterMark, so we can schedule + // another readable later. + state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; + flow(stream); +} + +// At this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore && state.constructed) { + state.readingMore = true; + process.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + // Attempt to read more data if we should. + // + // The conditions for reading more data are (one of): + // - Not enough data buffered (state.length < state.highWaterMark). The loop + // is responsible for filling the buffer with enough data if such data + // is available. If highWaterMark is 0 and we are not in the flowing mode + // we should _not_ attempt to buffer any extra data. We'll get more data + // when the stream consumer calls read() instead. + // - No data in the buffer, and the stream is in flowing mode. In this mode + // the loop below is responsible for ensuring read() is called. Failing to + // call read here would abort the flow and there's no other mechanism for + // continuing the flow if the stream consumer has just subscribed to the + // 'data' event. + // + // In addition to the above conditions to keep reading data, the following + // conditions prevent the data from being read: + // - The stream has ended (state.ended). + // - There is already a pending 'read' operation (state.reading). This is a + // case where the stream has called the implementation defined _read() + // method, but they are processing the call asynchronously and have _not_ + // called push() with new data. In this case we skip performing more + // read()s. The execution ends in this method again after the _read() ends + // up calling push() with more data. + while ( + !state.reading && + !state.ended && + (state.length < state.highWaterMark || (state.flowing && state.length === 0)) + ) { + const len = state.length; + stream.read(0); + if (len === state.length) + // Didn't get any data, stop spinning. + break; + } + state.readingMore = false; +} + +// Abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (_size) { + throw new ERR_METHOD_NOT_IMPLEMENTED("_read()"); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + const src = this; + const state = this._readableState; + if (state.pipes.length === 1) { + if (!state.multiAwaitDrain) { + state.multiAwaitDrain = true; + state.awaitDrainWriters = new Set( + state.awaitDrainWriters ? [state.awaitDrainWriters] : [] + ); + } + } + state.pipes.push(dest); + const doEnd = !pipeOpts || pipeOpts.end !== false; + const endFn = doEnd ? onend : unpipe; + if (state.endEmitted) process.nextTick(endFn); + else src.once("end", endFn); + dest.on("unpipe", onunpipe); + function onunpipe(readable, unpipeInfo) { + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + function onend() { + dest.end(); + } + let ondrain; + let cleanedUp = false; + function cleanup() { + // Cleanup event handlers once the pipe is broken. + dest.removeListener("close", onclose); + dest.removeListener("finish", onfinish); + if (ondrain) { + dest.removeListener("drain", ondrain); + } + dest.removeListener("error", onerror); + dest.removeListener("unpipe", onunpipe); + src.removeListener("end", onend); + src.removeListener("end", unpipe); + src.removeListener("data", ondata); + cleanedUp = true; + + // If the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if ( + ondrain && + state.awaitDrainWriters && + (!dest._writableState || dest._writableState.needDrain) + ) + ondrain(); + } + function pause() { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if (!cleanedUp) { + if (state.pipes.length === 1 && state.pipes[0] === dest) { + state.awaitDrainWriters = dest; + state.multiAwaitDrain = false; + } else if (state.pipes.length > 1 && state.pipes.includes(dest)) { + state.awaitDrainWriters.add(dest); + } + src.pause(); + } + if (!ondrain) { + // When the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + ondrain = pipeOnDrain(src, dest); + dest.on("drain", ondrain); + } + } + src.on("data", ondata); + function ondata(chunk) { + const ret = dest.write(chunk); + if (ret === false) { + pause(); + } + } + + // If the dest has an error, then stop piping into it. + // However, don't suppress the throwing behavior for this. + function onerror(er) { + unpipe(); + dest.removeListener("error", onerror); + if (dest.listenerCount("error") === 0) { + const s = dest._writableState || dest._readableState; + if (s && !s.errorEmitted) { + // User incorrectly emitted 'error' directly on the stream. + errorOrDestroy(dest, er); + } else { + dest.emit("error", er); + } + } + } + + // Make sure our error handler is attached before userland ones. + dest.prependListener("error", onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener("finish", onfinish); + unpipe(); + } + dest.once("close", onclose); + function onfinish() { + dest.removeListener("close", onclose); + unpipe(); + } + dest.once("finish", onfinish); + function unpipe() { + src.unpipe(dest); + } + + // Tell the dest that it's being piped to. + dest.emit("pipe", src); + + // Start the flow if it hasn't been started already. + + if (dest.writableNeedDrain === true) { + if (state.flowing) { + pause(); + } + } else if (!state.flowing) { + src.resume(); + } + return dest; +}; + +function pipeOnDrain(src, dest) { + return function pipeOnDrainFunctionResult() { + const state = src._readableState; + + // `ondrain` will call directly, + // `this` maybe not a reference to dest, + // so we use the real dest here. + if (state.awaitDrainWriters === dest) { + state.awaitDrainWriters = null; + } else if (state.multiAwaitDrain) { + state.awaitDrainWriters.delete(dest); + } + if ( + (!state.awaitDrainWriters || state.awaitDrainWriters.size === 0) && + src.listenerCount("data") + ) { + src.resume(); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + const state = this._readableState; + const unpipeInfo = { + hasUnpiped: false, + }; + + // If we're not piping anywhere, then do nothing. + if (state.pipes.length === 0) return this; + if (!dest) { + // remove all. + const dests = state.pipes; + state.pipes = []; + this.pause(); + for (let i = 0; i < dests.length; i++) + dests[i].emit("unpipe", this, { + hasUnpiped: false, + }); + return this; + } + + // Try to find the right one. + const index = state.pipes.indexOf(dest); + if (index === -1) return this; + state.pipes.splice(index, 1); + if (state.pipes.length === 0) this.pause(); + dest.emit("unpipe", this, unpipeInfo); + return this; +}; + +// Set up data events if they are asked for +// Ensure readable listeners eventually get something. +Readable.prototype.on = function (ev, fn) { + const res = Stream.prototype.on.call(this, ev, fn); + const state = this._readableState; + if (ev === "data") { + // Update readableListening so that resume() may be a no-op + // a few lines down. This is needed to support once('readable'). + state.readableListening = this.listenerCount("readable") > 0; + + // Try start flowing on next tick if stream isn't explicitly paused. + if (state.flowing !== false) this.resume(); + } else if (ev === "readable") { + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.flowing = false; + state.emittedReadable = false; + if (state.length) { + emitReadable(this); + } else if (!state.reading) { + process.nextTick(nReadingNextTick, this); + } + } + } + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; +Readable.prototype.removeListener = function (ev, fn) { + const res = Stream.prototype.removeListener.call(this, ev, fn); + if (ev === "readable") { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + return res; +}; +Readable.prototype.off = Readable.prototype.removeListener; +Readable.prototype.removeAllListeners = function (ev) { + const res = Stream.prototype.removeAllListeners.apply(this, arguments); + if (ev === "readable" || ev === undefined) { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + return res; +}; + +function updateReadableListening(self) { + const state = self._readableState; + state.readableListening = self.listenerCount("readable") > 0; + if (state.resumeScheduled && state[kPaused] === false) { + // Flowing needs to be set to true now, otherwise + // the upcoming resume will not flow. + state.flowing = true; + + // Crude way to check if we should resume. + } else if (self.listenerCount("data") > 0) { + self.resume(); + } else if (!state.readableListening) { + state.flowing = null; + } +} + +function nReadingNextTick(self) { + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + const state = this._readableState; + if (!state.flowing) { + // We flow only if there is no one listening + // for readable, but we still have to call + // resume(). + state.flowing = !state.readableListening; + resume(this, state); + } + state[kPaused] = false; + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + process.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + stream.read(0); + } + state.resumeScheduled = false; + stream.emit("resume"); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + if (this._readableState.flowing !== false) { + this._readableState.flowing = false; + this.emit("pause"); + } + this._readableState[kPaused] = true; + return this; +}; + +function flow(stream) { + const state = stream._readableState; + while (state.flowing && stream.read() !== null); +} + +// Wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + let paused = false; + + // TODO (ronag): Should this.destroy(err) emit + // 'error' on the wrapped stream? Would require + // a static factory method, e.g. Readable.wrap(stream). + stream.on("data", (chunk) => { + if (!this.push(chunk) && stream.pause) { + paused = true; + stream.pause(); + } + }); + + stream.on("end", () => { + this.push(null); + }); + stream.on("error", (err) => { + errorOrDestroy(this, err); + }); + stream.on("close", () => { + this.destroy(); + }); + stream.on("destroy", () => { + this.destroy(); + }); + this._read = () => { + if (paused && stream.resume) { + paused = false; + stream.resume(); + } + }; + + // Proxy all the other methods. Important when wrapping filters and duplexes. + const streamKeys = Object.keys(stream); + for (let j = 1; j < streamKeys.length; j++) { + const i = streamKeys[j]; + if (this[i] === undefined && typeof stream[i] === "function") { + this[i] = stream[i].bind(stream); + } + } + return this; +}; + +Readable.prototype[Symbol.asyncIterator] = function () { + return streamToAsyncIterator(this); +}; + +Readable.prototype.iterator = function (options) { + if (options !== undefined) { + validateObject(options, "options", options); + } + return streamToAsyncIterator(this, options); +}; + +function streamToAsyncIterator(stream, options) { + if (typeof stream.read !== "function") { + stream = Readable.wrap(stream, { + objectMode: true, + }); + } + const iter = createAsyncIterator(stream, options); + iter.stream = stream; + return iter; +} + +async function* createAsyncIterator(stream, options) { + let callback = nop; + function next(resolve) { + if (this === stream) { + callback(); + callback = nop; + } else { + callback = resolve; + } + } + stream.on("readable", next); + let error; + const cleanup = eos( + stream, + { + writable: false, + }, + (err) => { + error = err ? aggregateTwoErrors(error, err) : null; + callback(); + callback = nop; + } + ); + try { + while (true) { + const chunk = stream.destroyed ? null : stream.read(); + if (chunk !== null) { + yield chunk; + } else if (error) { + throw error; + } else if (error === null) { + return; + } else { + await new Promise(next); + } + } + } catch (err) { + error = aggregateTwoErrors(error, err); + throw error; + } finally { + if ( + (error || + (options === null || options === undefined + ? undefined + : options.destroyOnReturn) !== false) && + (error === undefined || stream._readableState.autoDestroy) + ) { + destroyer(stream, null); + } else { + stream.off("readable", next); + cleanup(); + } + } +} + +// Making it explicit these properties are not enumerable +// because otherwise some prototype manipulation in +// userland will fail. +Object.defineProperties(Readable.prototype, { + readable: { + get() { + const r = this._readableState; + // r.readable === false means that this is part of a Duplex stream + // where the readable side was disabled upon construction. + // Compat. The user might manually disable readable side through + // deprecated setter. + return !!r && r.readable !== false && !r.destroyed && !r.errorEmitted && !r.endEmitted; + }, + set(val) { + // Backwards compat. + if (this._readableState) { + this._readableState.readable = !!val; + } + }, + }, + readableDidRead: { + enumerable: false, + get: function () { + return !!this._readableState?.dataEmitted; + }, + }, + readableAborted: { + enumerable: false, + get: function () { + return !!( + this._readableState?.readable !== false && + (this._readableState?.destroyed || this._readableState?.errored) && + !this._readableState?.endEmitted + ); + }, + }, + readableHighWaterMark: { + enumerable: false, + get: function () { + return this._readableState?.highWaterMark; + }, + }, + readableBuffer: { + enumerable: false, + get: function () { + return this._readableState?.buffer; + }, + }, + readableFlowing: { + enumerable: false, + get: function () { + return !!this._readableState?.flowing; + }, + set: function (state) { + if (this._readableState) { + this._readableState.flowing = state; + } + }, + }, + readableLength: { + enumerable: false, + get() { + return this._readableState?.length | 0; + }, + }, + readableObjectMode: { + enumerable: false, + get() { + return this._readableState ? this._readableState.objectMode : false; + }, + }, + readableEncoding: { + enumerable: false, + get() { + return this._readableState?.encoding || null; + }, + }, + errored: { + enumerable: false, + get() { + return this._readableState?.errored || null; + }, + }, + closed: { + get() { + return !!this._readableState?.closed; + }, + }, + destroyed: { + enumerable: false, + get() { + return !!this._readableState?.destroyed; + }, + set(value) { + // We ignore the value if the stream + // has not been initialized yet. + if (!this._readableState) { + return; + } + + // Backward compatibility, the user is explicitly + // managing destroyed. + this._readableState.destroyed = value; + }, + }, + readableEnded: { + enumerable: false, + get() { + return !!this._readableState?.endEmitted; + }, + }, +}); + +Object.defineProperties(ReadableState.prototype, { + // Legacy getter for `pipesCount`. + pipesCount: { + get() { + return this.pipes.length; + }, + }, + // Legacy property for `paused`. + paused: { + get() { + return this[kPaused] !== false; + }, + set(value) { + this[kPaused] = !!value; + }, + }, +}); + +// Exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered. + if (state.length === 0) return null; + let ret; + if (state.objectMode) ret = state.buffer.shift(); + else if (!n || n >= state.length) { + // Read it all, truncate the list. + if (state.decoder) ret = state.buffer.join(""); + else if (state.buffer.length === 1) ret = state.buffer.first(); + else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list. + ret = state.buffer.consume(n, !!state.decoder); + } + return ret; +} + +function endReadable(stream) { + const state = stream._readableState; + if (!state.endEmitted) { + state.ended = true; + process.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.errored && !state.closeEmitted && !state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.emit("end"); + if (stream.writable && stream.allowHalfOpen === false) { + process.nextTick(endWritableNT, stream); + } else if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the writable side is ready for autoDestroy as well. + const wState = stream._writableState; + const autoDestroy = + !wState || + (wState.autoDestroy && + // We don't expect the writable to ever 'finish' + // if writable is explicitly set to false. + (wState.finished || wState.writable === false)); + if (autoDestroy) { + stream.destroy(); + } + } + } +} + +function endWritableNT(stream) { + const writable = stream.writable && !stream.writableEnded && !stream.destroyed; + if (writable) { + stream.end(); + } +} + +Readable.fromWeb = function (readableStream, options) { + return newStreamReadableFromReadableStream(readableStream, options); +}; +Readable.toWeb = function (streamReadable, options) { + return newReadableStreamFromStreamReadable(streamReadable, options); +}; + +Readable.wrap = function (src, options) { + let _ref, _src$readableObjectMo; + return new Readable({ + objectMode: + (_ref = + (_src$readableObjectMo = src.readableObjectMode) !== null && + _src$readableObjectMo !== undefined + ? _src$readableObjectMo + : src.objectMode) !== null && _ref !== undefined + ? _ref + : true, + ...options, + destroy(err, callback) { + destroyer(src, err); + callback(err); + }, + }).wrap(src); +}; + +// ====================================================================================== +// + +Readable.from = function (iterable, opts) { + return from(Readable, iterable, opts); +}; + +export function from(Readable, iterable, opts) { + let iterator; + if (typeof iterable === "string" || iterable instanceof Buffer) { + return new Readable({ + objectMode: true, + ...opts, + read() { + this.push(iterable); + this.push(null); + }, + }); + } + let isAsync; + if (iterable && iterable[Symbol.asyncIterator]) { + isAsync = true; + iterator = iterable[Symbol.asyncIterator](); + } else if (iterable && iterable[Symbol.iterator]) { + isAsync = false; + iterator = iterable[Symbol.iterator](); + } else { + throw new ERR_INVALID_ARG_TYPE("iterable", ["Iterable"], iterable); + } + const readable = new Readable({ + objectMode: true, + highWaterMark: 1, + // TODO(ronag): What options should be allowed? + ...opts, + }); + + // Flag to protect against _read + // being called before last iteration completion. + let reading = false; + readable._read = function () { + if (!reading) { + reading = true; + next(); + } + }; + readable._destroy = function (error, cb) { + close(error).then( + () => process.nextTick(cb, error), + (err) => process.nextTick(cb, err || error) + ); + }; + async function close(error) { + const hadError = error !== undefined && error !== null; + const hasThrow = typeof iterator.throw === "function"; + if (hadError && hasThrow) { + const { value, done } = await iterator.throw(error); + await value; + if (done) { + return; + } + } + if (typeof iterator.return === "function") { + const { value } = await iterator.return(); + await value; + } + } + async function next() { + for (;;) { + try { + const { value, done } = isAsync ? await iterator.next() : iterator.next(); + if (done) { + readable.push(null); + } else { + const res = value && typeof value.then === "function" ? await value : value; + if (res === null) { + reading = false; + throw new ERR_STREAM_NULL_VALUES(); + } else if (readable.push(res)) { + continue; + } else { + reading = false; + } + } + } catch (err) { + readable.destroy(err); + } + break; + } + } + return readable; +} + +// ====================================================================================== +// Operators + +const kWeakHandler = Symbol("kWeak"); +const kEmpty = Symbol("kEmpty"); +const kEof = Symbol("kEof"); + +function map(fn, options) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE("fn", ["Function", "AsyncFunction"], fn); + } + if (options != null) { + validateObject(options, "options", options); + } + if (options?.signal != null) { + validateAbortSignal(options.signal, "options.signal"); + } + let concurrency = 1; + if (options?.concurrency != null) { + concurrency = Math.floor(options.concurrency); + } + validateInteger(concurrency, "concurrency", 1); + return async function* map() { + let _options$signal, _options$signal2; + const ac = new AbortController(); + const stream = this; + const queue = []; + const signal = ac.signal; + const signalOpt = { + signal, + }; + const abort = () => ac.abort(); + if ( + options !== null && + options !== undefined && + (_options$signal = options.signal) !== null && + _options$signal !== undefined && + _options$signal.aborted + ) { + abort(); + } + options === null || options === undefined + ? undefined + : (_options$signal2 = options.signal) === null || _options$signal2 === undefined + ? undefined + : _options$signal2.addEventListener("abort", abort); + let next; + let resume; + let done = false; + function onDone() { + done = true; + } + async function pump() { + try { + for await (let val of stream) { + let _val; + if (done) { + return; + } + if (signal.aborted) { + throw new AbortError(); + } + try { + val = fn(val, signalOpt); + } catch (err) { + val = Promise.reject(err); + } + if (val === kEmpty) { + continue; + } + if ( + typeof ((_val = val) === null || _val === undefined + ? undefined + : _val.catch) === "function" + ) { + val.catch(onDone); + } + queue.push(val); + if (next) { + next(); + next = null; + } + if (!done && queue.length && queue.length >= concurrency) { + await new Promise((resolve) => { + resume = resolve; + }); + } + } + queue.push(kEof); + } catch (err) { + const val = Promise.reject(err); + val.then(undefined, onDone); + queue.push(val); + } finally { + let _options$signal3; + done = true; + if (next) { + next(); + next = null; + } + options === null || options === undefined + ? undefined + : (_options$signal3 = options.signal) === null || _options$signal3 === undefined + ? undefined + : _options$signal3.removeEventListener("abort", abort); + } + } + pump(); + try { + while (true) { + while (queue.length > 0) { + const val = await queue[0]; + if (val === kEof) { + return; + } + if (signal.aborted) { + throw new AbortError(); + } + if (val !== kEmpty) { + yield val; + } + queue.shift(); + if (resume) { + resume(); + resume = null; + } + } + await new Promise((resolve) => { + next = resolve; + }); + } + } finally { + ac.abort(); + done = true; + if (resume) { + resume(); + resume = null; + } + } + }.call(this); +} + +function asIndexedPairs(options) { + if (options != null) { + validateObject(options, "options", options); + } + if ((options === null || options === undefined ? undefined : options.signal) != null) { + validateAbortSignal(options.signal, "options.signal"); + } + return async function* asIndexedPairs() { + let index = 0; + for await (const val of this) { + let _options$signal4; + if ( + options !== null && + options !== undefined && + (_options$signal4 = options.signal) !== null && + _options$signal4 !== undefined && + _options$signal4.aborted + ) { + throw new AbortError("Aborted", { + cause: options.signal?.reason, + }); + } + yield [index++, val]; + } + }.call(this); +} + +async function some(fn, options) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE("fn", ["Function", "AsyncFunction"], fn); + } + for await (const _ of filter.call(this, fn, options)) { + return true; + } + return false; +} + +async function every(fn, options) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE("fn", ["Function", "AsyncFunction"], fn); + } + // https://en.wikipedia.org/wiki/De_Morgan%27s_laws + return !(await some.call( + this, + async (...args) => { + return !(await fn(...args)); + }, + options + )); +} + +async function find(fn, options) { + for await (const result of filter.call(this, fn, options)) { + return result; + } + return undefined; +} + +async function forEach(fn, options) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE("fn", ["Function", "AsyncFunction"], fn); + } + async function forEachFn(value, options) { + await fn(value, options); + return kEmpty; + } + // eslint-disable-next-line no-unused-vars + for await (const _ of map.call(this, forEachFn, options)); +} + +function filter(fn, options) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE("fn", ["Function", "AsyncFunction"], fn); + } + async function filterFn(value, options) { + if (await fn(value, options)) { + return value; + } + return kEmpty; + } + return map.call(this, filterFn, options); +} + +// Specific to provide better error to reduce since the argument is only +// missing if the stream has no items in it - but the code is still appropriate +class ReduceAwareErrMissingArgs extends ERR_MISSING_ARGS { + constructor() { + super("reduce"); + this.message = "Reduce of an empty stream requires an initial value"; + } +} + +async function reduce(reducer, initialValue, options) { + let _options$signal5; + if (typeof reducer !== "function") { + throw new ERR_INVALID_ARG_TYPE("reducer", ["Function", "AsyncFunction"], reducer); + } + if (options != null) { + validateObject(options, "options", options); + } + if (options?.signal != null) { + validateAbortSignal(options?.signal, "options.signal"); + } + let hasInitialValue = arguments.length > 1; + if ( + options !== null && + options !== undefined && + (_options$signal5 = options.signal) !== null && + _options$signal5 !== undefined && + _options$signal5.aborted + ) { + const err = new AbortError(undefined, { + cause: options.signal?.reason, + }); + this.once("error", () => {}); // The error is already propagated + await finished(this.destroy(err)); + throw err; + } + const ac = new AbortController(); + const signal = ac.signal; + if (options?.signal) { + const opts = { + once: true, + [kWeakHandler]: this, + }; + options.signal.addEventListener("abort", () => ac.abort(), opts); + } + let gotAnyItemFromStream = false; + try { + for await (const value of this) { + let _options$signal6; + gotAnyItemFromStream = true; + if ( + options !== null && + options !== undefined && + (_options$signal6 = options.signal) !== null && + _options$signal6 !== undefined && + _options$signal6.aborted + ) { + throw new AbortError(); + } + if (!hasInitialValue) { + initialValue = value; + hasInitialValue = true; + } else { + initialValue = await reducer(initialValue, value, { + signal, + }); + } + } + if (!gotAnyItemFromStream && !hasInitialValue) { + throw new ReduceAwareErrMissingArgs(); + } + } finally { + ac.abort(); + } + return initialValue; +} + +async function toArray(options) { + if (options != null) { + validateObject(options, "options", options); + } + if (options?.signal != null) { + validateAbortSignal(options?.signal, "options.signal"); + } + const result = []; + for await (const val of this) { + let _options$signal7; + if ( + options !== null && + options !== undefined && + (_options$signal7 = options.signal) !== null && + _options$signal7 !== undefined && + _options$signal7.aborted + ) { + throw new AbortError(undefined, { + cause: options.signal?.reason, + }); + } + result.push(val); + } + return result; +} + +function flatMap(fn, options) { + const values = map.call(this, fn, options); + return async function* flatMap() { + for await (const val of values) { + yield* val; + } + }.call(this); +} + +function toIntegerOrInfinity(number) { + // We coerce here to align with the spec + // https://github.com/tc39/proposal-iterator-helpers/issues/169 + number = Number(number); + if (Number.isNaN(number)) { + return 0; + } + if (number < 0) { + throw new ERR_OUT_OF_RANGE("number", ">= 0", number); + } + return number; +} + +function drop(number, options) { + if (options != null) { + validateObject(options, "options", options); + } + if (options?.signal != null) { + validateAbortSignal(options?.signal, "options.signal"); + } + number = toIntegerOrInfinity(number); + return async function* drop() { + let _options$signal8; + if ( + options !== null && + options !== undefined && + (_options$signal8 = options.signal) !== null && + _options$signal8 !== undefined && + _options$signal8.aborted + ) { + throw new AbortError(); + } + for await (const val of this) { + let _options$signal9; + if ( + options !== null && + options !== undefined && + (_options$signal9 = options.signal) !== null && + _options$signal9 !== undefined && + _options$signal9.aborted + ) { + throw new AbortError(); + } + if (number-- <= 0) { + yield val; + } + } + }.call(this); +} + +function take(number, options) { + if (options != null) { + validateObject(options, "options", options); + } + if (options?.signal != null) { + validateAbortSignal(options?.signal, "options.signal"); + } + number = toIntegerOrInfinity(number); + return async function* take() { + let _options$signal10; + if ( + options !== null && + options !== undefined && + (_options$signal10 = options.signal) !== null && + _options$signal10 !== undefined && + _options$signal10.aborted + ) { + throw new AbortError(); + } + for await (const val of this) { + let _options$signal11; + if ( + options !== null && + options !== undefined && + (_options$signal11 = options.signal) !== null && + _options$signal11 !== undefined && + _options$signal11.aborted + ) { + throw new AbortError(); + } + if (number-- > 0) { + yield val; + } else { + return; + } + } + }.call(this); +} + +Readable.prototype.map = function (fn, options) { + return from(Readable, map.call(this, fn, options)); +}; + +Readable.prototype.asIndexedPairs = function (options) { + return from(Readable, asIndexedPairs.call(this, options)); +}; + +Readable.prototype.drop = function (number, options) { + return from(Readable, drop.call(this, number, options)); +}; + +Readable.prototype.filter = function (fn, options) { + return from(Readable, filter.call(this, fn, options)); +}; + +Readable.prototype.flatMap = function (fn, options) { + return from(Readable, flatMap.call(this, fn, options)); +}; + +Readable.prototype.take = function (number, options) { + return from(Readable, take.call(this, number, options)); +}; + +Readable.prototype.every = every; +Readable.prototype.forEach = forEach; +Readable.prototype.reduce = reduce; +Readable.prototype.toArray = toArray; +Readable.prototype.some = some; +Readable.prototype.find = find; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_transform.d.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_transform.d.ts new file mode 100644 index 000000000..7add11339 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_transform.d.ts @@ -0,0 +1,392 @@ +import EventEmitter from "./events"; + +interface WritableOptions { + highWaterMark?: number | undefined; + decodeStrings?: boolean | undefined; + defaultEncoding?: BufferEncoding | undefined; + objectMode?: boolean | undefined; + emitClose?: boolean | undefined; + write?( + this: Writable, + chunk: any, + encoding: BufferEncoding, + callback: (error?: Error | null) => void + ): void; + writev?( + this: Writable, + chunks: Array<{ chunk: any; encoding: BufferEncoding }>, + callback: (error?: Error | null) => void + ): void; + destroy?(this: Writable, error: Error | null, callback: (error: Error | null) => void): void; + final?(this: Writable, callback: (error?: Error | null) => void): void; + autoDestroy?: boolean | undefined; +} + +export class internal extends EventEmitter { + pipe( + destination: T, + options?: { end?: boolean | undefined } + ): T; +} + +export class Stream extends internal { + constructor(opts?: ReadableOptions); +} + +interface ReadableOptions { + highWaterMark?: number | undefined; + encoding?: BufferEncoding | undefined; + objectMode?: boolean | undefined; + read?(this: Readable, size: number): void; + destroy?(this: Readable, error: Error | null, callback: (error: Error | null) => void): void; + autoDestroy?: boolean | undefined; +} + +export class Readable extends Stream implements NodeJS.ReadableStream { + static from(iterable: Iterable | AsyncIterable, options?: ReadableOptions): Readable; + + readable: boolean; + readonly readableEncoding: BufferEncoding | null; + readonly readableEnded: boolean; + readonly readableFlowing: boolean | null; + readonly readableHighWaterMark: number; + readonly readableLength: number; + readonly readableObjectMode: boolean; + destroyed: boolean; + constructor(opts?: ReadableOptions); + _read(size: number): void; + read(size?: number): any; + setEncoding(encoding: BufferEncoding): this; + pause(): this; + resume(): this; + isPaused(): boolean; + unpipe(destination?: NodeJS.WritableStream): this; + unshift(chunk: any, encoding?: BufferEncoding): void; + wrap(oldStream: NodeJS.ReadableStream): this; + push(chunk: any, encoding?: BufferEncoding): boolean; + _destroy(error: Error | null, callback: (error?: Error | null) => void): void; + destroy(error?: Error): this; + + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: any) => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + + emit(event: "close"): boolean; + emit(event: "data", chunk: any): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "pause"): boolean; + emit(event: "readable"): boolean; + emit(event: "resume"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: any) => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "readable", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: any) => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "readable", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: any) => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: any) => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + + removeListener(event: "close", listener: () => void): this; + removeListener(event: "data", listener: (chunk: any) => void): this; + removeListener(event: "end", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "pause", listener: () => void): this; + removeListener(event: "readable", listener: () => void): this; + removeListener(event: "resume", listener: () => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; + + [Symbol.asyncIterator](): AsyncIterableIterator; +} + +export class Writable extends Stream implements NodeJS.WritableStream { + readonly writable: boolean; + readonly writableEnded: boolean; + readonly writableFinished: boolean; + readonly writableHighWaterMark: number; + readonly writableLength: number; + readonly writableObjectMode: boolean; + readonly writableCorked: number; + destroyed: boolean; + constructor(opts?: WritableOptions); + _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void; + _writev?( + chunks: Array<{ chunk: any; encoding: BufferEncoding }>, + callback: (error?: Error | null) => void + ): void; + _destroy(error: Error | null, callback: (error?: Error | null) => void): void; + _final(callback: (error?: Error | null) => void): void; + write(chunk: any, cb?: (error: Error | null | undefined) => void): boolean; + write( + chunk: any, + encoding: BufferEncoding, + cb?: (error: Error | null | undefined) => void + ): boolean; + setDefaultEncoding(encoding: BufferEncoding): this; + end(cb?: () => void): this; + end(chunk: any, cb?: () => void): this; + end(chunk: any, encoding: BufferEncoding, cb?: () => void): this; + cork(): void; + uncork(): void; + destroy(error?: Error): this; + + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pipe", listener: (src: Readable) => void): this; + addListener(event: "unpipe", listener: (src: Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + + emit(event: "close"): boolean; + emit(event: "drain"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "pipe", src: Readable): boolean; + emit(event: "unpipe", src: Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pipe", listener: (src: Readable) => void): this; + on(event: "unpipe", listener: (src: Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pipe", listener: (src: Readable) => void): this; + once(event: "unpipe", listener: (src: Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pipe", listener: (src: Readable) => void): this; + prependListener(event: "unpipe", listener: (src: Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + + removeListener(event: "close", listener: () => void): this; + removeListener(event: "drain", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "finish", listener: () => void): this; + removeListener(event: "pipe", listener: (src: Readable) => void): this; + removeListener(event: "unpipe", listener: (src: Readable) => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; +} + +export class Duplex extends Readable implements Writable { + readonly writable: boolean; + readonly writableEnded: boolean; + readonly writableFinished: boolean; + readonly writableHighWaterMark: number; + readonly writableLength: number; + readonly writableObjectMode: boolean; + readonly writableCorked: number; + allowHalfOpen: boolean; + constructor(opts?: DuplexOptions); + _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void; + _writev?( + chunks: Array<{ chunk: any; encoding: BufferEncoding }>, + callback: (error?: Error | null) => void + ): void; + _destroy(error: Error | null, callback: (error: Error | null) => void): void; + _final(callback: (error?: Error | null) => void): void; + write( + chunk: any, + encoding?: BufferEncoding, + cb?: (error: Error | null | undefined) => void + ): boolean; + write(chunk: any, cb?: (error: Error | null | undefined) => void): boolean; + setDefaultEncoding(encoding: BufferEncoding): this; + end(cb?: () => void): this; + end(chunk: any, cb?: () => void): this; + end(chunk: any, encoding?: BufferEncoding, cb?: () => void): this; + cork(): void; + uncork(): void; + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: any) => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "pipe", listener: (src: Readable) => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: "unpipe", listener: (src: Readable) => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "close"): boolean; + emit(event: "data", chunk: any): boolean; + emit(event: "drain"): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "pause"): boolean; + emit(event: "pipe", src: Readable): boolean; + emit(event: "readable"): boolean; + emit(event: "resume"): boolean; + emit(event: "unpipe", src: Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: any) => void): this; + on(event: "drain", listener: () => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pause", listener: () => void): this; + on(event: "pipe", listener: (src: Readable) => void): this; + on(event: "readable", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: "unpipe", listener: (src: Readable) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: any) => void): this; + once(event: "drain", listener: () => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pause", listener: () => void): this; + once(event: "pipe", listener: (src: Readable) => void): this; + once(event: "readable", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: "unpipe", listener: (src: Readable) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: any) => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "pipe", listener: (src: Readable) => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: "unpipe", listener: (src: Readable) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: any) => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "data", listener: (chunk: any) => void): this; + removeListener(event: "drain", listener: () => void): this; + removeListener(event: "end", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "finish", listener: () => void): this; + removeListener(event: "pause", listener: () => void): this; + removeListener(event: "pipe", listener: (src: Readable) => void): this; + removeListener(event: "readable", listener: () => void): this; + removeListener(event: "resume", listener: () => void): this; + removeListener(event: "unpipe", listener: (src: Readable) => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; +} + +interface DuplexOptions extends ReadableOptions, WritableOptions { + allowHalfOpen?: boolean | undefined; + readableObjectMode?: boolean | undefined; + writableObjectMode?: boolean | undefined; + readableHighWaterMark?: number | undefined; + writableHighWaterMark?: number | undefined; + writableCorked?: number | undefined; + read?(this: Duplex, size: number): void; + write?( + this: Duplex, + chunk: any, + encoding: BufferEncoding, + callback: (error?: Error | null) => void + ): void; + writev?( + this: Duplex, + chunks: Array<{ chunk: any; encoding: BufferEncoding }>, + callback: (error?: Error | null) => void + ): void; + final?(this: Duplex, callback: (error?: Error | null) => void): void; + destroy?(this: Duplex, error: Error | null, callback: (error: Error | null) => void): void; +} + +interface TransformOptions extends DuplexOptions { + read?(this: Transform, size: number): void; + write?( + this: Transform, + chunk: any, + encoding: BufferEncoding, + callback: (error?: Error | null) => void + ): void; + writev?( + this: Transform, + chunks: Array<{ chunk: any; encoding: BufferEncoding }>, + callback: (error?: Error | null) => void + ): void; + final?(this: Transform, callback: (error?: Error | null) => void): void; + destroy?(this: Transform, error: Error | null, callback: (error: Error | null) => void): void; + transform?( + this: Transform, + chunk: any, + encoding: BufferEncoding, + callback: TransformCallback + ): void; + flush?(this: Transform, callback: TransformCallback): void; +} + +type TransformCallback = (error?: Error | null, data?: any) => void; + +export class Transform extends Duplex { + constructor(opts?: TransformOptions); + _transform(chunk: any, encoding: BufferEncoding, callback: TransformCallback): void; + _flush(callback: TransformCallback): void; +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_transform.js b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_transform.js new file mode 100644 index 000000000..213c21c61 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_transform.js @@ -0,0 +1,143 @@ +"use strict"; + +import { ERR_METHOD_NOT_IMPLEMENTED } from "./internal_errors"; + +import { Duplex } from "./streams_duplex"; + +import { getHighWaterMark } from "./streams_util"; + +Object.setPrototypeOf(Transform.prototype, Duplex.prototype); +Object.setPrototypeOf(Transform, Duplex); + +const kCallback = Symbol("kCallback"); + +export function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + // TODO (ronag): This should preferably always be + // applied but would be semver-major. Or even better; + // make Transform a Readable with the Writable interface. + const readableHighWaterMark = options + ? getHighWaterMark(options, "readableHighWaterMark", true) + : null; + if (readableHighWaterMark === 0) { + // A Duplex will buffer both on the writable and readable side while + // a Transform just wants to buffer hwm number of elements. To avoid + // buffering twice we disable buffering on the writable side. + options = { + ...options, + highWaterMark: null, + readableHighWaterMark, + // TODO (ronag): 0 is not optimal since we have + // a "bug" where we check needDrain before calling _write and not after. + // Refs: https://github.com/nodejs/node/pull/32887 + // Refs: https://github.com/nodejs/node/pull/35941 + writableHighWaterMark: options?.writableHighWaterMark || 0, + }; + } + Duplex.call(this, options); + + // We have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + this[kCallback] = null; + if (options) { + if (typeof options.transform === "function") this._transform = options.transform; + if (typeof options.flush === "function") this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + // Backwards compat. Some Transform streams incorrectly implement _final + // instead of or in addition to _flush. By using 'prefinish' instead of + // implementing _final we continue supporting this unfortunate use case. + this.on("prefinish", prefinish); +} + +function final(cb) { + if (typeof this._flush === "function" && !this.destroyed) { + this._flush((er, data) => { + if (er) { + if (cb) { + cb(er); + } else { + this.destroy(er); + } + return; + } + if (data != null) { + this.push(data); + } + this.push(null); + if (cb) { + cb(); + } + }); + } else { + this.push(null); + if (cb) { + cb(); + } + } +} + +function prefinish() { + if (this._final !== final) { + final.call(this); + } +} +Transform.prototype._final = final; + +Transform.prototype._transform = function () { + throw new ERR_METHOD_NOT_IMPLEMENTED("_transform()"); +}; + +Transform.prototype._write = function (chunk, encoding, callback) { + const rState = this._readableState; + const wState = this._writableState; + const length = rState.length; + this._transform(chunk, encoding, (err, val) => { + if (err) { + callback(err); + return; + } + if (val != null) { + this.push(val); + } + if ( + wState.ended || + // Backwards compat. + length === rState.length || + // Backwards compat. + rState.length < rState.highWaterMark + ) { + callback(); + } else { + this[kCallback] = callback; + } + }); +}; + +Transform.prototype._read = function (_size) { + if (this[kCallback]) { + const callback = this[kCallback]; + this[kCallback] = null; + callback(); + } +}; + +Object.setPrototypeOf(PassThrough.prototype, Transform.prototype); +Object.setPrototypeOf(PassThrough, Transform); + +export function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + Transform.call(this, { + ...options, + transform: undefined, + flush: undefined, + }); +} + +PassThrough.prototype._transform = function (chunk, _, cb) { + cb(null, chunk); +}; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_util.js b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_util.js new file mode 100644 index 000000000..91949bd71 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_util.js @@ -0,0 +1,1043 @@ +export const kDestroyed = Symbol("kDestroyed"); +export const kIsErrored = Symbol("kIsErrored"); +export const kIsReadable = Symbol("kIsReadable"); +export const kIsDisturbed = Symbol("kIsDisturbed"); +export const kPaused = Symbol("kPaused"); +export const kOnFinished = Symbol("kOnFinished"); +export const kDestroy = Symbol("kDestroy"); +export const kConstruct = Symbol("kConstruct"); + +import { + AbortError, + ERR_INVALID_ARG_TYPE, + ERR_INVALID_ARG_VALUE, + ERR_STREAM_PREMATURE_CLOSE, + ERR_MULTIPLE_CALLBACK, + aggregateTwoErrors, +} from "./internal_errors"; + +import * as process from "./process"; + +import { Buffer } from "./internal_buffer"; + +import { validateAbortSignal, validateFunction, validateObject } from "./validators"; + +export function isReadableNodeStream(obj, strict = false) { + let _obj$_readableState; + return !!( + ( + obj && + typeof obj.pipe === "function" && + typeof obj.on === "function" && + (!strict || (typeof obj.pause === "function" && typeof obj.resume === "function")) && + (!obj._writableState || + ((_obj$_readableState = obj._readableState) === null || + _obj$_readableState === undefined + ? undefined + : _obj$_readableState.readable) !== false) && + // Duplex + (!obj._writableState || obj._readableState) + ) // Writable has .pipe. + ); +} + +export function isWritableNodeStream(obj) { + let _obj$_writableState; + return !!( + ( + obj && + typeof obj.write === "function" && + typeof obj.on === "function" && + (!obj._readableState || + ((_obj$_writableState = obj._writableState) === null || + _obj$_writableState === undefined + ? undefined + : _obj$_writableState.writable) !== false) + ) // Duplex + ); +} + +export function isDuplexNodeStream(obj) { + return !!( + obj && + typeof obj.pipe === "function" && + obj._readableState && + typeof obj.on === "function" && + typeof obj.write === "function" + ); +} + +export function isNodeStream(obj) { + return ( + obj && + (obj._readableState || + obj._writableState || + (typeof obj.write === "function" && typeof obj.on === "function") || + (typeof obj.pipe === "function" && typeof obj.on === "function")) + ); +} + +export function isIterable(obj, isAsync = false) { + if (obj == null) return false; + if (isAsync === true) return typeof obj[Symbol.asyncIterator] === "function"; + if (isAsync === false) return typeof obj[Symbol.iterator] === "function"; + return ( + typeof obj[Symbol.asyncIterator] === "function" || + typeof obj[Symbol.iterator] === "function" + ); +} + +export function isDestroyed(stream) { + if (!isNodeStream(stream)) return null; + const wState = stream._writableState; + const rState = stream._readableState; + const state = wState || rState; + return !!( + stream.destroyed || + stream[kDestroyed] || + (state !== null && state !== undefined && state.destroyed) + ); +} + +export function isWritableEnded(stream) { + if (!isWritableNodeStream(stream)) return null; + if (stream.writableEnded === true) return true; + const wState = stream._writableState; + if (wState !== null && wState !== undefined && wState.errored) return false; + if (typeof (wState === null || wState === undefined ? undefined : wState.ended) !== "boolean") + return null; + return wState.ended; +} + +export function isWritableFinished(stream, strict = false) { + if (!isWritableNodeStream(stream)) return null; + if (stream.writableFinished === true) return true; + const wState = stream._writableState; + if (wState !== null && wState !== undefined && wState.errored) return false; + if ( + typeof (wState === null || wState === undefined ? undefined : wState.finished) !== "boolean" + ) + return null; + return !!( + wState.finished || + (strict === false && wState.ended === true && wState.length === 0) + ); +} + +export function isReadableEnded(stream) { + if (!isReadableNodeStream(stream)) return null; + if (stream.readableEnded === true) return true; + const rState = stream._readableState; + if (!rState || rState.errored) return false; + if (typeof (rState === null || rState === undefined ? undefined : rState.ended) !== "boolean") + return null; + return rState.ended; +} + +export function isReadableFinished(stream, strict = false) { + if (!isReadableNodeStream(stream)) return null; + const rState = stream._readableState; + if (rState !== null && rState !== undefined && rState.errored) return false; + if ( + typeof (rState === null || rState === undefined ? undefined : rState.endEmitted) !== + "boolean" + ) + return null; + return !!( + rState.endEmitted || + (strict === false && rState.ended === true && rState.length === 0) + ); +} + +export function isReadable(stream) { + if (stream && stream[kIsReadable] != null) return stream[kIsReadable]; + if ( + typeof (stream === null || stream === undefined ? undefined : stream.readable) !== "boolean" + ) + return null; + if (isDestroyed(stream)) return false; + return isReadableNodeStream(stream) && stream.readable && !isReadableFinished(stream); +} + +export function isWritable(stream) { + if ( + typeof (stream === null || stream === undefined ? undefined : stream.writable) !== "boolean" + ) + return null; + if (isDestroyed(stream)) return false; + return isWritableNodeStream(stream) && stream.writable && !isWritableEnded(stream); +} + +export function isFinished(stream, opts = {}) { + if (!isNodeStream(stream)) { + return null; + } + if (isDestroyed(stream)) { + return true; + } + if ( + (opts === null || opts === undefined ? undefined : opts.readable) !== false && + isReadable(stream) + ) { + return false; + } + if ( + (opts === null || opts === undefined ? undefined : opts.writable) !== false && + isWritable(stream) + ) { + return false; + } + return true; +} + +export function isWritableErrored(stream) { + let _stream$_writableStat, _stream$_writableStat2; + if (!isNodeStream(stream)) { + return null; + } + if (stream.writableErrored) { + return stream.writableErrored; + } + return (_stream$_writableStat = + (_stream$_writableStat2 = stream._writableState) === null || + _stream$_writableStat2 === undefined + ? undefined + : _stream$_writableStat2.errored) !== null && _stream$_writableStat !== undefined + ? _stream$_writableStat + : null; +} + +export function isReadableErrored(stream) { + let _stream$_readableStat, _stream$_readableStat2; + if (!isNodeStream(stream)) { + return null; + } + if (stream.readableErrored) { + return stream.readableErrored; + } + return (_stream$_readableStat = + (_stream$_readableStat2 = stream._readableState) === null || + _stream$_readableStat2 === undefined + ? undefined + : _stream$_readableStat2.errored) !== null && _stream$_readableStat !== undefined + ? _stream$_readableStat + : null; +} + +export function isClosed(stream) { + if (!isNodeStream(stream)) { + return null; + } + if (typeof stream.closed === "boolean") { + return stream.closed; + } + const wState = stream._writableState; + const rState = stream._readableState; + if ( + typeof (wState === null || wState === undefined ? undefined : wState.closed) === + "boolean" || + typeof (rState === null || rState === undefined ? undefined : rState.closed) === "boolean" + ) { + return ( + (wState === null || wState === undefined ? undefined : wState.closed) || + (rState === null || rState === undefined ? undefined : rState.closed) + ); + } + if (typeof stream._closed === "boolean" && isOutgoingMessage(stream)) { + return stream._closed; + } + return null; +} + +// TODO(later): We do not actually support OutgoingMessage yet. Might not ever? +// Keeping this here tho just to keep things simple. +export function isOutgoingMessage(stream) { + return ( + typeof stream._closed === "boolean" && + typeof stream._defaultKeepAlive === "boolean" && + typeof stream._removedConnection === "boolean" && + typeof stream._removedContLen === "boolean" + ); +} + +// TODO(later): We do not actually support Server Response yet. Might not ever? +// Keeping this here tho just to keep things simple. +export function isServerResponse(stream) { + return typeof stream._sent100 === "boolean" && isOutgoingMessage(stream); +} + +// TODO(later): We do not actually support Server Request yet. Might not ever? +// Keeping this here tho just to keep things simple. +export function isServerRequest(stream) { + let _stream$req; + return ( + typeof stream._consuming === "boolean" && + typeof stream._dumped === "boolean" && + ((_stream$req = stream.req) === null || _stream$req === undefined + ? undefined + : _stream$req.upgradeOrConnect) === undefined + ); +} + +export function willEmitClose(stream) { + if (!isNodeStream(stream)) return null; + const wState = stream._writableState; + const rState = stream._readableState; + const state = wState || rState; + return ( + (!state && isServerResponse(stream)) || + !!(state && state.autoDestroy && state.emitClose && state.closed === false) + ); +} + +export function isDisturbed(stream) { + let _stream$kIsDisturbed; + return !!( + stream && + ((_stream$kIsDisturbed = stream[kIsDisturbed]) !== null && + _stream$kIsDisturbed !== undefined + ? _stream$kIsDisturbed + : stream.readableDidRead || stream.readableAborted) + ); +} + +export function isErrored(stream) { + var _ref, + _ref2, + _ref3, + _ref4, + _ref5, + _stream$kIsErrored, + _stream$_readableStat3, + _stream$_writableStat3, + _stream$_readableStat4, + _stream$_writableStat4; + return !!( + stream && + ((_ref = + (_ref2 = + (_ref3 = + (_ref4 = + (_ref5 = + (_stream$kIsErrored = stream[kIsErrored]) !== null && + _stream$kIsErrored !== undefined + ? _stream$kIsErrored + : stream.readableErrored) !== null && _ref5 !== undefined + ? _ref5 + : stream.writableErrored) !== null && _ref4 !== undefined + ? _ref4 + : (_stream$_readableStat3 = stream._readableState) === null || + _stream$_readableStat3 === undefined + ? undefined + : _stream$_readableStat3.errorEmitted) !== null && _ref3 !== undefined + ? _ref3 + : (_stream$_writableStat3 = stream._writableState) === null || + _stream$_writableStat3 === undefined + ? undefined + : _stream$_writableStat3.errorEmitted) !== null && _ref2 !== undefined + ? _ref2 + : (_stream$_readableStat4 = stream._readableState) === null || + _stream$_readableStat4 === undefined + ? undefined + : _stream$_readableStat4.errored) !== null && _ref !== undefined + ? _ref + : (_stream$_writableStat4 = stream._writableState) === null || + _stream$_writableStat4 === undefined + ? undefined + : _stream$_writableStat4.errored) + ); +} + +export const nop = () => {}; + +export function once(callback) { + let called = false; + return function (...args) { + if (called) { + return; + } + called = true; + callback.apply(this, args); + }; +} + +// ====================================================================================== +// highWaterMark handling + +export function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null + ? options.highWaterMark + : isDuplex + ? options[duplexKey] + : null; +} + +export function getDefaultHighWaterMark(objectMode = false) { + return objectMode ? 16 : 16 * 1024; +} + +export function getHighWaterMark(state, options, duplexKey, isDuplex) { + const hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + if (hwm != null) { + if (!Number.isInteger(hwm) || hwm < 0) { + const name = isDuplex ? `options.${duplexKey}` : "options.highWaterMark"; + throw new ERR_INVALID_ARG_VALUE(name, hwm, name); + } + return Math.floor(hwm); + } + + // Default value + return getDefaultHighWaterMark(state.objectMode); +} + +// ====================================================================================== +// addAbortSignal + +export function addAbortSignal(signal, stream) { + validateAbortSignal(signal, "signal"); + if (!isNodeStream(stream)) { + throw new ERR_INVALID_ARG_TYPE("stream", "stream.Stream", stream); + } + const onAbort = () => { + stream.destroy( + new AbortError(undefined, { + cause: signal.reason, + }) + ); + }; + if (signal.aborted) { + onAbort(); + } else { + signal.addEventListener("abort", onAbort); + eos(stream, () => signal.removeEventListener("abort", onAbort)); + } + return stream; +} + +// ====================================================================================== +// BufferList + +export class BufferList { + head = null; + tail = null; + length = 0; + + push(v) { + const entry = { + data: v, + next: null, + }; + if (this.length > 0) this.tail.next = entry; + else this.head = entry; + this.tail = entry; + ++this.length; + } + unshift(v) { + const entry = { + data: v, + next: this.head, + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + shift() { + if (this.length === 0) return; + const ret = this.head.data; + if (this.length === 1) this.head = this.tail = null; + else this.head = this.head.next; + --this.length; + return ret; + } + + clear() { + this.head = this.tail = null; + this.length = 0; + } + + join(s) { + if (this.length === 0) return ""; + let p = this.head; + let ret = "" + p.data; + while ((p = p.next) !== null) ret += s + p.data; + return ret; + } + + concat(n) { + if (this.length === 0) return Buffer.alloc(0); + const ret = Buffer.allocUnsafe(n >>> 0); + let p = this.head; + let i = 0; + while (p) { + ret.set(p.data, i); + i += p.data.length; + p = p.next; + } + return ret; + } + + consume(n, hasStrings = false) { + const data = this.head.data; + if (n < data.length) { + // `slice` is the same for buffers and strings. + const slice = data.slice(0, n); + this.head.data = data.slice(n); + return slice; + } + if (n === data.length) { + // First chunk is a perfect match. + return this.shift(); + } + // Result spans more than one buffer. + return hasStrings ? this._getString(n) : this._getBuffer(n); + } + + first() { + return this.head.data; + } + + *[Symbol.iterator]() { + for (let p = this.head; p; p = p.next) { + yield p.data; + } + } + + _getString(n) { + let ret = ""; + let p = this.head; + let c = 0; + do { + const str = p.data; + if (n > str.length) { + ret += str; + n -= str.length; + } else { + if (n === str.length) { + ret += str; + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + ret += str.slice(0, n); + this.head = p; + p.data = str.slice(n); + } + break; + } + ++c; + } while ((p = p.next) !== null); + this.length -= c; + return ret; + } + + _getBuffer(n) { + const ret = Buffer.allocUnsafe(n); + const retLen = n; + let p = this.head; + let c = 0; + do { + const buf = p.data; + if (n > buf.length) { + ret.set(buf, retLen - n); + n -= buf.length; + } else { + if (n === buf.length) { + ret.set(buf, retLen - n); + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + ret.set(new Uint8Array(buf.buffer, buf.byteOffset, n), retLen - n); + this.head = p; + p.data = buf.slice(n); + } + break; + } + ++c; + } while ((p = p.next) !== null); + this.length -= c; + return ret; + } +} + +// ====================================================================================== + +// TODO(later): We do not current implement Node.js' Request object. Might never? +function isRequest(stream) { + return stream && stream.setHeader && typeof stream.abort === "function"; +} + +export function eos(stream, options, callback) { + let _options$readable, _options$writable; + if (arguments.length === 2) { + callback = options; + options = {}; + } else if (options == null) { + options = {}; + } else { + validateObject(options, "options", options); + } + validateFunction(callback, "callback"); + validateAbortSignal(options.signal, "options.signal"); + callback = once(callback); + const readable = + (_options$readable = options.readable) !== null && _options$readable !== undefined + ? _options$readable + : isReadableNodeStream(stream); + const writable = + (_options$writable = options.writable) !== null && _options$writable !== undefined + ? _options$writable + : isWritableNodeStream(stream); + if (!isNodeStream(stream)) { + // TODO: Webstreams. + throw new ERR_INVALID_ARG_TYPE("stream", "Stream", stream); + } + const wState = stream._writableState; + const rState = stream._readableState; + const onlegacyfinish = () => { + if (!stream.writable) { + onfinish(); + } + }; + + // TODO (ronag): Improve soft detection to include core modules and + // common ecosystem modules that do properly emit 'close' but fail + // this generic check. + let _willEmitClose = + willEmitClose(stream) && + isReadableNodeStream(stream) === readable && + isWritableNodeStream(stream) === writable; + let writableFinished = isWritableFinished(stream, false); + const onfinish = () => { + writableFinished = true; + // Stream should not be destroyed here. If it is that + // means that user space is doing something differently and + // we cannot trust willEmitClose. + if (stream.destroyed) { + _willEmitClose = false; + } + if (_willEmitClose && (!stream.readable || readable)) { + return; + } + if (!readable || readableFinished) { + callback.call(stream); + } + }; + let readableFinished = isReadableFinished(stream, false); + const onend = () => { + readableFinished = true; + // Stream should not be destroyed here. If it is that + // means that user space is doing something differently and + // we cannot trust willEmitClose. + if (stream.destroyed) { + _willEmitClose = false; + } + if (_willEmitClose && (!stream.writable || writable)) { + return; + } + if (!writable || writableFinished) { + callback.call(stream); + } + }; + const onerror = (err) => { + callback.call(stream, err); + }; + let closed = isClosed(stream); + const onclose = () => { + closed = true; + const errored = isWritableErrored(stream) || isReadableErrored(stream); + if (errored && typeof errored !== "boolean") { + return callback.call(stream, errored); + } + if (readable && !readableFinished && isReadableNodeStream(stream, true)) { + if (!isReadableFinished(stream, false)) + return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE()); + } + if (writable && !writableFinished) { + if (!isWritableFinished(stream, false)) + return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE()); + } + callback.call(stream); + }; + const onrequest = () => { + stream.req.on("finish", onfinish); + }; + if (isRequest(stream)) { + stream.on("complete", onfinish); + if (!_willEmitClose) { + stream.on("abort", onclose); + } + if (stream.req) { + onrequest(); + } else { + stream.on("request", onrequest); + } + } else if (writable && !wState) { + // legacy streams + stream.on("end", onlegacyfinish); + stream.on("close", onlegacyfinish); + } + + // Not all streams will emit 'close' after 'aborted'. + if (!_willEmitClose && typeof stream.aborted === "boolean") { + stream.on("aborted", onclose); + } + stream.on("end", onend); + stream.on("finish", onfinish); + if (options.error !== false) { + stream.on("error", onerror); + } + stream.on("close", onclose); + if (closed) { + process.nextTick(onclose); + } else if ( + (wState !== null && wState !== undefined && wState.errorEmitted) || + (rState !== null && rState !== undefined && rState.errorEmitted) + ) { + if (!_willEmitClose) { + process.nextTick(onclose); + } + } else if ( + !readable && + (!_willEmitClose || isReadable(stream)) && + (writableFinished || isWritable(stream) === false) + ) { + process.nextTick(onclose); + } else if ( + !writable && + (!_willEmitClose || isWritable(stream)) && + (readableFinished || isReadable(stream) === false) + ) { + process.nextTick(onclose); + } else if (rState && stream.req && stream.aborted) { + process.nextTick(onclose); + } + const cleanup = () => { + callback = nop; + stream.removeListener("aborted", onclose); + stream.removeListener("complete", onfinish); + stream.removeListener("abort", onclose); + stream.removeListener("request", onrequest); + if (stream.req) stream.req.removeListener("finish", onfinish); + stream.removeListener("end", onlegacyfinish); + stream.removeListener("close", onlegacyfinish); + stream.removeListener("finish", onfinish); + stream.removeListener("end", onend); + stream.removeListener("error", onerror); + stream.removeListener("close", onclose); + }; + if (options.signal && !closed) { + const abort = () => { + // Keep it because cleanup removes it. + const endCallback = callback; + cleanup(); + endCallback.call( + stream, + new AbortError(undefined, { + cause: options.signal?.reason, + }) + ); + }; + if (options.signal.aborted) { + process.nextTick(abort); + } else { + const originalCallback = callback; + callback = once((...args) => { + options.signal.removeEventListener("abort", abort); + originalCallback.apply(stream, args); + }); + options.signal.addEventListener("abort", abort); + } + } + return cleanup; +} + +export function finished(stream, opts) { + return new Promise((resolve, reject) => { + eos(stream, opts, (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); +} + +eos.finished = finished; + +// ====================================================================================== +// Destroy + +function checkError(err, w, r) { + if (err) { + // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364 + err.stack; // eslint-disable-line no-unused-expressions + + if (w && !w.errored) { + w.errored = err; + } + if (r && !r.errored) { + r.errored = err; + } + } +} + +export function destroy(err, cb) { + const r = this._readableState; + const w = this._writableState; + // With duplex streams we use the writable side for state. + const s = w || r; + if ((w && w.destroyed) || (r && r.destroyed)) { + if (typeof cb === "function") { + cb(); + } + return this; + } + + // We set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + checkError(err, w, r); + if (w) { + w.destroyed = true; + } + if (r) { + r.destroyed = true; + } + + // If still constructing then defer calling _destroy. + if (!s.constructed) { + this.once(kDestroy, function (er) { + _destroy(this, aggregateTwoErrors(er, err), cb); + }); + } else { + _destroy(this, err, cb); + } + return this; +} + +function _destroy(self, err, cb) { + let called = false; + function onDestroy(err) { + if (called) { + return; + } + called = true; + const r = self._readableState; + const w = self._writableState; + checkError(err, w, r); + if (w) { + w.closed = true; + } + if (r) { + r.closed = true; + } + if (typeof cb === "function") { + cb(err); + } + if (err) { + process.nextTick(emitErrorCloseNT, self, err); + } else { + process.nextTick(emitCloseNT, self); + } + } + try { + self._destroy(err || null, onDestroy); + } catch (err) { + onDestroy(err); + } +} + +function emitErrorCloseNT(self, err) { + emitErrorNT(self, err); + emitCloseNT(self); +} + +function emitCloseNT(self) { + const r = self._readableState; + const w = self._writableState; + if (w) { + w.closeEmitted = true; + } + if (r) { + r.closeEmitted = true; + } + if ((w && w.emitClose) || (r && r.emitClose)) { + self.emit("close"); + } +} + +function emitErrorNT(self, err) { + const r = self._readableState; + const w = self._writableState; + if ((w && w.errorEmitted) || (r && r.errorEmitted)) { + return; + } + if (w) { + w.errorEmitted = true; + } + if (r) { + r.errorEmitted = true; + } + self.emit("error", err); +} + +export function undestroy() { + const r = this._readableState; + const w = this._writableState; + if (r) { + r.constructed = true; + r.closed = false; + r.closeEmitted = false; + r.destroyed = false; + r.errored = null; + r.errorEmitted = false; + r.reading = false; + r.ended = r.readable === false; + r.endEmitted = r.readable === false; + } + if (w) { + w.constructed = true; + w.destroyed = false; + w.closed = false; + w.closeEmitted = false; + w.errored = null; + w.errorEmitted = false; + w.finalCalled = false; + w.prefinished = false; + w.ended = w.writable === false; + w.ending = w.writable === false; + w.finished = w.writable === false; + } +} + +export function errorOrDestroy(stream, err, sync = false) { + // We have tests that rely on errors being emitted + // in the same tick, so changing this is semver major. + // For now when you opt-in to autoDestroy we allow + // the error to be emitted nextTick. In a future + // semver major update we should change the default to this. + + const r = stream._readableState; + const w = stream._writableState; + if ((w && w.destroyed) || (r && r.destroyed)) { + return; + } + if ((r && r.autoDestroy) || (w && w.autoDestroy)) stream.destroy(err); + else if (err) { + // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364 + err.stack; // eslint-disable-line no-unused-expressions + + if (w && !w.errored) { + w.errored = err; + } + if (r && !r.errored) { + r.errored = err; + } + if (sync) { + process.nextTick(emitErrorNT, stream, err); + } else { + emitErrorNT(stream, err); + } + } +} + +export function construct(stream, cb) { + if (typeof stream._construct !== "function") { + return; + } + const r = stream._readableState; + const w = stream._writableState; + if (r) { + r.constructed = false; + } + if (w) { + w.constructed = false; + } + stream.once(kConstruct, cb); + if (stream.listenerCount(kConstruct) > 1) { + // Duplex + return; + } + process.nextTick(constructNT, stream); +} + +function constructNT(stream) { + let called = false; + function onConstruct(err) { + if (called) { + errorOrDestroy( + stream, + err !== null && err !== undefined ? err : new ERR_MULTIPLE_CALLBACK() + ); + return; + } + called = true; + const r = stream._readableState; + const w = stream._writableState; + const s = w || r; + if (r) { + r.constructed = true; + } + if (w) { + w.constructed = true; + } + if (s.destroyed) { + stream.emit(kDestroy, err); + } else if (err) { + errorOrDestroy(stream, err, true); + } else { + process.nextTick(emitConstructNT, stream); + } + } + try { + stream._construct(onConstruct); + } catch (err) { + onConstruct(err); + } +} + +function emitConstructNT(stream) { + stream.emit(kConstruct); +} + +function emitCloseLegacy(stream) { + stream.emit("close"); +} + +function emitErrorCloseLegacy(stream, err) { + stream.emit("error", err); + process.nextTick(emitCloseLegacy, stream); +} + +// Normalize destroy for legacy. +export function destroyer(stream, err) { + if (!stream || isDestroyed(stream)) { + return; + } + if (!err && !isFinished(stream)) { + err = new AbortError(); + } + + // TODO: Remove isRequest branches. + if (isServerRequest(stream)) { + stream.socket = null; + stream.destroy(err); + } else if (isRequest(stream)) { + stream.abort(); + } else if (isRequest(stream.req)) { + stream.req.abort(); + } else if (typeof stream.destroy === "function") { + stream.destroy(err); + } else if (typeof stream.close === "function") { + // TODO: Don't lose err? + stream.close(); + } else if (err) { + process.nextTick(emitErrorCloseLegacy, stream, err); + } else { + process.nextTick(emitCloseLegacy, stream); + } + if (!stream.destroyed) { + stream[kDestroyed] = true; + } +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_writable.js b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_writable.js new file mode 100644 index 000000000..6a288b6d6 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/streams_writable.js @@ -0,0 +1,816 @@ +import EventEmitter from "./events"; + +import { Stream } from "./streams_legacy"; + +import { Buffer } from "./internal_buffer"; + +import * as process from "./process"; + +import { + nop, + kOnFinished, + getHighWaterMark, + getDefaultHighWaterMark, + addAbortSignal, + construct, + destroy, + undestroy, + errorOrDestroy, +} from "./streams_util"; + +import { + newStreamWritableFromWritableStream, + newWritableStreamFromStreamWritable, +} from "./streams_adapters"; + +import { + ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED, + ERR_STREAM_ALREADY_FINISHED, + ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING, +} from "./internal_errors"; + +import { isDuplexInstance } from "./streams_duplex"; + +// ====================================================================================== +// WritableState + +function WritableState(options, stream, isDuplex) { + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream, + // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. + if (typeof isDuplex !== "boolean") isDuplex = isDuplexInstance(stream); + + // Object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options?.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options?.writableObjectMode; + + // The point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write(). + this.highWaterMark = options + ? getHighWaterMark(this, options, "writableHighWaterMark", isDuplex) + : getDefaultHighWaterMark(false); + + // if _final has been called. + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // At the start of calling end() + this.ending = false; + // When end() has been called, and returned. + this.ended = false; + // When 'finish' is emitted. + this.finished = false; + + // Has it been destroyed + this.destroyed = false; + + // Should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + const noDecode = !!(options?.decodeStrings === false); + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options?.defaultEncoding || "utf8"; + + // Not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // A flag to see when we're in the middle of a write. + this.writing = false; + + // When true all writes will be buffered until .uncork() call. + this.corked = 0; + + // A flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // A flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // The callback that's passed to _write(chunk, cb). + this.onwrite = (err) => onwrite.call(undefined, stream, err); + + // The callback that the user supplies to write(chunk, encoding, cb). + this.writecb = null; + + // The amount that is being written when _write is called. + this.writelen = 0; + + // Storage for data passed to the afterWrite() callback in case of + // synchronous _write() completion. + this.afterWriteTickInfo = null; + resetBuffer(this); + + // Number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted. + this.pendingcb = 0; + + // Stream is still being constructed and cannot be + // destroyed until construction finished or failed. + // Async construction is opt in, therefore we start as + // constructed. + this.constructed = true; + + // Emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams. + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again. + this.errorEmitted = false; + + // Should close be emitted on destroy. Defaults to true. + this.emitClose = !options || options.emitClose !== false; + + // Should .destroy() be called after 'finish' (and potentially 'end'). + this.autoDestroy = !options || options.autoDestroy !== false; + + // Indicates whether the stream has errored. When true all write() calls + // should return false. This is needed since when autoDestroy + // is disabled we need a way to tell whether the stream has failed. + this.errored = null; + + // Indicates whether the stream has finished destroying. + this.closed = false; + + // True if close has been emitted or would have been emitted + // depending on emitClose. + this.closeEmitted = false; + this[kOnFinished] = []; +} + +function resetBuffer(state) { + state.buffered = []; + state.bufferedIndex = 0; + state.allBuffers = true; + state.allNoop = true; +} + +WritableState.prototype.getBuffer = function getBuffer() { + return this.buffered.slice(this.bufferedIndex); +}; + +Object.defineProperty(WritableState.prototype, "bufferedRequestCount", { + get() { + return this.buffered.length - this.bufferedIndex; + }, +}); + +// ====================================================================================== +// Writable + +Writable.WritableState = WritableState; + +Object.setPrototypeOf(Writable.prototype, Stream.prototype); +Object.setPrototypeOf(Writable, Stream); + +export function Writable(options) { + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + + // Checking for a Stream.Duplex instance is faster here instead of inside + // the WritableState constructor, at least with V8 6.5. + const isDuplex = isDuplexInstance(this); + if (!isDuplex && !Writable[Symbol.hasInstance](this)) return new Writable(options); + this._writableState = new WritableState(options, this, isDuplex); + if (options) { + if (typeof options.write === "function") this._write = options.write; + if (typeof options.writev === "function") this._writev = options.writev; + if (typeof options.destroy === "function") this._destroy = options.destroy; + if (typeof options.final === "function") this._final = options.final; + if (typeof options.construct === "function") this._construct = options.construct; + if (options.signal) addAbortSignal(options.signal, this); + } + Stream.call(this, options); + construct(this, () => { + const state = this._writableState; + if (!state.writing) { + clearBuffer(this, state); + } + finishMaybe(this, state); + }); +} + +Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (Function.prototype[Symbol.hasInstance].call(this, object)) return true; + if (this !== Writable) return false; + return object?._writableState instanceof WritableState; + }, +}); + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function (_1, _2) { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); +}; + +function _write(stream, chunk, encoding, cb) { + const state = stream._writableState; + if (typeof encoding === "function") { + cb = encoding; + encoding = state.defaultEncoding; + } else { + if (!encoding) encoding = state.defaultEncoding; + else if (encoding !== "buffer" && !Buffer.isEncoding(encoding)) { + throw new ERR_UNKNOWN_ENCODING(encoding); + } + if (typeof cb !== "function") cb = nop; + } + if (chunk === null) { + throw new ERR_STREAM_NULL_VALUES(); + } else if (!state.objectMode) { + if (typeof chunk === "string") { + if (state.decodeStrings !== false) { + chunk = Buffer.from(chunk, encoding); + encoding = "buffer"; + } + } else if (chunk instanceof Buffer) { + encoding = "buffer"; + } else if (Stream._isUint8Array(chunk)) { + chunk = Stream._uint8ArrayToBuffer(chunk); + encoding = "buffer"; + } else { + throw new ERR_INVALID_ARG_TYPE("chunk", ["string", "Buffer", "Uint8Array"], chunk); + } + } + let err; + if (state.ending) { + err = new ERR_STREAM_WRITE_AFTER_END(); + } else if (state.destroyed) { + err = new ERR_STREAM_DESTROYED("write"); + } + if (err) { + process.nextTick(cb, err); + errorOrDestroy(stream, err, true); + return err; + } + state.pendingcb++; + return writeOrBuffer(stream, state, chunk, encoding, cb); +} + +function write(chunk, encoding, cb) { + return _write(this, chunk, encoding, cb) === true; +} + +Writable.prototype.write = write; + +Writable.prototype.cork = function () { + this._writableState.corked++; +}; + +Writable.prototype.uncork = function () { + const state = this._writableState; + if (state.corked) { + state.corked--; + if (!state.writing) clearBuffer(this, state); + } +}; + +function setDefaultEncoding(encoding) { + if (typeof encoding === "string") encoding = encoding.toLowerCase(); + if (!Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding); + this._writableState.defaultEncoding = encoding; + return this; +} + +Writable.prototype.setDefaultEncoding = setDefaultEncoding; + +// If we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, callback) { + const len = state.objectMode ? 1 : chunk.length; + state.length += len; + + // stream._write resets state.length + const ret = state.length < state.highWaterMark; + // We must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + if (state.writing || state.corked || state.errored || !state.constructed) { + state.buffered.push({ + chunk, + encoding, + callback, + }); + if (state.allBuffers && encoding !== "buffer") { + state.allBuffers = false; + } + if (state.allNoop && callback !== nop) { + state.allNoop = false; + } + } else { + state.writelen = len; + state.writecb = callback; + state.writing = true; + state.sync = true; + stream._write(chunk, encoding, state.onwrite); + state.sync = false; + } + + // Return false if errored or destroyed in order to break + // any synchronous while(stream.write(data)) loops. + return ret && !state.errored && !state.destroyed; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED("write")); + else if (writev) stream._writev(chunk, state.onwrite); + else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, er, cb) { + --state.pendingcb; + cb(er); + // Ensure callbacks are invoked even when autoDestroy is + // not enabled. Passing `er` here doesn't make sense since + // it's related to one specific write, not to the buffered + // writes. + errorBuffer(state); + // This can emit error, but error must always follow cb. + errorOrDestroy(stream, er); +} + +function onwrite(stream, er) { + const state = stream._writableState; + const sync = state.sync; + const cb = state.writecb; + if (typeof cb !== "function") { + errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK()); + return; + } + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; + if (er) { + // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364 + er.stack; // eslint-disable-line no-unused-expressions + + if (!state.errored) { + state.errored = er; + } + + // In case of duplex streams we need to notify the readable side of the + // error. + if (stream._readableState && !stream._readableState.errored) { + stream._readableState.errored = er; + } + if (sync) { + process.nextTick(onwriteError, stream, state, er, cb); + } else { + onwriteError(stream, state, er, cb); + } + } else { + if (state.buffered.length > state.bufferedIndex) { + clearBuffer(stream, state); + } + if (sync) { + // It is a common case that the callback passed to .write() is always + // the same. In that case, we do not schedule a new nextTick(), but + // rather just increase a counter, to improve performance and avoid + // memory allocations. + if (state.afterWriteTickInfo !== null && state.afterWriteTickInfo.cb === cb) { + state.afterWriteTickInfo.count++; + } else { + state.afterWriteTickInfo = { + count: 1, + cb, + stream, + state, + }; + process.nextTick(afterWriteTick, state.afterWriteTickInfo); + } + } else { + afterWrite(stream, state, 1, cb); + } + } +} + +function afterWriteTick({ stream, state, count, cb }) { + state.afterWriteTickInfo = null; + return afterWrite(stream, state, count, cb); +} + +function afterWrite(stream, state, count, cb) { + const needDrain = !state.ending && !stream.destroyed && state.length === 0 && state.needDrain; + if (needDrain) { + state.needDrain = false; + stream.emit("drain"); + } + while (count-- > 0) { + state.pendingcb--; + cb(); + } + if (state.destroyed) { + errorBuffer(state); + } + finishMaybe(stream, state); +} + +// If there's something in the buffer waiting, then invoke callbacks. +function errorBuffer(state) { + if (state.writing) { + return; + } + for (let n = state.bufferedIndex; n < state.buffered.length; ++n) { + let _state$errored; + const { chunk, callback } = state.buffered[n]; + const len = state.objectMode ? 1 : chunk.length; + state.length -= len; + callback( + (_state$errored = state.errored) !== null && _state$errored !== undefined + ? _state$errored + : new ERR_STREAM_DESTROYED("write") + ); + } + const onfinishCallbacks = state[kOnFinished].splice(0); + for (let i = 0; i < onfinishCallbacks.length; i++) { + let _state$errored2; + onfinishCallbacks[i]( + (_state$errored2 = state.errored) !== null && _state$errored2 !== undefined + ? _state$errored2 + : new ERR_STREAM_DESTROYED("end") + ); + } + resetBuffer(state); +} + +// If there's something in the buffer waiting, then process it. +function clearBuffer(stream, state) { + if (state.corked || state.bufferProcessing || state.destroyed || !state.constructed) { + return; + } + const { buffered, bufferedIndex, objectMode } = state; + const bufferedLength = buffered.length - bufferedIndex; + if (!bufferedLength) { + return; + } + let i = bufferedIndex; + state.bufferProcessing = true; + if (bufferedLength > 1 && stream._writev) { + state.pendingcb -= bufferedLength - 1; + const callback = state.allNoop + ? nop + : (err) => { + for (let n = i; n < buffered.length; ++n) { + buffered[n].callback(err); + } + }; + // Make a copy of `buffered` if it's going to be used by `callback` above, + // since `doWrite` will mutate the array. + const chunks = state.allNoop && i === 0 ? buffered : buffered.slice(i); + chunks.allBuffers = state.allBuffers; + doWrite(stream, state, true, state.length, chunks, "", callback); + resetBuffer(state); + } else { + do { + const { chunk, encoding, callback } = buffered[i]; + buffered[i++] = null; + const len = objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, callback); + } while (i < buffered.length && !state.writing); + if (i === buffered.length) { + resetBuffer(state); + } else if (i > 256) { + buffered.splice(0, i); + state.bufferedIndex = 0; + } else { + state.bufferedIndex = i; + } + } + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + if (this._writev) { + this._writev( + [ + { + chunk, + encoding, + }, + ], + cb + ); + } else { + throw new ERR_METHOD_NOT_IMPLEMENTED("_write()"); + } +}; + +Writable.prototype._writev = null; + +function end(chunk, encoding, cb) { + const state = this._writableState; + if (typeof chunk === "function") { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === "function") { + cb = encoding; + encoding = null; + } + let err; + if (chunk !== null && chunk !== undefined) { + const ret = _write(this, chunk, encoding); + if (ret instanceof Error) { + err = ret; + } + } + + // .end() fully uncorks. + if (state.corked) { + state.corked = 1; + this.uncork(); + } + if (err) { + // Do nothing... + } else if (!state.errored && !state.ending) { + // This is forgiving in terms of unnecessary calls to end() and can hide + // logic errors. However, usually such errors are harmless and causing a + // hard error can be disproportionately destructive. It is not always + // trivial for the user to determine whether end() needs to be called + // or not. + + state.ending = true; + finishMaybe(this, state, true); + state.ended = true; + } else if (state.finished) { + err = new ERR_STREAM_ALREADY_FINISHED("end"); + } else if (state.destroyed) { + err = new ERR_STREAM_DESTROYED("end"); + } + if (typeof cb === "function") { + if (err || state.finished) { + process.nextTick(cb, err); + } else { + state[kOnFinished].push(cb); + } + } + return this; +} + +Writable.prototype.end = end; + +function needFinish(state) { + return ( + state.ending && + !state.destroyed && + state.constructed && + state.length === 0 && + !state.errored && + state.buffered.length === 0 && + !state.finished && + !state.writing && + !state.errorEmitted && + !state.closeEmitted + ); +} + +function callFinal(stream, state) { + let called = false; + function onFinish(err) { + if (called) { + errorOrDestroy(stream, err || new ERR_MULTIPLE_CALLBACK()); + return; + } + called = true; + state.pendingcb--; + if (err) { + const onfinishCallbacks = state[kOnFinished].splice(0); + for (let i = 0; i < onfinishCallbacks.length; i++) { + onfinishCallbacks[i](err); + } + errorOrDestroy(stream, err, state.sync); + } else if (needFinish(state)) { + state.prefinished = true; + stream.emit("prefinish"); + // Backwards compat. Don't check state.sync here. + // Some streams assume 'finish' will be emitted + // asynchronously relative to _final callback. + state.pendingcb++; + process.nextTick(finish, stream, state); + } + } + state.sync = true; + state.pendingcb++; + try { + stream._final(onFinish); + } catch (err) { + onFinish(err); + } + state.sync = false; +} + +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === "function" && !state.destroyed) { + state.finalCalled = true; + callFinal(stream, state); + } else { + state.prefinished = true; + stream.emit("prefinish"); + } + } +} + +function finishMaybe(stream, state, sync = false) { + if (needFinish(state)) { + prefinish(stream, state); + if (state.pendingcb === 0) { + if (sync) { + state.pendingcb++; + process.nextTick(() => { + ((stream, state) => { + if (needFinish(state)) { + finish(stream, state); + } else { + state.pendingcb--; + } + })(stream, state); + }); + } else if (needFinish(state)) { + state.pendingcb++; + finish(stream, state); + } + } + } +} + +function finish(stream, state) { + state.pendingcb--; + state.finished = true; + const onfinishCallbacks = state[kOnFinished].splice(0); + for (let i = 0; i < onfinishCallbacks.length; i++) { + onfinishCallbacks[i](); + } + stream.emit("finish"); + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the readable side is ready for autoDestroy as well. + const rState = stream._readableState; + const autoDestroy = + !rState || + (rState.autoDestroy && + // We don't expect the readable to ever 'end' + // if readable is explicitly set to false. + (rState.endEmitted || rState.readable === false)); + if (autoDestroy) { + stream.destroy(); + } + } +} + +Object.defineProperties(Writable.prototype, { + closed: { + get() { + return !!this._writableState?.closed; + }, + }, + destroyed: { + get() { + return !!this._writableState?.destroyed; + }, + set(value) { + // Backward compatibility, the user is explicitly managing destroyed. + if (this._writableState) { + this._writableState.destroyed = value; + } + }, + }, + errored: { + enumerable: false, + get() { + return this._writableState?.errored || null; + }, + }, + writable: { + get() { + const w = this._writableState; + // w.writable === false means that this is part of a Duplex stream + // where the writable side was disabled upon construction. + // Compat. The user might manually disable writable side through + // deprecated setter. + return ( + !!w && w.writable !== false && !w.destroyed && !w.errored && !w.ending && !w.ended + ); + }, + set(val) { + // Backwards compatible. + if (this._writableState) { + this._writableState.writable = !!val; + } + }, + }, + writableFinished: { + get() { + return !!this._writableState?.finished; + }, + }, + writableObjectMode: { + get() { + return !!this._writableState?.objectMode; + }, + }, + writableBuffer: { + get() { + return this._writableState?.getBuffer(); + }, + }, + writableEnded: { + get() { + return !!this._writableState?.ending; + }, + }, + writableNeedDrain: { + get() { + const wState = this._writableState; + if (!wState) return false; + return !wState.destroyed && !wState.ending && wState.needDrain; + }, + }, + writableHighWaterMark: { + get() { + return this._writableState?.highWaterMark; + }, + }, + writableCorked: { + get() { + return this._writableState?.corked | 0; + }, + }, + writableLength: { + get() { + return this._writableState?.length; + }, + }, + writableAborted: { + enumerable: false, + get() { + return !!( + this._writableState.writable !== false && + (this._writableState.destroyed || this._writableState.errored) && + !this._writableState.finished + ); + }, + }, +}); + +Writable.prototype.destroy = function (err, cb) { + const state = this._writableState; + + // Invoke pending callbacks. + if ( + !state.destroyed && + (state.bufferedIndex < state.buffered.length || state[kOnFinished].length) + ) { + process.nextTick(errorBuffer, state); + } + destroy.call(this, err, cb); + return this; +}; + +Writable.prototype._undestroy = undestroy; + +Writable.prototype._destroy = function (err, cb) { + if (cb) cb(err); +}; +Writable.prototype[EventEmitter.captureRejectionSymbol] = function (err) { + this.destroy(err); +}; + +Writable.fromWeb = function (writableStream, options) { + return newStreamWritableFromWritableStream(writableStream, options); +}; +Writable.toWeb = function (streamWritable) { + return newWritableStreamFromStreamWritable(streamWritable); +}; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/util.d.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/util.d.ts new file mode 100644 index 000000000..d97761026 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/util.d.ts @@ -0,0 +1,107 @@ +export abstract class MIMEType { + public constructor(input: string); + public type: string; + public subtype: string; + public readonly essence: string; + public readonly params: MIMEParams; + public toString(): string; + public toJSON(): string; +} + +export abstract class MIMEParams { + public constructor(); + public delete(name: string): void; + public get(name: string): string | undefined; + public has(name: string): boolean; + public set(name: string, value: string): void; + public entries(): Iterable; + public keys(): Iterable; + public values(): Iterable; +} + +export const kResourceTypeInspect: unique symbol; + +export const ALL_PROPERTIES: 0; +export const ONLY_ENUMERABLE: 1; +export function getOwnNonIndexProperties( + value: unknown, + filter: typeof ALL_PROPERTIES | typeof ONLY_ENUMERABLE +): PropertyKey[]; + +export const kPending: 0; +export const kFulfilled: 1; +export const kRejected: 2; +export interface PromiseDetails { + state: typeof kPending | typeof kFulfilled | typeof kRejected; + result: unknown; +} +export function getPromiseDetails(value: unknown): PromiseDetails | undefined; + +export interface ProxyDetails { + target: unknown; + handler: unknown; +} +export function getProxyDetails(value: unknown): ProxyDetails | undefined; + +export interface PreviewedEntries { + entries: unknown[]; + isKeyValue: boolean; +} +export function previewEntries(value: unknown): PreviewedEntries | undefined; + +export function getConstructorName(value: unknown): string; + +export type TypedArray = + | Uint8Array + | Uint8ClampedArray + | Uint16Array + | Uint32Array + | Int8Array + | Int16Array + | Int32Array + | BigUint64Array + | BigInt64Array + | Float32Array + | Float64Array; + +export function isArrayBufferView(value: unknown): value is ArrayBufferView; +export function isArgumentsObject(value: unknown): value is IArguments; +export function isArrayBuffer(value: unknown): value is ArrayBuffer; +export function isAsyncFunction(value: unknown): value is Function; +export function isBigInt64Array(value: unknown): value is BigInt64Array; +export function isBigIntObject(value: unknown): value is BigInt; +export function isBigUint64Array(value: unknown): value is BigUint64Array; +export function isBooleanObject(value: unknown): value is Boolean; +export function isDataView(value: unknown): value is DataView; +export function isDate(value: unknown): value is Date; +export function isFloat32Array(value: unknown): value is Float32Array; +export function isFloat64Array(value: unknown): value is Float64Array; +export function isGeneratorFunction(value: unknown): value is GeneratorFunction; +export function isGeneratorObject(value: unknown): value is Generator; +export function isInt8Array(value: unknown): value is Int8Array; +export function isInt16Array(value: unknown): value is Int16Array; +export function isInt32Array(value: unknown): value is Int32Array; +export function isMap(value: unknown): value is Map; +export function isMapIterator(value: unknown): value is IterableIterator; +export function isModuleNamespaceObject(value: unknown): boolean; +export function isNativeError(value: unknown): value is Error; +export function isNumberObject(value: unknown): value is Number; +export function isPromise(value: unknown): value is Promise; +export function isProxy(value: unknown): boolean; +export function isRegExp(value: unknown): value is RegExp; +export function isSet(value: unknown): value is Set; +export function isSetIterator(value: unknown): value is IterableIterator; +export function isSharedArrayBuffer(value: unknown): value is SharedArrayBuffer; +export function isStringObject(value: unknown): value is String; +export function isSymbolObject(value: unknown): value is Symbol; +export function isTypedArray(value: unknown): value is TypedArray; +export function isUint8Array(value: unknown): value is Uint8Array; +export function isUint8ClampedArray(value: unknown): value is Uint8ClampedArray; +export function isUint16Array(value: unknown): value is Uint16Array; +export function isUint32Array(value: unknown): value is Uint32Array; +export function isWeakMap(value: unknown): value is WeakMap; +export function isWeakSet(value: unknown): value is WeakSet; +export function isAnyArrayBuffer(value: unknown): value is ArrayBuffer | SharedArrayBuffer; +export function isBoxedPrimitive( + value: unknown +): value is Number | String | Boolean | BigInt | Symbol; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/util.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/util.ts new file mode 100644 index 000000000..13f506b0b --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/util.ts @@ -0,0 +1,261 @@ +import { + ALL_PROPERTIES as A_PROPERTIES, + ONLY_CONFIGURABLE, + ONLY_ENUMERABLE as O_ENUMERABLE, + ONLY_WRITABLE, + SKIP_STRINGS, + SKIP_SYMBOLS, + isArrayIndex, +} from "./internal_utils"; + +export const kPending = 0; +export const kFulfilled = 1; +export const kRejected = 2; + +export const kResourceTypeInspect: unique symbol = Symbol.for("nodejs.util.inspect.custom"); + +export interface PromiseDetails { + state: typeof kPending | typeof kFulfilled | typeof kRejected; + result: unknown; +} + +export type TypedArray = + | Uint8Array + | Uint8ClampedArray + | Uint16Array + | Uint32Array + | Int8Array + | Int16Array + | Int32Array + | BigUint64Array + | BigInt64Array + | Float32Array + | Float64Array; + +export interface PreviewedEntries { + entries: unknown[]; + isKeyValue: boolean; +} +export interface ProxyDetails { + target: unknown; + handler: unknown; +} + +export function getOwnNonIndexProperties( + // deno-lint-ignore ban-types + obj: object, + filter: number +): (string | symbol)[] { + let allProperties = [...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj)]; + + if (Array.isArray(obj)) { + allProperties = allProperties.filter((k) => !isArrayIndex(k)); + } + + if (filter === A_PROPERTIES) { + return allProperties; + } + + const result: (string | symbol)[] = []; + for (const key of allProperties) { + const desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc === undefined) { + continue; + } + if (filter & ONLY_WRITABLE && !desc.writable) { + continue; + } + if (filter & O_ENUMERABLE && !desc.enumerable) { + continue; + } + if (filter & ONLY_CONFIGURABLE && !desc.configurable) { + continue; + } + if (filter & SKIP_STRINGS && typeof key === "string") { + continue; + } + if (filter & SKIP_SYMBOLS && typeof key === "symbol") { + continue; + } + result.push(key); + } + return result; +} + +export const ALL_PROPERTIES = A_PROPERTIES; +export const ONLY_ENUMERABLE = O_ENUMERABLE; + +// TODO: implement this properly +export function isArrayBufferView(value: unknown): value is ArrayBufferView { + return false; +} + +export function isArgumentsObject(value: unknown): value is IArguments { + return false; +} + +export function isArrayBuffer(value: unknown): value is ArrayBuffer { + return false; +} + +export function isAsyncFunction(value: unknown): value is Function { + return false; +} + +export function isBigInt64Array(value: unknown): value is BigInt64Array { + return false; +} + +export function isBigIntObject(value: unknown): value is BigInt { + return false; +} + +export function isBigUint64Array(value: unknown): value is BigUint64Array { + return false; +} + +export function isBooleanObject(value: unknown): value is Boolean { + return false; +} + +export function isDataView(value: unknown): value is DataView { + return false; +} + +export function isDate(value: unknown): value is Date { + return false; +} + +export function isFloat32Array(value: unknown): value is Float32Array { + return false; +} + +export function isFloat64Array(value: unknown): value is Float64Array { + return false; +} + +export function isGeneratorFunction(value: unknown): value is GeneratorFunction { + return false; +} + +export function isGeneratorObject(value: unknown): value is Generator { + return false; +} + +export function isInt8Array(value: unknown): value is Int8Array { + return false; +} + +export function isInt16Array(value: unknown): value is Int16Array { + return false; +} + +export function isInt32Array(value: unknown): value is Int32Array { + return false; +} + +export function isMap(value: unknown): value is Map { + return false; +} + +export function isMapIterator(value: unknown): value is IterableIterator { + return false; +} + +export function isModuleNamespaceObject(value: unknown): boolean { + return false; +} + +export function isNativeError(value: unknown): value is Error { + return false; +} + +export function isNumberObject(value: unknown): value is Number { + return false; +} + +export function isPromise(value: unknown): value is Promise { + return false; +} + +export function isProxy(value: unknown): boolean { + return false; +} + +export function isRegExp(value: unknown): value is RegExp { + return false; +} + +export function isSet(value: unknown): value is Set { + return false; +} + +export function isSetIterator(value: unknown): value is IterableIterator { + return false; +} + +export function isSharedArrayBuffer(value: unknown): value is SharedArrayBuffer { + return false; +} + +export function isStringObject(value: unknown): value is String { + return false; +} + +export function isSymbolObject(value: unknown): value is Symbol { + return false; +} + +export function isTypedArray(value: unknown): value is TypedArray { + return false; +} + +export function isUint8Array(value: unknown): value is Uint8Array { + return false; +} + +export function isUint8ClampedArray(value: unknown): value is Uint8ClampedArray { + return false; +} + +export function isUint16Array(value: unknown): value is Uint16Array { + return false; +} + +export function isUint32Array(value: unknown): value is Uint32Array { + return false; +} + +export function isWeakMap(value: unknown): value is WeakMap { + return false; +} + +export function isWeakSet(value: unknown): value is WeakSet { + return false; +} + +export function isAnyArrayBuffer(value: unknown): value is ArrayBuffer | SharedArrayBuffer { + return false; +} + +export function isBoxedPrimitive( + value: unknown +): value is Number | String | Boolean | BigInt | Symbol { + return false; +} + +export function getPromiseDetails(value: unknown): PromiseDetails | undefined { + return undefined; +} + +export function getProxyDetails(value: unknown): ProxyDetails | undefined { + return undefined; +} + +export function previewEntries(value: unknown): PreviewedEntries | undefined { + return undefined; +} + +export function getConstructorName(value: unknown): string { + return ""; +} diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/internal/validators.ts b/JS/wasm/crates/wasmjs-engine/shims/src/internal/validators.ts new file mode 100644 index 000000000..f34d63533 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/internal/validators.ts @@ -0,0 +1,171 @@ +import { isArrayBufferView } from "./internal_types"; +import { normalizeEncoding } from "./internal_utils"; +import { ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, ERR_OUT_OF_RANGE } from "./internal_errors"; + +// TODO(someday): Not current implementing parseFileMode, validatePort + +export const isInt32 = (value: any) => value === (value | 0); +export const isUint32 = (value: any) => value === value >>> 0; + +export function validateBuffer(buffer: unknown, name = "buffer") { + if (!isArrayBufferView(buffer)) { + throw new ERR_INVALID_ARG_TYPE(name, ["Buffer", "TypedArray", "DataView"], buffer); + } +} + +export function validateInteger( + value: unknown, + name: string, + min = Number.MIN_SAFE_INTEGER, + max = Number.MAX_SAFE_INTEGER +) { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE(name, "number", value); + } + if (!Number.isInteger(value)) { + throw new ERR_OUT_OF_RANGE(name, "an integer", value); + } + if (value < min || value > max) { + throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value); + } +} + +export interface ValidateObjectOptions { + allowArray?: boolean; + allowFunction?: boolean; + nullable?: boolean; +} + +export function validateObject(value: unknown, name: string, options?: ValidateObjectOptions) { + const useDefaultOptions = options == null; + const allowArray = useDefaultOptions ? false : options.allowArray; + const allowFunction = useDefaultOptions ? false : options.allowFunction; + const nullable = useDefaultOptions ? false : options.nullable; + if ( + (!nullable && value === null) || + (!allowArray && Array.isArray(value)) || + (typeof value !== "object" && (!allowFunction || typeof value !== "function")) + ) { + throw new ERR_INVALID_ARG_TYPE(name, "Object", value); + } +} + +export function validateInt32(value: any, name: string, min = -2147483648, max = 2147483647) { + if (!isInt32(value)) { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE(name, "number", value); + } + + if (!Number.isInteger(value)) { + throw new ERR_OUT_OF_RANGE(name, "an integer", value); + } + + throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value); + } + + if (value < min || value > max) { + throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value); + } +} + +export function validateUint32(value: unknown, name: string, positive?: boolean) { + if (!isUint32(value)) { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE(name, "number", value); + } + if (!Number.isInteger(value)) { + throw new ERR_OUT_OF_RANGE(name, "an integer", value); + } + const min = positive ? 1 : 0; + // 2 ** 32 === 4294967296 + throw new ERR_OUT_OF_RANGE(name, `>= ${min} && < 4294967296`, value); + } + if (positive && value === 0) { + throw new ERR_OUT_OF_RANGE(name, ">= 1 && < 4294967296", value); + } +} + +export function validateString(value: unknown, name: string) { + if (typeof value !== "string") { + throw new ERR_INVALID_ARG_TYPE(name, "string", value); + } +} + +export function validateNumber(value: unknown, name: string) { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE(name, "number", value); + } +} + +export function validateBoolean(value: unknown, name: string) { + if (typeof value !== "boolean") { + throw new ERR_INVALID_ARG_TYPE(name, "boolean", value); + } +} + +export function validateOneOf(value: unknown, name: string, oneOf: any[]) { + if (!Array.prototype.includes.call(oneOf, value)) { + const allowed = Array.prototype.join.call( + Array.prototype.map.call(oneOf, (v) => (typeof v === "string" ? `'${v}'` : String(v))), + ", " + ); + const reason = "must be one of: " + allowed; + + throw new ERR_INVALID_ARG_VALUE(name, value, reason); + } +} + +export function validateEncoding(data: unknown, encoding: string): void { + const normalizedEncoding = normalizeEncoding(encoding); + const length = (data as any).length; + + if (normalizedEncoding === "hex" && length % 2 !== 0) { + throw new ERR_INVALID_ARG_VALUE( + "encoding", + encoding, + `is invalid for data of length ${length}` + ); + } +} + +export function validateAbortSignal(signal: unknown, name: string) { + if ( + signal !== undefined && + (signal === null || typeof signal !== "object" || !("aborted" in signal)) + ) { + throw new ERR_INVALID_ARG_TYPE(name, "AbortSignal", signal); + } +} + +export function validateFunction(value: unknown, name: string) { + if (typeof value !== "function") { + throw new ERR_INVALID_ARG_TYPE(name, "Function", value); + } +} + +export function validateArray(value: unknown, name: string, minLength = 0) { + if (!Array.isArray(value)) { + throw new ERR_INVALID_ARG_TYPE(name, "Array", value); + } + if (value.length < minLength) { + const reason = `must be longer than ${minLength}`; + throw new ERR_INVALID_ARG_VALUE(name, value, reason); + } +} + +export default { + isInt32, + isUint32, + validateAbortSignal, + validateArray, + validateBoolean, + validateBuffer, + validateFunction, + validateInt32, + validateInteger, + validateNumber, + validateObject, + validateOneOf, + validateString, + validateUint32, +}; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/path.js b/JS/wasm/crates/wasmjs-engine/shims/src/path.js new file mode 100644 index 000000000..f5f64f2c4 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/path.js @@ -0,0 +1,58 @@ +import { posix, win32 } from "./internal/internal_path"; + +const { + resolve, + normalize, + isAbsolute, + join, + relative, + toNamespacedPath, + dirname, + basename, + extname, + format, + parse, + sep, + delimiter, +} = posix; + +export { + resolve, + normalize, + isAbsolute, + join, + relative, + toNamespacedPath, + dirname, + basename, + extname, + format, + parse, + sep, + delimiter, + posix, + win32, +}; + +export { default } from "./internal/internal_path"; +import process from "./internal/process"; + +globalThis.process = process; + +globalThis.path = { + resolve, + normalize, + isAbsolute, + join, + relative, + toNamespacedPath, + dirname, + basename, + extname, + format, + parse, + sep, + delimiter, + posix, + win32, +}; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/path/posix.ts b/JS/wasm/crates/wasmjs-engine/shims/src/path/posix.ts new file mode 100644 index 000000000..7a16fe830 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/path/posix.ts @@ -0,0 +1,3 @@ +import { posix } from "../internal/internal_path"; + +export default posix; diff --git a/JS/wasm/crates/wasmjs-engine/shims/src/path/win32.ts b/JS/wasm/crates/wasmjs-engine/shims/src/path/win32.ts new file mode 100644 index 000000000..f67ec9e71 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/shims/src/path/win32.ts @@ -0,0 +1,3 @@ +import { win32 } from "../internal/internal_path"; + +export default win32; diff --git a/JS/wasm/crates/wasmjs-engine/src/main.rs b/JS/wasm/crates/wasmjs-engine/src/main.rs new file mode 100644 index 000000000..6ccb308f0 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/src/main.rs @@ -0,0 +1,294 @@ +use std::{ + collections::HashMap, + env, fs, + io::{stdin, stdout, Read, Write}, +}; + +use javy::{ + json, + quickjs::{JSContextRef, JSValue, JSValueRef}, + Runtime, +}; + +wit_bindgen_rust::import!({paths: ["../../assets/wasmjs/wit/http.wit"]}); +use crate::http::*; + +pub enum RuntimeError { + InvalidBinding { invalid_export: String }, +} + +pub fn load_bindings(context: &JSContextRef, global: JSValueRef) -> Result<(), RuntimeError> { + global + .set_property( + "__send_http_request", + context + .wrap_callback(|_ctx, _this_arg, args| { + let uri = args[0].to_string(); + + let opts: HashMap = args[1].try_into()?; + let method = opts.get("method").unwrap().to_string(); + let headers = opts.get("headers").unwrap(); + let body = opts.get("body").unwrap(); + + let method = match method.as_str() { + "GET" => HttpMethod::Get, + "POST" => HttpMethod::Post, + _ => HttpMethod::Get, + }; + + let mut parsed_headers: Vec<(String, String)> = Vec::new(); + + if let JSValue::Object(headers) = headers { + for (key, val) in headers.iter() { + parsed_headers.push((key.to_string(), val.to_string())); + } + } + + let headers_slice: &[(&str, &str)] = &parsed_headers + .iter() + .map(|(k, v)| (k.as_str(), v.as_str())) + .collect::>(); + + let parsed_body: Option<&[u8]>; + + if let JSValue::ArrayBuffer(buf) = body { + parsed_body = Some(buf.as_ref()); + } else if let JSValue::String(data) = body { + parsed_body = Some(data.as_bytes()); + } else { + parsed_body = None; + } + + let req = HttpRequest { + uri: uri.as_str(), + body: parsed_body, + headers: headers_slice, + method, + params: &[], + }; + + match send_http_request(req) { + Ok(result) => { + let body = result.body.unwrap_or(Vec::new()); + let mut headers = HashMap::new(); + + for (key, val) in result.headers.iter() { + headers.insert(key.as_str(), JSValue::String(val.to_string())); + } + + let parsed_result = HashMap::from([ + ("status", JSValue::Int(result.status as i32)), + ("body", JSValue::ArrayBuffer(body)), + ("headers", JSValue::from_hashmap(headers)), + ]); + + Ok(JSValue::from_hashmap(parsed_result)) + } + Err(err) => { + let kind = match err.error { + HttpError::InvalidRequest => "Invalid Request".to_string(), + HttpError::InvalidRequestBody => "Invalid Request Body".to_string(), + HttpError::InvalidResponseBody => { + "Invalid Response Body".to_string() + } + HttpError::NotAllowed => "Not allowed".to_string(), + HttpError::InternalError => "Internal Error".to_string(), + HttpError::Timeout => "Request Timeout".to_string(), + HttpError::RedirectLoop => "Redirect Loop".to_string(), + }; + + Ok(JSValue::from_hashmap(HashMap::from([ + ("error", JSValue::Bool(true)), + ("type", JSValue::String(kind)), + ("message", JSValue::String(err.message)), + ]))) + } + } + }) + .map_err(|_| RuntimeError::InvalidBinding { + invalid_export: "send_http_request".to_string(), + })?, + ) + .map_err(|_| RuntimeError::InvalidBinding { + invalid_export: "send_http_request".to_string(), + })?; + + global + .set_property( + "__console_log", + context + .wrap_callback(|_ctx, _this_arg, args| { + let msg = args[0].to_string(); + eprintln!("{msg}"); + + Ok(JSValue::Null) + }) + .map_err(|_| RuntimeError::InvalidBinding { + invalid_export: "console_log".to_string(), + })?, + ) + .map_err(|_| RuntimeError::InvalidBinding { + invalid_export: "console_log".to_string(), + })?; + + global + .set_property( + "readBytes", + context + .wrap_callback(|_ctx, _this_arg, args| { + let path = args[0].to_string(); + match read_bytes(path.as_str()) { + Ok(result) => Ok(JSValue::String(result)), + Err(err) => { + let kind = match err { + FileError::NotFound => "File not found".to_string(), + FileError::InvalidPath => "Not allowed".to_string(), + }; + + Ok(JSValue::from_hashmap(HashMap::from([ + ("error", JSValue::Bool(true)), + ("type", JSValue::String(kind)), + ]))) + } + } + }) + .map_err(|_| RuntimeError::InvalidBinding { + invalid_export: "readBytes".to_string(), + })?, + ) + .map_err(|_| RuntimeError::InvalidBinding { + invalid_export: "readBytes".to_string(), + })?; + + global + .set_property( + "parseJsonnet", + context + .wrap_callback(|_ctx, _this_arg, args| { + let path = args[0].to_string(); + match parse_jsonnet(path.as_str()) { + Ok(result) => Ok(JSValue::String(result)), + Err(err) => { + let kind = match err { + FileError::NotFound => "File not found".to_string(), + FileError::InvalidPath => "Not allowed".to_string(), + }; + + Ok(JSValue::from_hashmap(HashMap::from([ + ("error", JSValue::Bool(true)), + ("type", JSValue::String(kind)), + ]))) + } + } + }) + .map_err(|_| RuntimeError::InvalidBinding { + invalid_export: "parseJsonnet".to_string(), + })?, + ) + .map_err(|_| RuntimeError::InvalidBinding { + invalid_export: "parseJsonnet".to_string(), + })?; + Ok(()) +} + +static POLYFILL: &str = include_str!("../shims/dist/index.js"); +static POLYFILL_BUFFER: &str = include_str!("../shims/dist/buffer.js"); +static POLYFILL_PATH: &str = include_str!("../shims/dist/path.js"); +static POLYFILL_CRYPTO: &str = include_str!("../shims/dist/crypto.js"); +static ARAKOOJSONNET: &str = include_str!("../shims/dist/arakoo-jsonnet.js"); + +fn main() { + let runtime = Runtime::default(); + let context = runtime.context(); + + let source = fs::read_to_string("/src/index.js"); + let mut contents = String::new(); + let mut buffer = String::new(); + let mut path = String::new(); + let mut crypto = String::new(); + + let mut request = String::new(); + contents.push_str(POLYFILL); + buffer.push_str(POLYFILL_BUFFER); + path.push_str(POLYFILL_PATH); + crypto.push_str(POLYFILL_CRYPTO); + + stdin().read_to_string(&mut request).unwrap(); + + let mut env_vars = HashMap::new(); + for (key, val) in env::vars() { + env_vars.insert(key, val); + } + let env_vars_json = serde_json::to_string(&env_vars).unwrap(); + contents.push_str(&format!("globalThis.env = {};", env_vars_json)); + + contents.push_str(&source.unwrap()); + + let global = context.global_object().unwrap(); + match load_bindings(context, global) { + Ok(_) => {} + Err(e) => { + match e { + RuntimeError::InvalidBinding { invalid_export } => { + eprintln!("There was an error adding the '{invalid_export}' binding"); + } + } + } + } + + context.eval_module("buffer", &buffer).unwrap(); + context.eval_module("crypto", &crypto).unwrap(); + context.eval_module("arakoo-jsonnet", &ARAKOOJSONNET).unwrap(); + + match context.eval_module("path", &path) { + Ok(_) => {} + Err(err) => eprintln!("Error loading the path shim: {err}"), + }; + + context.eval_module("handler.mjs", &contents).unwrap(); + + context + .eval_module( + "runtime.mjs", + &format!( + r#" + import {{ default as handler }} from 'handler.mjs'; + addEventListener('fetch', (e) => {{ + e.respondWith(handler.fetch(e.request)) + }}); + "# + ), + ) + .unwrap(); + + let global = context.global_object().unwrap(); + let entrypoint = global.get_property("entrypoint").unwrap(); + + let input_bytes = request.as_bytes(); + let input_value = json::transcode_input(context, input_bytes).unwrap(); + + match entrypoint.call(&global, &[input_value]) { + Ok(_) => {} + Err(err) => eprintln!("Error calling the main entrypoint: {err}"), + }; + + if context.is_pending() { + if let Err(err) = context.execute_pending() { + eprintln!("Error running async methods: {err}"); + } + } + + let global = context.global_object().unwrap(); + let error_value = global.get_property("error").unwrap(); + let output_value = global.get_property("result").unwrap(); + + if !error_value.is_null_or_undefined() { + eprintln!("{}", error_value.as_str_lossy()); + } + + let output = json::transcode_output(output_value).unwrap(); + + stdout() + .write_all(&output) + .expect("Error when returning the response"); +} diff --git a/JS/wasm/crates/wasmjs-engine/taskfile.yml b/JS/wasm/crates/wasmjs-engine/taskfile.yml new file mode 100644 index 000000000..26ac78188 --- /dev/null +++ b/JS/wasm/crates/wasmjs-engine/taskfile.yml @@ -0,0 +1,23 @@ +version: "3" + +tasks: + add:wasm32-wasi:target: rustup target add wasm32-wasi + build: + deps: + - add:wasm32-wasi:target + - build-shims + cmds: + - cargo build --target wasm32-wasi --release + - cp ./target/wasm32-wasi/release/wasmjs-engine.wasm ./ + build-shims: + deps: + - shims-install + dir: shims + cmds: + - echo pwd + - npm run build + shims-install: + dir: shims + cmds: + - pwd + - npm install diff --git a/JS/wasm/crates/wasmjs-engine/wasmjs-engine.wasm b/JS/wasm/crates/wasmjs-engine/wasmjs-engine.wasm new file mode 100755 index 000000000..a6796d523 Binary files /dev/null and b/JS/wasm/crates/wasmjs-engine/wasmjs-engine.wasm differ diff --git a/JS/wasm/crates/wasmjs-runtime/Cargo.lock b/JS/wasm/crates/wasmjs-runtime/Cargo.lock new file mode 100644 index 000000000..2beed09ee --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/Cargo.lock @@ -0,0 +1,3936 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "actix-codec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" +dependencies = [ + "bitflags 1.3.2", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-files" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d832782fac6ca7369a70c9ee9a20554623c5e51c76e190ad151780ebea1cf689" +dependencies = [ + "actix-http", + "actix-service", + "actix-utils", + "actix-web", + "askama_escape", + "bitflags 1.3.2", + "bytes", + "derive_more", + "futures-core", + "http-range", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", +] + +[[package]] +name = "actix-http" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92ef85799cba03f76e4f7c10f533e66d87c9a7e7055f3391f09000ad8351bc9" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "ahash", + "base64", + "bitflags 2.4.1", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "futures-core", + "h2", + "http", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd 0.12.4", +] + +[[package]] +name = "actix-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +dependencies = [ + "quote", + "syn 2.0.41", +] + +[[package]] +name = "actix-router" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" +dependencies = [ + "bytestring", + "http", + "regex", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2 0.5.5", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" +dependencies = [ + "futures-core", + "paste", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4a5b5e29603ca8c94a77c65cf874718ceb60292c5a5c3e5f4ace041af462b9" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "ahash", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more", + "encoding_rs", + "futures-core", + "futures-util", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2 0.5.5", + "time", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "ambient-authority" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" + +[[package]] +name = "anstream" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "askama_escape" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" + +[[package]] +name = "async-trait" +version = "0.1.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "blake3" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "bytestring" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" +dependencies = [ + "bytes", +] + +[[package]] +name = "cap-fs-ext" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b779b2d0a001c125b4584ad586268fb4b92d957bff8d26d7fe0dd78283faa814" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes", + "windows-sys 0.48.0", +] + +[[package]] +name = "cap-net-ext" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ffc30dee200c20b4dcb80572226f42658e1d9c4b668656d7cc59c33d50e396e" +dependencies = [ + "cap-primitives", + "cap-std", + "rustix", + "smallvec", +] + +[[package]] +name = "cap-primitives" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf30c373a3bee22c292b1b6a7a26736a38376840f1af3d2d806455edf8c3899" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes", + "ipnet", + "maybe-owned", + "rustix", + "windows-sys 0.48.0", + "winx", +] + +[[package]] +name = "cap-rand" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "577de6cff7c2a47d6b13efe5dd28bf116bd7f8f7db164ea95b7cc2640711f522" +dependencies = [ + "ambient-authority", + "rand", +] + +[[package]] +name = "cap-std" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84bade423fa6403efeebeafe568fdb230e8c590a275fba2ba978dd112efcf6e9" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes", + "rustix", +] + +[[package]] +name = "cap-time-ext" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f52b3c8f4abfe3252fd0a071f3004aaa3b18936ec97bdbd8763ce03aff6247" +dependencies = [ + "cap-primitives", + "once_cell", + "rustix", + "winx", +] + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "4.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "const_format" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpp_demangle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "cpufeatures" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "751cbf89e513f283c0641eb7f95dc72fda5051dd95ca203d1dc45e26bc89dba8" +dependencies = [ + "cranelift-entity 0.100.1", +] + +[[package]] +name = "cranelift-codegen" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "210730edc05121e915201cc36595e1f00062094669fa07ac362340e3627b3dc5" +dependencies = [ + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-control", + "cranelift-entity 0.100.1", + "cranelift-isle", + "gimli", + "hashbrown 0.14.3", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5dc7fdf210c53db047f3eaf49b3a89efee0cc3d9a2ce0c0f0236933273d0c53" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46875cc87d963119d78fe5c19852757dc6eea3cb9622c0df69c26b242cd44b4" + +[[package]] +name = "cranelift-control" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375dca8f58d8a801a85e11730c1529c5c4a9c3593dfb12118391ac437b037155" +dependencies = [ + "arbitrary", +] + +[[package]] +name = "cranelift-entity" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc619b86fe3c72f43fc417c9fd67a04ec0c98296e5940922d9fd9e6eedf72521" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "cranelift-entity" +version = "0.102.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb25f573701284fe2bcf88209d405342125df00764b396c923e11eafc94d892" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "cranelift-frontend" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb607fd19ae264da18f9f2532e7302b826f7fbf77bf88365fc075f2e3419436" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fe806a6470dddfdf79e878af6a96afb1235a09fe3e21f9e0c2f18d402820432" + +[[package]] +name = "cranelift-native" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac7f1722660b10af1f7229c0048f716bfd8bd344549b0e06e3eb6417ec3fe5b" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1b65810be56b619c3c55debade92798d999f34bf0670370c578afab5d905f06" +dependencies = [ + "cranelift-codegen", + "cranelift-entity 0.100.1", + "cranelift-frontend", + "itertools 0.10.5", + "log", + "smallvec", + "wasmparser 0.112.0", + "wasmtime-types 13.0.1", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2fe95351b870527a5d09bf563ed3c97c0cffb87cf1c78a591bf48bb218d9aa" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] + +[[package]] +name = "deranged" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "fd-lock" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93f7a0db71c99f68398f80653ed05afb0b00e062e1a20c7ff849c4edfabbbcc" +dependencies = [ + "cfg-if", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs-set-times" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "033b337d725b97690d86893f9de22b67b80dcc4e9ad815f348254c38119db8fb" +dependencies = [ + "io-lifetimes", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "futures" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-io" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-sink" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" + +[[package]] +name = "futures-task" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" + +[[package]] +name = "futures-util" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "fxprof-processed-profile" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" +dependencies = [ + "bitflags 2.4.1", + "debugid", + "fxhash", + "serde", + "serde_json", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "h2" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.4.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", + "serde", +] + +[[package]] +name = "io-extras" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c301e73fb90e8a29e600a9f402d095765f74310d582916a952f618836a1bd1ed" +dependencies = [ + "io-lifetimes", + "windows-sys 0.52.0", +] + +[[package]] +name = "io-lifetimes" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "ittapi" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a5c0b993601cad796222ea076565c5d9f337d35592f8622c753724f06d7271" +dependencies = [ + "anyhow", + "ittapi-sys", + "log", +] + +[[package]] +name = "ittapi-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7b5e473765060536a660eed127f758cf1a810c73e49063264959c60d1727d9" +dependencies = [ + "cc", +] + +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonnet-rs" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b396bdfc3ae94965555c9ec3efa2214e5f3921545a943ef9fc9873ff5e4723" +dependencies = [ + "jsonnet-sys", + "libc", +] + +[[package]] +name = "jsonnet-sys" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02347cbdf34234f30f0d92f0f8f678a15883bd5e1e4b3def4ed4a14f691d9add" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "libc" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" + +[[package]] +name = "local-channel" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" +dependencies = [ + "futures-core", + "futures-sink", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memfd" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +dependencies = [ + "rustix", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "crc32fast", + "hashbrown 0.14.3", + "indexmap", + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "openssl" +version = "0.10.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "pori" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a63d338dec139f56dacc692ca63ad35a6be6a797442479b55acd611d79e906" +dependencies = [ + "nom", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + +[[package]] +name = "pulldown-cmark" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffade02495f22453cd593159ea2f59827aae7f53fa8323f756799b670881dcf8" +dependencies = [ + "bitflags 1.3.2", + "memchr", + "unicase", +] + +[[package]] +name = "pulldown-cmark" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" +dependencies = [ + "bitflags 1.3.2", + "memchr", + "unicase", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regalloc2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" +dependencies = [ + "hashbrown 0.13.2", + "log", + "rustc-hash", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "reqwest" +version = "0.11.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.20", +] + +[[package]] +name = "rustix" +version = "0.38.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +dependencies = [ + "bitflags 2.4.1", + "errno", + "itoa", + "libc", + "linux-raw-sys", + "once_cell", + "windows-sys 0.52.0", +] + +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "394cec28fa623e00903caf7ba4fa6fb9a0e260280bb8cdbbba029611108a0190" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha256" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7895c8ae88588ccead14ff438b939b0c569cd619116f14b4d13fdff7b8333386" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2", + "tokio", +] + +[[package]] +name = "shellexpand" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" +dependencies = [ + "dirs", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "sptr" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-interface" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27ce32341b2c0b70c144bbf35627fdc1ef18c76ced5e5e7b3ee8b5ba6b2ab6a0" +dependencies = [ + "bitflags 2.4.1", + "cap-fs-ext", + "cap-std", + "fd-lock", + "io-lifetimes", + "rustix", + "windows-sys 0.48.0", + "winx", +] + +[[package]] +name = "target-lexicon" +version = "0.12.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" + +[[package]] +name = "tempfile" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "time" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +dependencies = [ + "deranged", + "itoa", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.5.5", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "uuid" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi-cap-std-sync" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c4db6155e71cfae4ed732d87c2583faf4bbdcb77372697eb77d636f46108ba" +dependencies = [ + "anyhow", + "async-trait", + "cap-fs-ext", + "cap-rand", + "cap-std", + "cap-time-ext", + "fs-set-times", + "io-extras", + "io-lifetimes", + "is-terminal", + "once_cell", + "rustix", + "system-interface", + "tracing", + "wasi-common", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasi-common" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3f291b2a567f266ac488715f1742f62b2ca633524708c62ead9c0f71b7d72c" +dependencies = [ + "anyhow", + "bitflags 2.4.1", + "cap-rand", + "cap-std", + "io-extras", + "log", + "rustix", + "thiserror", + "tracing", + "wasmtime 13.0.1", + "wiggle 13.0.1", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.41", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "wasm-encoder" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba64e81215916eaeb48fee292f29401d69235d62d8b8fd92a7b2844ec5ae5f7" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasm-encoder" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "822b645bf4f2446b949776ffca47e2af60b167209ffb70814ef8779d299cd421" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasm-encoder" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasmjs-runtime" +version = "0.1.0" +dependencies = [ + "actix-files", + "actix-web", + "anyhow", + "base64", + "blake3", + "clap", + "http", + "jsonnet-rs", + "lazy_static", + "regex", + "reqwest", + "semver 0.10.0", + "serde", + "serde_json", + "sha256", + "thiserror", + "tokio", + "toml 0.8.8", + "tracing", + "wasi-common", + "wasmparser 0.115.0", + "wasmtime 13.0.1", + "wasmtime-wasi", + "wax", + "wiggle 15.0.1", + "wit-bindgen-wasmtime", +] + +[[package]] +name = "wasmparser" +version = "0.112.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e986b010f47fcce49cf8ea5d5f9e5d2737832f12b53ae8ae785bbe895d0877bf" +dependencies = [ + "indexmap", + "semver 1.0.20", +] + +[[package]] +name = "wasmparser" +version = "0.115.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e06c0641a4add879ba71ccb3a1e4278fd546f76f1eafb21d8f7b07733b547cd5" +dependencies = [ + "indexmap", + "semver 1.0.20", +] + +[[package]] +name = "wasmparser" +version = "0.116.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" +dependencies = [ + "indexmap", + "semver 1.0.20", +] + +[[package]] +name = "wasmparser" +version = "0.118.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ee9723b928e735d53000dec9eae7b07a60e490c85ab54abb66659fc61bfcd9" +dependencies = [ + "indexmap", + "semver 1.0.20", +] + +[[package]] +name = "wasmprinter" +version = "0.2.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d027eb8294904fc715ac0870cebe6b0271e96b90605ee21511e7565c4ce568c" +dependencies = [ + "anyhow", + "wasmparser 0.118.1", +] + +[[package]] +name = "wasmtime" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0263693caa1486bd4d26a5f18511948a706c9290689386b81b851ce088063ce" +dependencies = [ + "anyhow", + "async-trait", + "bincode", + "bumpalo", + "cfg-if", + "encoding_rs", + "fxprof-processed-profile", + "indexmap", + "libc", + "log", + "object", + "once_cell", + "paste", + "psm", + "rayon", + "serde", + "serde_derive", + "serde_json", + "target-lexicon", + "wasm-encoder 0.32.0", + "wasmparser 0.112.0", + "wasmtime-cache", + "wasmtime-component-macro 13.0.1", + "wasmtime-component-util 13.0.1", + "wasmtime-cranelift", + "wasmtime-environ 13.0.1", + "wasmtime-fiber 13.0.1", + "wasmtime-jit 13.0.1", + "wasmtime-runtime 13.0.1", + "wasmtime-winch", + "wat", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "642e12d108e800215263e3b95972977f473957923103029d7d617db701d67ba4" +dependencies = [ + "anyhow", + "async-trait", + "bincode", + "bumpalo", + "cfg-if", + "indexmap", + "libc", + "log", + "object", + "once_cell", + "paste", + "psm", + "serde", + "serde_derive", + "serde_json", + "target-lexicon", + "wasmparser 0.116.1", + "wasmtime-component-macro 15.0.1", + "wasmtime-environ 15.0.1", + "wasmtime-fiber 15.0.1", + "wasmtime-jit 15.0.1", + "wasmtime-runtime 15.0.1", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711e5969236ecfbe70c807804ff9ffb5206c1dbb5c55c5e8200d9f7e8e76adf" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beada8bb15df52503de0a4c58de4357bfd2f96d9a44a6e547bad11efdd988b47" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-cache" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b79f9f79188e5a26b6911b79d3171c06699d9a17ae07f6a265c51635b8d80c2" +dependencies = [ + "anyhow", + "base64", + "bincode", + "directories-next", + "log", + "rustix", + "serde", + "serde_derive", + "sha2", + "toml 0.5.11", + "windows-sys 0.48.0", + "zstd 0.11.2+zstd.1.5.2", +] + +[[package]] +name = "wasmtime-component-macro" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed724d0f41c21bcf8754651a59d0423c530069ddca4cf3822768489ad313a812" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.41", + "wasmtime-component-util 13.0.1", + "wasmtime-wit-bindgen 13.0.1", + "wit-parser 0.11.3", +] + +[[package]] +name = "wasmtime-component-macro" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ccba556991465cca68d5a54769684bcf489fb532059da55105f851642d52c1" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.41", + "wasmtime-component-util 15.0.1", + "wasmtime-wit-bindgen 15.0.1", + "wit-parser 0.13.0", +] + +[[package]] +name = "wasmtime-component-util" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7d69464b94bd312a27d93d0b482cd74bedf01f030199ef0740d6300ebca1d3" + +[[package]] +name = "wasmtime-component-util" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05492a177a6006cb73f034d6e9a6fad6da55b23c4398835cb0012b5fa51ecf67" + +[[package]] +name = "wasmtime-cranelift" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e63f53c61ba05eb815f905c1738ad82c95333dd42ef5a8cc2aa3d7dfb2b08d7" +dependencies = [ + "anyhow", + "cfg-if", + "cranelift-codegen", + "cranelift-control", + "cranelift-entity 0.100.1", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli", + "log", + "object", + "target-lexicon", + "thiserror", + "wasmparser 0.112.0", + "wasmtime-cranelift-shared", + "wasmtime-environ 13.0.1", + "wasmtime-versioned-export-macros 13.0.1", +] + +[[package]] +name = "wasmtime-cranelift-shared" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f6b197d68612f7dc3a17aa9f9587533715ecb8b4755609ce9baf7fb92b74ddc" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-control", + "cranelift-native", + "gimli", + "object", + "target-lexicon", + "wasmtime-environ 13.0.1", +] + +[[package]] +name = "wasmtime-environ" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e2558c8b04fd27764d8601d46b8dc39555b79720a41e626bce210a80758932" +dependencies = [ + "anyhow", + "cranelift-entity 0.100.1", + "gimli", + "indexmap", + "log", + "object", + "serde", + "serde_derive", + "target-lexicon", + "thiserror", + "wasm-encoder 0.32.0", + "wasmparser 0.112.0", + "wasmprinter", + "wasmtime-component-util 13.0.1", + "wasmtime-types 13.0.1", +] + +[[package]] +name = "wasmtime-environ" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6d33a9f421da810a070cd56add9bc51f852bd66afbb8b920489d6242f15b70e" +dependencies = [ + "anyhow", + "cranelift-entity 0.102.1", + "gimli", + "indexmap", + "log", + "object", + "serde", + "serde_derive", + "target-lexicon", + "thiserror", + "wasmparser 0.116.1", + "wasmtime-types 15.0.1", +] + +[[package]] +name = "wasmtime-fiber" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a615a2cf64a49c0dc659c7d850c6cd377b975e0abfdcf0888b282d274a82e730" +dependencies = [ + "cc", + "cfg-if", + "rustix", + "wasmtime-asm-macros 13.0.1", + "wasmtime-versioned-export-macros 13.0.1", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-fiber" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "404741f4c6d7f4e043be2e8b466406a2aee289ccdba22bf9eba6399921121b97" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "rustix", + "wasmtime-asm-macros 15.0.1", + "wasmtime-versioned-export-macros 15.0.1", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-jit" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd775514b8034b85b0323bfdc60abb1c28d27dbf6e22aad083ed57dac95cf72e" +dependencies = [ + "addr2line", + "anyhow", + "bincode", + "cfg-if", + "cpp_demangle", + "gimli", + "ittapi", + "log", + "object", + "rustc-demangle", + "rustix", + "serde", + "serde_derive", + "target-lexicon", + "wasmtime-environ 13.0.1", + "wasmtime-jit-debug 13.0.1", + "wasmtime-jit-icache-coherence 13.0.1", + "wasmtime-runtime 13.0.1", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-jit" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d0994a86d6dca5f7d9740d7f2bd0568be06d2014a550361dc1c397d289d81ef" +dependencies = [ + "anyhow", + "bincode", + "cfg-if", + "gimli", + "log", + "object", + "rustix", + "serde", + "serde_derive", + "target-lexicon", + "wasmtime-environ 15.0.1", + "wasmtime-jit-icache-coherence 15.0.1", + "wasmtime-runtime 15.0.1", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c054e27c6ce2a6191edabe89e646da013044dd5369e1d203c89f977f9bd32937" +dependencies = [ + "object", + "once_cell", + "rustix", + "wasmtime-versioned-export-macros 13.0.1", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0c4b74e606d1462d648631d5bc328e3d5b14e7f9d3ff93bc6db062fb8c5cd8" +dependencies = [ + "once_cell", + "wasmtime-versioned-export-macros 15.0.1", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f323977cddf4a262d1b856366b665c5b4d01793c57b79fb42505b9fd9e61e5b" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3090a69ba1476979e090aa7ed4bc759178bafdb65b22f98b9ba24fc6e7e578d5" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-runtime" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29e26461bba043f73cb4183f4ce0d606c0eaac112475867b11e5ea36fe1cac8e" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "encoding_rs", + "indexmap", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "paste", + "rand", + "rustix", + "sptr", + "wasm-encoder 0.32.0", + "wasmtime-asm-macros 13.0.1", + "wasmtime-environ 13.0.1", + "wasmtime-fiber 13.0.1", + "wasmtime-jit-debug 13.0.1", + "wasmtime-versioned-export-macros 13.0.1", + "wasmtime-wmemcheck 13.0.1", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-runtime" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b993ac8380385ed67bf71b51b9553edcf1ab0801b78a805a067de581b9a3e88a" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "indexmap", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "paste", + "rand", + "rustix", + "sptr", + "wasm-encoder 0.36.2", + "wasmtime-asm-macros 15.0.1", + "wasmtime-environ 15.0.1", + "wasmtime-fiber 15.0.1", + "wasmtime-jit-debug 15.0.1", + "wasmtime-versioned-export-macros 15.0.1", + "wasmtime-wmemcheck 15.0.1", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-types" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd7e9b29fee64eea5058cb5e7cb3480b52c2f1312d431d16ea8617ceebeb421" +dependencies = [ + "cranelift-entity 0.100.1", + "serde", + "serde_derive", + "thiserror", + "wasmparser 0.112.0", +] + +[[package]] +name = "wasmtime-types" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b5778112fcab2dc3d4371f4203ab8facf0c453dd94312b0a88dd662955e64e0" +dependencies = [ + "cranelift-entity 0.102.1", + "serde", + "serde_derive", + "thiserror", + "wasmparser 0.116.1", +] + +[[package]] +name = "wasmtime-versioned-export-macros" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6362c557c36d8ad4aaab735f14ed9e4f78d6b40ec85a02a88fd859af87682e52" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "wasmtime-versioned-export-macros" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50f51f8d79bfd2aa8e9d9a0ae7c2d02b45fe412e62ff1b87c0c81b07c738231" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "wasmtime-wasi" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c9e79f73320d96cd7644b021502dffee09dd92300b073f3541ae44e9ae377c" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.4.1", + "bytes", + "cap-fs-ext", + "cap-net-ext", + "cap-rand", + "cap-std", + "cap-time-ext", + "fs-set-times", + "futures", + "io-extras", + "io-lifetimes", + "is-terminal", + "libc", + "once_cell", + "rustix", + "system-interface", + "thiserror", + "tokio", + "tracing", + "wasi-cap-std-sync", + "wasi-common", + "wasmtime 13.0.1", + "wiggle 13.0.1", + "windows-sys 0.48.0", +] + +[[package]] +name = "wasmtime-winch" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa5fc7212424c04c01a20bfa66c4c518e8749dde6546f5e05815dcacbec80723" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli", + "object", + "target-lexicon", + "wasmparser 0.112.0", + "wasmtime-cranelift-shared", + "wasmtime-environ 13.0.1", + "winch-codegen", +] + +[[package]] +name = "wasmtime-wit-bindgen" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc03bd58f77a68dc6a0b2ba2f8e64b1f902b50389d21bbcc690ef2f3bb87198" +dependencies = [ + "anyhow", + "heck 0.4.1", + "indexmap", + "wit-parser 0.11.3", +] + +[[package]] +name = "wasmtime-wit-bindgen" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b804dfd3d0c0d6d37aa21026fe7772ba1a769c89ee4f5c4f13b82d91d75216f" +dependencies = [ + "anyhow", + "heck 0.4.1", + "indexmap", + "wit-parser 0.13.0", +] + +[[package]] +name = "wasmtime-wmemcheck" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e485bf54eba675ca615f8f55788d3a8cd44e7bd09b8b4011edc22c2c41d859e" + +[[package]] +name = "wasmtime-wmemcheck" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6060bc082cc32d9a45587c7640e29e3c7b89ada82677ac25d87850aaccb368" + +[[package]] +name = "wast" +version = "35.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" +dependencies = [ + "leb128", +] + +[[package]] +name = "wast" +version = "69.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" +dependencies = [ + "leb128", + "memchr", + "unicode-width", + "wasm-encoder 0.38.1", +] + +[[package]] +name = "wat" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" +dependencies = [ + "wast 69.0.1", +] + +[[package]] +name = "wax" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d12a78aa0bab22d2f26ed1a96df7ab58e8a93506a3e20adb47c51a93b4e1357" +dependencies = [ + "const_format", + "itertools 0.11.0", + "nom", + "pori", + "regex", + "thiserror", + "walkdir", +] + +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wiggle" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e81ddbdc400b38d04241d740d0406ef343bd242c460f252fe59f29ad964ad24c" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.4.1", + "thiserror", + "tracing", + "wasmtime 13.0.1", + "wiggle-macro 13.0.1", +] + +[[package]] +name = "wiggle" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91028b241e692fdf30627ac10ba9d5ac378353ea4119b4f904ac95177057a44" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.4.1", + "thiserror", + "tracing", + "wasmtime 15.0.1", + "wiggle-macro 15.0.1", + "witx", +] + +[[package]] +name = "wiggle-generate" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c993123d6db1a1908ef8352aabdf2e681a3dcdedc3656beb747e4db16d3cf08" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro2", + "quote", + "shellexpand", + "syn 2.0.41", + "witx", +] + +[[package]] +name = "wiggle-generate" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e8b3d76531994513671b2ec3b29fd342bf041e2282945bb6c52eebe6aa9e7da" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro2", + "quote", + "shellexpand", + "syn 2.0.41", + "witx", +] + +[[package]] +name = "wiggle-macro" +version = "13.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "476e3e09bc68e82624b70a322265515523754cb9e05fcacceabd216e276bc2ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", + "wiggle-generate 13.0.1", +] + +[[package]] +name = "wiggle-macro" +version = "15.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c189fe00c67f61bb330827f2abab1af9b5925c7929535cd13a68d265ec20b02d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", + "wiggle-generate 15.0.1", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winch-codegen" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9b01ca6722f7421c9cdbe4c9b62342ce864d0a9e8736d56dac717a86b1a65ae" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli", + "regalloc2", + "smallvec", + "target-lexicon", + "wasmparser 0.112.0", + "wasmtime-environ 13.0.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winnow" +version = "0.5.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "winx" +version = "0.36.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346" +dependencies = [ + "bitflags 2.4.1", + "windows-sys 0.52.0", +] + +[[package]] +name = "wit-bindgen-gen-core" +version = "0.2.0" +source = "git+https://github.com/fermyon/wit-bindgen-backport?rev=598cd229bb43baceff9616d16930b8a5a3e79d79#598cd229bb43baceff9616d16930b8a5a3e79d79" +dependencies = [ + "anyhow", + "wit-parser 0.2.0", +] + +[[package]] +name = "wit-bindgen-gen-rust" +version = "0.2.0" +source = "git+https://github.com/fermyon/wit-bindgen-backport?rev=598cd229bb43baceff9616d16930b8a5a3e79d79#598cd229bb43baceff9616d16930b8a5a3e79d79" +dependencies = [ + "heck 0.3.3", + "wit-bindgen-gen-core", +] + +[[package]] +name = "wit-bindgen-gen-wasmtime" +version = "0.2.0" +source = "git+https://github.com/fermyon/wit-bindgen-backport?rev=598cd229bb43baceff9616d16930b8a5a3e79d79#598cd229bb43baceff9616d16930b8a5a3e79d79" +dependencies = [ + "heck 0.3.3", + "wit-bindgen-gen-core", + "wit-bindgen-gen-rust", +] + +[[package]] +name = "wit-bindgen-wasmtime" +version = "0.2.0" +source = "git+https://github.com/fermyon/wit-bindgen-backport?rev=598cd229bb43baceff9616d16930b8a5a3e79d79#598cd229bb43baceff9616d16930b8a5a3e79d79" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 1.3.2", + "thiserror", + "wasmtime 13.0.1", + "wit-bindgen-wasmtime-impl", +] + +[[package]] +name = "wit-bindgen-wasmtime-impl" +version = "0.2.0" +source = "git+https://github.com/fermyon/wit-bindgen-backport?rev=598cd229bb43baceff9616d16930b8a5a3e79d79#598cd229bb43baceff9616d16930b8a5a3e79d79" +dependencies = [ + "proc-macro2", + "syn 1.0.109", + "wit-bindgen-gen-core", + "wit-bindgen-gen-wasmtime", +] + +[[package]] +name = "wit-parser" +version = "0.2.0" +source = "git+https://github.com/fermyon/wit-bindgen-backport?rev=598cd229bb43baceff9616d16930b8a5a3e79d79#598cd229bb43baceff9616d16930b8a5a3e79d79" +dependencies = [ + "anyhow", + "id-arena", + "pulldown-cmark 0.8.0", + "unicode-normalization", + "unicode-xid", +] + +[[package]] +name = "wit-parser" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a39edca9abb16309def3843af73b58d47d243fe33a9ceee572446bcc57556b9a" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "pulldown-cmark 0.9.3", + "semver 1.0.20", + "serde", + "serde_json", + "unicode-xid", + "url", +] + +[[package]] +name = "wit-parser" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15df6b7b28ce94b8be39d8df5cb21a08a4f3b9f33b631aedb4aa5776f785ead3" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.20", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", +] + +[[package]] +name = "witx" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" +dependencies = [ + "anyhow", + "log", + "thiserror", + "wast 35.0.2", +] + +[[package]] +name = "zerocopy" +version = "0.7.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306dca4455518f1f31635ec308b6b3e4eb1b11758cefafc782827d0aa7acb5c7" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be912bf68235a88fbefd1b73415cb218405958d1655b2ece9035a19920bdf6ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe 5.0.2+zstd.1.5.2", +] + +[[package]] +name = "zstd" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" +dependencies = [ + "zstd-safe 6.0.6", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-safe" +version = "6.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.9+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/JS/wasm/crates/wasmjs-runtime/Cargo.toml b/JS/wasm/crates/wasmjs-runtime/Cargo.toml new file mode 100644 index 000000000..3f6e47f8d --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "wasmjs-runtime" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1" +actix-web = "4" +lazy_static = "1" +reqwest = "0.11" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +clap = { version = "4", features = ["derive"] } +tokio = { version = "1", features = ["full"] } +wasmtime = "13" +wasmtime-wasi = "13" +wasi-common = "13" +wit-bindgen-wasmtime = { git = "https://github.com/fermyon/wit-bindgen-backport", rev = "598cd229bb43baceff9616d16930b8a5a3e79d79", features = [ + "async", +] } +wax = "0.6" +regex = "1" +base64 = "0.21" +sha256 = "1" +blake3 = "1.5.0" +wasmparser = "0.115.0" +toml = "0.8.6" +actix-files = "0.6.2" +http = "0.2.11" +wiggle = "15.0.0" +thiserror = "1.0" +tracing = "0.1.40" +semver = "^0.10.0" +jsonnet-rs = "0.17.0" diff --git a/JS/wasm/crates/wasmjs-runtime/arakoo.toml b/JS/wasm/crates/wasmjs-runtime/arakoo.toml new file mode 100644 index 000000000..c18b6ba81 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/arakoo.toml @@ -0,0 +1,61 @@ +[local_server] +[local_server.geolocation] +use_default_loopback = false +[local_server.geolocation.mapping.InlineToml.addresses] +[local_server.geolocation.mapping.InlineToml.addresses."103.117.185.66".data] +as_name = "shree net online services private limited" +as_number = 137679 +area_code = 0 +city = "bhiwandi" +conn_speed = "broadband" +conn_type = "wifi" +continent = "AS" +country_code = "IN" +country_code3 = "IND" +country_name = "india" +latitude = 19.24 +longitude = 73.02 +metro_code = 356002 +postal_code = "421302" +proxy_description = "?" +proxy_type = "?" +region = "MH" +utc_offset = 530 +[local_server.geolocation.mapping.InlineToml.addresses."127.0.0.1".data] +as_name = "Arakoo Test" +as_number = 12345 +area_code = 123 +city = "Test City" +conn_speed = "broadband" +conn_type = "wired" +continent = "NA" +country_code = "CA" +country_code3 = "CAN" +country_name = "Canada" +latitude = 12.345 +longitude = 54.321 +metro_code = 0 +postal_code = "12345" +proxy_description = "?" +proxy_type = "?" +region = "BC" +utc_offset = -700 +[local_server.geolocation.mapping.InlineToml.addresses."0000:0000:0000:0000:0000:0000:0000:0001".data] +as_name = "Arakoo Test IPv6" +as_number = 12345 +area_code = 123 +city = "Test City IPv6" +conn_speed = "broadband" +conn_type = "wired" +continent = "NA" +country_code = "CA" +country_code3 = "CAN" +country_name = "Canada" +latitude = 12.345 +longitude = 54.321 +metro_code = 0 +postal_code = "12345" +proxy_description = "?" +proxy_type = "?" +region = "BC" +utc_offset = -700 diff --git a/JS/wasm/crates/wasmjs-runtime/src/bindings.rs b/JS/wasm/crates/wasmjs-runtime/src/bindings.rs new file mode 100644 index 000000000..591fcbd0c --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/bindings.rs @@ -0,0 +1,263 @@ +use actix_web::http::Uri; +use jsonnet::JsonnetVm; +use reqwest::Method; +use serde::Deserialize; +use tokio::runtime::Builder; +use wiggle::GuestErrorType; +use crate::error::Error; + +wit_bindgen_wasmtime::export!({paths: ["../../assets/wasmjs/wit/http.wit",], + async:[] + } +); + +wiggle::from_witx!({ + witx:["$CARGO_MANIFEST_DIR/../../assets/wasmjs/wit/arakoo-geo.witx"], + errors: { arakoo_status => Error }, +}); + +impl GuestErrorType for ArakooStatus { + fn success() -> Self { + ArakooStatus::Ok + } +} + +use self::{http::{Http, HttpRequest, HttpRequestError, HttpResponse, HttpError, HttpMethod, FileError}, types::ArakooStatus}; + +#[derive(Deserialize, Clone)] +#[serde(default)] +pub struct HttpRequestsConfig { + pub allowed_hosts: Vec, + pub allowed_methods: Vec, + pub allow_http: bool, +} + +impl Default for HttpRequestsConfig { + fn default() -> Self { + Self { + allowed_hosts: vec!["aws.connect.psdb.cloud".to_string()], + allowed_methods: Vec::from([ + String::from("GET"), + String::from("POST"), + String::from("PUT"), + String::from("PATCH"), + String::from("DELETE"), + ]), + allow_http: false, + } + } +} + +pub struct HttpBindings { + pub http_config: HttpRequestsConfig, +} + +impl From for Method { + fn from(value: HttpMethod) -> Self { + match value { + HttpMethod::Get => Method::GET, + HttpMethod::Post => Method::POST, + HttpMethod::Put => Method::PUT, + HttpMethod::Patch => Method::PATCH, + HttpMethod::Delete => Method::DELETE, + HttpMethod::Options => Method::OPTIONS, + HttpMethod::Head => Method::HEAD, + } + } +} + +impl From for HttpError { + fn from(value: reqwest::Error) -> Self { + if value.is_timeout() { + HttpError::Timeout + } else if value.is_redirect() { + HttpError::RedirectLoop + } else if value.is_request() { + HttpError::InvalidRequest + } else if value.is_body() { + HttpError::InvalidRequestBody + } else if value.is_decode() { + HttpError::InvalidResponseBody + } else { + HttpError::InternalError + } + } +} + +impl Http for HttpBindings { + fn send_http_request( + &mut self, + req: HttpRequest<'_>, + ) -> Result { + let mut headers = Vec::new(); + let url = req.uri.to_string(); + let body = req.body.unwrap_or(&[]).to_vec(); + let uri = url.parse::().map_err(|e| HttpRequestError { + error: HttpError::InvalidRequest, + message: e.to_string(), + })?; + let method: Method = req.method.into(); + + if uri.host().is_some() + && !self + .http_config + .allowed_hosts + .contains(&uri.host().unwrap().to_string()) + { + return Err(HttpRequestError { + error: HttpError::NotAllowed, + message: format!("'{}' is not in the allowed hosts list", uri.host().unwrap()), + }); + } + + if uri.scheme().is_some() + && (!self.http_config.allow_http && uri.scheme_str().unwrap() == "http") + { + return Err(HttpRequestError { + error: HttpError::NotAllowed, + message: "Only https is allowed".to_string(), + }); + } + + if !self + .http_config + .allowed_methods + .contains(&method.to_string()) + { + return Err(HttpRequestError { + error: HttpError::NotAllowed, + message: format!("'{}' method not allowed", method.as_str()), + }); + } + + for (key, value) in req.headers { + headers.push((key.to_string(), value.to_string())); + } + + let thread_result = std::thread::spawn(move || { + Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + let client = reqwest::Client::new(); + + let mut builder = client.request(method, url); + + for (key, value) in headers { + builder = builder.header(key, value); + } + + builder = builder.body(body); + + match builder.send().await { + Ok(res) => { + let mut headers = Vec::new(); + let status = res.status().as_u16(); + + for (name, value) in res.headers().iter() { + headers + .push((name.to_string(), value.to_str().unwrap().to_string())); + } + + let body = res.bytes().await; + + Ok(HttpResponse { + headers, + status, + body: Some(body.unwrap().to_vec()), + }) + } + Err(e) => { + let message = e.to_string(); + + Err(HttpRequestError { + error: e.into(), + message, + }) + } + } + }) + }) + .join(); + + match thread_result { + Ok(res) => match res { + Ok(res) => Ok(res), + Err(err) => Err(err), + }, + Err(_) => Err(HttpRequestError { + error: HttpError::InternalError, + message: "Could not process the request".to_string(), + }), + } + } + + fn read_bytes(&mut self, path: &str) -> Result { + // read the file from the path and return the bytes + // if the file does not exist, return FileError::NotFound + let path = path.to_owned(); + let thread_result = std::thread::spawn(move || { + Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + let bytes = tokio::fs::read(path).await; + match bytes { + Ok(bytes) => + Ok(std::str::from_utf8(&bytes).unwrap().to_string()), + Err(_) => { + Err(FileError::NotFound) + } + } + }) + }) + .join(); + + match thread_result { + Ok(res) => match res { + Ok(res) => Ok(res), + Err(err) => Err(err), + }, + Err(_) => Err(FileError::NotFound), + } + } + + + fn parse_jsonnet(&mut self, file: &str) -> Result { + parse_jsonnet(file) + } +} + + +pub fn parse_jsonnet(file: &str) -> Result { + let file = file.to_owned(); + let thread_result = std::thread::spawn(move || { + Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + let mut vm = JsonnetVm::new(); + let json = vm.evaluate_file(&file); + + match json { + Ok(json) => Ok(json.to_string()), + Err(e) => { + println!("Error: {}", e); + Err(FileError::NotFound) + }, + } + }) + }) + .join(); + + match thread_result { + Ok(res) => match res { + Ok(res) => Ok(res), + Err(err) => Err(err), + }, + Err(_) => Err(FileError::NotFound), + } +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/config.rs b/JS/wasm/crates/wasmjs-runtime/src/config.rs new file mode 100644 index 000000000..69123fd29 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/config.rs @@ -0,0 +1,181 @@ +use crate::bindings::HttpRequestsConfig; +use anyhow::Result; +use serde::Deserialize; +use serde::Deserializer; +use std::collections::HashMap; +use std::{env, fs}; +use std::path::{Path, PathBuf}; +use std::str::FromStr; +use toml::Table; +use crate::error::ArakooConfigError; +use crate::geolocation::Geolocation; + +#[derive(Deserialize, Clone, Default)] +#[serde(default)] +pub struct Features { + pub http_requests: HttpRequestsConfig, + pub geo: ArakooConfig +} + +#[derive(Deserialize, Clone, Default)] +pub struct Folder { + #[serde(deserialize_with = "deserialize_path", default)] + pub from: PathBuf, + pub to: String, +} + +fn deserialize_path<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + let result: Result = Deserialize::deserialize(deserializer); + + match result { + Ok(value) => { + let split = if value.contains('/') { + value.split('/') + } else { + value.split('\\') + }; + + Ok(split.fold(PathBuf::new(), |mut acc, el| { + acc.push(el); + acc + })) + } + Err(err) => Err(err), + } +} + +#[derive(Debug, Clone, Deserialize)] +pub struct ArakooConfig { + pub(crate) local_server: LocalServerConfig, +} + +impl Default for ArakooConfig { + fn default() -> Self { + ArakooConfig{ + local_server: LocalServerConfig::default() + } + } +} + +impl ArakooConfig { + pub fn geolocation(&self) -> &Geolocation { + &self.local_server.geolocation + } + pub fn from_file(path: impl AsRef) -> Result { + fs::read_to_string(path.as_ref()) + .map_err(|err| ArakooConfigError::IoError { + path: path.as_ref().display().to_string(), + err, + }) + .and_then(Self::from_str) + } + + /// Parse a string containing TOML data into a `ArakooConfig`. + fn from_str(toml: impl AsRef) -> Result { + toml::from_str::(toml.as_ref()) + .map_err(Into::into) + .and_then(TryInto::try_into) + } + +} + +impl FromStr for ArakooConfig { + type Err = ArakooConfigError; + fn from_str(s: &str) -> Result { + Self::from_str(s) + } +} + +#[derive(Deserialize)] +struct TomlArakooConfig { + local_server: Option, +} + +impl TryInto for TomlArakooConfig { + type Error = ArakooConfigError; + fn try_into(self) -> Result { + let Self { + local_server, + } = self; + let local_server: LocalServerConfig = local_server + .map(TryInto::try_into) + .transpose()? + .unwrap_or_default(); + Ok(ArakooConfig { + local_server, + }) + } +} + +#[derive(Deserialize, Clone, Default)] +pub struct Config { + pub name: Option, + #[serde(default)] + pub features: Features, + pub folders: Option>, + #[serde(deserialize_with = "read_environment_variables", default)] + pub vars: HashMap, +} + +fn read_environment_variables<'de, D>( + deserializer: D, +) -> core::result::Result, D::Error> +where + D: Deserializer<'de>, +{ + let result: core::result::Result>, D::Error> = + Deserialize::deserialize(deserializer); + + match result { + Ok(value) => match value { + Some(mut options) => { + for (_, value) in options.iter_mut() { + if value.starts_with('$') && !value.contains(' ') { + value.remove(0); + + match env::var(&value) { + Ok(env_value) => *value = env_value, + Err(_) => *value = String::new(), + } + } + } + + Ok(options) + } + None => Ok(HashMap::new()), + }, + Err(err) => Err(err), + } +} + +#[derive(Clone, Debug, Default, Deserialize, )] +pub struct LocalServerConfig { + geolocation: Geolocation, +} + + +#[derive(Deserialize)] +struct RawLocalServerConfig { + geolocation: Option, +} + +impl TryInto for RawLocalServerConfig { + type Error = ArakooConfigError; + fn try_into(self) -> Result { + let Self { + geolocation, + } = self; + let geolocation = if let Some(geolocation) = geolocation { + geolocation.try_into()? + } else { + Geolocation::default() + }; + + Ok(LocalServerConfig { + geolocation, + }) + } +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/error.rs b/JS/wasm/crates/wasmjs-runtime/src/error.rs new file mode 100644 index 000000000..944a5eff2 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/error.rs @@ -0,0 +1,103 @@ +//! Error types. + +use thiserror::Error; +use wiggle::GuestError; + +#[derive(Debug, Error)] +#[non_exhaustive] +pub enum Error { + #[error("Buffer length error: {buf} too long to fit in {len}")] + BufferLengthError { + buf: &'static str, + len: &'static str, + }, + #[error("Invalid argument given")] + InvalidArgument, + #[error(transparent)] + GeolocationError(#[from] crate::wiggle_abi::geo_impl::GeolocationError), + #[error("Shared memory not supported yet")] + SharedMemory, + #[error("Guest error: [{0}]")] + GuestError(#[from] GuestError), +} + +/// Errors that may occur while validating geolocation configurations. +#[derive(Debug, Error)] +pub enum GeolocationConfigError { + #[error(transparent)] + IoError(std::io::Error), + + #[error("definition was not provided as a TOML table")] + InvalidEntryType, + + #[error("missing 'file' field")] + MissingFile, + + #[error("'file' field is empty")] + EmptyFileEntry, + + #[error("missing 'addresses' field")] + MissingAddresses, + + #[error("inline geolocation value was not a string")] + InvalidInlineEntryType, + + #[error("'file' field was not a string")] + InvalidFileEntry, + + #[error("'addresses' was not provided as a TOML table")] + InvalidAddressesType, + + // #[error("unrecognized key '{0}'")] + // UnrecognizedKey(String), + + // #[error("missing 'format' field")] + // MissingFormat, + + #[error("'format' field was not a string")] + InvalidFormatEntry, + + #[error("IP address not valid: '{0}'")] + InvalidAddressEntry(String), + + #[error("'{0}' is not a valid format for the geolocation mapping. Supported format(s) are: 'inline-toml', 'json'.")] + InvalidGeolocationMappingFormat(String), + + #[error( + "The file is of the wrong format. The file is expected to contain a single JSON Object" + )] + GeolocationFileWrongFormat, + + #[error("'format' field is empty")] + EmptyFormatEntry, + + // #[error("Item value under key named '{key}' is of the wrong format. The value is expected to be a JSON String")] + // GeolocationItemValueWrongFormat { key: String }, +} + +#[derive(Debug, Error)] +pub enum ArakooConfigError { + + #[error("invalid configuration for '{name}': {err}")] + InvalidGeolocationDefinition { + name: String, + #[source] + err: GeolocationConfigError, + }, + + #[error("error parsing `edge.toml`: {0}")] + InvalidArakooToml(#[from] toml::de::Error), + + #[error("invalid manifest version: {0}")] + InvalidManifestVersion(#[from] semver::SemVerError), + + /// An I/O error that occurred while reading the file. + #[error("error reading '{path}': {err}")] + IoError { + path: String, + #[source] + err: std::io::Error, + }, + // #[error("error reading: {err}")] + // TomlError { err: toml::de::Error }, +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/geolocation.rs b/JS/wasm/crates/wasmjs-runtime/src/geolocation.rs new file mode 100644 index 000000000..72ffdc2a7 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/geolocation.rs @@ -0,0 +1,308 @@ +use serde::{Deserialize, Serialize}; +use { + crate::error::GeolocationConfigError, + serde_json::{ + Map, Number, Value as SerdeValue, Value::Number as SerdeNumber, + Value::String as SerdeString, + }, + std::{collections::HashMap, fs, iter::FromIterator, net::IpAddr, path::Path, path::PathBuf}, +}; + +#[derive(Clone, Debug,Deserialize)] +pub struct Geolocation { + mapping: GeolocationMapping, + use_default_loopback: bool, +} + +#[derive(Clone, Debug, Deserialize)] +pub enum GeolocationMapping { + Empty, + InlineToml { + addresses: HashMap, + }, + Json { + file: PathBuf, + }, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct GeolocationData { + pub(crate) data: Map, +} + +impl Default for Geolocation { + fn default() -> Self { + Self { + mapping: GeolocationMapping::default(), + use_default_loopback: true, + } + } +} + +impl Geolocation { + + pub fn lookup(&self, addr: &IpAddr) -> Option { + self.mapping.get(addr).or_else(|| { + if self.use_default_loopback && addr.is_loopback() { + Some(GeolocationData::default()) + } else { + None + } + }) + } +} + +mod deserialization { + use std::{net::IpAddr, str::FromStr}; + + use serde_json::Number; + + use { + super::{Geolocation, GeolocationData, GeolocationMapping}, + crate::error::{ArakooConfigError, GeolocationConfigError}, + serde_json::Value as SerdeValue, + std::path::PathBuf, + std::{collections::HashMap, convert::TryFrom}, + toml::value::{Table, Value}, + }; + + impl TryFrom
for Geolocation { + type Error = ArakooConfigError; + + fn try_from(toml: Table) -> Result { + fn process_config(mut toml: Table) -> Result { + let use_default_loopback = toml.remove("use_default_loopback").map_or( + Ok(true), + |use_default_loopback| match use_default_loopback { + Value::Boolean(use_default_loopback) => Ok(use_default_loopback), + _ => Err(GeolocationConfigError::InvalidEntryType), + }, + )?; + + let mapping = match toml.remove("format") { + Some(Value::String(value)) => match value.as_str() { + "inline-toml" => process_inline_toml_dictionary(&mut toml)?, + "json" => process_json_entries(&mut toml)?, + "" => return Err(GeolocationConfigError::EmptyFormatEntry), + format => { + return Err(GeolocationConfigError::InvalidGeolocationMappingFormat( + format.to_string(), + )) + } + }, + Some(_) => return Err(GeolocationConfigError::InvalidFormatEntry), + None => GeolocationMapping::Empty, + }; + + Ok(Geolocation { + mapping, + use_default_loopback, + }) + } + + process_config(toml).map_err(|err| ArakooConfigError::InvalidGeolocationDefinition { + name: "geolocation_mapping".to_string(), + err, + }) + } + } + + pub fn parse_ip_address(address: &str) -> Result { + IpAddr::from_str(address) + .map_err(|err| GeolocationConfigError::InvalidAddressEntry(err.to_string())) + } + + fn process_inline_toml_dictionary( + toml: &mut Table, + ) -> Result { + fn convert_value_to_json(value: Value) -> Option { + match value { + Value::String(value) => Some(SerdeValue::String(value)), + Value::Integer(value) => Number::try_from(value).ok().map(SerdeValue::Number), + Value::Float(value) => Number::from_f64(value).map(SerdeValue::Number), + Value::Boolean(value) => Some(SerdeValue::Bool(value)), + _ => None, + } + } + + // Take the `addresses` field from the provided TOML table. + let toml = match toml + .remove("addresses") + .ok_or(GeolocationConfigError::MissingAddresses)? + { + Value::Table(table) => table, + _ => return Err(GeolocationConfigError::InvalidAddressesType), + }; + + let mut addresses = HashMap::::with_capacity(toml.len()); + + for (address, value) in toml { + let address = parse_ip_address(address.as_str())?; + let table = value + .as_table() + .ok_or(GeolocationConfigError::InvalidInlineEntryType)? + .to_owned(); + + let mut geolocation_data = GeolocationData::new(); + + for (field, value) in table { + let value = convert_value_to_json(value) + .ok_or(GeolocationConfigError::InvalidInlineEntryType)?; + geolocation_data.insert(field, value); + } + + addresses.insert(address, geolocation_data); + } + + Ok(GeolocationMapping::InlineToml { addresses }) + } + + fn process_json_entries( + toml: &mut Table, + ) -> Result { + let file: PathBuf = match toml + .remove("file") + .ok_or(GeolocationConfigError::MissingFile)? + { + Value::String(file) => { + if file.is_empty() { + return Err(GeolocationConfigError::EmptyFileEntry); + } else { + file.into() + } + } + _ => return Err(GeolocationConfigError::InvalidFileEntry), + }; + + GeolocationMapping::read_json_contents(&file)?; + + Ok(GeolocationMapping::Json { file }) + } +} + +impl Default for GeolocationMapping { + fn default() -> Self { + Self::Empty + } +} + +impl GeolocationMapping { + pub fn get(&self, address: &IpAddr) -> Option { + match self { + Self::Empty => None, + Self::InlineToml { addresses } => addresses + .get(address) + .map(|geolocation_data| geolocation_data.to_owned()), + Self::Json { file } => Self::read_json_contents(file) + .ok() + .map(|addresses| { + addresses + .get(address) + .map(|geolocation_data| geolocation_data.to_owned()) + }) + .unwrap(), + } + } + + pub fn read_json_contents( + file: &Path, + ) -> Result, GeolocationConfigError> { + let data = fs::read_to_string(file).map_err(GeolocationConfigError::IoError)?; + + // Deserialize the contents of the given JSON file. + let json = match serde_json::from_str(&data) + .map_err(|_| GeolocationConfigError::GeolocationFileWrongFormat)? + { + // Check that we were given an object. + serde_json::Value::Object(obj) => obj, + _ => { + return Err(GeolocationConfigError::GeolocationFileWrongFormat); + } + }; + + let mut addresses = HashMap::::with_capacity(json.len()); + + for (address, value) in json { + let address = deserialization::parse_ip_address(address.as_str())?; + let table = value + .as_object() + .ok_or(GeolocationConfigError::InvalidInlineEntryType)? + .to_owned(); + + let geolocation_data = GeolocationData::from(&table); + + addresses.insert(address, geolocation_data); + } + + Ok(addresses) + } +} + +impl Default for GeolocationData { + fn default() -> Self { + let default_entries = HashMap::<&str, SerdeValue>::from([ + ("as_name", SerdeString(String::from("Arakoo Cloud, Inc"))), + ("as_number", SerdeNumber(Number::from(54113))), + ("area_code", SerdeNumber(Number::from(415))), + ("city", SerdeString(String::from("San Francisco"))), + ("conn_speed", SerdeString(String::from("broadband"))), + ("conn_type", SerdeString(String::from("wired"))), + ("continent", SerdeString(String::from("NA"))), + ("country_code", SerdeString(String::from("US"))), + ("country_code3", SerdeString(String::from("USA"))), + ( + "country_name", + SerdeString(String::from("United States of America")), + ), + ("latitude", SerdeNumber(Number::from_f64(37.77869).unwrap())), + ( + "longitude", + SerdeNumber(Number::from_f64(-122.39557).unwrap()), + ), + ("metro_code", SerdeNumber(Number::from(0))), + ("postal_code", SerdeString(String::from("94107"))), + ("proxy_description", SerdeString(String::from("?"))), + ("proxy_type", SerdeString(String::from("?"))), + ("region", SerdeString(String::from("CA"))), + ("utc_offset", SerdeNumber(Number::from(-700))), + ]); + + Self::from(default_entries) + } +} + +impl From> for GeolocationData { + fn from(value: HashMap<&str, SerdeValue>) -> Self { + let entries = value + .iter() + .map(|(&field, value)| (field.to_string(), value.to_owned())); + + Self { + data: Map::from_iter(entries), + } + } +} + +impl From<&Map> for GeolocationData { + fn from(data: &Map) -> Self { + Self { + data: data.to_owned(), + } + } +} + +impl GeolocationData { + pub fn new() -> Self { + Self { data: Map::new() } + } + + pub fn insert(&mut self, field: String, value: SerdeValue) { + self.data.insert(field, value); + } +} + +impl ToString for GeolocationData { + fn to_string(&self) -> String { + serde_json::to_string(&self.data).unwrap_or_else(|_| "".to_string()) + } +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/handlers.rs b/JS/wasm/crates/wasmjs-runtime/src/handlers.rs new file mode 100644 index 000000000..e70c556e3 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/handlers.rs @@ -0,0 +1,163 @@ +use std::{ + io::{Error, ErrorKind}, + path::{Component, Path, PathBuf}, +}; + +use actix_files::NamedFile; +use actix_web::{ + http::StatusCode, + web::{Bytes, Data}, + HttpRequest, HttpResponse, +}; + +use std::net::{IpAddr, Ipv4Addr}; +use std::str::FromStr; +use crate::geolocation::GeolocationData; +use crate::io::WasmOutput; +use crate::routes::WORKERS; +use crate::server::AppData; + +fn clean_up_path(uri: &str) -> PathBuf { + let path = PathBuf::from_iter(uri.split('/')); + + let valid_components: Vec> = path + .components() + .filter(|c| matches!(c, Component::Normal(_))) + .collect(); + + PathBuf::from_iter(valid_components) +} + +fn retrieve_asset_path(root_path: &Path, file_path: &Path, index_folder: bool) -> Option { + let public_folder = root_path.join("public"); + let asset_path = if index_folder { + public_folder.join(file_path).join("index.html") + } else { + public_folder.join(file_path) + }; + + if asset_path.starts_with(public_folder) && asset_path.exists() && asset_path.is_file() { + Some(asset_path) + } else { + None + } +} + +pub async fn handle_assets(req: &HttpRequest) -> Result { + let root_path = &req + .app_data::>() + .expect("error fetching app data") + .root_path; + let uri_path = req.path(); + + let parsed_path = clean_up_path(uri_path); + + if let Some(file_path) = retrieve_asset_path(root_path, &parsed_path, false) { + NamedFile::open_async(file_path).await + } else if let Some(index_folder_path) = retrieve_asset_path(root_path, &parsed_path, true) { + NamedFile::open_async(index_folder_path).await + } else { + Err(Error::new(ErrorKind::NotFound, "The file is not present")) + } +} + +pub async fn handle_not_found(req: &HttpRequest) -> HttpResponse { + let root_path = &req + .app_data::>() + .expect("error fetching app data") + .root_path; + let public_404_path = root_path.join("public").join("404.html"); + + if let Ok(file) = NamedFile::open_async(public_404_path).await { + file.into_response(req) + } else { + HttpResponse::NotFound().body("") + } +} + +const CORS_HEADER: &str = "Access-Control-Allow-Origin"; + +pub async fn handle_worker(req: HttpRequest, body: Bytes) -> HttpResponse { + let app_data = req + .app_data::>() + .expect("error fetching app data"); + + let selected_route = app_data.routes.retrieve_best_route(req.path()); + let worker = if let Some(route) = selected_route { + if route.is_dynamic() { + if let Ok(existing_file) = handle_assets(&req).await { + return existing_file.into_response(&req); + } + } + + let workers = WORKERS + .read() + .expect("error locking worker lock for reading"); + + Some( + workers + .get(&route.worker) + .expect("unexpected missing worker") + .clone(), + ) + } else { + None + }; + + if worker.is_none() { + return handle_not_found(&req).await; + }; + let worker = worker.unwrap(); + + let body_str = String::from_utf8(body.to_vec()).unwrap_or_else(|_| String::from("")); + + let vars = &worker.config.vars; + let geolocation = worker.config.features.geo.geolocation(); + + let client = req.connection_info(); + let ip = client.realip_remote_addr(); + + let loop_back_ip = IpAddr::V4(Ipv4Addr::new(127,0,0,1)); + + let look_up_ip = match ip { + None => { loop_back_ip } + Some(result) => {match IpAddr::from_str(result) { + Ok(ip_addr) => {ip_addr} + Err(_) => {loop_back_ip} + }} + }; + + let geo_details = match geolocation.lookup(&look_up_ip) { + None => { GeolocationData::default() } + Some(details) => {details} + }; + + let handler_result = match worker.run(&req, &body_str, vars, geo_details).await { + Ok(output) => output, + Err(err) => WasmOutput::failed( + err, + worker.config.name.clone(), + selected_route.map(|route| route.path.clone()), + ), + }; + + let mut builder = + HttpResponse::build(StatusCode::from_u16(handler_result.status).unwrap_or(StatusCode::OK)); + builder.insert_header(("Content-Type", "text/html")); + + if let Some(origins) = app_data.cors_origins.as_ref() { + if !handler_result.headers.contains_key(CORS_HEADER) { + let header_value = origins.join(","); + builder.insert_header((CORS_HEADER, header_value)); + } + } + + for (key, val) in handler_result.headers.iter() { + builder.insert_header((key.replace('_', "-").as_str(), val.as_str())); + } + + match handler_result.body() { + Ok(res) => builder.body(res), + Err(_) => HttpResponse::ServiceUnavailable().body("There was an error running the worker"), + } +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/io.rs b/JS/wasm/crates/wasmjs-runtime/src/io.rs new file mode 100644 index 000000000..c08511e3d --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/io.rs @@ -0,0 +1,98 @@ +use std::{collections::HashMap, fmt::Debug}; + +use actix_web::{ + http::{header::HeaderMap, StatusCode, Uri}, + HttpRequest, +}; +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value as SerdeValue}; +use crate::geolocation::GeolocationData; + +#[derive(Serialize, Deserialize, Debug)] +pub struct WasmInput<'a> { + url: String, + method: &'a str, + headers: HashMap, + body: &'a str, + params: HashMap, + geo: Map +} + +impl<'a> WasmInput<'a> { + pub fn new(request: &'a HttpRequest, body: &'a str, geo_details: GeolocationData) -> Self { + let mut params = HashMap::new(); + + for (k, v) in request.match_info().iter() { + params.insert(k.to_string(), v.to_string()); + } + + let url = Self::build_url(request); + + Self { + url, + method: request.method().as_str(), + headers: Self::build_headers_hash(request.headers()), + body, + params, + geo: geo_details.data.clone() + } + } + + fn build_url(request: &HttpRequest) -> String { + match Uri::builder() + .scheme(request.connection_info().scheme()) + .authority(request.connection_info().host()) + .path_and_query(request.uri().to_string()) + .build() + { + Ok(uri) => uri.to_string(), + Err(_) => request.uri().to_string(), + } + } + + fn build_headers_hash(headers: &HeaderMap) -> HashMap { + let mut parsed_headers = HashMap::new(); + + for (key, value) in headers.iter() { + parsed_headers.insert( + String::from(key.as_str()), + String::from(value.to_str().unwrap()), + ); + } + + parsed_headers + } +} + +#[derive(Deserialize, Debug)] +pub struct WasmOutput { + pub headers: HashMap, + pub status: u16, + data: String, +} + +impl WasmOutput { + pub fn new(body: &str, headers: HashMap, status: u16) -> Self { + Self { + data: String::from(body), + headers, + status, + } + } + + pub fn failed(err: anyhow::Error, worker_name: Option, route: Option) -> Self { + eprintln!( + "Error running {:?} at route {:?}: {:?}", + worker_name, route, err + ); + Self::new( + "err", + HashMap::from([("content-type".to_string(), "text/html".to_string())]), + StatusCode::INTERNAL_SERVER_ERROR.as_u16(), + ) + } + + pub fn body(&self) -> anyhow::Result> { + Ok(self.data.as_bytes().into()) + } +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/main.rs b/JS/wasm/crates/wasmjs-runtime/src/main.rs new file mode 100644 index 000000000..15f5a3303 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/main.rs @@ -0,0 +1,98 @@ +use std::path::PathBuf; + +use clap::{Args, Parser, Subcommand}; + +use routes::Routes; +use server::run; + +use crate::server::{serve, ServeOptions}; + +mod bindings; +mod config; +mod error; +mod geolocation; +mod handlers; +mod io; +mod routes; +mod runtime; +mod server; +mod store; +mod wiggle_abi; +mod workers; + +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +#[command(propagate_version = true)] +#[command(args_conflicts_with_subcommands = true)] +pub struct Opts { + #[command(subcommand)] + pub command: Option, + #[command(flatten)] + pub args: ServeArgs, +} + +#[derive(Debug, Clone, Subcommand)] +pub enum Command { + Server(ServeArgs), + Run(ServeArgs), +} + +#[derive(Debug, Args, Clone)] +pub struct ServeArgs { + #[arg(value_parser, default_value = ".")] + path: PathBuf, + #[arg(short = 'C', long = "config")] + config_path: Option, + #[arg(long = "host", default_value = "0.0.0.0")] + hostname: String, + #[arg(short, long, default_value_t = 8080)] + port: u16, + #[arg(long)] + cors: Option>, +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + // let args = Args::parse(); + let opt = Opts::parse(); + let cmd = opt.command.unwrap_or(Command::Server(opt.args)); + match cmd { + Command::Server(args) => { + let routes = Routes::new(&args.path, &args); + for route in routes.routes.iter() { + println!( + "- http://{}:{}{}\n => {}", + &args.hostname, + args.port, + route.path, + route.handler.to_string_lossy() + ); + } + + let server = serve(ServeOptions { + root_path: args.path.clone(), + config_path: args.config_path, + base_routes: routes, + hostname: args.hostname, + port: args.port, + cors_origins: args.cors, + }) + .await + .unwrap(); + + server.await + } + Command::Run(args) => { + let routes = Routes::new(&args.path, &args); + let serve_options = ServeOptions { + root_path: args.path.clone(), + config_path: args.config_path, + base_routes: routes, + hostname: args.hostname, + port: args.port, + cors_origins: args.cors, + }; + run(serve_options).await.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string())) + } + } +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/routes.rs b/JS/wasm/crates/wasmjs-runtime/src/routes.rs new file mode 100644 index 000000000..7cebe67f9 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/routes.rs @@ -0,0 +1,235 @@ +use std::{ + collections::HashMap, + ffi::OsStr, + path::{Component, Path, PathBuf}, + str::FromStr, + sync::{Arc, RwLock}, +}; + +use lazy_static::lazy_static; +use regex::Regex; +use wax::{Glob, WalkEntry}; +use crate::ServeArgs; + +use crate::{store::STORE_FOLDER, workers::Worker}; + +pub struct Files<'t> { + root: PathBuf, + include_pattern: Glob<'t>, + ignore_patterns: Vec>, +} + +impl<'t> Files<'t> { + const DEFAULT_EXTENSIONS: [&'static str; 1] = ["js"]; + + pub fn new(root: &Path, file_extensions: Vec) -> Self { + Self { + root: root.to_path_buf(), + include_pattern: Self::build_include_pattern(file_extensions), + ignore_patterns: Self::build_ignore_patterns(vec![]), + } + } + + pub fn walk(&self) -> Vec { + self.include_pattern + .walk(&self.root) + .not(self.ignore_patterns.clone()) + .expect("Failed to walk the tree when processing files in the current directory") + .map(|e| e.unwrap()) + .collect() + } + + fn build_include_pattern(file_extensions: Vec) -> Glob<'t> { + let mut file_extensions = file_extensions; + for default_extension in Self::DEFAULT_EXTENSIONS { + file_extensions.push(default_extension.to_string()); + } + + let include_pattern = format!("**/*.{{{}}}", file_extensions.join(",")); + Glob::from_str(include_pattern.as_str()).unwrap() + } + + fn build_ignore_patterns(ignore_patterns: Vec) -> Vec> { + let default_ignore_patterns = vec![format!("**/{}/**", STORE_FOLDER)]; + + let mut result = default_ignore_patterns; + result.extend(ignore_patterns); + result + .iter() + .map(|s| Glob::from_str(s.as_str()).unwrap()) + .collect() + } +} + +#[derive(Clone, Default, Debug)] +pub struct Routes { + pub routes: Vec, +} + +impl Routes { + pub fn new(path: &Path, args: &ServeArgs) -> Self { + let mut routes = Vec::new(); + let runtime_extensions = vec![String::from("js")]; + + let files = Files::new(path, runtime_extensions); + + let mut route_paths: Vec = Vec::new(); + for entry in files.walk() { + route_paths.push(entry.into_path()); + } + + for route_path in route_paths { + routes.push(Route::new(path, route_path, args)); + } + + Self { routes } + } + + pub fn iter(&self) -> impl Iterator { + self.routes.iter() + } + + pub fn retrieve_best_route<'a>(&'a self, path: &str) -> Option<&'a Route> { + self.iter().find(|r| r.can_manage(path)) + } +} + +lazy_static! { + static ref PARAMETER_REGEX: Regex = + Regex::new(r"\[(?P\.{3})?(?P\w+)\]").unwrap(); + pub static ref WORKERS: RwLock = RwLock::new(WorkerSet::default()); +} + +#[derive(PartialEq, Eq, Debug, Clone)] +pub enum RouteType { + Tail { number_of_segments: usize }, +} + +impl From<&String> for RouteType { + fn from(route_path: &String) -> Self { + let number_of_segments = route_path.chars().filter(|&c| c == '/').count(); + RouteType::Tail { number_of_segments } + } +} + +#[derive(PartialEq, Eq, Debug, Clone)] +pub enum Segment { + Tail(String), +} + +impl From<&str> for Segment { + fn from(segment: &str) -> Self { + Segment::Tail(segment.to_owned()) + } +} + +#[derive(Clone, Debug)] +pub struct Route { + pub handler: PathBuf, + pub path: String, + pub route_type: RouteType, + pub segments: Vec, + pub worker: String, +} + +#[derive(Default)] +pub struct WorkerSet { + workers: HashMap>, +} + +impl WorkerSet { + pub fn get(&self, worker_id: &str) -> Option<&Arc> { + self.workers.get(worker_id) + } + + pub fn register(&mut self, worker_id: String, worker: Worker) { + self.workers.insert(worker_id, Arc::new(worker)); + } +} + +impl Route { + pub fn new(base_path: &Path, filepath: PathBuf, args: &ServeArgs) -> Self { + let worker = Worker::new(base_path, &filepath, args).unwrap(); + let worker_id = worker.id.clone(); + + WORKERS.write().unwrap().register(worker_id.clone(), worker); + let route_path = Self::retrieve_route(base_path, &filepath); + Self { + handler: filepath, + route_type: RouteType::from(&route_path), + segments: Self::get_segments(&route_path), + path: route_path, + worker: worker_id.clone(), + } + } + + fn retrieve_route(base_path: &Path, path: &Path) -> String { + let n_path = Self::normalize_path_to_url(path); + let n_base_path = Self::normalize_path_to_url(base_path); + + match n_path.strip_prefix(&n_base_path) { + Some(worker_path) => if worker_path.is_empty() { + "/" + } else { + worker_path + } + .into(), + None => String::from("/unknown"), + } + } + + fn normalize_path_to_url(path: &Path) -> String { + path.with_extension("") + .components() + .filter_map(|c| match c { + Component::Normal(os_str) if os_str != OsStr::new("index") => os_str + .to_str() + .map(|parsed_str| String::from("/") + parsed_str), + _ => None, + }) + .collect() + } + + fn get_segments(route_path: &str) -> Vec { + route_path.split('/').skip(1).map(Segment::from).collect() + } + + pub fn can_manage(&self, path: &str) -> bool { + let path_number_of_segments = path.chars().filter(|&c| c == '/').count(); + + match self.route_type { + RouteType::Tail { number_of_segments } + if number_of_segments > path_number_of_segments => + { + false + } + RouteType::Tail { .. } => true, + } + } + + pub fn actix_path(&self) -> String { + PARAMETER_REGEX + .replace_all(&self.path, |caps: ®ex::Captures| { + match (caps.name("ellipsis"), caps.name("segment")) { + (Some(_), Some(segment)) => format!("{{{}:.*}}", segment.as_str()), + (_, Some(segment)) => format!("{{{}}}", segment.as_str()), + _ => String::new(), + } + }) + .into() + } + + pub fn is_dynamic(&self) -> bool { + match self.route_type { + RouteType::Tail { .. } => true, + } + } +} + +impl Eq for Route {} + +impl PartialEq for Route { + fn eq(&self, other: &Self) -> bool { + self.path == other.path + } +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/runtime.rs b/JS/wasm/crates/wasmjs-runtime/src/runtime.rs new file mode 100644 index 000000000..ca48e2bc0 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/runtime.rs @@ -0,0 +1,70 @@ +use std::path::{Path, PathBuf}; + +use anyhow::Result; +use wasmtime_wasi::{ambient_authority, Dir, WasiCtxBuilder}; + +use crate::store::Store; + +static JS_ENGINE_WASM: &[u8] = include_bytes!("../../wasmjs-engine/wasmjs-engine.wasm"); + +pub struct JavaScriptRuntime { + path: PathBuf, + store: Store, +} + +impl JavaScriptRuntime { + pub fn new(project_root: &Path, path: PathBuf) -> Result { + let hash = Store::file_hash(&path)?; + let store = Store::create(project_root, &["js", &hash])?; + + Ok(Self { path, store }) + } +} + +impl Runtime for JavaScriptRuntime { + fn prepare(&self) -> Result<()> { + self.store.copy(&self.path, &["index.js"])?; + + Ok(()) + } + + fn prepare_wasi_ctx(&self, builder: &mut CtxBuilder) -> Result<()> { + match builder { + CtxBuilder::Preview1(ref mut builder) => { + builder.preopened_dir( + Dir::open_ambient_dir(&self.store.folder, ambient_authority())?, + "/src", + )?; + } + } + + Ok(()) + } + + fn module_bytes(&self) -> Result> { + Ok(JS_ENGINE_WASM.to_vec()) + } +} + +pub enum CtxBuilder { + Preview1(WasiCtxBuilder), +} + +pub trait Runtime { + fn prepare(&self) -> Result<()> { + Ok(()) + } + + fn prepare_wasi_ctx(&self, _builder: &mut CtxBuilder) -> Result<()> { + Ok(()) + } + + fn module_bytes(&self) -> Result>; +} + +pub fn init_runtime(project_root: &Path, path: &Path) -> Result> { + Ok(Box::new(JavaScriptRuntime::new( + project_root, + path.to_path_buf(), + )?)) +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/server.rs b/JS/wasm/crates/wasmjs-runtime/src/server.rs new file mode 100644 index 000000000..7d9e0aeb6 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/server.rs @@ -0,0 +1,80 @@ +use std::path::PathBuf; + +use actix_web::{ + App, + HttpServer, + middleware, web::{self, Data}, +}; +use actix_web::dev::Server; +use actix_web::HttpRequest; +use actix_web::web::Bytes; +use anyhow::{Ok, Result}; + +use crate::handlers::handle_worker; +use crate::routes::Routes; + +#[derive(Clone)] +pub struct ServeOptions { + pub root_path: PathBuf, + pub config_path: Option, + pub base_routes: Routes, + pub hostname: String, + pub port: u16, + pub cors_origins: Option>, +} + +#[derive(Default)] +pub struct AppData { + pub routes: Routes, + pub root_path: PathBuf, + pub cors_origins: Option>, +} + +impl From for AppData { + fn from(serve_options: ServeOptions) -> Self { + AppData { + routes: serve_options.base_routes, + root_path: serve_options.root_path.clone(), + cors_origins: serve_options.cors_origins, + } + } +} + +pub async fn serve(serve_options: ServeOptions) -> Result { + let (hostname, port) = (serve_options.hostname.clone(), serve_options.port); + let serve_options = serve_options.clone(); + + let server = HttpServer::new(move || { + let app_data: Data = + Data::new(>::try_into(serve_options.clone()).unwrap()); + + let mut app = App::new() + .wrap(middleware::Logger::default()) + .wrap(middleware::NormalizePath::trim()) + .app_data(Data::clone(&app_data)); + + for route in app_data.routes.iter() { + app = app.service(web::resource(route.actix_path()).to(handle_worker)); + } + + app + }) + .bind(format!("{}:{}", hostname, port))?; + + Ok(server.run()) +} + +pub async fn run(serve_options: ServeOptions) -> Result<()> { + + let app_data: Data = + Data::new(>::try_into(serve_options).unwrap()); + let request = actix_web::test::TestRequest::with_uri("/").app_data(app_data).to_http_request(); + let body: Bytes = Bytes::from(""); + let req = HttpRequest::from(request); + let res = handle_worker(req, body).await; + // print body of response + let res_body = res.body(); + + println!("{:?}", res_body); + Ok(()) +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/store.rs b/JS/wasm/crates/wasmjs-runtime/src/store.rs new file mode 100644 index 000000000..3b72b7b97 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/store.rs @@ -0,0 +1,46 @@ +use std::{ + fs, + path::{Path, PathBuf}, +}; + +use anyhow::Result; + +pub const STORE_FOLDER: &str = ".wasmjs"; + +pub struct Store { + pub folder: PathBuf, +} + +impl Store { + pub fn create(project_root: &Path, folder: &[&str]) -> Result { + let folder = Self::build_root_path(project_root, folder); + + fs::create_dir_all(&folder)?; + + Ok(Self { folder }) + } + + pub fn copy(&self, source: &Path, dest: &[&str]) -> Result<()> { + let file_path = self.build_folder_path(dest); + fs::copy(source, file_path)?; + Ok(()) + } + + pub fn build_folder_path(&self, source: &[&str]) -> PathBuf { + source + .iter() + .fold(self.folder.clone(), |acc, comp| acc.join(comp)) + } + + pub fn file_hash(path: &Path) -> Result { + let content = fs::read(path)?; + + Ok(blake3::hash(&content).to_string()) + } + + fn build_root_path(root: &Path, source: &[&str]) -> PathBuf { + source + .iter() + .fold(root.join(STORE_FOLDER), |acc, comp| acc.join(comp)) + } +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/wiggle_abi.rs b/JS/wasm/crates/wasmjs-runtime/src/wiggle_abi.rs new file mode 100644 index 000000000..834ccf472 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/wiggle_abi.rs @@ -0,0 +1,69 @@ +pub mod geo_impl; +use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; +use std::sync::Arc; +use wiggle::GuestPtr; + +use crate::bindings::arakoo_geo::ArakooGeo; +use crate::geolocation::Geolocation; +use crate::wiggle_abi::geo_impl::GeolocationError; +use crate::error::Error; + +pub struct Session { + geolocation: Arc, +} + +impl Session { + pub fn geolocation_lookup(&self, addr: &IpAddr) -> Option { + self.geolocation.lookup(addr).map(|data| data.to_string()) + } +} + +impl ArakooGeo for Session { + fn lookup( + &mut self, + addr_octets: &GuestPtr, + addr_len: u32, + buf: &GuestPtr, + buf_len: u32, + nwritten_out: &GuestPtr, + ) -> Result<(), Error> { + let octets = addr_octets + .as_array(addr_len) + .iter() + .map(|v| v.unwrap().read().unwrap()) + .collect::>(); + + let ip_addr: IpAddr = match addr_len { + 4 => IpAddr::V4(Ipv4Addr::from( + TryInto::<[u8; 4]>::try_into(octets).unwrap(), + )), + 16 => IpAddr::V6(Ipv6Addr::from( + TryInto::<[u8; 16]>::try_into(octets).unwrap(), + )), + _ => return Err(Error::InvalidArgument), + }; + + let result = self + .geolocation_lookup(&ip_addr) + .ok_or_else(|| GeolocationError::NoGeolocationData(ip_addr.to_string()))?; + + if result.len() > buf_len as usize { + return Err(Error::BufferLengthError { + buf: "geolocation_lookup", + len: "geolocation_lookup_max_len", + }); + } + + let result_len = + u32::try_from(result.len()).expect("smaller than value_max_len means it must fit"); + + let mut buf_ptr = buf + .as_array(result_len) + .as_slice_mut()? + .ok_or(Error::SharedMemory)?; + buf_ptr.copy_from_slice(result.as_bytes()); + nwritten_out.write(result_len)?; + Ok(()) + } +} + diff --git a/JS/wasm/crates/wasmjs-runtime/src/wiggle_abi/geo_impl.rs b/JS/wasm/crates/wasmjs-runtime/src/wiggle_abi/geo_impl.rs new file mode 100644 index 000000000..ab5d39114 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/wiggle_abi/geo_impl.rs @@ -0,0 +1,18 @@ +use crate::bindings::types::ArakooStatus; + +#[derive(Debug, thiserror::Error)] +pub enum GeolocationError { + /// Geolocation data for given address not found. + #[error("No geolocation data: {0}")] + NoGeolocationData(String), +} + +impl GeolocationError { + /// Convert to an error code representation suitable for passing across the ABI boundary. + pub fn to_aradoo_status(&self) -> ArakooStatus { + use GeolocationError::*; + match self { + NoGeolocationData(_) => ArakooStatus::None, + } + } +} diff --git a/JS/wasm/crates/wasmjs-runtime/src/workers.rs b/JS/wasm/crates/wasmjs-runtime/src/workers.rs new file mode 100644 index 000000000..cbe403958 --- /dev/null +++ b/JS/wasm/crates/wasmjs-runtime/src/workers.rs @@ -0,0 +1,187 @@ +use crate::bindings::HttpBindings; +use crate::config::{ArakooConfig, Config}; +use crate::io::{WasmInput, WasmOutput}; +use crate::runtime::{init_runtime, CtxBuilder, Runtime}; +use crate::bindings::http; +use std::{ + collections::HashMap, + io::Cursor, + path::{Path, PathBuf}, +}; + +use actix_web::HttpRequest; +use sha256::digest as sha256_digest; +use wasmtime::{Config as WasmtimeConfig, Engine, Linker, Module, Store}; +use wasmtime_wasi::{ambient_authority, Dir, WasiCtxBuilder}; + +use anyhow::Result; +use wasi_common::pipe::{ReadPipe, WritePipe}; +use crate::ServeArgs; +use crate::geolocation::GeolocationData; + +pub struct Stdio { + pub stdin: Vec, + pub stdout: WritePipe>>, +} + +impl Stdio { + pub fn new(input: &str) -> Self { + Self { + stdin: Vec::from(input), + stdout: WritePipe::new_in_memory(), + } + } + + pub fn configure_wasi_ctx(&self, mut builder: CtxBuilder) -> CtxBuilder { + match builder { + CtxBuilder::Preview1(ref mut wasi_builder) => { + wasi_builder + .stdin(Box::new(ReadPipe::from(self.stdin.clone()).clone())) + .stdout(Box::new(self.stdout.clone())) + .inherit_stderr(); + } + } + builder + } +} + +pub struct Worker { + pub id: String, + engine: Engine, + runtime: Box, + module: Module, + pub config: Config, + path: PathBuf, +} + +#[derive(Default)] +struct Host { + pub wasi_preview1_ctx: Option, + pub http: Option, +} + +impl Worker { + pub fn new(project_root: &Path, path: &Path, args: &ServeArgs) -> Result { + let id = sha256_digest(project_root.join(path).to_string_lossy().as_bytes()); + + let mut config=Config::default(); + match &args.config_path { + Some(path) => config.features.geo = ArakooConfig::from_file(&path)?, + _ => {}, + } + config.vars = std::env::vars().collect(); + + let engine = Engine::new(WasmtimeConfig::default().async_support(true))?; + let runtime = init_runtime(project_root, path)?; + let bytes = runtime.module_bytes()?; + + let module = if wasmparser::Parser::is_core_wasm(&bytes) { + Ok(Module::from_binary(&engine, &bytes)?) + } else { + Err("Invalid module".to_string()) + } + .map_err(|e| anyhow::anyhow!(e))?; + + runtime.prepare()?; + + Ok(Self { + id, + engine, + runtime, + module, + config, + path: path.to_path_buf(), + }) + } + + pub fn prepare_wasi_context( + &self, + environment_variables: &[(String, String)], + wasi_builder: &mut CtxBuilder, + ) -> Result<()> { + match wasi_builder { + CtxBuilder::Preview1(wasi_builder) => { + wasi_builder.envs(environment_variables)?; + + if let Some(folders) = self.config.folders.as_ref() { + for folder in folders { + if let Some(base) = &self.path.parent() { + let dir = Dir::open_ambient_dir( + base.join(&folder.from), + ambient_authority(), + )?; + wasi_builder.preopened_dir(dir, &folder.to)?; + } else { + panic!("Failed to initialize") + } + } + } + } + } + + Ok(()) + } + + pub async fn run( + &self, + request: &HttpRequest, + body: &str, + vars: &HashMap, + geo_details: GeolocationData, + ) -> Result { + let input = serde_json::to_string(&WasmInput::new(request, body, geo_details)).unwrap(); + + let mut linker = Linker::new(&self.engine); + + wasmtime_wasi::add_to_linker(&mut linker, |host: &mut Host| { + host.wasi_preview1_ctx.as_mut().unwrap() + })?; + + http::add_to_linker(&mut linker, |host: &mut Host| host.http.as_mut().unwrap())?; + + let environment_variables: Vec<(String, String)> = + vars.iter().map(|(k, v)| (k.clone(), v.clone())).collect(); + + let mut wasi_builder = CtxBuilder::Preview1(WasiCtxBuilder::new()); + + self.prepare_wasi_context(&environment_variables, &mut wasi_builder)?; + + let stdio = Stdio::new(&input); + let mut wasi_builder = stdio.configure_wasi_ctx(wasi_builder); + + self.runtime.prepare_wasi_ctx(&mut wasi_builder)?; + + let host = match wasi_builder { + CtxBuilder::Preview1(mut wasi_builder) => Host { + wasi_preview1_ctx: Some(wasi_builder.build()), + http: Some(HttpBindings { + http_config: self.config.features.http_requests.clone(), + }), + ..Host::default() + }, + }; + + let contents = { + let mut store = Store::new(&self.engine, host); + linker.module_async(&mut store, "", &self.module).await?; + + linker + .get_default(&mut store, "")? + .typed::<(), ()>(&store)? + .call_async(&mut store, ()) + .await?; + + drop(store); + + stdio + .stdout + .try_into_inner() + .unwrap_or_default() + .into_inner() + }; + + let output: WasmOutput = serde_json::from_slice(&contents)?; + + Ok(output) + } +} diff --git a/JS/wasm/examples/ec-wasmjs-hono/.gitignore b/JS/wasm/examples/ec-wasmjs-hono/.gitignore new file mode 100644 index 000000000..a198a78d5 --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/.gitignore @@ -0,0 +1,2 @@ +bin/ +node_modules/ \ No newline at end of file diff --git a/JS/wasm/examples/ec-wasmjs-hono/Dockerfile b/JS/wasm/examples/ec-wasmjs-hono/Dockerfile new file mode 100644 index 000000000..c1eacd0aa --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/Dockerfile @@ -0,0 +1,18 @@ +FROM node:20 as builder + +WORKDIR /app + +COPY package*.json ./ + +RUN npm install + +COPY build.js ./ +COPY src ./src + +RUN npm run build + +FROM tanjim/wasmjs:latest + +COPY --from=builder --chown=cnb:cnb --chmod=0777 /app/bin /app + +ENTRYPOINT [ "wasmjs-runtime", "/app" ] diff --git a/JS/wasm/examples/ec-wasmjs-hono/build.js b/JS/wasm/examples/ec-wasmjs-hono/build.js new file mode 100644 index 000000000..83f669710 --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/build.js @@ -0,0 +1,15 @@ +import { build } from "esbuild"; + +build({ + entryPoints: ["src/index.js"], + bundle: true, + minify: true, + outfile: "bin/[...app].js", + format: "esm", + target: "esnext", + platform: "node", + external: ["arakoo-jsonnet"], +}).catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/JS/wasm/examples/ec-wasmjs-hono/package-lock.json b/JS/wasm/examples/ec-wasmjs-hono/package-lock.json new file mode 100644 index 000000000..ae5bd0d88 --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/package-lock.json @@ -0,0 +1,567 @@ +{ + "name": "hono", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hono", + "dependencies": { + "@hono/node-server": "^1.3.1", + "arakoo-jsonnet": "file:../../types/jsonnet", + "axios": "^1.6.2", + "crypto": "^1.0.1", + "http": "^0.0.1-security", + "stream": "^0.0.2" + }, + "devDependencies": { + "@planetscale/database": "^1.4.0", + "esbuild": "^0.19", + "hono": "^3.9" + } + }, + "../../types/jsonnet": { + "version": "0.1.0", + "hasInstallScript": true, + "license": "ISC", + "devDependencies": { + "cargo-cp-artifact": "^0.1" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@hono/node-server": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.3.1.tgz", + "integrity": "sha512-eQBCDbH1Vv/TiYXNP8aGfJTuXi9xGhEd/EZg9u6dhr7zC5/WKKztcBmbrOTtixVBvvV6bfcay6KEginwiqHyXg==", + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@planetscale/database": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@planetscale/database/-/database-1.11.0.tgz", + "integrity": "sha512-aWbU+D/IRHoDE9975y+Q4c+EwwAWxCPwFId+N1AhQVFXzbeJMkj6KN2iQtoi03elcLMRdfT+V3i9Z4WRw+/oIA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/arakoo-jsonnet": { + "resolved": "../../types/jsonnet", + "link": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/emitter-component": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.2.tgz", + "integrity": "sha512-QdXO3nXOzZB4pAjM0n6ZE+R9/+kPpECA/XSELIcc54NeYVnBqIk+4DFiBgK+8QbV3mdvTG6nedl7dTYgO+5wDw==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esbuild": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hono": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.9.0.tgz", + "integrity": "sha512-MSGmerYD69jwDkBa631lY7y3xtEwbKFg2huFZ0TruzCdfJlmPd/rFzyvmMheePKsiA7CZp/KqL3mflBOzEmjLA==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/http": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz", + "integrity": "sha512-RnDvP10Ty9FxqOtPZuxtebw1j4L/WiqNMDtuc1YMH1XQm5TgDRaR1G9u8upL6KD1bXHSp9eSXo/ED+8Q7FAr+g==" + }, + "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==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz", + "integrity": "sha512-gCq3NDI2P35B2n6t76YJuOp7d6cN/C7Rt0577l91wllh0sY9ZBuw9KaSGqH/b0hzn3CWWJbpbW0W0WvQ1H/Q7g==", + "dependencies": { + "emitter-component": "^1.1.1" + } + } + } +} diff --git a/JS/wasm/examples/ec-wasmjs-hono/package.json b/JS/wasm/examples/ec-wasmjs-hono/package.json new file mode 100644 index 000000000..08f95e85d --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/package.json @@ -0,0 +1,21 @@ +{ + "name": "hono", + "type": "module", + "main": "bin/[...app].js", + "scripts": { + "build": "node ./build.js" + }, + "devDependencies": { + "@planetscale/database": "^1.4.0", + "esbuild": "^0.19", + "hono": "^3.9" + }, + "dependencies": { + "@hono/node-server": "^1.3.1", + "axios": "^1.6.2", + "crypto": "^1.0.1", + "arakoo-jsonnet": "file:../../types/jsonnet", + "http": "^0.0.1-security", + "stream": "^0.0.2" + } +} diff --git a/JS/wasm/examples/ec-wasmjs-hono/src/index.js b/JS/wasm/examples/ec-wasmjs-hono/src/index.js new file mode 100644 index 000000000..69eb2dca0 --- /dev/null +++ b/JS/wasm/examples/ec-wasmjs-hono/src/index.js @@ -0,0 +1,38 @@ +import { Hono } from "hono"; +import { connect } from "@planetscale/database"; + +const app = new Hono(); + +app.get("/", (c) => { + const geo = c.req.raw.geo; + return c.text(`Your from ${geo.city}, ${geo.country_name}!`); +}); + +app.get("/hello/:name", async (c) => { + const name = c.req.param("name"); + return c.text(`Async Hello ${name}!`); +}); + +app.get("/env/:key", async (c) => { + const key = c.req.param("key"); + return c.text(env[key]); +}); + +const config = { + host: env["PLANETSCALE_HOST"], + username: env["PLANETSCALE_USERNAME"], + password: env["PLANETSCALE_PASSWORD"], +}; +const conn = connect(config); + +app.get("/db", async (c) => { + const result = await conn.execute("SHOW TABLES"); + + return c.json(result); +}); + +app.notFound((c) => { + return c.text("404 not found", 404); +}); + +export default app; diff --git a/JS/wasm/types/jsonnet/.gitignore b/JS/wasm/types/jsonnet/.gitignore new file mode 100644 index 000000000..8ea5b111e --- /dev/null +++ b/JS/wasm/types/jsonnet/.gitignore @@ -0,0 +1,6 @@ +target +index.node +**/node_modules +**/.DS_Store +npm-debug.log* + diff --git a/JS/wasm/types/jsonnet/Cargo.lock b/JS/wasm/types/jsonnet/Cargo.lock new file mode 100644 index 000000000..bd343e56a --- /dev/null +++ b/JS/wasm/types/jsonnet/Cargo.lock @@ -0,0 +1,192 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "arakoo-jsonnet" +version = "0.1.0" +dependencies = [ + "jsonnet-rs", + "neon", +] + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "jsonnet-rs" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b396bdfc3ae94965555c9ec3efa2214e5f3921545a943ef9fc9873ff5e4723" +dependencies = [ + "jsonnet-sys", + "libc", +] + +[[package]] +name = "jsonnet-sys" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02347cbdf34234f30f0d92f0f8f678a15883bd5e1e4b3def4ed4a14f691d9add" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "libc" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + +[[package]] +name = "libloading" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "neon" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e15415261d880aed48122e917a45e87bb82cf0260bb6db48bbab44b7464373" +dependencies = [ + "neon-build", + "neon-macros", + "neon-runtime", + "semver", + "smallvec", +] + +[[package]] +name = "neon-build" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bac98a702e71804af3dacfde41edde4a16076a7bbe889ae61e56e18c5b1c811" + +[[package]] +name = "neon-macros" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7288eac8b54af7913c60e0eb0e2a7683020dffa342ab3fd15e28f035ba897cf" +dependencies = [ + "quote", + "syn", + "syn-mid", +] + +[[package]] +name = "neon-runtime" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4676720fa8bb32c64c3d9f49c47a47289239ec46b4bdb66d0913cc512cb0daca" +dependencies = [ + "cfg-if", + "libloading", + "smallvec", +] + +[[package]] +name = "proc-macro2" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-mid" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea305d57546cc8cd04feb14b62ec84bf17f50e3f7b12560d7bfa9265f39d9ed" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/JS/wasm/types/jsonnet/Cargo.toml b/JS/wasm/types/jsonnet/Cargo.toml new file mode 100644 index 000000000..0b5163643 --- /dev/null +++ b/JS/wasm/types/jsonnet/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "arakoo-jsonnet" +version = "0.1.0" +license = "ISC" +edition = "2018" +exclude = ["index.node"] + +[lib] +crate-type = ["cdylib"] +path = "src/lib.rs" +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +jsonnet-rs = "0.17" + +[dependencies.neon] +version = "0.10" +default-features = false +features = ["napi-6"] diff --git a/JS/wasm/types/jsonnet/package-lock.json b/JS/wasm/types/jsonnet/package-lock.json new file mode 100644 index 000000000..a8728d922 --- /dev/null +++ b/JS/wasm/types/jsonnet/package-lock.json @@ -0,0 +1,26 @@ +{ + "name": "arakoo-jsonnet", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "arakoo-jsonnet", + "version": "0.1.0", + "hasInstallScript": true, + "license": "ISC", + "devDependencies": { + "cargo-cp-artifact": "^0.1" + } + }, + "node_modules/cargo-cp-artifact": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.8.tgz", + "integrity": "sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA==", + "dev": true, + "bin": { + "cargo-cp-artifact": "bin/cargo-cp-artifact.js" + } + } + } +} diff --git a/JS/wasm/types/jsonnet/package.json b/JS/wasm/types/jsonnet/package.json new file mode 100644 index 000000000..20fade37d --- /dev/null +++ b/JS/wasm/types/jsonnet/package.json @@ -0,0 +1,25 @@ +{ + "name": "arakoo-jsonnet", + "version": "0.1.0", + "description": "", + "main": "index.node", + "scripts": { + "build": "cargo-cp-artifact -nc index.node -- cargo build --message-format=json-render-diagnostics", + "build-debug": "npm run build --", + "build-release": "npm run build -- --release", + "install": "npm run build-release", + "test": "cargo test", + "preinstall": "npm install cargo-cp-artifact --no-save" + }, + "author": "", + "exports": { + ".": { + "require": "./src/index.js", + "default": "./src/module.mjs" + } + }, + "license": "ISC", + "devDependencies": { + "cargo-cp-artifact": "^0.1" + } +} diff --git a/JS/wasm/types/jsonnet/src/index.d.ts b/JS/wasm/types/jsonnet/src/index.d.ts new file mode 100644 index 000000000..c08e25f03 --- /dev/null +++ b/JS/wasm/types/jsonnet/src/index.d.ts @@ -0,0 +1 @@ +export function parseJsonnet(filename: string): Promise; diff --git a/JS/wasm/types/jsonnet/src/index.js b/JS/wasm/types/jsonnet/src/index.js new file mode 100644 index 000000000..66874ec6c --- /dev/null +++ b/JS/wasm/types/jsonnet/src/index.js @@ -0,0 +1,5 @@ +const { parseJsonnet } = require("../index.node"); + +module.exports = { + parseJsonnet, +}; diff --git a/JS/wasm/types/jsonnet/src/lib.rs b/JS/wasm/types/jsonnet/src/lib.rs new file mode 100644 index 000000000..70aa202fc --- /dev/null +++ b/JS/wasm/types/jsonnet/src/lib.rs @@ -0,0 +1,27 @@ +use std::fs; + +use neon::prelude::*; + +use jsonnet::JsonnetVm; + +pub fn parse_jsonnet( + mut cx: FunctionContext, +) -> JsResult { + let path: String = cx.argument::(0)?.value(&mut cx); + let mut vm = JsonnetVm::new(); + let snippet = fs::read_to_string(path).unwrap(); + let output = vm.evaluate_snippet("snippet", &snippet); + let output = match output { + Ok(output) => output, + Err(e) => { + return cx.throw_error(format!("Error: {}", e)); + } + }; + Ok(cx.string(output.to_string())) +} + +#[neon::main] +fn main(mut cx: ModuleContext) -> NeonResult<()> { + cx.export_function("parseJsonnet", parse_jsonnet)?; + Ok(()) +} diff --git a/JS/wasm/types/jsonnet/src/module.mjs b/JS/wasm/types/jsonnet/src/module.mjs new file mode 100644 index 000000000..8efe8310e --- /dev/null +++ b/JS/wasm/types/jsonnet/src/module.mjs @@ -0,0 +1,5 @@ +import parseJson from "./index.js"; + +const { parseJsonnet } = parseJson; + +export { parseJsonnet }; diff --git a/JS/wasm/types/jsonnet/tsconfig.json b/JS/wasm/types/jsonnet/tsconfig.json new file mode 100644 index 000000000..acbd9198e --- /dev/null +++ b/JS/wasm/types/jsonnet/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": ["es6"], + "strict": true, + "baseUrl": ".", + "paths": { "arakoo-jsonnet": ["."] } + }, + "typedocOptions": { + "entryPoints": ["index.d.ts"], + "out": "../docs", + "excludeExternals": true + }, + "include": ["."] +} diff --git a/Java/.DS_Store b/Java/.DS_Store new file mode 100644 index 000000000..d2f94edf4 Binary files /dev/null and b/Java/.DS_Store differ diff --git a/Java/Examples/.DS_Store b/Java/Examples/.DS_Store index 07e27bb69..e6c911b09 100644 Binary files a/Java/Examples/.DS_Store and b/Java/Examples/.DS_Store differ diff --git a/Java/Examples/airtable/AirtableExample.java b/Java/Examples/airtable/AirtableExample.java new file mode 100644 index 000000000..6cd5c2cdf --- /dev/null +++ b/Java/Examples/airtable/AirtableExample.java @@ -0,0 +1,134 @@ +package com.edgechain; + +import com.edgechain.lib.endpoint.impl.integration.AirtableEndpoint; +import com.edgechain.lib.integration.airtable.query.AirtableQueryBuilder; +import com.edgechain.lib.integration.airtable.query.SortOrder; +import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.response.ArkResponse; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import dev.fuxing.airtable.AirtableRecord; +import dev.fuxing.airtable.formula.AirtableFormula; +import dev.fuxing.airtable.formula.LogicalOperator; +import org.json.JSONObject; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.web.bind.annotation.*; + +import java.util.Properties; + +/** + * For the purpose, of this example, create a simple table using AirTable i.e, "Speakers" Following + * are some basic fields: "speaker_name", "designation", "organization", "biography", + * "speaker_photo", "rating To get, your BASE_ID of specific database; use the following API + * https://api.airtable.com/v0/meta/bases --header 'Authorization: Bearer + * YOUR_PERSONAL_ACCESS_TOKEN' You can create, complex tables using Airtable; also define + * relationships b/w tables via lookups. + */ +@SpringBootApplication +public class AirtableExample { + private static final String AIRTABLE_API_KEY = ""; + private static final String AIRTABLE_BASE_ID = ""; + + private static AirtableEndpoint airtableEndpoint; + + public static void main(String[] args) { + + System.setProperty("server.port", "8080"); + + Properties properties = new Properties(); + properties.setProperty("cors.origins", "http://localhost:4200"); + + new SpringApplicationBuilder(AirtableExample.class).properties(properties).run(args); + + airtableEndpoint = new AirtableEndpoint(AIRTABLE_BASE_ID, AIRTABLE_API_KEY); + } + + @RestController + @RequestMapping("/airtable") + public class AirtableController { + + @GetMapping("/findAll") + public ArkResponse findAll(ArkRequest arkRequest) { + + int pageSize = arkRequest.getIntQueryParam("pageSize"); + String sortSpeakerName = arkRequest.getQueryParam("sortName"); + String offset = arkRequest.getQueryParam("offset"); + + AirtableQueryBuilder queryBuilder = new AirtableQueryBuilder(); + queryBuilder.pageSize(pageSize); // pageSize --> no. of records in each request + queryBuilder.sort("speaker_name", SortOrder.fromValue(sortSpeakerName).getValue()); + queryBuilder.offset(offset); // move to next page by passing offset returned in response; + + // Return only those speakers which have rating Greater Than Eq to 3; + queryBuilder.filterByFormula( + LogicalOperator.GTE, + AirtableFormula.Object.field("rating"), + AirtableFormula.Object.value(3)); + + return new EdgeChain<>(airtableEndpoint.findAll("Speakers", queryBuilder)).getArkResponse(); + } + + @GetMapping("/find") + public ArkResponse findById(ArkRequest arkRequest) { + String id = arkRequest.getQueryParam("id"); + return new EdgeChain<>(airtableEndpoint.findById("Speakers", id)).getArkResponse(); + } + + @PostMapping("/create") + public ArkResponse create(ArkRequest arkRequest) { + + JSONObject body = arkRequest.getBody(); + String speakerName = body.getString("name"); + String designation = body.getString("designation"); + int rating = body.getInt("rating"); + String organization = body.getString("organization"); + String biography = body.getString("biography"); + + // Airtable API doesn't allow to upload blob files directly; therefore, you would require to + // upload it + // to some cloud storage i.e, S3 and then set the URL in Airtable. + + AirtableRecord record = new AirtableRecord(); + record.putField("speaker_name", speakerName); + record.putField("designation", designation); + record.putField("rating", rating); + record.putField("organization", organization); + record.putField("biography", biography); + + return new EdgeChain<>(airtableEndpoint.create("Speakers", record)).getArkResponse(); + } + + @PostMapping("/update") + public ArkResponse update(ArkRequest arkRequest) { + + JSONObject body = arkRequest.getBody(); + String id = body.getString("id"); + String speakerName = body.getString("name"); + String designation = body.getString("designation"); + int rating = body.getInt("rating"); + String organization = body.getString("organization"); + String biography = body.getString("biography"); + + // Airtable API doesn't allow to upload blob files directly; therefore, you would require to + // upload it + // to some cloud storage i.e, S3 and then set the URL in Airtable. + + AirtableRecord record = new AirtableRecord(); + record.setId(id); + record.putField("speaker_name", speakerName); + record.putField("designation", designation); + record.putField("rating", rating); + record.putField("organization", organization); + record.putField("biography", biography); + + return new EdgeChain<>(airtableEndpoint.update("Speakers", record)).getArkResponse(); + } + + @DeleteMapping("/delete") + public ArkResponse delete(ArkRequest arkRequest) { + JSONObject body = arkRequest.getBody(); + String id = body.getString("id"); + return new EdgeChain<>(airtableEndpoint.delete("Speakers", id)).getArkResponse(); + } + } +} diff --git a/Java/Examples/code-interpreter/CodeInterpreter.java b/Java/Examples/code-interpreter/CodeInterpreter.java index 084876a39..cce993b95 100644 --- a/Java/Examples/code-interpreter/CodeInterpreter.java +++ b/Java/Examples/code-interpreter/CodeInterpreter.java @@ -4,6 +4,7 @@ import java.util.concurrent.TimeUnit; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import org.json.JSONException; import org.json.JSONObject; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -13,7 +14,6 @@ import org.springframework.web.bind.annotation.RestController; import com.edgechain.lib.codeInterpreter.Eval; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; import com.edgechain.lib.jsonnet.JsonnetArgs; import com.edgechain.lib.jsonnet.JsonnetLoader; import com.edgechain.lib.jsonnet.enums.DataType; @@ -28,7 +28,7 @@ public class CodeInterpreter { private static final String OPENAI_AUTH_KEY = ""; - private static OpenAiEndpoint userChatEndpoint; + private static OpenAiChatEndpoint userChatEndpoint; private static final ObjectMapper objectMapper = new ObjectMapper(); private static JsonnetLoader loader = new FileJsonnetLoader("./code-interpreter/code-interpreter.jsonnet"); @@ -48,7 +48,7 @@ public double interpret(ArkRequest arkRequest) throws JSONException { JSONObject json = arkRequest.getBody(); userChatEndpoint = - new OpenAiEndpoint( + new OpenAiChatEndpoint( OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, "gpt-3.5-turbo", diff --git a/Java/Examples/htmx-ui-demo/ChatMessage.java b/Java/Examples/htmx-ui-demo/ChatMessage.java index 2f77db2c5..8d0c4b71c 100644 --- a/Java/Examples/htmx-ui-demo/ChatMessage.java +++ b/Java/Examples/htmx-ui-demo/ChatMessage.java @@ -1,30 +1,30 @@ -package com.edgechain; - -public class ChatMessage { - String role; - String content; - - public ChatMessage(String role, String content) { - this.role = role; - this.content = content; - } - - public ChatMessage() {} - - public String getRole() { - return role; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - @Override - public String toString() { - return "ChatMessage{" + "role='" + role + '\'' + ", content='" + content + '\'' + '}'; - } -} +package com.edgechain; + +public class ChatMessage { + String role; + String content; + + public ChatMessage(String role, String content) { + this.role = role; + this.content = content; + } + + public ChatMessage() {} + + public String getRole() { + return role; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public String toString() { + return "ChatMessage{" + "role='" + role + '\'' + ", content='" + content + '\'' + '}'; + } +} diff --git a/Java/Examples/htmx-ui-demo/User.java b/Java/Examples/htmx-ui-demo/User.java index a0a76a979..d2ea16502 100644 --- a/Java/Examples/htmx-ui-demo/User.java +++ b/Java/Examples/htmx-ui-demo/User.java @@ -1,5 +1,4 @@ -package com.edgechain; -public class User { +class User { public String email; public String password; diff --git a/Java/Examples/json/JsonFormat.java b/Java/Examples/json/JsonFormat.java index d1d7f5aaf..2e2423138 100644 --- a/Java/Examples/json/JsonFormat.java +++ b/Java/Examples/json/JsonFormat.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import org.json.JSONObject; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; @@ -17,7 +18,6 @@ import org.springframework.web.client.RestTemplate; import com.edgechain.lib.constants.EndpointConstants; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; import com.edgechain.lib.jsonFormat.request.FunctionRequest; import com.edgechain.lib.jsonFormat.request.Message; import com.edgechain.lib.jsonFormat.request.OpenApiFunctionRequest; @@ -41,7 +41,7 @@ public class JsonFormat { // need only for situation endpoint private static final String OPENAI_ORG_ID = ""; - private static OpenAiEndpoint userChatEndpoint; + private static OpenAiChatEndpoint userChatEndpoint; private static JsonnetLoader loader = new FileJsonnetLoader("./json/json-format.jsonnet"); private static JsonnetLoader functionLoader = new FileJsonnetLoader("./json/function.jsonnet"); private static final ObjectMapper objectMapper = new ObjectMapper(); @@ -84,7 +84,7 @@ public class ExampleController { public String extract(ArkRequest arkRequest) { userChatEndpoint = - new OpenAiEndpoint( + new OpenAiChatEndpoint( OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, "gpt-3.5-turbo", @@ -129,8 +129,8 @@ public String situation(ArkRequest arkRequest) { JSONObject json = arkRequest.getBody(); - OpenAiEndpoint userChat = - new OpenAiEndpoint( + OpenAiChatEndpoint userChat = + new OpenAiChatEndpoint( EndpointConstants.OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, OPENAI_ORG_ID, diff --git a/Java/Examples/pinecone/PineconeExample.java b/Java/Examples/pinecone/PineconeExample.java index 8f98764e6..fda4e6163 100644 --- a/Java/Examples/pinecone/PineconeExample.java +++ b/Java/Examples/pinecone/PineconeExample.java @@ -4,12 +4,13 @@ import static com.edgechain.lib.constants.EndpointConstants.OPENAI_EMBEDDINGS_API; import com.edgechain.lib.chains.PineconeRetrieval; -import com.edgechain.lib.chains.Retrieval; import com.edgechain.lib.context.domain.HistoryContext; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.endpoint.impl.PineconeEndpoint; -import com.edgechain.lib.endpoint.impl.RedisHistoryContextEndpoint; + +import com.edgechain.lib.endpoint.impl.context.RedisHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.OpenAiEmbeddingEndpoint; +import com.edgechain.lib.endpoint.impl.index.PineconeEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.jsonnet.JsonnetArgs; import com.edgechain.lib.jsonnet.JsonnetLoader; import com.edgechain.lib.jsonnet.enums.DataType; @@ -19,13 +20,11 @@ import com.edgechain.lib.request.ArkRequest; import com.edgechain.lib.response.ArkResponse; import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; -import com.edgechain.lib.rxjava.retry.impl.FixedDelay; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import java.io.IOException; import java.io.InputStream; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; @@ -34,22 +33,19 @@ @SpringBootApplication public class PineconeExample { - private static final String OPENAI_AUTH_KEY = ""; - private static final String PINECONE_AUTH_KEY = ""; - private static final String PINECONE_QUERY_API = ""; - private static final String PINECONE_UPSERT_API = ""; - private static final String PINECONE_DELETE = ""; - - private static OpenAiEndpoint ada002Embedding; - private static OpenAiEndpoint gpt3Endpoint; + private static final String OPENAI_AUTH_KEY = ""; // YOUR OPENAI AUTH KEY + private static final String OPENAI_ORG_ID = ""; // YOUR OPENAI ORG ID - private static PineconeEndpoint upsertPineconeEndpoint; - private static PineconeEndpoint queryPineconeEndpoint; + private static final String PINECONE_AUTH_KEY = ""; + private static final String PINECONE_API = ""; // Only API + private static OpenAiChatEndpoint gpt3Endpoint; + private static OpenAiChatEndpoint gpt3StreamEndpoint; - private static PineconeEndpoint deletePineconeEndpoint; + private static PineconeEndpoint pineconeEndpoint; private static RedisHistoryContextEndpoint contextEndpoint; + // It's recommended to perform localized instantiation for thread-safe approach. private JsonnetLoader queryLoader = new FileJsonnetLoader("./pinecone/pinecone-query.jsonnet"); private JsonnetLoader chatLoader = new FileJsonnetLoader("./pinecone/pinecone-chat.jsonnet"); @@ -65,7 +61,7 @@ public static void main(String[] args) { // Redis Configuration properties.setProperty("redis.url", ""); - properties.setProperty("redis.port", "12285"); + properties.setProperty("redis.port", ""); properties.setProperty("redis.username", "default"); properties.setProperty("redis.password", ""); properties.setProperty("redis.ttl", "3600"); @@ -78,36 +74,41 @@ public static void main(String[] args) { new SpringApplicationBuilder(PineconeExample.class).properties(properties).run(args); - // Variables Initialization ==> Endpoints must be intialized in main method... - ada002Embedding = - new OpenAiEndpoint( - OPENAI_EMBEDDINGS_API, + gpt3Endpoint = + new OpenAiChatEndpoint( + OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, - "text-embedding-ada-002", - new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); + OPENAI_ORG_ID, + "gpt-3.5-turbo", + "user", + 0.85, + new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - gpt3Endpoint = - new OpenAiEndpoint( + gpt3StreamEndpoint = + new OpenAiChatEndpoint( OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, + OPENAI_ORG_ID, "gpt-3.5-turbo", "user", 0.7, + true, new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - upsertPineconeEndpoint = - new PineconeEndpoint( - PINECONE_UPSERT_API, - PINECONE_AUTH_KEY, + OpenAiEmbeddingEndpoint ada002 = + new OpenAiEmbeddingEndpoint( + OPENAI_EMBEDDINGS_API, + OPENAI_AUTH_KEY, + OPENAI_ORG_ID, + "text-embedding-ada-002", new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - queryPineconeEndpoint = + pineconeEndpoint = new PineconeEndpoint( - PINECONE_QUERY_API, PINECONE_AUTH_KEY, new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); - - deletePineconeEndpoint = - new PineconeEndpoint( - PINECONE_DELETE, PINECONE_AUTH_KEY, new FixedDelay(4, 5, TimeUnit.SECONDS)); + PINECONE_API, + PINECONE_AUTH_KEY, + ada002, + new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); contextEndpoint = new RedisHistoryContextEndpoint(new ExponentialDelay(2, 2, 2, TimeUnit.SECONDS)); @@ -157,46 +158,27 @@ public class PineconeController { // Namespace is optional (if not provided, it will be using Empty String "") @PostMapping("/pinecone/upsert") // /v1/examples/openai/upsert?namespace=machine-learning public void upsertPinecone(ArkRequest arkRequest) throws IOException { - String namespace = arkRequest.getQueryParam("namespace"); InputStream file = arkRequest.getMultiPart("file").getInputStream(); - - // Configure Pinecone - upsertPineconeEndpoint.setNamespace(namespace); - String[] arr = pdfReader.readByChunkSize(file, 512); + PineconeRetrieval retrieval = + new PineconeRetrieval(arr, pineconeEndpoint, namespace, arkRequest); - /** - * Retrieval Class is basically used to generate embeddings & upsert it to VectorDB; If OpenAI - * Embedding Endpoint is not provided; then Doc2Vec constructor is used If the model is not - * provided, then it will emit an error - */ - Retrieval retrieval = - new PineconeRetrieval(upsertPineconeEndpoint, ada002Embedding, arkRequest); - - IntStream.range(0, arr.length).parallel().forEach(i -> retrieval.upsert(arr[i])); + retrieval.upsert(); } @PostMapping(value = "/pinecone/query") public ArkResponse query(ArkRequest arkRequest) { - String namespace = arkRequest.getQueryParam("namespace"); String query = arkRequest.getBody().getString("query"); int topK = arkRequest.getIntQueryParam("topK"); + String namespace = arkRequest.getQueryParam("namespace"); - // Configure Pinecone - queryPineconeEndpoint.setNamespace(namespace); - - // Step 1: Chain ==> Get Embeddings From Input & Then Query To Pinecone - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Step 2: Chain ==> Query Embeddings from Pinecone + // Chain 1 ==> Query Embeddings from Pinecone EdgeChain> queryChain = - new EdgeChain<>(queryPineconeEndpoint.query(embeddingsChain.get(), topK)); + new EdgeChain<>(pineconeEndpoint.query(query, namespace, topK, arkRequest)); - // Chain 3 ===> Our queryFn passes takes list and passes each response with base prompt to - // OpenAI + // Chain ===> Our queryFn passes takes list and passes each response with base prompt EdgeChain> gpt3Chain = queryChain.transform(wordEmbeddings -> queryFn(wordEmbeddings, arkRequest)); @@ -215,14 +197,8 @@ public ArkResponse chatWithPinecone(ArkRequest arkRequest) { String contextId = arkRequest.getQueryParam("id"); String query = arkRequest.getBody().getString("query"); - String namespace = arkRequest.getQueryParam("namespace"); boolean stream = arkRequest.getBooleanHeader("stream"); - - // Configure Pinecone - queryPineconeEndpoint.setNamespace(namespace); - - // Configure GPT3endpoint - gpt3Endpoint.setStream(stream); + String namespace = arkRequest.getQueryParam("namespace"); // Get HistoryContext HistoryContext historyContext = contextEndpoint.get(contextId); @@ -238,22 +214,19 @@ public ArkResponse chatWithPinecone(ArkRequest arkRequest) { // Extract topK value from JsonnetLoader; int topK = chatLoader.getInt("topK"); - // Chain 1 ==> Get Embeddings From Input - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from Pinecone & Then concatenate it (preparing for prompt) - // let's say topK=5; then we concatenate List into a string using String.join method + // Chain 1 ==> Query Embeddings from Pinecone & Then concatenate it (preparing for prompt) EdgeChain> pineconeChain = - new EdgeChain<>(queryPineconeEndpoint.query(embeddingsChain.get(), topK)); + new EdgeChain<>(pineconeEndpoint.query(query, namespace, topK, arkRequest)); - // Chain 3 ===> Transform String of Queries into List + // Chain 2 ===> Transform String of Queries into List + // let's say topK=5; then we concatenate List into a string using String.join method EdgeChain queryChain = new EdgeChain<>(pineconeChain) .transform( pineconeResponse -> { + List wordEmbeddings = pineconeResponse.get(); List queryList = new ArrayList<>(); - pineconeResponse.get().forEach(q -> queryList.add(q.getId())); + wordEmbeddings.forEach(q -> queryList.add(q.getId())); return String.join("\n", queryList); }); @@ -261,16 +234,16 @@ public ArkResponse chatWithPinecone(ArkRequest arkRequest) { EdgeChain promptChain = queryChain.transform(queries -> chatFn(historyContext.getResponse(), queries)); - // Chain 5 ==> Pass the Prompt To Gpt3 - EdgeChain gpt3Chain = - new EdgeChain<>( - gpt3Endpoint.chatCompletion(promptChain.get(), "PineconeChatChain", arkRequest)); - // (FOR NON STREAMING) // If it's not stream ==> // Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory if (!stream) { + // Chain 5 ==> Pass the Prompt To Gpt3 + EdgeChain gpt3Chain = + new EdgeChain<>( + gpt3Endpoint.chatCompletion(promptChain.get(), "RedisChatChain", arkRequest)); + // Chain 6 EdgeChain historyUpdatedChain = gpt3Chain.doOnNext( @@ -287,8 +260,13 @@ public ArkResponse chatWithPinecone(ArkRequest arkRequest) { // For STREAMING Version else { + // Chain 5 ==> Pass the Prompt To Gpt3 + EdgeChain gpt3Chain = + new EdgeChain<>( + gpt3StreamEndpoint.chatCompletion(promptChain.get(), "RedisChatChain", arkRequest)); + /* As the response is in stream, so we will use StringBuilder to append the response - and once GPT chain indicates that it is finished, we will save the following into Postgres + and once GPT chain indicates that it is finished, we will save the following into Redis Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory */ @@ -318,8 +296,7 @@ public ArkResponse chatWithPinecone(ArkRequest arkRequest) { @DeleteMapping("/pinecone/deleteAll") public ArkResponse deletePinecone(ArkRequest arkRequest) { String namespace = arkRequest.getQueryParam("namespace"); - deletePineconeEndpoint.setNamespace(namespace); - return new EdgeChain<>(deletePineconeEndpoint.deleteAll()).getArkResponse(); + return new EdgeChain<>(pineconeEndpoint.deleteAll(namespace)).getArkResponse(); } public List queryFn( diff --git a/Java/Examples/postgresql/PostgreSQLExample.java b/Java/Examples/postgresql/PostgreSQLExample.java index 2c5e0b36c..7b1782e3c 100644 --- a/Java/Examples/postgresql/PostgreSQLExample.java +++ b/Java/Examples/postgresql/PostgreSQLExample.java @@ -4,12 +4,14 @@ import static com.edgechain.lib.constants.EndpointConstants.OPENAI_EMBEDDINGS_API; import com.edgechain.lib.chains.PostgresRetrieval; -import com.edgechain.lib.chains.Retrieval; import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.*; +import com.edgechain.lib.endpoint.impl.context.PostgreSQLHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.OpenAiEmbeddingEndpoint; +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.index.domain.PostgresWordEmbeddings; import com.edgechain.lib.index.enums.PostgresDistanceMetric; +import com.edgechain.lib.index.enums.PostgresLanguage; import com.edgechain.lib.jsonnet.JsonnetArgs; import com.edgechain.lib.jsonnet.JsonnetLoader; import com.edgechain.lib.jsonnet.enums.DataType; @@ -26,7 +28,6 @@ import java.io.InputStream; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -36,13 +37,14 @@ @SpringBootApplication public class PostgreSQLExample { - private static final String OPENAI_AUTH_KEY = ""; - - private static OpenAiEndpoint ada002Embedding; - private static OpenAiEndpoint gpt3Endpoint; + private static final String OPENAI_AUTH_KEY = ""; // YOUR OPENAI AUTH KEY + private static final String OPENAI_ORG_ID = ""; // YOUR OPENAI ORG ID + private static OpenAiChatEndpoint gpt3Endpoint; + private static OpenAiChatEndpoint gpt3StreamEndpoint; private static PostgresEndpoint postgresEndpoint; private static PostgreSQLHistoryContextEndpoint contextEndpoint; + // For thread safe, instantitate it in methods... private JsonnetLoader queryLoader = new FileJsonnetLoader("./postgres/postgres-query.jsonnet"); private JsonnetLoader chatLoader = new FileJsonnetLoader("./postgres/postgres-chat.jsonnet"); @@ -62,30 +64,48 @@ public static void main(String[] args) { // If you want to use PostgreSQL only; then just provide dbHost, dbUsername & dbPassword. // If you haven't specified PostgreSQL, then logs won't be stored. properties.setProperty("postgres.db.host", ""); - properties.setProperty("postgres.db.username", "postgres"); + properties.setProperty("postgres.db.username", ""); properties.setProperty("postgres.db.password", ""); new SpringApplicationBuilder(PostgreSQLExample.class).properties(properties).run(args); - // Variables Initialization ==> Endpoints must be intialized in main method... - ada002Embedding = - new OpenAiEndpoint( - OPENAI_EMBEDDINGS_API, + gpt3Endpoint = + new OpenAiChatEndpoint( + OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, - "text-embedding-ada-002", - new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); + OPENAI_ORG_ID, + "gpt-3.5-turbo", + "user", + 0.85, + new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - gpt3Endpoint = - new OpenAiEndpoint( + gpt3StreamEndpoint = + new OpenAiChatEndpoint( OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, + OPENAI_ORG_ID, "gpt-3.5-turbo", "user", - 0.7, + 0.85, + true, new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); + OpenAiEmbeddingEndpoint adaEmbedding = + new OpenAiEmbeddingEndpoint( + OPENAI_EMBEDDINGS_API, + OPENAI_AUTH_KEY, + OPENAI_ORG_ID, + "text-embedding-ada-002", + new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); + + // Defining tablename and namespace... postgresEndpoint = - new PostgresEndpoint("spring_vectors", new ExponentialDelay(5, 5, 2, TimeUnit.SECONDS)); + new PostgresEndpoint( + "pg_vectors", + "machine-learning", + adaEmbedding, + new ExponentialDelay(5, 5, 2, TimeUnit.SECONDS)); + contextEndpoint = new PostgreSQLHistoryContextEndpoint(new FixedDelay(2, 3, TimeUnit.SECONDS)); } @@ -136,39 +156,36 @@ public class PostgreSQLController { */ @PostMapping("/postgres/upsert") public void upsert(ArkRequest arkRequest) throws IOException { - - String namespace = arkRequest.getQueryParam("namespace"); String filename = arkRequest.getMultiPart("file").getSubmittedFileName(); InputStream file = arkRequest.getMultiPart("file").getInputStream(); - postgresEndpoint.setNamespace(namespace); - String[] arr = pdfReader.readByChunkSize(file, 512); - final Retrieval retrieval = - new PostgresRetrieval(postgresEndpoint, filename, 1536, ada002Embedding, arkRequest); + PostgresRetrieval retrieval = + new PostgresRetrieval( + arr, postgresEndpoint, 1536, filename, PostgresLanguage.ENGLISH, arkRequest); + + // retrieval.setBatchSize(50); // Modifying batchSize....(Default is 30) - IntStream.range(0, arr.length).parallel().forEach(i -> retrieval.upsert(arr[i])); + // Getting ids from upsertion... Internally, it automatically parallelizes the operation... + List ids = retrieval.upsert(); + + ids.forEach(System.out::println); + + System.out.println("Size: " + ids.size()); // Printing the UUIDs } @PostMapping(value = "/postgres/query") public ArkResponse query(ArkRequest arkRequest) { - String namespace = arkRequest.getQueryParam("namespace"); String query = arkRequest.getBody().getString("query"); int topK = arkRequest.getIntQueryParam("topK"); - postgresEndpoint.setNamespace(namespace); - - // Chain 1==> Get Embeddings From Input & Then Query To PostgreSQL - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from PostgreSQL + // Chain 1==> Query Embeddings from PostgreSQL EdgeChain> queryChain = new EdgeChain<>( postgresEndpoint.query( - embeddingsChain.get(), PostgresDistanceMetric.IP, topK, 10)); // defining probes + List.of(query), PostgresDistanceMetric.COSINE, topK, topK, 10, arkRequest)); // Chain 3 ===> Our queryFn passes takes list and passes each response with base prompt to // OpenAI @@ -184,15 +201,9 @@ public ArkResponse chat(ArkRequest arkRequest) { String contextId = arkRequest.getQueryParam("id"); String query = arkRequest.getBody().getString("query"); - String namespace = arkRequest.getQueryParam("namespace"); boolean stream = arkRequest.getBooleanHeader("stream"); - // Configure PostgresEndpoint - postgresEndpoint.setNamespace(namespace); - - gpt3Endpoint.setStream(stream); - // Get HistoryContext HistoryContext historyContext = contextEndpoint.get(contextId); @@ -206,24 +217,23 @@ public ArkResponse chat(ArkRequest arkRequest) { // Extract topK value from JsonnetLoader; int topK = chatLoader.getInt("topK"); - - // Chain 1 ==> Get Embeddings From Input - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - // Chain 2 ==> Query Embeddings from PostgreSQL & Then concatenate it (preparing for prompt) - // let's say topK=5; then we concatenate List into a string using String.join method + EdgeChain> postgresChain = new EdgeChain<>( - postgresEndpoint.query(embeddingsChain.get(), PostgresDistanceMetric.L2, topK)); + postgresEndpoint.query( + List.of(query), PostgresDistanceMetric.COSINE, topK, topK, arkRequest)); // Chain 3 ===> Transform String of Queries into List + // let's say topK=5; then we concatenate List into a string using String.join method EdgeChain queryChain = new EdgeChain<>(postgresChain) .transform( postgresResponse -> { + List postgresWordEmbeddingsList = + postgresResponse.get(); List queryList = new ArrayList<>(); - postgresResponse.get().forEach(q -> queryList.add(q.getRawText())); + postgresWordEmbeddingsList.forEach(q -> queryList.add(q.getRawText())); return String.join("\n", queryList); }); @@ -231,16 +241,16 @@ public ArkResponse chat(ArkRequest arkRequest) { EdgeChain promptChain = queryChain.transform(queries -> chatFn(historyContext.getResponse(), queries)); - // Chain 5 ==> Pass the Prompt To Gpt3 - EdgeChain gpt3Chain = - new EdgeChain<>( - gpt3Endpoint.chatCompletion(promptChain.get(), "PostgresChatChain", arkRequest)); - // (FOR NON STREAMING) // If it's not stream ==> // Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory if (!stream) { + // Chain 5 ==> Pass the Prompt To Gpt3 + EdgeChain gpt3Chain = + new EdgeChain<>( + gpt3Endpoint.chatCompletion(promptChain.get(), "PostgresChatChain", arkRequest)); + // Chain 6 EdgeChain historyUpdatedChain = gpt3Chain.doOnNext( @@ -257,6 +267,12 @@ public ArkResponse chat(ArkRequest arkRequest) { // For STREAMING Version else { + // Chain 5 ==> Pass the Prompt To Gpt3 + EdgeChain gpt3Chain = + new EdgeChain<>( + gpt3StreamEndpoint.chatCompletion( + promptChain.get(), "PostgresChatChain", arkRequest)); + /* As the response is in stream, so we will use StringBuilder to append the response and once GPT chain indicates that it is finished, we will save the following into Postgres Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory diff --git a/Java/Examples/react-chain/ReactChainApplication.java b/Java/Examples/react-chain/ReactChainApplication.java index b8c848f25..d3e612155 100644 --- a/Java/Examples/react-chain/ReactChainApplication.java +++ b/Java/Examples/react-chain/ReactChainApplication.java @@ -1,6 +1,6 @@ package com.edgechain; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.jsonnet.JsonnetArgs; import com.edgechain.lib.jsonnet.JsonnetLoader; import com.edgechain.lib.jsonnet.enums.DataType; @@ -9,9 +9,10 @@ import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import java.util.Properties; import java.util.concurrent.TimeUnit; @@ -22,8 +23,9 @@ public class ReactChainApplication { private static final String OPENAI_AUTH_KEY = ""; - - private static OpenAiEndpoint userChatEndpoint; + private static final String OPENAI_ORG_ID = ""; + private static OpenAiChatEndpoint userChatEndpoint; + private static JsonnetLoader loader = new FileJsonnetLoader("./react-chain/react-chain.jsonnet"); public static void main(String[] args) { System.setProperty("server.port", "8080"); @@ -45,64 +47,83 @@ public static void main(String[] args) { new SpringApplicationBuilder(ReactChainApplication.class).properties(properties).run(args); userChatEndpoint = - new OpenAiEndpoint( + new OpenAiChatEndpoint( OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, + OPENAI_ORG_ID, "gpt-3.5-turbo", "user", 0.7, + false, new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); } @RestController @RequestMapping("/v1/examples") - public class ExampleController { + public class ReactChainController { - @GetMapping(value = "/react-chain") + @PostMapping(value = "/react-chain") public String reactChain(ArkRequest arkRequest) { String prompt = (String) arkRequest.getBody().get("prompt"); - StringBuilder context = new StringBuilder(); - JsonnetLoader loader = - new FileJsonnetLoader("./react-chain.jsonnet") - .put("context", new JsonnetArgs(DataType.STRING, "This is context")) - .put("gptResponse", new JsonnetArgs(DataType.STRING, "")) - .loadOrReload(); - String preset = loader.get("preset"); - - prompt = preset + " \nQuestion: " + prompt; - - String gptResponse = - userChatEndpoint - .chatCompletion(prompt, "React-Chain", arkRequest) - .blockingFirst() - .getChoices() - .get(0) - .getMessage() - .getContent(); - context.append(prompt); - loader.put("context", new JsonnetArgs(DataType.STRING, context.toString())); + + loader.put("context", new JsonnetArgs(DataType.STRING, "This is context")); + loader.put("gptResponse", new JsonnetArgs(DataType.STRING, "")); + loader.put("question", new JsonnetArgs(DataType.STRING, prompt)); + loader.put("text", new JsonnetArgs(DataType.STRING, "")); + + try { + loader.loadOrReload(); + } catch (Exception e) { + e.printStackTrace(); + return "Please broaden the search query!"; + } + prompt = loader.get("initialPrompt"); + + String gptResponse = gptFn(prompt, arkRequest); + + loader.put("context", new JsonnetArgs(DataType.STRING, prompt)); loader.put("gptResponse", new JsonnetArgs(DataType.STRING, gptResponse)); while (!checkIfFinished(gptResponse)) { - loader.loadOrReload(); + try { + loader.loadOrReload(); + } catch (Exception e) { + return "Please broaden the search query or try again!"; + } + + String observation = loader.get("observation"); + if (observation.isEmpty()) + return "No info found on Wiki! Please broaden the search query or try again!"; + prompt = loader.get("prompt"); - gptResponse = - userChatEndpoint - .chatCompletion(prompt, "React-Chain", arkRequest) - .blockingFirst() - .getChoices() - .get(0) - .getMessage() - .getContent(); - context.append("\n" + prompt); - loader.put("context", new JsonnetArgs(DataType.STRING, context.toString())); + gptResponse = gptFn(prompt, arkRequest); + + loader.put("context", new JsonnetArgs(DataType.STRING, prompt)); loader.put("gptResponse", new JsonnetArgs(DataType.STRING, gptResponse)); } - return gptResponse.substring(gptResponse.indexOf("Finish[") + 7, gptResponse.indexOf("]")); + + // Extracting the final answer + loader.put("text", new JsonnetArgs(DataType.STRING, gptResponse)); + + try { + loader.loadOrReload(); + return loader.get("finalAns"); + } catch (Exception e) { + return "Please broaden the search query or try again!"; + } } private boolean checkIfFinished(String gptResponse) { return gptResponse.contains("Finish"); } + + private String gptFn(String prompt, ArkRequest arkRequest) { + return new EdgeChain<>(userChatEndpoint.chatCompletion(prompt, "React-Chain", arkRequest)) + .get() + .getChoices() + .get(0) + .getMessage() + .getContent(); + } } } diff --git a/Java/Examples/react-chain/react-chain.jsonnet b/Java/Examples/react-chain/react-chain.jsonnet index 5f2c25d20..39f3d5da5 100644 --- a/Java/Examples/react-chain/react-chain.jsonnet +++ b/Java/Examples/react-chain/react-chain.jsonnet @@ -45,6 +45,7 @@ local preset = ||| Action 3: Finish[yes] **ALL THE OBSERVATIONS WILL BE PROVIDED BY THE USER, YOU DON'T HAVE TO PROVIDE ANY OBSERVATION** + Question: {} |||; //To extract action from the response @@ -57,14 +58,27 @@ local extractThought(str) = local thought = xtr.strings.substringAfter(xtr.strings.substringBefore(str, "Action"), ":"); thought; +//Replace the {} in the preset with the question +local updateQueryPrompt(question) = + local updatedPrompt = xtr.replace(preset, '{}', question + "\n"); + updatedPrompt; + +//Extract the final answer +local extractFinalAns(text) = + local finalAns = xtr.strings.substringAfter(xtr.strings.substringBeforeLast(xtr.strings.substringAfter(text, "Finish["), "]"), "["); + finalAns; + +local initialPrompt = updateQueryPrompt(payload.question); local gptResponse = payload.gptResponse; //this will be populated from the java code after the prompt is submitted to gpt local action = extractAction(gptResponse); local thought = extractThought(gptResponse); -local searchResponse = std.substr(callFunction("search")(action), 0, 200); //extract action from response and insert here +local searchResponse = std.substr(callFunction("search")(action), 0, 400); //extract action from response and insert here local observation = xtr.join(["Observation:", searchResponse], ''); -local context = payload.context + "\n" + gptResponse + "\n" + observation; -local prompt = xtr.strings.appendIfMissing(context, "\n" + observation); +local context = payload.context; +local prompt = xtr.join([context, gptResponse, observation], '\n'); +local finalAns = extractFinalAns(payload.text); { + initialPrompt: initialPrompt, observation: observation, thought: thought, action: action, @@ -72,6 +86,7 @@ local prompt = xtr.strings.appendIfMissing(context, "\n" + observation); prompt: prompt, context: context, searchResponse: searchResponse, - gptResponse: gptResponse + gptResponse: gptResponse, + finalAns: finalAns } diff --git a/Java/Examples/redis/RedisExample.java b/Java/Examples/redis/RedisExample.java index 603970750..919b4cfa7 100644 --- a/Java/Examples/redis/RedisExample.java +++ b/Java/Examples/redis/RedisExample.java @@ -4,11 +4,13 @@ import static com.edgechain.lib.constants.EndpointConstants.OPENAI_EMBEDDINGS_API; import com.edgechain.lib.chains.RedisRetrieval; -import com.edgechain.lib.chains.Retrieval; import com.edgechain.lib.chunk.enums.LangType; import com.edgechain.lib.context.domain.HistoryContext; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.*; +import com.edgechain.lib.endpoint.impl.context.RedisHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.OpenAiEmbeddingEndpoint; +import com.edgechain.lib.endpoint.impl.index.RedisEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.index.enums.RedisDistanceMetric; import com.edgechain.lib.jsonnet.JsonnetArgs; import com.edgechain.lib.jsonnet.JsonnetLoader; @@ -25,7 +27,6 @@ import java.io.InputStream; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -35,9 +36,12 @@ @SpringBootApplication public class RedisExample { - private static final String OPENAI_AUTH_KEY = ""; - private static OpenAiEndpoint ada002Embedding; - private static OpenAiEndpoint gpt3Endpoint; + private static final String OPENAI_AUTH_KEY = ""; // YOUR OPENAI AUTH KEY + private static final String OPENAI_ORG_ID = ""; // YOUR OPENAI ORG ID + private static OpenAiChatEndpoint gpt3Endpoint; + + private static OpenAiChatEndpoint gpt3StreamEndpoint; + private static RedisEndpoint redisEndpoint; private static RedisHistoryContextEndpoint contextEndpoint; @@ -70,25 +74,42 @@ public static void main(String[] args) { new SpringApplicationBuilder(RedisExample.class).properties(properties).run(args); - // Variables Initialization ==> Endpoints must be intialized in main method... - ada002Embedding = - new OpenAiEndpoint( - OPENAI_EMBEDDINGS_API, + gpt3Endpoint = + new OpenAiChatEndpoint( + OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, - "text-embedding-ada-002", - new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); + OPENAI_ORG_ID, + "gpt-3.5-turbo", + "user", + 0.85, + new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); - gpt3Endpoint = - new OpenAiEndpoint( + gpt3StreamEndpoint = + new OpenAiChatEndpoint( OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, + OPENAI_ORG_ID, "gpt-3.5-turbo", "user", - 0.7, + 0.85, + true, new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); + OpenAiEmbeddingEndpoint ada002Endpoint = + new OpenAiEmbeddingEndpoint( + OPENAI_EMBEDDINGS_API, + OPENAI_AUTH_KEY, + OPENAI_ORG_ID, + "text-embedding-ada-002", + new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); + redisEndpoint = - new RedisEndpoint("vector_index", new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); + new RedisEndpoint( + "vector_index", + "machine-learning", + ada002Endpoint, + new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); + contextEndpoint = new RedisHistoryContextEndpoint(new ExponentialDelay(2, 2, 2, TimeUnit.SECONDS)); } @@ -123,20 +144,15 @@ public class RedisController { /********************** REDIS WITH OPENAI ****************************/ // Namespace is optional (if not provided, it will be using namespace will be "knowledge") + /** + * Both IndexName & namespace are integral for upsert & performing similarity search; If you are + * creating different namespace; recommended to use different index_name because filtering is + * done by index_name * + */ @PostMapping("/redis/upsert") // /v1/examples/openai/upsert?namespace=machine-learning public void upsert(ArkRequest arkRequest) throws IOException { - - String namespace = arkRequest.getQueryParam("namespace"); InputStream file = arkRequest.getMultiPart("file").getInputStream(); - /** - * Both IndexName & namespace are integral for upsert & performing similarity search; If you - * are creating different namespace; recommended to use different index_name because filtering - * is done by index_name * - */ - // Configure RedisEndpoint - redisEndpoint.setNamespace(namespace); - /** * We have two implementation for Read By Sentence: a) readBySentence(LangType, Your File) * EdgeChains sdk has predefined support to chunk by sentences w.r.t to 5 languages (english, @@ -147,14 +163,12 @@ public void upsert(ArkRequest arkRequest) throws IOException { String[] arr = pdfReader.readBySentence(LangType.EN, file); /** - * Retrieval Class is basically used to generate embeddings & upsert it to VectorDB; If OpenAI - * Embedding Endpoint is not provided; then Doc2Vec constructor is used If the model is not - * provided, then it will emit an error + * Retrieval Class is basically used to generate embeddings & upsert it to VectorDB + * asynchronously...; */ - Retrieval retrieval = - new RedisRetrieval( - redisEndpoint, ada002Embedding, 1536, RedisDistanceMetric.COSINE, arkRequest); - IntStream.range(0, arr.length).parallel().forEach(i -> retrieval.upsert(arr[i])); + RedisRetrieval retrieval = + new RedisRetrieval(arr, redisEndpoint, 1536, RedisDistanceMetric.COSINE, arkRequest); + retrieval.upsert(); } /** @@ -166,19 +180,12 @@ public void upsert(ArkRequest arkRequest) throws IOException { @PostMapping(value = "/redis/similarity-search") public ArkResponse similaritySearch(ArkRequest arkRequest) { - String namespace = arkRequest.getQueryParam("namespace"); String query = arkRequest.getBody().getString("query"); int topK = arkRequest.getIntQueryParam("topK"); - redisEndpoint.setNamespace(namespace); - - // Chain 1 ==> Generate Embeddings Using Ada002 - EdgeChain ada002Chain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Chain 2 ==> Pass those embeddings to Redis & Return Score/values (Similarity search) + // Chain 1 ==> Pass those embeddings to Redis & Return Score/values (Similarity search) EdgeChain> redisQueries = - new EdgeChain<>(redisEndpoint.query(ada002Chain.get(), topK)); + new EdgeChain<>(redisEndpoint.query(query, topK, arkRequest)); return redisQueries.getArkResponse(); } @@ -186,19 +193,12 @@ public ArkResponse similaritySearch(ArkRequest arkRequest) { @PostMapping(value = "/redis/query") public ArkResponse queryRedis(ArkRequest arkRequest) { - String namespace = arkRequest.getQueryParam("namespace"); String query = arkRequest.getBody().getString("query"); int topK = arkRequest.getIntQueryParam("topK"); - redisEndpoint.setNamespace(namespace); - - // Chain 1==> Get Embeddings From Input & Then Query To Redis - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from Redis + // Chain 1 ==> Query Embeddings from Redis EdgeChain> queryChain = - new EdgeChain<>(redisEndpoint.query(embeddingsChain.get(), topK)); + new EdgeChain<>(redisEndpoint.query(query, topK, arkRequest)); // Chain 3 ===> Our queryFn passes takes list and passes each response with base prompt to // OpenAI @@ -213,14 +213,8 @@ public ArkResponse chatWithRedis(ArkRequest arkRequest) { String contextId = arkRequest.getQueryParam("id"); String query = arkRequest.getBody().getString("query"); - String namespace = arkRequest.getQueryParam("namespace"); boolean stream = arkRequest.getBooleanHeader("stream"); - // configure GPT3Endpoint - gpt3Endpoint.setStream(stream); - - redisEndpoint.setNamespace(namespace); - // Get HistoryContext HistoryContext historyContext = contextEndpoint.get(contextId); @@ -235,22 +229,20 @@ public ArkResponse chatWithRedis(ArkRequest arkRequest) { // Extract topK value from JsonnetLoader; int topK = chatLoader.getInt("topK"); - // Chain 1 ==> Get Embeddings From Input - EdgeChain embeddingsChain = - new EdgeChain<>(ada002Embedding.embeddings(query, arkRequest)); + // Chain 1==> Query Embeddings from Redis & Then concatenate it (preparing for prompt) - // Chain 2 ==> Query Embeddings from Redis & Then concatenate it (preparing for prompt) - // let's say topK=5; then we concatenate List into a string using String.join method EdgeChain> redisChain = - new EdgeChain<>(redisEndpoint.query(embeddingsChain.get(), topK)); + new EdgeChain<>(redisEndpoint.query(query, topK, arkRequest)); // Chain 3 ===> Transform String of Queries into List + // let's say topK=5; then we concatenate List into a string using String.join method EdgeChain queryChain = new EdgeChain<>(redisChain) .transform( redisResponse -> { + List wordEmbeddings = redisResponse.get(); List queryList = new ArrayList<>(); - redisResponse.get().forEach(q -> queryList.add(q.getId())); + wordEmbeddings.forEach(q -> queryList.add(q.getId())); return String.join("\n", queryList); }); @@ -258,16 +250,16 @@ public ArkResponse chatWithRedis(ArkRequest arkRequest) { EdgeChain promptChain = queryChain.transform(queries -> chatFn(historyContext.getResponse(), queries)); - // Chain 5 ==> Pass the Prompt To Gpt3 - EdgeChain gpt3Chain = - new EdgeChain<>( - gpt3Endpoint.chatCompletion(promptChain.get(), "RedisChatChain", arkRequest)); - // (FOR NON STREAMING) // If it's not stream ==> // Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory if (!stream) { + // Chain 5 ==> Pass the Prompt To Gpt3 + EdgeChain gpt3Chain = + new EdgeChain<>( + gpt3Endpoint.chatCompletion(promptChain.get(), "RedisChatChain", arkRequest)); + // Chain 6 EdgeChain historyUpdatedChain = gpt3Chain.doOnNext( @@ -284,6 +276,11 @@ public ArkResponse chatWithRedis(ArkRequest arkRequest) { // For STREAMING Version else { + // Chain 5 ==> Pass the Prompt To Gpt3 + EdgeChain gpt3Chain = + new EdgeChain<>( + gpt3StreamEndpoint.chatCompletion(promptChain.get(), "RedisChatChain", arkRequest)); + /* As the response is in stream, so we will use StringBuilder to append the response and once GPT chain indicates that it is finished, we will save the following into Redis Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory diff --git a/Java/Examples/supabase-miniLM/SupabaseMiniLMExample.java b/Java/Examples/supabase-miniLM/SupabaseMiniLMExample.java index a58cdb94c..dba35663e 100644 --- a/Java/Examples/supabase-miniLM/SupabaseMiniLMExample.java +++ b/Java/Examples/supabase-miniLM/SupabaseMiniLMExample.java @@ -1,13 +1,15 @@ package com.edgechain; import com.edgechain.lib.chains.PostgresRetrieval; -import com.edgechain.lib.chains.Retrieval; import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.embeddings.WordEmbeddings; import com.edgechain.lib.embeddings.miniLLM.enums.MiniLMModel; -import com.edgechain.lib.endpoint.impl.*; +import com.edgechain.lib.endpoint.impl.context.PostgreSQLHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.MiniLMEndpoint; +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.index.domain.PostgresWordEmbeddings; import com.edgechain.lib.index.enums.PostgresDistanceMetric; +import com.edgechain.lib.index.enums.PostgresLanguage; import com.edgechain.lib.jsonnet.JsonnetArgs; import com.edgechain.lib.jsonnet.JsonnetLoader; import com.edgechain.lib.jsonnet.enums.DataType; @@ -33,20 +35,19 @@ import java.util.Objects; import java.util.Properties; import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; @SpringBootApplication public class SupabaseMiniLMExample { - private static final String OPENAI_AUTH_KEY = ""; + private static final String OPENAI_AUTH_KEY = ""; // YOUR OPENAI AUTH KEY + private static final String OPENAI_ORG_ID = ""; // YOUR OPENAI ORG ID - private static OpenAiEndpoint gpt3Endpoint; + private static OpenAiChatEndpoint gpt3Endpoint; + private static OpenAiChatEndpoint gpt3StreamEndpoint; private static PostgresEndpoint postgresEndpoint; private static PostgreSQLHistoryContextEndpoint contextEndpoint; - private static MiniLMEndpoint miniLMEndpoint; - private JsonnetLoader queryLoader = new FileJsonnetLoader("./supabase-miniLM/postgres-query.jsonnet"); private JsonnetLoader chatLoader = @@ -61,6 +62,9 @@ public static void main(String[] args) { properties.setProperty("supabase.url", ""); properties.setProperty("supabase.annon.key", ""); + // For JWT decode + properties.setProperty("jwt.secret", ""); + // Adding Cors ==> You can configure multiple cors w.r.t your urls.; properties.setProperty("cors.origins", "http://localhost:4200"); @@ -73,18 +77,27 @@ public static void main(String[] args) { properties.setProperty("postgres.db.username", "postgres"); properties.setProperty("postgres.db.password", ""); - // For JWT decode - properties.setProperty("jwt.secret", ""); - new SpringApplicationBuilder(SupabaseMiniLMExample.class).properties(properties).run(args); gpt3Endpoint = - new OpenAiEndpoint( + new OpenAiChatEndpoint( OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, + OPENAI_ORG_ID, "gpt-3.5-turbo", "user", - 0.7, + 0.85, + new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); + + gpt3StreamEndpoint = + new OpenAiChatEndpoint( + OPENAI_CHAT_COMPLETION_API, + OPENAI_AUTH_KEY, + OPENAI_ORG_ID, + "gpt-3.5-turbo", + "user", + 0.85, + true, new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); // Creating MiniLM Endpoint @@ -92,12 +105,16 @@ public static void main(String[] args) { // download on fly. // All the requests will wait until the model is download & loaded once into the application... // As you can see, the model is not download; so it will download on fly... - miniLMEndpoint = new MiniLMEndpoint(MiniLMModel.ALL_MINILM_L12_V2); + MiniLMEndpoint miniLMEndpoint = new MiniLMEndpoint(MiniLMModel.ALL_MINILM_L12_V2); // Creating PostgresEndpoint ==> We create a new table because miniLM supports 384 dimensional // vectors; postgresEndpoint = - new PostgresEndpoint("minilm_vectors", new ExponentialDelay(2, 3, 2, TimeUnit.SECONDS)); + new PostgresEndpoint( + "minilm_vectors", + "minilm-ns", + miniLMEndpoint, + new ExponentialDelay(2, 3, 2, TimeUnit.SECONDS)); contextEndpoint = new PostgreSQLHistoryContextEndpoint(new FixedDelay(2, 3, TimeUnit.SECONDS)); } @@ -150,39 +167,37 @@ public class SupabaseController { @PostMapping("/miniLM/upsert") @PreAuthorize("hasAnyAuthority('authenticated')") public void upsert(ArkRequest arkRequest) throws IOException { - - String namespace = arkRequest.getQueryParam("namespace"); String filename = arkRequest.getMultiPart("file").getSubmittedFileName(); InputStream file = arkRequest.getMultiPart("file").getInputStream(); - postgresEndpoint.setNamespace(namespace); - String[] arr = pdfReader.readByChunkSize(file, 512); - Retrieval retrieval = - new PostgresRetrieval(postgresEndpoint, filename, 384, miniLMEndpoint, arkRequest); + PostgresRetrieval retrieval = + new PostgresRetrieval( + arr, postgresEndpoint, 384, filename, PostgresLanguage.ENGLISH, arkRequest); - IntStream.range(0, arr.length).parallel().forEach(i -> retrieval.upsert(arr[i])); + // retrieval.setBatchSize(50); // Modifying batchSize.... + + // Getting ids from upsertion... Internally, it automatically parallelizes the operation... + List ids = retrieval.upsert(); + + ids.forEach(System.out::println); + + System.out.println("Size: " + ids.size()); // Printing the UUIDs } @PostMapping(value = "/miniLM/query") @PreAuthorize("hasAnyAuthority('authenticated')") public ArkResponse queryPostgres(ArkRequest arkRequest) { - String namespace = arkRequest.getQueryParam("namespace"); String query = arkRequest.getBody().getString("query"); int topK = arkRequest.getIntQueryParam("topK"); - postgresEndpoint.setNamespace(namespace); - - // Chain 1==> Get Embeddings From Input using MiniLM & Then Query To PostgreSQL - EdgeChain embeddingsChain = - new EdgeChain<>(miniLMEndpoint.embeddings(query, arkRequest)); - // Chain 2 ==> Query Embeddings from PostgreSQL EdgeChain> queryChain = new EdgeChain<>( - postgresEndpoint.query(embeddingsChain.get(), PostgresDistanceMetric.L2, topK)); + postgresEndpoint.query( + List.of(query), PostgresDistanceMetric.L2, topK, topK, arkRequest)); // Chain 3 ===> Our queryFn passes takes list and passes each response with base prompt to // OpenAI @@ -199,15 +214,9 @@ public ArkResponse chatWithPostgres(ArkRequest arkRequest) { String contextId = arkRequest.getQueryParam("id"); String query = arkRequest.getBody().getString("query"); - String namespace = arkRequest.getQueryParam("namespace"); boolean stream = arkRequest.getBooleanHeader("stream"); - // Configure PostgresEndpoint - postgresEndpoint.setNamespace(namespace); - - gpt3Endpoint.setStream(stream); - // Get HistoryContext HistoryContext historyContext = contextEndpoint.get(contextId); @@ -222,23 +231,22 @@ public ArkResponse chatWithPostgres(ArkRequest arkRequest) { // Extract topK value from JsonnetLoader; int topK = chatLoader.getInt("topK"); - // Chain 1 ==> Get Embeddings From Input using MiniLM - EdgeChain embeddingsChain = - new EdgeChain<>(miniLMEndpoint.embeddings(query, arkRequest)); - - // Chain 2 ==> Query Embeddings from PostgreSQL & Then concatenate it (preparing for prompt) + // Chain 1 ==> Query Embeddings from PostgreSQL & Then concatenate it (preparing for prompt) // let's say topK=5; then we concatenate List into a string using String.join method EdgeChain> postgresChain = new EdgeChain<>( - postgresEndpoint.query(embeddingsChain.get(), PostgresDistanceMetric.L2, topK)); + postgresEndpoint.query( + List.of(query), PostgresDistanceMetric.L2, topK, topK, arkRequest)); // Chain 3 ===> Transform String of Queries into List EdgeChain queryChain = new EdgeChain<>(postgresChain) .transform( postgresResponse -> { + List postgresWordEmbeddingsList = + postgresResponse.get(); List queryList = new ArrayList<>(); - postgresResponse.get().forEach(q -> queryList.add(q.getRawText())); + postgresWordEmbeddingsList.forEach(q -> queryList.add(q.getRawText())); return String.join("\n", queryList); }); @@ -246,17 +254,17 @@ public ArkResponse chatWithPostgres(ArkRequest arkRequest) { EdgeChain promptChain = queryChain.transform(queries -> chatFn(historyContext.getResponse(), queries)); - // Chain 5 ==> Pass the Prompt To Gpt3 - EdgeChain gpt3Chain = - new EdgeChain<>( - gpt3Endpoint.chatCompletion( - promptChain.get(), "MiniLMPostgresChatChain", arkRequest)); - // (FOR NON STREAMING) // If it's not stream ==> // Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory if (!stream) { + // Chain 5 ==> Pass the Prompt To Gpt3 + EdgeChain gpt3Chain = + new EdgeChain<>( + gpt3Endpoint.chatCompletion( + promptChain.get(), "MiniLMPostgresChatChain", arkRequest)); + // Chain 6 EdgeChain historyUpdatedChain = gpt3Chain.doOnNext( @@ -273,6 +281,12 @@ public ArkResponse chatWithPostgres(ArkRequest arkRequest) { // For STREAMING Version else { + // Chain 5 ==> Pass the Prompt To Gpt3 + EdgeChain gpt3Chain = + new EdgeChain<>( + gpt3StreamEndpoint.chatCompletion( + promptChain.get(), "MiniLMPostgresChatChain", arkRequest)); + /* As the response is in stream, so we will use StringBuilder to append the response and once GPT chain indicates that it is finished, we will save the following into Postgres Query(What is the collect stage for data maturity) + OpenAiResponse + Prev. ChatHistory diff --git a/Java/Examples/wiki/WikiExample.java b/Java/Examples/wiki/WikiExample.java index 7c3d8cab1..feedb984a 100644 --- a/Java/Examples/wiki/WikiExample.java +++ b/Java/Examples/wiki/WikiExample.java @@ -1,7 +1,7 @@ package com.edgechain; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.endpoint.impl.WikiEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; +import com.edgechain.lib.endpoint.impl.wiki.WikiEndpoint; import com.edgechain.lib.jsonnet.JsonnetArgs; import com.edgechain.lib.jsonnet.JsonnetLoader; import com.edgechain.lib.jsonnet.enums.DataType; @@ -27,13 +27,19 @@ @SpringBootApplication public class WikiExample { - private static final String OPENAI_AUTH_KEY = ""; + private static final String OPENAI_AUTH_KEY = ""; // YOUR OPENAI AUTH KEY + private static final String OPENAI_ORG_ID = ""; // YOUR OPENAI ORG ID /* Step 3: Create OpenAiEndpoint to communicate with OpenAiServices; */ - private static OpenAiEndpoint gpt4Endpoint; + private static OpenAiChatEndpoint gpt3Endpoint; + + private static OpenAiChatEndpoint gpt3StreamEndpoint; + private static WikiEndpoint wikiEndpoint; - private final JsonnetLoader loader = new FileJsonnetLoader("./wiki/wiki.jsonnet"); + // There is a 70% chance that file1 is executed; 30% chance file2 is executed.... + private final JsonnetLoader loader = + new FileJsonnetLoader(70, "./wiki/wiki1.jsonnet", "./wiki/wiki2.jsonnet"); public static void main(String[] args) { System.setProperty("server.port", "8080"); @@ -48,20 +54,32 @@ public static void main(String[] args) { properties.setProperty("spring.jpa.properties.hibernate.format_sql", "true"); properties.setProperty("postgres.db.host", ""); - properties.setProperty("postgres.db.username", "postgres"); + properties.setProperty("postgres.db.username", ""); properties.setProperty("postgres.db.password", ""); new SpringApplicationBuilder(WikiExample.class).properties(properties).run(args); wikiEndpoint = new WikiEndpoint(); - gpt4Endpoint = - new OpenAiEndpoint( + gpt3Endpoint = + new OpenAiChatEndpoint( + OPENAI_CHAT_COMPLETION_API, + OPENAI_AUTH_KEY, + OPENAI_ORG_ID, + "gpt-3.5-turbo", + "user", + 0.7, + new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); + + gpt3StreamEndpoint = + new OpenAiChatEndpoint( OPENAI_CHAT_COMPLETION_API, OPENAI_AUTH_KEY, - "gpt-4", + OPENAI_ORG_ID, + "gpt-3.5-turbo", "user", 0.7, + true, new ExponentialDelay(3, 5, 2, TimeUnit.SECONDS)); } @@ -80,19 +98,11 @@ public ArkResponse wikiSummary(ArkRequest arkRequest) { String query = arkRequest.getQueryParam("query"); boolean stream = arkRequest.getBooleanHeader("stream"); - // Configure GPT4Endpoint - gpt4Endpoint.setStream(stream); - // Chain 1 ==> WikiChain EdgeChain wikiChain = new EdgeChain<>(wikiEndpoint.getPageContent(query)); // Chain 2 ===> Creating Prompt Chain & Return ChatCompletion EdgeChain promptChain = wikiChain.transform(this::fn); - - // Chain 3 ==> Pass Prompt to ChatCompletion API & Return ArkResponseObservable - EdgeChain openAiChain = - new EdgeChain<>(gpt4Endpoint.chatCompletion(promptChain.get(), "WikiChain", arkRequest)); - /** * The best part is flexibility with just one method EdgeChainsSDK will return response either * in json or stream; The real magic happens here. Streaming happens only if your logic allows @@ -101,8 +111,25 @@ public ArkResponse wikiSummary(ArkRequest arkRequest) { // Note: When you call getArkResponse() or getArkStreamResponse() ==> Only then your streams // are executed... - if (stream) return openAiChain.getArkStreamResponse(); - else return openAiChain.getArkResponse(); + if (stream) { + + // Chain 3 ==> Pass Prompt to ChatCompletion API & Return ArkResponseObservable + EdgeChain openAiChain = + new EdgeChain<>( + gpt3StreamEndpoint.chatCompletion( + promptChain.get(), "WikiChain", loader, arkRequest)); + + return openAiChain.getArkStreamResponse(); + + } else { + + // Chain 3 ==> Pass Prompt to ChatCompletion API & Return ArkResponseObservable + EdgeChain openAiChain = + new EdgeChain<>( + gpt3Endpoint.chatCompletion(promptChain.get(), "WikiChain", loader, arkRequest)); + + return openAiChain.getArkResponse(); + } } private String fn(WikiResponse wiki) { diff --git a/Java/Examples/wiki/wiki.jsonnet b/Java/Examples/wiki/wiki1.jsonnet similarity index 93% rename from Java/Examples/wiki/wiki.jsonnet rename to Java/Examples/wiki/wiki1.jsonnet index 051d088ce..347054fdb 100644 --- a/Java/Examples/wiki/wiki.jsonnet +++ b/Java/Examples/wiki/wiki1.jsonnet @@ -12,7 +12,7 @@ local preset = ||| 2. - ... ``` - Now, given the data, create a 30-bullet point summary of: + Now, given the data, create a 5-bullet point summary of: |||; local keepContext = payload.keepContext; local context = if keepContext == "true" then payload.context else ""; diff --git a/Java/Examples/wiki/wiki2.jsonnet b/Java/Examples/wiki/wiki2.jsonnet new file mode 100644 index 000000000..a0c9e064c --- /dev/null +++ b/Java/Examples/wiki/wiki2.jsonnet @@ -0,0 +1,23 @@ +local keepMaxTokens = payload.keepMaxTokens; +local maxTokens = if keepMaxTokens == "true" then payload.maxTokens else 5120; + +local preset = ||| + Just consider yourself as a summary generator bot. You should detect the language and the characters the user is writing in, and reply in the same character set and language. + You should follow the following template while answering the user: + ``` + 1. - + 2. - + ... + ``` + Now, given the data, create a 15-bullet point summary of: + |||; +local keepContext = payload.keepContext; +local context = if keepContext == "true" then payload.context else ""; +local prompt = std.join("\n", [preset, context]); +{ + "maxTokens": maxTokens, + "typeOfKeepContext": xtr.type(keepContext), + "preset" : preset, + "context": context, + "prompt": if(std.length(prompt) > xtr.parseNum(maxTokens)) then std.substr(prompt, 0, xtr.parseNum(maxTokens)) else prompt +} \ No newline at end of file diff --git a/Java/Examples/zapier/ZapierExample.java b/Java/Examples/zapier/ZapierExample.java new file mode 100644 index 000000000..f50c93f40 --- /dev/null +++ b/Java/Examples/zapier/ZapierExample.java @@ -0,0 +1,266 @@ +package com.edgechain; + +// DEPS com.amazonaws:aws-java-sdk-s3:1.12.554 + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import com.amazonaws.services.s3.model.ListObjectsV2Request; +import com.amazonaws.services.s3.model.ListObjectsV2Result; +import com.amazonaws.services.s3.model.S3Object; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import com.edgechain.lib.chains.PineconeRetrieval; +import com.edgechain.lib.chunk.Chunker; +import com.edgechain.lib.endpoint.impl.embeddings.OpenAiEmbeddingEndpoint; +import com.edgechain.lib.endpoint.impl.index.PineconeEndpoint; +import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.response.ArkResponse; +import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import me.xuender.unidecode.Unidecode; +import org.apache.commons.io.IOUtils; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.util.retry.Retry; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import static com.edgechain.lib.constants.EndpointConstants.OPENAI_EMBEDDINGS_API; + +/** + * Objective (1): 1. Use Zapier Webhook to pass list of urls (in our example, we have used Wikipedia + * Urls") ==> Trigger 2. Action: Use 'Web Page Parser by Zapier' to extract entire content (which is + * later used to upsert in Pinecone) from url 3. Action: Stringify the JSON 4. Action: Save each + * json (parsed content from each URL) to Amazon S3 (This process is entirely automated by Zapier). + * You would need to create Zap for it. Zapier Hook is used to trigger the ETL process, (Parallelize + * Hook Requests)... ========================================================== 5. Then, we extract + * each file from Amazon S3 6. Upsert the normalized content to Pinecone with a chunkSize of 512... + * You can choose any file storage S3, Dropbox, Google Drive etc.... + */ + +/** + * Objective (2): Extracting PDF via PDF4Me. Create a Zapier by using the following steps: 1. + * Trigger ==> Integrate Google Drive Folder; when new file is added (it's not instant; it's + * scheduled internally by Zapier.) (You can also trigger it by Webhook as well) 2. Action ==> + * Extract text from PDF using PDF4Me (Free plan allows 20 API calls) 3. Action ==> Use ZapierByCode + * to stringify the json response from PDF4Me 4. Action ==> Save it to Amazon S3 Now, from + * EdgeChains SDK we extract the files from S3 & upsert it to Pinecone via Chunk Size 512. + */ +@SpringBootApplication +public class ZapierExample { + + private static final String OPENAI_AUTH_KEY = ""; // YOUR OPENAI AUTH KEY + private static final String OPENAI_ORG_ID = ""; // YOUR OPENAI ORG ID + private static final String ZAPIER_HOOK_URL = + ""; // E.g. https://hooks.zapier.com/hooks/catch/18785910/2ia657b + + private static final String PINECONE_AUTH_KEY = ""; + private static final String PINECONE_API = ""; + + private static PineconeEndpoint pineconeEndpoint; + + public static void main(String[] args) { + + System.setProperty("server.port", "8080"); + + new SpringApplicationBuilder(ZapierExample.class).run(args); + + OpenAiEmbeddingEndpoint adaEmbedding = + new OpenAiEmbeddingEndpoint( + OPENAI_EMBEDDINGS_API, + OPENAI_AUTH_KEY, + OPENAI_ORG_ID, + "text-embedding-ada-002", + new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); + + pineconeEndpoint = + new PineconeEndpoint( + PINECONE_API, + PINECONE_AUTH_KEY, + adaEmbedding, + new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); + } + + @Bean + public AmazonS3 s3Client() { + + String accessKey = ""; // YOUR_AWS_S3_ACCESS_KEY + String secretKey = ""; // YOUR_AWS_S3_SECRET_KEY + + BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + return AmazonS3ClientBuilder.standard() + .withRegion(Regions.fromName("us-east-1")) + .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) + .build(); + } + + @RestController + public class ZapierController { + + @Autowired private AmazonS3 s3Client; + + // List of wiki urls triggered in parallel via WebHook. They are automatically parsed, + // transformed to JSON and stored in AWS S3. + /* + Examples: + "https://en.wikipedia.org/wiki/The_Weather_Company", + "https://en.wikipedia.org/wiki/Microsoft_Bing", + "https://en.wikipedia.org/wiki/Quora", + "https://en.wikipedia.org/wiki/Steve_Jobs", + "https://en.wikipedia.org/wiki/Michael_Jordan", + */ + @PostMapping("/etl") + public void performETL(ArkRequest arkRequest) { + + JSONObject body = arkRequest.getBody(); + JSONArray jsonArray = body.getJSONArray("urls"); + + IntStream.range(0, jsonArray.length()) + .parallel() + .forEach( + index -> { + String url = jsonArray.getString(index); + // For Logging + System.out.printf("Url %s: %s\n", index, url); + + // Trigger Zapier WebHook + this.zapWebHook(url); + }); + } + + @PostMapping("/upsert-urls") + public void upsertParsedURLs(ArkRequest arkRequest) throws IOException { + String namespace = arkRequest.getQueryParam("namespace"); + JSONObject body = arkRequest.getBody(); + String bucketName = body.getString("bucketName"); + + // Get all the files from S3 bucket + ListObjectsV2Request listObjectsRequest = + new ListObjectsV2Request().withBucketName(bucketName); + + ListObjectsV2Result objectListing = s3Client.listObjectsV2(listObjectsRequest); + + for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { + String key = objectSummary.getKey(); + + if (key.endsWith(".txt")) { + + S3Object object = s3Client.getObject(bucketName, key); + InputStream objectData = object.getObjectContent(); + String content = IOUtils.toString(objectData, StandardCharsets.UTF_8); + + JSONObject jsonObject = new JSONObject(content); + + // These fields are specified from Zapier Action... + System.out.println("Domain: " + jsonObject.getString("domain")); // en.wikipedia.org + System.out.println("Title: " + jsonObject.getString("title")); // Barack Obama + System.out.println("Author: " + jsonObject.getString("author")); // Wikipedia Contributers + System.out.println("Word Count: " + jsonObject.get("word_count")); // 23077 + System.out.println( + "Date Published: " + jsonObject.getString("date_published")); // Publish date + + // Now, we extract content and Chunk it by 512 size; then upsert it to Pinecone + // Normalize the extracted content.... + + String normalizedText = + Unidecode.decode(jsonObject.getString("content")).replaceAll("[\t\n\r]+", " "); + Chunker chunker = new Chunker(normalizedText); + String[] arr = chunker.byChunkSize(512); + + // Upsert to Pinecone: + PineconeRetrieval retrieval = + new PineconeRetrieval(arr, pineconeEndpoint, namespace, arkRequest); + + retrieval.upsert(); + + System.out.println("File is parsed: " + key); // For Logging + } + } + } + + @PostMapping("/upsert-pdfs") + public void upsertPDFs(ArkRequest arkRequest) throws IOException { + String namespace = arkRequest.getQueryParam("namespace"); + JSONObject body = arkRequest.getBody(); + + String bucketName = body.getString("bucketName"); + + // Get all the files from S3 bucket + ListObjectsV2Request listObjectsRequest = + new ListObjectsV2Request().withBucketName(bucketName); + + ListObjectsV2Result objectListing = s3Client.listObjectsV2(listObjectsRequest); + + for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { + String key = objectSummary.getKey(); + + if (key.endsWith("-pdf.txt")) { + + S3Object object = s3Client.getObject(bucketName, key); + InputStream objectData = object.getObjectContent(); + String content = IOUtils.toString(objectData, StandardCharsets.UTF_8); + + JSONObject jsonObject = new JSONObject(content); + + // These fields are specified from Zapier Action... + // Now, we extract content and Chunk it by 512 size; then upsert it to Pinecone + // Normalize the extracted content.... + + System.out.println("Filename: " + jsonObject.getString("filename")); // abcd.pdf + System.out.println("Extension: " + jsonObject.getString("file_extension")); // pdf + + String normalizedText = + Unidecode.decode(jsonObject.getString("text")).replaceAll("[\t\n\r]+", " "); + Chunker chunker = new Chunker(normalizedText); + String[] arr = chunker.byChunkSize(512); + + // Upsert to Pinecone: + PineconeRetrieval retrieval = + new PineconeRetrieval(arr, pineconeEndpoint, namespace, arkRequest); + + retrieval.upsert(); + + System.out.println("File is parsed: " + key); // For Logging + } + } + } + + @DeleteMapping("/pinecone/deleteAll") + public ArkResponse deletePinecone(ArkRequest arkRequest) { + String namespace = arkRequest.getQueryParam("namespace"); + return new EdgeChain<>(pineconeEndpoint.deleteAll(namespace)).getArkResponse(); + } + + private void zapWebHook(String url) { + + WebClient webClient = WebClient.builder().baseUrl(ZAPIER_HOOK_URL).build(); + + JSONObject json = new JSONObject(); + json.put("url", url); + + webClient + .post() + .contentType(MediaType.APPLICATION_JSON) + .body(BodyInserters.fromValue(json.toString())) + .retrieve() + .bodyToMono(String.class) + .retryWhen(Retry.fixedDelay(3, Duration.ofSeconds(20))) // Using Fixed Delay.. + .block(); + } + } +} diff --git a/Java/FlySpring/.DS_Store b/Java/FlySpring/.DS_Store new file mode 100644 index 000000000..b945340c8 Binary files /dev/null and b/Java/FlySpring/.DS_Store differ diff --git a/Java/FlySpring/autoroute/dependency-reduced-pom.xml b/Java/FlySpring/autoroute/dependency-reduced-pom.xml index 8bde02dcf..d186c8cb2 100644 --- a/Java/FlySpring/autoroute/dependency-reduced-pom.xml +++ b/Java/FlySpring/autoroute/dependency-reduced-pom.xml @@ -1,205 +1,115 @@ - - - - spring-boot-starter-parent - org.springframework.boot - 3.0.0 - pom.xml - - 4.0.0 - com.flyspring - autoroute-spring-boot-starter - autoroute - 0.1.1-SNAPSHOT - AutoRoute java functions to routes - - - - maven-shade-plugin - 3.4.1 - - - package - - shade - - - - - - - - - - gofly - - - - maven-antrun-plugin - 3.1.0 - - - package - - run - - - - - - - - - - - - - - - - org.junit.jupiter - junit-jupiter-api - 5.9.2 - test - - - opentest4j - org.opentest4j - - - junit-platform-commons - org.junit.platform - - - apiguardian-api - org.apiguardian - - - - - org.mockito - mockito-junit-jupiter - 5.3.0 - test - - - mockito-core - org.mockito - - - - - junit - junit - 4.4 - test - - - org.springframework - spring-mock - 2.0.8 - test - - - commons-io - commons-io - 2.6 - provided - - - org.springframework.boot - spring-boot-starter-webflux - 3.0.5 - provided - - - org.reflections - reflections - 0.9.12 - provided - - - org.springframework.boot - spring-boot-starter-oauth2-resource-server - 3.0.0 - provided - - - org.springframework.security - spring-security-oauth2-jose - 6.0.0 - provided - - - org.glowroot - glowroot-agent-api - 0.13.6 - provided - - - org.projectlombok - lombok - 1.18.24 - provided - true - - - io.reactivex.rxjava3 - rxjava - 3.1.6 - provided - - - io.reactivex - rxjava-reactive-streams - 1.2.1 - provided - - - io.projectreactor.addons - reactor-adapter - 3.5.1 - provided - - - org.apache.pdfbox - pdfbox - 2.0.28 - provided - - - com.squareup.okhttp3 - okhttp - 4.10.0 - provided - - - commons-fileupload - commons-fileupload - 1.5 - provided - - - me.xuender - unidecode - 0.0.7 - provided - - - org.apache.tika - tika-core - 2.7.0 - provided - - - org.apache.tika - tika-parsers-standard-package - 2.7.0 - provided - - - - 17 - 17 - - + + + + edgechain-parent + com.flyspring + 0.0.1-SNAPSHOT + + 4.0.0 + autoroute + autoroute + 0.1.1-SNAPSHOT + AutoRoute java functions to routes + + clean install + + + maven-shade-plugin + ${maven-shade.version} + + + package + + shade + + + + + + + + + gofly + + + + maven-antrun-plugin + 3.1.0 + + + package + + run + + + + + + + + + + + + + + + + org.junit.jupiter + junit-jupiter-api + 5.9.3 + test + + + opentest4j + org.opentest4j + + + junit-platform-commons + org.junit.platform + + + apiguardian-api + org.apiguardian + + + + + org.mockito + mockito-junit-jupiter + 5.3.1 + test + + + mockito-core + org.mockito + + + + + junit + junit + 4.13.2 + test + + + hamcrest-core + org.hamcrest + + + + + org.springframework + spring-mock + 2.0.8 + test + + + + 1.5 + 2.0.28 + 0.13.6 + 0.9.12 + 2.0.8 + + diff --git a/Java/FlySpring/autoroute/pom.xml b/Java/FlySpring/autoroute/pom.xml index 8612af0e4..5694a6799 100644 --- a/Java/FlySpring/autoroute/pom.xml +++ b/Java/FlySpring/autoroute/pom.xml @@ -1,76 +1,84 @@ - + 4.0.0 - com.flyspring - autoroute-spring-boot-starter + + com.flyspring + edgechain-parent + 0.0.1-SNAPSHOT + + + autoroute 0.1.1-SNAPSHOT autoroute AutoRoute java functions to routes - - org.springframework.boot - spring-boot-starter-parent - 3.0.0 - - - 17 - 17 + 1.5 + 0.13.6 + 0.9.12 + 2.0.28 + 2.0.8 org.junit.jupiter junit-jupiter-api - 5.9.2 test + org.mockito mockito-junit-jupiter - 5.3.0 test + junit junit - 4.4 test + org.springframework spring-mock - 2.0.8 + ${spring-mock.version} test + commons-io commons-io - 2.6 + org.springframework.boot spring-boot-starter-webflux - 3.0.5 + org.reflections - reflections - 0.9.12 + reflections + ${org-reflections.version} + org.springframework.boot spring-boot-starter-oauth2-resource-server + org.springframework.security spring-security-oauth2-jose + org.glowroot glowroot-agent-api - 0.13.6 + ${glowroot.version} @@ -82,104 +90,104 @@ io.reactivex.rxjava3 rxjava - 3.1.6 io.reactivex rxjava-reactive-streams - 1.2.1 + ${rxjava-reactive-streams.version} io.projectreactor.addons reactor-adapter - 3.5.1 org.apache.pdfbox pdfbox - 2.0.28 + ${pdfbox.version} com.squareup.okhttp3 okhttp - 4.10.0 - commons-fileupload - commons-fileupload - 1.5 - + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + me.xuender unidecode - 0.0.7 + ${unidecode.version} org.apache.tika tika-core - 2.7.0 + ${apache-tika.version} org.apache.tika tika-parsers-standard-package - 2.7.0 + ${apache-tika.version} - - + - - gofly - - - - maven-antrun-plugin - 3.1.0 - - - package - - - - - - - run - - - - - - - - + + gofly + + true + + + + + maven-antrun-plugin + ${maven-antrun.version} + + + package + + + + + + + run + + + + + + + + + - - - org.apache.maven.plugins - maven-shade-plugin - 3.4.1 - - - - - - package - - shade - - - - - - - + clean install + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade.version} + + + package + + shade + + + + + + + \ No newline at end of file diff --git a/Java/FlySpring/edgechain-app/.DS_Store b/Java/FlySpring/edgechain-app/.DS_Store new file mode 100644 index 000000000..b0fd969a0 Binary files /dev/null and b/Java/FlySpring/edgechain-app/.DS_Store differ diff --git a/Java/FlySpring/edgechain-app/.gitignore b/Java/FlySpring/edgechain-app/.gitignore index 848775e32..3f969a6bf 100644 --- a/Java/FlySpring/edgechain-app/.gitignore +++ b/Java/FlySpring/edgechain-app/.gitignore @@ -45,3 +45,4 @@ build/ /src/main/java/com/edgechain/HydeExample.java /model/ +/src/main/java/com/edgechain/SupabaseMiniLMExample.java diff --git a/Java/FlySpring/edgechain-app/chat/README.md b/Java/FlySpring/edgechain-app/chat/README.md new file mode 100644 index 000000000..cebd9efee --- /dev/null +++ b/Java/FlySpring/edgechain-app/chat/README.md @@ -0,0 +1,21 @@ +# Simple Chat test + +- Edit SimpleApp.java and set your OpenAI key + +- Run the server using `./run.sh` or enter `java -jar ../target/edgechain.jar jbang SimpleApp.java` + +- Wait for server to start + +- In a separate terminal call the server using `./callserver.sh` or enter + +```bash +curl --location 'localhost:8080/v1/examples/gpt/ask' \ +--header 'Content-Type: application/json' \ +--data '{ + "prompt": "Who was Nikola Tesla?" +}' +``` + + - After a short time text should appear similar to `Ah, my dear interlocutor, allow me to regale you with the tale of Nikola Tesla! Born in 1856, this remarkable gentleman ` ... + +- Close the server terminal using `ctrl+c` diff --git a/Java/FlySpring/edgechain-app/chat/SimpleApp.java b/Java/FlySpring/edgechain-app/chat/SimpleApp.java new file mode 100644 index 000000000..a7a2dacc2 --- /dev/null +++ b/Java/FlySpring/edgechain-app/chat/SimpleApp.java @@ -0,0 +1,83 @@ +package com.edgechain; + +import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; +import com.edgechain.lib.openai.client.OpenAiClient; +import com.edgechain.lib.openai.request.ChatCompletionRequest; +import com.edgechain.lib.openai.request.ChatMessage; +import com.edgechain.lib.openai.response.ChatCompletionResponse; +import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static com.edgechain.lib.constants.EndpointConstants.OPENAI_CHAT_COMPLETION_API; + +@SpringBootApplication +public class SimpleApp { + + private final String OPENAI_AUTH_KEY = ""; // YOUR OPENAI KEY + + public static void main(String[] args) { + System.setProperty("server.port", "8080"); + SpringApplication.run(SimpleApp.class, args); + } + + @RestController + @RequestMapping("/v1/examples") + public class Conversation { + + private List messages; + + public Conversation() { + messages = new ArrayList<>(); + messages.add( + new ChatMessage( + "system", + "You are a helpful, polite, old English assistant. Answer the user prompt with a bit" + + " of humor.")); + } + + @PostMapping("/gpt/ask") + public ResponseEntity ask(@RequestBody String prompt) { + updateMessageList("user", prompt); + String model = "gpt-3.5-turbo"; + ChatCompletionRequest chatCompletionRequest = + new ChatCompletionRequest( + model, 0.7, // temperature + messages, false, null, null, null, null, null, null, null); + OpenAiClient openAiClient = new OpenAiClient(); + OpenAiEndpoint chatEndpoint = + new OpenAiEndpoint( + OPENAI_CHAT_COMPLETION_API, + OPENAI_AUTH_KEY, + model, + "user", + 0.7, + false, + new ExponentialDelay(3, 3, 2, TimeUnit.SECONDS)); + openAiClient.setEndpoint(chatEndpoint); + EdgeChain chatCompletion = + openAiClient.createChatCompletion(chatCompletionRequest); + String response = chatCompletion.get().getChoices().get(0).getMessage().getContent(); + System.out.println(response); + updateMessageList("assistant", response); + return new ResponseEntity<>(response, HttpStatus.OK); + } + + private void updateMessageList(String role, String content) { + messages.add(new ChatMessage(role, content)); + + if (messages.size() > 20) { + messages.remove(0); + } + } + } +} diff --git a/Java/FlySpring/edgechain-app/chat/callserver.sh b/Java/FlySpring/edgechain-app/chat/callserver.sh new file mode 100755 index 000000000..ec4d2ffa7 --- /dev/null +++ b/Java/FlySpring/edgechain-app/chat/callserver.sh @@ -0,0 +1,5 @@ +curl --location 'localhost:8080/v1/examples/gpt/ask' \ +--header 'Content-Type: application/json' \ +--data '{ + "prompt": "Who was Nikola Tesla?" +}' diff --git a/Java/FlySpring/edgechain-app/pom.xml b/Java/FlySpring/edgechain-app/pom.xml index 27b8f282b..1d66b78e2 100644 --- a/Java/FlySpring/edgechain-app/pom.xml +++ b/Java/FlySpring/edgechain-app/pom.xml @@ -1,378 +1,402 @@ - - 4.0.0 - com.edgechain - edgechain-app - 1.0.0 - edgechain - EdgeChains SDK. - jar - - 17 - 17 - 17 - 0.23.0 - - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-webflux - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - - redis.clients - jedis - 4.3.1 - - - - org.postgresql - postgresql - runtime - - - - javax.validation - validation-api - 2.0.1.Final - - - - com.github.f4b6a3 - uuid-creator - 5.2.0 - - - - org.hibernate.validator - hibernate-validator - 6.1.6.Final - - - - org.modelmapper - modelmapper - 3.1.1 - - - - io.jsonwebtoken - jjwt - 0.9.1 - - - - javax.xml.bind - jaxb-api - 2.3.1 - - - - - com.squareup.retrofit2 - retrofit - 2.9.0 - - - - com.squareup.retrofit2 - adapter-rxjava3 - 2.9.0 - - - - com.squareup.retrofit2 - converter-jackson - 2.9.0 - - - - org.apache.opennlp - opennlp-tools - 2.2.0 - - - - io.reactivex.rxjava3 - rxjava - 3.1.6 - - - - io.reactivex - rxjava-reactive-streams - 1.2.1 - - - - io.projectreactor.addons - reactor-adapter - 3.5.1 - - - - me.xuender - unidecode - 0.0.7 - - - - org.apache.tika - tika-core - 2.7.0 - - - - org.apache.tika - tika-parsers-standard-package - 2.7.0 - - - - ai.djl - api - ${djl.version} - - - - ai.djl - basicdataset - ${djl.version} - - - - ai.djl.huggingface - tokenizers - 0.23.0 - - - - ai.djl - model-zoo - ${djl.version} - - - - - - ai.djl.pytorch - pytorch-engine - ${djl.version} - - - - ai.djl.pytorch - pytorch-model-zoo - ${djl.version} - - - - - io.github.jam01 - xtrasonnet - 0.5.3 - - - - com.knuddels - jtokkit - 0.6.1 - - - - net.objecthunter - exp4j - 0.4.8 - - - - - info.picocli - picocli-spring-boot-starter - 4.7.0 - - - - net.lingala.zip4j - zip4j - 2.11.3 - - - - org.zeroturnaround - zt-exec - 1.12 - - - - org.testcontainers - testcontainers - 1.17.6 - - - - org.testcontainers - postgresql - - - - org.springframework.boot - spring-boot-starter-test - test - - - - ai.djl.onnxruntime - onnxruntime-engine - 0.23.0 - runtime - - - - - - - - - - org.springframework.boot - spring-boot-dependencies - 3.1.0 - pom - import - - - - - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.apache.maven.plugins - maven-shade-plugin - 3.3.0 - - - org.springframework.boot - spring-boot-maven-plugin - 2.7.0 - - - - false - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - package - - shade - - - edgechain - - - META-INF/spring.handlers - META-INF/spring.schemas + + 4.0.0 + + com.flyspring + edgechain-parent + 0.0.1-SNAPSHOT + + + edgechain-app + 1.0.0 + edgechain + EdgeChains SDK. + jar + + + 4.4.0 + 0.23.0 + 0.4.8 + 6.0.23.Final + 2.3.1 + 0.9.1 + 0.6.1 + 3.1.1 + 2.2.0 + 2.9.0 + 5.2.0 + 2.0.1.Final + 0.5.3 + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-webflux + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + redis.clients + jedis + + + + org.postgresql + postgresql + compile + + + + dev.fuxing + airtable-api + 0.3.2 + + + + javax.validation + validation-api + ${validation-api.version} + + + + com.github.f4b6a3 + uuid-creator + ${uuid-creator.version} + + + + org.hibernate.validator + hibernate-validator + ${hibernate-validator} + + + + org.modelmapper + modelmapper + ${modelmapper.version} + + + + io.jsonwebtoken + jjwt + ${jsonwebtoken.version} + + + + javax.xml.bind + jaxb-api + ${jaxb-api.version} + + + + com.squareup.retrofit2 + retrofit + ${retrofit2.version} + + + + com.squareup.retrofit2 + adapter-rxjava3 + ${retrofit2.version} + + + + com.squareup.retrofit2 + converter-jackson + ${retrofit2.version} + + + + org.apache.opennlp + opennlp-tools + ${opennlp.version} + + + + io.reactivex.rxjava3 + rxjava + + + + io.reactivex + rxjava-reactive-streams + ${rxjava-reactive-streams.version} + + + + io.projectreactor.addons + reactor-adapter + + + + me.xuender + unidecode + ${unidecode.version} + + + + org.apache.tika + tika-core + ${apache-tika.version} + + + + org.apache.tika + tika-parsers-standard-package + ${apache-tika.version} + + + xml-apis + xml-apis + + + + + + ai.djl + api + ${djl.version} + + + + ai.djl + basicdataset + ${djl.version} + + + + ai.djl.huggingface + tokenizers + ${djl.version} + + + + ai.djl + model-zoo + ${djl.version} + + + + + + ai.djl.pytorch + pytorch-engine + ${djl.version} + + + + ai.djl.pytorch + pytorch-model-zoo + ${djl.version} + + + + + io.github.jam01 + xtrasonnet + ${xtrasonnet.version} + + + + com.knuddels + jtokkit + ${jtokkit.version} + + + + net.objecthunter + exp4j + ${exp4j.version} + + + + + info.picocli + picocli-spring-boot-starter + ${picocli.version} + + + + net.lingala.zip4j + zip4j + ${zip4j.version} + + + + org.zeroturnaround + zt-exec + ${zeroturnaround.version} + + + + org.testcontainers + testcontainers + + + + org.testcontainers + postgresql + + + + org.springframework.boot + spring-boot-starter-test + + + com.vaadin.external.google + android-json + + + test + + + + ai.djl.onnxruntime + onnxruntime-engine + ${djl.version} + runtime + + + + org.testcontainers + junit-jupiter + test + + + + com.auth0 + java-jwt + ${auth0-jwt.version} + test + + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade.version} + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + + false + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + shade-jar-with-dependencies + package + + shade + + + + edgechain + + + META-INF/spring.handlers + META-INF/spring.schemas - - META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports - - - - - com.edgechain.EdgeChainApplication - - - - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - 1.8 - - - download-and-unpack-jbang - generate-resources - - run - - - - - - - - - - - - - - - - - - - - - - - - - - + + META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports + + + + + com.edgechain.EdgeChainApplication + + + + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + ${maven-antrun.version} + + + download-and-unpack-jbang + generate-resources + + run + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/EdgeChainApplication.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/EdgeChainApplication.java index 1e00dfc6c..23714c735 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/EdgeChainApplication.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/EdgeChainApplication.java @@ -1,5 +1,7 @@ package com.edgechain; +import java.net.URL; +import java.nio.file.Paths; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -7,14 +9,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.annotation.Bean; -import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; -import java.net.URL; -import java.nio.file.Paths; - @SpringBootApplication -@EnableScheduling public class EdgeChainApplication { private static final Logger logger = LoggerFactory.getLogger(EdgeChainApplication.class); @@ -22,8 +19,9 @@ public class EdgeChainApplication { public static void main(String[] args) { logger.info("Please avoid special symbols such as space in naming the directory."); - System.setProperty("jar.name", getJarFileName(EdgeChainApplication.class)); - logger.info("Executed jar file: " + System.getProperty("jar.name")); + String jarFileName = getJarFileName(EdgeChainApplication.class); + System.setProperty("jar.name", jarFileName); + logger.info("Executed jar file: {}", jarFileName); SpringApplication springApplication = new SpringApplicationBuilder() @@ -35,7 +33,7 @@ public static void main(String[] args) { } @Bean(name = "mvcHandlerMappingIntrospector") - public HandlerMappingIntrospector mvcHandlerMappingIntrospector() { + HandlerMappingIntrospector mvcHandlerMappingIntrospector() { return new HandlerMappingIntrospector(); } @@ -44,13 +42,15 @@ private static String getJarFileName(Class clazz) { if (classResource == null) { throw new RuntimeException("class resource is null"); } + String url = classResource.toString(); + logger.info("class url: {}", url); if (url.startsWith("jar:file:")) { String path = url.replaceAll("^jar:(file:.*[.]jar)!/.*", "$1"); try { return Paths.get(new URL(path).toURI()).toString(); } catch (Exception e) { - throw new RuntimeException("Invalid jar file"); + throw new RuntimeException("Invalid jar file", e); } } throw new RuntimeException("Invalid jar file"); diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PineconeRetrieval.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PineconeRetrieval.java index e1091f97b..e2d19d6df 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PineconeRetrieval.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PineconeRetrieval.java @@ -1,47 +1,79 @@ package com.edgechain.lib.chains; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.endpoint.impl.PineconeEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.BgeSmallEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.MiniLMEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.OpenAiEmbeddingEndpoint; +import com.edgechain.lib.endpoint.impl.index.PineconeEndpoint; import com.edgechain.lib.request.ArkRequest; +import io.reactivex.rxjava3.core.Completable; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.schedulers.Schedulers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class PineconeRetrieval extends Retrieval { +import java.util.List; - private final Logger logger = LoggerFactory.getLogger(getClass()); +public class PineconeRetrieval { private final PineconeEndpoint pineconeEndpoint; private final ArkRequest arkRequest; - private final Endpoint endpoint; + private final String[] arr; + private String namespace; + private int batchSize = 30; public PineconeRetrieval( - PineconeEndpoint pineconeEndpoint, Endpoint endpoint, ArkRequest arkRequest) { + String[] arr, PineconeEndpoint pineconeEndpoint, String namespace, ArkRequest arkRequest) { this.pineconeEndpoint = pineconeEndpoint; - this.endpoint = endpoint; this.arkRequest = arkRequest; + this.arr = arr; + this.namespace = namespace; - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) + Logger logger = LoggerFactory.getLogger(getClass()); + if (pineconeEndpoint.getEmbeddingEndpoint() instanceof OpenAiEmbeddingEndpoint openAiEndpoint) logger.info("Using OpenAi Embedding Service: " + openAiEndpoint.getModel()); - else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) + else if (pineconeEndpoint.getEmbeddingEndpoint() instanceof MiniLMEndpoint miniLMEndpoint) logger.info(String.format("Using %s", miniLMEndpoint.getMiniLMModel().getName())); + else if (pineconeEndpoint.getEmbeddingEndpoint() instanceof BgeSmallEndpoint bgeSmallEndpoint) + logger.info(String.format("Using BgeSmall: " + bgeSmallEndpoint.getModelUrl())); } - @Override - public void upsert(String input) { - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) { - WordEmbeddings embeddings = - openAiEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.pineconeEndpoint.upsert(embeddings); - } else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) { - WordEmbeddings embeddings = - miniLMEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.pineconeEndpoint.upsert(embeddings); - } else - throw new RuntimeException( - "Invalid Endpoint; Only OpenAIEndpoint & MiniLMEndpoint are supported"); + public void upsert() { + Observable.fromArray(arr) + .buffer(batchSize) + .concatMapCompletable( + batch -> + Observable.fromIterable(batch) + .flatMap( + input -> + Observable.fromCallable(() -> generateEmbeddings(input)) + .subscribeOn(Schedulers.io())) + .toList() + .flatMapCompletable( + wordEmbeddingsList -> + Completable.fromAction(() -> executeBatchUpsert(wordEmbeddingsList)) + .subscribeOn(Schedulers.io()))) + .blockingAwait(); + } + + private WordEmbeddings generateEmbeddings(String input) { + return pineconeEndpoint + .getEmbeddingEndpoint() + .embeddings(input, arkRequest) + .firstOrError() + .blockingGet(); + } + + private void executeBatchUpsert(List wordEmbeddingsList) { + pineconeEndpoint.batchUpsert(wordEmbeddingsList, this.namespace); + } + + public int getBatchSize() { + return batchSize; + } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PostgresRetrieval.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PostgresRetrieval.java index c888c03c9..48f82c6fe 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PostgresRetrieval.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/PostgresRetrieval.java @@ -1,93 +1,186 @@ package com.edgechain.lib.chains; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.endpoint.impl.BgeSmallEndpoint; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.BgeSmallEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.MiniLMEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.OpenAiEmbeddingEndpoint; +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; import com.edgechain.lib.index.enums.PostgresDistanceMetric; +import com.edgechain.lib.index.enums.PostgresLanguage; import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.response.StringResponse; +import io.reactivex.rxjava3.core.Completable; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.schedulers.Schedulers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class PostgresRetrieval extends Retrieval { +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; +import java.util.stream.Collectors; - private final Logger logger = LoggerFactory.getLogger(getClass()); +public class PostgresRetrieval { - private final PostgresEndpoint postgresEndpoint; - private final int dimensions; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final PostgresDistanceMetric metric; - private final int lists; + private int batchSize = 30; + + private final String[] arr; private final String filename; + private final PostgresLanguage postgresLanguage; + private final ArkRequest arkRequest; - private final Endpoint endpoint; + private final PostgresEndpoint postgresEndpoint; + private final int dimensions; + private final PostgresDistanceMetric metric; + private final int lists; public PostgresRetrieval( + String[] arr, PostgresEndpoint postgresEndpoint, - String filename, int dimensions, - Endpoint endpoint, + PostgresDistanceMetric metric, + int lists, + String filename, + PostgresLanguage postgresLanguage, ArkRequest arkRequest) { - this.postgresEndpoint = postgresEndpoint; - this.dimensions = dimensions; + this.arr = arr; this.filename = filename; - this.endpoint = endpoint; + this.postgresEndpoint = postgresEndpoint; + this.postgresLanguage = postgresLanguage; this.arkRequest = arkRequest; - this.metric = PostgresDistanceMetric.COSINE; - this.lists = 2000; - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) + this.dimensions = dimensions; + this.metric = metric; + this.lists = lists; + + if (postgresEndpoint.getEmbeddingEndpoint() instanceof OpenAiEmbeddingEndpoint openAiEndpoint) logger.info("Using OpenAi Embedding Service: " + openAiEndpoint.getModel()); - else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) + else if (postgresEndpoint.getEmbeddingEndpoint() instanceof MiniLMEndpoint miniLMEndpoint) logger.info(String.format("Using %s", miniLMEndpoint.getMiniLMModel().getName())); + else if (postgresEndpoint.getEmbeddingEndpoint() instanceof BgeSmallEndpoint bgeSmallEndpoint) + logger.info(String.format("Using BgeSmall: " + bgeSmallEndpoint.getModelUrl())); } public PostgresRetrieval( + String[] arr, PostgresEndpoint postgresEndpoint, - String filename, int dimensions, - Endpoint endpoint, - ArkRequest arkRequest, - PostgresDistanceMetric metric, - int lists) { + String filename, + PostgresLanguage postgresLanguage, + ArkRequest arkRequest) { + this.arr = arr; + this.filename = filename; + this.postgresLanguage = postgresLanguage; this.postgresEndpoint = postgresEndpoint; this.dimensions = dimensions; - this.filename = filename; - this.endpoint = endpoint; + this.metric = PostgresDistanceMetric.COSINE; + this.lists = 1000; this.arkRequest = arkRequest; - this.metric = metric; - this.lists = lists; - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) + if (postgresEndpoint.getEmbeddingEndpoint() instanceof OpenAiEmbeddingEndpoint openAiEndpoint) logger.info("Using OpenAi Embedding Service: " + openAiEndpoint.getModel()); - else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) + else if (postgresEndpoint.getEmbeddingEndpoint() instanceof MiniLMEndpoint miniLMEndpoint) logger.info(String.format("Using %s", miniLMEndpoint.getMiniLMModel().getName())); + else if (postgresEndpoint.getEmbeddingEndpoint() instanceof BgeSmallEndpoint bgeSmallEndpoint) + logger.info(String.format("Using BgeSmall: " + bgeSmallEndpoint.getModelUrl())); + } + + public List upsert() { + + // Create Table... + this.postgresEndpoint.createTable(dimensions, metric, lists); + + ConcurrentLinkedQueue uuidQueue = new ConcurrentLinkedQueue<>(); + + Observable.fromArray(arr) + .buffer(batchSize) + .concatMapCompletable( + batch -> + Observable.fromIterable(batch) + .flatMap( + input -> + Observable.fromCallable(() -> generateEmbeddings(input)) + .subscribeOn(Schedulers.io())) + .toList() + .flatMapCompletable( + wordEmbeddingsList -> + Completable.fromAction( + () -> upsertAndCollectIds(wordEmbeddingsList, uuidQueue)) + .subscribeOn(Schedulers.io()))) + .blockingAwait(); + + return new ArrayList<>(uuidQueue); + } + + private WordEmbeddings generateEmbeddings(String input) { + return postgresEndpoint + .getEmbeddingEndpoint() + .embeddings(input, arkRequest) + .firstOrError() + .blockingGet(); + } + + private void upsertAndCollectIds( + List wordEmbeddingsList, ConcurrentLinkedQueue uuidQueue) { + List batchUuidList = executeBatchUpsert(wordEmbeddingsList); + uuidQueue.addAll(batchUuidList); + } + + private List executeBatchUpsert(List wordEmbeddingsList) { + return this.postgresEndpoint.upsert(wordEmbeddingsList, filename, postgresLanguage).stream() + .map(StringResponse::getResponse) + .collect(Collectors.toList()); + } + + public List insertMetadata(String metadataTableName) { + + // Create Table... + this.postgresEndpoint.createMetadataTable(metadataTableName); + + ConcurrentLinkedQueue uuidQueue = new ConcurrentLinkedQueue<>(); + + CountDownLatch latch = new CountDownLatch(1); + + Observable.fromArray(arr) + .map(str -> str.replaceAll("'", "")) + .buffer(batchSize) + .flatMapCompletable( + metadataList -> + Completable.fromAction(() -> insertMetadataAndCollectIds(metadataList, uuidQueue))) + .blockingSubscribe(latch::countDown, error -> latch.countDown()); + + return new ArrayList<>(uuidQueue); + } + + public StringResponse insertOneMetadata( + String metadataTableName, String metadata, String documentDate) { + // Create Table... + this.postgresEndpoint.createMetadataTable(metadataTableName); + return this.postgresEndpoint.insertMetadata(metadataTableName, metadata, documentDate); + } + + private void insertMetadataAndCollectIds( + List metadataList, ConcurrentLinkedQueue uuidQueue) { + List batchUuidList = executeBatchInsertMetadata(metadataList); + uuidQueue.addAll(batchUuidList); + } + + private List executeBatchInsertMetadata(List metadataList) { + return this.postgresEndpoint.batchInsertMetadata(metadataList).stream() + .map(StringResponse::getResponse) + .collect(Collectors.toList()); + } + + public int getBatchSize() { + return batchSize; } - @Override - public void upsert(String input) { - - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) { - WordEmbeddings embeddings = - openAiEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.postgresEndpoint.upsert( - embeddings, this.filename, this.dimensions, this.metric, this.lists); - } else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) { - WordEmbeddings embeddings = - miniLMEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.postgresEndpoint.upsert( - embeddings, this.filename, this.dimensions, this.metric, this.lists); - } else if (endpoint instanceof BgeSmallEndpoint bgeSmallEndpoint) { - WordEmbeddings embeddings = bgeSmallEndpoint.embeddings(input, arkRequest); - this.postgresEndpoint.upsert( - embeddings, this.filename, this.dimensions, this.metric, this.lists); - } else - throw new RuntimeException( - "Invalid Endpoint; Only OpenAIEndpoint & MiniLMEndpoint are supported"); + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/RedisRetrieval.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/RedisRetrieval.java index 34d4c3d50..35f5d1732 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/RedisRetrieval.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/RedisRetrieval.java @@ -1,55 +1,87 @@ package com.edgechain.lib.chains; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; -import com.edgechain.lib.endpoint.impl.RedisEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.BgeSmallEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.MiniLMEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.OpenAiEmbeddingEndpoint; +import com.edgechain.lib.endpoint.impl.index.RedisEndpoint; import com.edgechain.lib.index.enums.RedisDistanceMetric; import com.edgechain.lib.request.ArkRequest; +import io.reactivex.rxjava3.core.Completable; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.schedulers.Schedulers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class RedisRetrieval extends Retrieval { - - private final Logger logger = LoggerFactory.getLogger(getClass()); +import java.util.List; +public class RedisRetrieval { private final RedisEndpoint redisEndpoint; private final ArkRequest arkRequest; - private final Endpoint endpoint; + private final String[] arr; private final int dimension; private final RedisDistanceMetric metric; + private int batchSize = 30; public RedisRetrieval( + String[] arr, RedisEndpoint redisEndpoint, - Endpoint endpoint, int dimension, RedisDistanceMetric metric, ArkRequest arkRequest) { this.redisEndpoint = redisEndpoint; - this.endpoint = endpoint; this.dimension = dimension; this.metric = metric; this.arkRequest = arkRequest; - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) + this.arr = arr; + + Logger logger = LoggerFactory.getLogger(getClass()); + if (redisEndpoint.getEmbeddingEndpoint() instanceof OpenAiEmbeddingEndpoint openAiEndpoint) logger.info("Using OpenAi Embedding Service: " + openAiEndpoint.getModel()); - else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) + else if (redisEndpoint.getEmbeddingEndpoint() instanceof MiniLMEndpoint miniLMEndpoint) logger.info(String.format("Using %s", miniLMEndpoint.getMiniLMModel().getName())); + else if (redisEndpoint.getEmbeddingEndpoint() instanceof BgeSmallEndpoint bgeSmallEndpoint) + logger.info(String.format("Using BgeSmall: " + bgeSmallEndpoint.getModelUrl())); + } + + public void upsert() { + + this.redisEndpoint.createIndex(redisEndpoint.getNamespace(), dimension, metric); + + Observable.fromArray(arr) + .buffer(batchSize) + .concatMapCompletable( + batch -> + Observable.fromIterable(batch) + .flatMap( + input -> + Observable.fromCallable(() -> generateEmbeddings(input)) + .subscribeOn(Schedulers.io())) + .toList() + .flatMapCompletable( + wordEmbeddingsList -> + Completable.fromAction(() -> executeBatchUpsert(wordEmbeddingsList)) + .subscribeOn(Schedulers.io()))) + .blockingAwait(); + } + + private WordEmbeddings generateEmbeddings(String input) { + return redisEndpoint + .getEmbeddingEndpoint() + .embeddings(input, arkRequest) + .firstOrError() + .blockingGet(); + } + + private void executeBatchUpsert(List wordEmbeddingsList) { + redisEndpoint.batchUpsert(wordEmbeddingsList); + } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; } - @Override - public void upsert(String input) { - - if (endpoint instanceof OpenAiEndpoint openAiEndpoint) { - WordEmbeddings embeddings = - openAiEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.redisEndpoint.upsert(embeddings, dimension, metric); - } else if (endpoint instanceof MiniLMEndpoint miniLMEndpoint) { - WordEmbeddings embeddings = - miniLMEndpoint.embeddings(input, arkRequest).firstOrError().blockingGet(); - this.redisEndpoint.upsert(embeddings, dimension, metric); - } else - throw new RuntimeException( - "Invalid Endpoint; Only OpenAIEndpoint & MiniLMEndpoint are supported"); + public int getBatchSize() { + return batchSize; } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/Retrieval.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/Retrieval.java deleted file mode 100644 index 39916b97f..000000000 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/chains/Retrieval.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.edgechain.lib.chains; - -public abstract class Retrieval { - - public abstract void upsert(String input); -} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/PostgreSQLConfiguration.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/PostgreSQLConfiguration.java index 60945770b..4a547916e 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/PostgreSQLConfiguration.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/PostgreSQLConfiguration.java @@ -1,5 +1,6 @@ package com.edgechain.lib.configuration; +import com.zaxxer.hikari.HikariDataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; @@ -8,7 +9,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; -import java.util.Objects; @Configuration public class PostgreSQLConfiguration { @@ -16,34 +16,23 @@ public class PostgreSQLConfiguration { @Autowired private Environment env; @Bean - public DataSource dataSource() { + DataSource dataSource() { String dbHost = env.getProperty("postgres.db.host"); String dbUsername = env.getProperty("postgres.db.username"); String dbPassword = env.getProperty("postgres.db.password"); return DataSourceBuilder.create() + .type(HikariDataSource.class) .url(dbHost) .driverClassName("org.postgresql.Driver") .username(dbUsername) .password(dbPassword) .build(); - - // return DataSourceBuilder.create() - // .type(HikariDataSource.class) - // .url(dbHost) - // .driverClassName("org.postgresql.Driver") - // .username(dbUsername) - // .password(dbPassword) - // .build(); } @Bean - public JdbcTemplate jdbcTemplate() { + JdbcTemplate jdbcTemplate() { return new JdbcTemplate(dataSource()); } - - private boolean nonNullAndNotEmpty(String val) { - return Objects.nonNull(val) && val.trim().isEmpty(); - } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/RedisConfiguration.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/RedisConfiguration.java index 947c37cd9..d5c162cea 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/RedisConfiguration.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/RedisConfiguration.java @@ -21,7 +21,7 @@ public class RedisConfiguration { @Bean @Lazy - public JedisPooled jedisPooled() { + JedisPooled jedisPooled() { int port = 6379; String host = "127.0.0.1"; @@ -40,7 +40,7 @@ public JedisPooled jedisPooled() { @Bean @Lazy - public JedisConnectionFactory jedisConnectionFactory() { + JedisConnectionFactory jedisConnectionFactory() { int port = 6379; String host = "127.0.0.1"; @@ -63,7 +63,7 @@ public JedisConnectionFactory jedisConnectionFactory() { } @Bean - public RedisTemplate redisTemplate() { + RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/WebConfiguration.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/WebConfiguration.java index 519730dc8..f1f580484 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/WebConfiguration.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/configuration/WebConfiguration.java @@ -3,6 +3,8 @@ import com.edgechain.lib.configuration.domain.AuthFilter; import com.edgechain.lib.configuration.domain.MethodAuthentication; import com.edgechain.lib.configuration.domain.SecurityUUID; +import java.util.List; +import java.util.UUID; import org.modelmapper.ModelMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -10,9 +12,6 @@ import org.springframework.context.annotation.Primary; import org.springframework.web.client.RestTemplate; -import java.util.List; -import java.util.UUID; - @Configuration("WebConfiguration") @Import(EdgeChainAutoConfiguration.class) public class WebConfiguration { @@ -20,29 +19,29 @@ public class WebConfiguration { public static final String CONTEXT_PATH = "/edgechains"; @Bean - public ModelMapper modelMapper() { + ModelMapper modelMapper() { return new ModelMapper(); } @Bean - public RestTemplate restTemplate() { + RestTemplate restTemplate() { return new RestTemplate(); } @Bean @Primary - public SecurityUUID securityUUID() { + SecurityUUID securityUUID() { return new SecurityUUID(UUID.randomUUID().toString()); } @Bean - public AuthFilter authFilter() { + AuthFilter authFilter() { AuthFilter filter = new AuthFilter(); - filter.setRequestPost(new MethodAuthentication(List.of(""), "")); - filter.setRequestGet(new MethodAuthentication(List.of(""), "")); - filter.setRequestDelete(new MethodAuthentication(List.of(""), "")); - filter.setRequestPatch(new MethodAuthentication(List.of(""), "")); - filter.setRequestPut(new MethodAuthentication(List.of(""), "")); + filter.setRequestPost(new MethodAuthentication(List.of("**"), "")); + filter.setRequestGet(new MethodAuthentication(List.of("**"), "")); + filter.setRequestDelete(new MethodAuthentication(List.of("**"), "")); + filter.setRequestPatch(new MethodAuthentication(List.of("**"), "")); + filter.setRequestPut(new MethodAuthentication(List.of("**"), "")); return filter; } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/PostgreSQLHistoryContextClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/PostgreSQLHistoryContextClient.java index 08b5e7538..e5ab71034 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/PostgreSQLHistoryContextClient.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/PostgreSQLHistoryContextClient.java @@ -3,9 +3,11 @@ import com.edgechain.lib.context.client.HistoryContextClient; import com.edgechain.lib.context.client.repositories.PostgreSQLHistoryContextRepository; import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.PostgreSQLHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.context.PostgreSQLHistoryContextEndpoint; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import io.reactivex.rxjava3.core.Observable; +import java.time.LocalDateTime; +import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,14 +15,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; -import java.util.Objects; - @Service public class PostgreSQLHistoryContextClient implements HistoryContextClient { - private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private PostgreSQLHistoryContextRepository historyContextRepository; @@ -28,6 +27,7 @@ public class PostgreSQLHistoryContextClient private static final String PREFIX = "historycontext:"; + @Transactional @Override public EdgeChain create(String id, PostgreSQLHistoryContextEndpoint endpoint) { return new EdgeChain<>( @@ -41,6 +41,11 @@ public EdgeChain create(String id, PostgreSQLHistoryContextEndpo this.createTable(); // Create Table IF NOT EXISTS; HistoryContext context = new HistoryContext(PREFIX + id, "", LocalDateTime.now()); + + if (logger.isInfoEnabled()) { + logger.info("{} is added", context.getId()); + } + emitter.onNext(historyContextRepository.save(context)); emitter.onComplete(); @@ -51,6 +56,7 @@ public EdgeChain create(String id, PostgreSQLHistoryContextEndpo endpoint); } + @Transactional @Override public EdgeChain put( String id, String response, PostgreSQLHistoryContextEndpoint endpoint) { @@ -60,11 +66,14 @@ public EdgeChain put( try { HistoryContext historyContext = this.get(id, null).get(); - String input = response.replaceAll("'", ""); + String input = response.replace("'", ""); historyContext.setResponse(input); HistoryContext returnValue = this.historyContextRepository.save(historyContext); - logger.info(String.format("%s is updated", id)); + + if (logger.isInfoEnabled()) { + logger.info("{} is updated", id); + } emitter.onNext(returnValue); emitter.onComplete(); @@ -76,20 +85,23 @@ public EdgeChain put( endpoint); } + @Transactional(readOnly = true) @Override public EdgeChain get(String id, PostgreSQLHistoryContextEndpoint endpoint) { return new EdgeChain<>( Observable.create( emitter -> { try { - emitter.onNext( + final HistoryContext val = this.historyContextRepository .findById(id) .orElseThrow( () -> - new RuntimeException( - "PostgreSQL history_context id isn't found."))); + new RuntimeException("PostgreSQL history_context id isn't found.")); + + emitter.onNext(val); emitter.onComplete(); + } catch (final Exception e) { emitter.onError(e); } @@ -97,6 +109,7 @@ public EdgeChain get(String id, PostgreSQLHistoryContextEndpoint endpoint); } + @Transactional @Override public EdgeChain delete(String id, PostgreSQLHistoryContextEndpoint endpoint) { return new EdgeChain<>( @@ -107,8 +120,13 @@ public EdgeChain delete(String id, PostgreSQLHistoryContextEndpoint endp HistoryContext historyContext = this.get(id, null).get(); this.historyContextRepository.delete(historyContext); + if (logger.isInfoEnabled()) { + logger.info("{} is deleted", id); + } + emitter.onNext(""); emitter.onComplete(); + } catch (final Exception e) { emitter.onError(e); } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/RedisHistoryContextClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/RedisHistoryContextClient.java index 962839794..c12006cf2 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/RedisHistoryContextClient.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/context/client/impl/RedisHistoryContextClient.java @@ -1,10 +1,13 @@ package com.edgechain.lib.context.client.impl; -import com.edgechain.lib.context.domain.HistoryContext; import com.edgechain.lib.context.client.HistoryContextClient; -import com.edgechain.lib.endpoint.impl.RedisHistoryContextEndpoint; +import com.edgechain.lib.context.domain.HistoryContext; +import com.edgechain.lib.endpoint.impl.context.RedisHistoryContextEndpoint; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import io.reactivex.rxjava3.core.Observable; +import java.time.LocalDateTime; +import java.util.Objects; +import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,25 +16,20 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Repository; -import java.time.LocalDateTime; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - @Repository public class RedisHistoryContextClient implements HistoryContextClient { - private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final String PREFIX = "historycontext:"; - @Autowired private RedisTemplate redisTemplate; + @Autowired private RedisTemplate redisTemplate; @Autowired @Lazy private Environment env; @Override public EdgeChain create(String id, RedisHistoryContextEndpoint endpoint) { - return new EdgeChain<>( Observable.create( emitter -> { @@ -54,6 +52,10 @@ public EdgeChain create(String id, RedisHistoryContextEndpoint e this.redisTemplate.expire( key, Long.parseLong(env.getProperty("redis.ttl")), TimeUnit.SECONDS); + if (logger.isInfoEnabled()) { + logger.info("{} is added", key); + } + emitter.onNext(context); emitter.onComplete(); @@ -71,7 +73,6 @@ public EdgeChain put( Observable.create( emitter -> { try { - HistoryContext historyContext = this.get(key, null).get(); historyContext.setResponse(response); @@ -79,7 +80,9 @@ public EdgeChain put( this.redisTemplate.expire( key, Long.parseLong(env.getProperty("redis.ttl")), TimeUnit.SECONDS); - logger.info(String.format("%s is updated", key)); + if (logger.isInfoEnabled()) { + logger.info("{} is updated", key); + } emitter.onNext(historyContext); emitter.onComplete(); @@ -99,9 +102,11 @@ public EdgeChain get(String key, RedisHistoryContextEndpoint end try { Boolean b = this.redisTemplate.hasKey(key); if (Boolean.TRUE.equals(b)) { - emitter.onNext( - Objects.requireNonNull( - (HistoryContext) this.redisTemplate.opsForValue().get(key))); + + HistoryContext obj = (HistoryContext) this.redisTemplate.opsForValue().get(key); + Objects.requireNonNull(obj, "null value not allowed! key " + key); + + emitter.onNext(obj); emitter.onComplete(); } else { emitter.onError(new RuntimeException("Redis history_context id isn't found.")); @@ -116,13 +121,17 @@ public EdgeChain get(String key, RedisHistoryContextEndpoint end @Override public EdgeChain delete(String key, RedisHistoryContextEndpoint endpoint) { - return new EdgeChain<>( Observable.create( emitter -> { try { this.get(key, null).get(); this.redisTemplate.delete(key); + + if (logger.isInfoEnabled()) { + logger.info("{} is deleted", key); + } + emitter.onNext(""); emitter.onComplete(); diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/EmbeddingLoggerController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/EmbeddingLoggerController.java index 2163bc918..821f27339 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/EmbeddingLoggerController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/EmbeddingLoggerController.java @@ -1,13 +1,15 @@ package com.edgechain.lib.controllers; -import com.edgechain.lib.logger.EmbeddingLogger; import com.edgechain.lib.logger.EmbeddingLogger; import com.edgechain.lib.logger.entities.EmbeddingLog; import java.util.HashMap; -import java.util.Objects; - import org.springframework.data.domain.Page; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/v1/logs/embeddings") @@ -16,8 +18,10 @@ public class EmbeddingLoggerController { private EmbeddingLogger embeddingLogger; private EmbeddingLogger getInstance() { - if (Objects.isNull(embeddingLogger)) return embeddingLogger = new EmbeddingLogger(); - else return embeddingLogger; + if (embeddingLogger == null) { + embeddingLogger = new EmbeddingLogger(); + } + return embeddingLogger; } @GetMapping("/findAll/{page}/{size}") diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/JsonnetLoggerController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/JsonnetLoggerController.java new file mode 100644 index 000000000..8aab8ec9a --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/JsonnetLoggerController.java @@ -0,0 +1,39 @@ +package com.edgechain.lib.controllers; + +import com.edgechain.lib.logger.JsonnetLogger; +import java.util.HashMap; +import java.util.Objects; + +import com.edgechain.lib.logger.entities.JsonnetLog; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/v1/logs/jsonnet") +public class JsonnetLoggerController { + + private JsonnetLogger jsonnetLogger; + + private JsonnetLogger getInstance() { + if (Objects.isNull(jsonnetLogger)) return jsonnetLogger = new JsonnetLogger(); + else return jsonnetLogger; + } + + @GetMapping("/findAll/{page}/{size}") + public Page findAll(@PathVariable int page, @PathVariable int size) { + return getInstance().findAll(page, size); + } + + @GetMapping("/findAll/sorted/{page}/{size}") + public Page findAllOrderByCompletedAtDesc( + @PathVariable int page, @PathVariable int size) { + return getInstance().findAllOrderByCreatedAtDesc(page, size); + } + + @PostMapping("/findByName/{page}/{size}") + public Page findAllBySelectedFileOrderByCreatedAtDesc( + @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { + return getInstance() + .findAllBySelectedFileOrderByCreatedAtDesc(mapper.get("filename"), page, size); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PgHistoryContextController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PgHistoryContextController.java index 1a44017c9..470ec6de3 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PgHistoryContextController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PgHistoryContextController.java @@ -1,7 +1,7 @@ package com.edgechain.lib.controllers; import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.PostgreSQLHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.context.PostgreSQLHistoryContextEndpoint; import com.edgechain.lib.request.ArkRequest; import com.edgechain.lib.rxjava.retry.impl.FixedDelay; import org.json.JSONObject; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PostgresController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PostgresController.java index 166bc7b6f..0352f04a0 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PostgresController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/PostgresController.java @@ -1,6 +1,6 @@ package com.edgechain.lib.controllers; -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; import com.edgechain.lib.request.ArkRequest; import com.edgechain.lib.response.StringResponse; import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; @@ -27,13 +27,8 @@ private PostgresEndpoint getInstance() { @DeleteMapping("/deleteAll") public StringResponse deletePostgres(ArkRequest arkRequest) { - String table = arkRequest.getQueryParam("table"); String namespace = arkRequest.getQueryParam("namespace"); - - getInstance().setTableName(table); - getInstance().setNamespace(namespace); - - return getInstance().deleteAll(); + return getInstance().deleteAll(table, namespace); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisController.java index 950855fc2..42658fddb 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisController.java @@ -1,6 +1,6 @@ package com.edgechain.lib.controllers; -import com.edgechain.lib.endpoint.impl.RedisEndpoint; +import com.edgechain.lib.endpoint.impl.index.RedisEndpoint; import com.edgechain.lib.request.ArkRequest; import com.edgechain.lib.rxjava.retry.impl.ExponentialDelay; import org.springframework.web.bind.annotation.DeleteMapping; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisHistoryContextController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisHistoryContextController.java index 9f956768a..d9cc61f0a 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisHistoryContextController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/RedisHistoryContextController.java @@ -1,7 +1,7 @@ package com.edgechain.lib.controllers; import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.RedisHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.context.RedisHistoryContextEndpoint; import com.edgechain.lib.request.ArkRequest; import com.edgechain.lib.rxjava.retry.impl.FixedDelay; import org.json.JSONObject; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/SupabaseController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/SupabaseController.java index 557cdb394..f81cd3d1a 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/SupabaseController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/controllers/SupabaseController.java @@ -1,6 +1,6 @@ package com.edgechain.lib.controllers; -import com.edgechain.lib.endpoint.impl.SupabaseEndpoint; +import com.edgechain.lib.endpoint.impl.supabase.SupabaseEndpoint; import com.edgechain.lib.request.ArkRequest; import com.edgechain.lib.supabase.response.AuthenticatedResponse; import com.edgechain.lib.supabase.response.SupabaseUser; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/WordEmbeddings.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/WordEmbeddings.java index e5cb0101b..46b5f32f9 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/WordEmbeddings.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/WordEmbeddings.java @@ -12,7 +12,7 @@ public class WordEmbeddings implements ArkObject, Serializable { private static final long serialVersionUID = 2210956496609994219L; private String id; private List values; - private String score; + private Double score; public WordEmbeddings() {} @@ -26,13 +26,13 @@ public WordEmbeddings(String id, List values) { this.values = values; } - public WordEmbeddings(String id, List values, String score) { + public WordEmbeddings(String id, List values, Double score) { this.id = id; this.values = values; this.score = score; } - public WordEmbeddings(String id, String score) { + public WordEmbeddings(String id, Double score) { this.id = id; this.score = score; } @@ -49,7 +49,7 @@ public void setValues(List values) { this.values = values; } - public String getScore() { + public Double getScore() { return score; } @@ -57,7 +57,7 @@ public void setId(String id) { this.id = id; } - public void setScore(String score) { + public void setScore(Double score) { this.score = score; } @@ -69,9 +69,34 @@ public String toString() { @Override public JSONObject toJson() { JSONObject json = new JSONObject(); - json.put("id", id); - json.put("values", new JSONArray(values)); - json.put("score", score); + + if (id != null) { + json.put("id", id); + } + + if (values != null) { + json.put("values", new JSONArray(values)); + } + + if (score != null) { + json.put("score", score); + } + return json; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + WordEmbeddings that = (WordEmbeddings) o; + + return id.equals(that.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/bgeSmall/BgeSmallClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/bgeSmall/BgeSmallClient.java index 905ff134f..6cc92c672 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/bgeSmall/BgeSmallClient.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/bgeSmall/BgeSmallClient.java @@ -16,33 +16,24 @@ import ai.djl.translate.Translator; import ai.djl.translate.TranslatorContext; import com.edgechain.lib.embeddings.bgeSmall.response.BgeSmallResponse; -import com.edgechain.lib.endpoint.impl.BgeSmallEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.BgeSmallEndpoint; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import io.reactivex.rxjava3.core.Observable; -import org.springframework.stereotype.Service; - import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.LinkedList; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; @Service public class BgeSmallClient { - private BgeSmallEndpoint endpoint; - private static volatile ZooModel bgeSmallEn; - public BgeSmallEndpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(BgeSmallEndpoint endpoint) { - this.endpoint = endpoint; - } - - public EdgeChain createEmbeddings(String input) { + public EdgeChain createEmbeddings(String input, BgeSmallEndpoint endpoint) { return new EdgeChain<>( Observable.create( @@ -69,19 +60,23 @@ private ZooModel loadSmallBgeEn() throws IOException { ZooModel r = bgeSmallEn; if (r == null) { + final Logger logger = LoggerFactory.getLogger(BgeSmallEndpoint.class); synchronized (this) { r = bgeSmallEn; if (r == null) { - Path path = Paths.get("./model"); + logger.info("Creating tokenizer"); + Path path = Paths.get(BgeSmallEndpoint.MODEL_FOLDER); HuggingFaceTokenizer tokenizer = HuggingFaceTokenizer.builder() .optTokenizerPath(path) .optManager(NDManager.newBaseManager("PyTorch")) .build(); + logger.info("Creating translator"); MyTextEmbeddingTranslator translator = new MyTextEmbeddingTranslator(tokenizer, Batchifier.STACK, "cls", true, true); + logger.info("Loading criteria"); Criteria criteria = Criteria.builder() .setTypes(String.class, float[].class) @@ -94,7 +89,7 @@ private ZooModel loadSmallBgeEn() throws IOException { r = criteria.loadModel(); bgeSmallEn = r; } catch (IOException | ModelNotFoundException | MalformedModelException e) { - e.printStackTrace(); + logger.error("Failed to load model", e); throw new RuntimeException(e); } } @@ -162,8 +157,9 @@ static NDArray processEmbedding( embedding = list.head(); } long[] attentionMask = encoding.getAttentionMask(); - try (NDManager ptManager = NDManager.newBaseManager("PyTorch")) { - NDArray inputAttentionMask = ptManager.create(attentionMask).toType(DataType.FLOAT32, true); + try (NDManager ptManager = NDManager.newBaseManager("PyTorch"); + NDArray array = ptManager.create(attentionMask)) { + NDArray inputAttentionMask = array.toType(DataType.FLOAT32, true); switch (pooling) { case "mean": return meanPool(embedding, inputAttentionMask, false); @@ -206,7 +202,7 @@ private static NDArray maxPool(NDArray embeddings, NDArray inputAttentionMask) { private static NDArray weightedMeanPool(NDArray embeddings, NDArray attentionMask) { long[] shape = embeddings.getShape().getShape(); - NDArray weight = embeddings.getManager().arange(1, shape[0] + 1); + NDArray weight = embeddings.getManager().arange(1f, shape[0] + 1f); weight = weight.expandDims(-1).broadcast(shape); attentionMask = attentionMask.expandDims(-1).broadcast(shape).mul(weight); diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/MiniLMClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/MiniLMClient.java index b3c958995..b12ec6af0 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/MiniLMClient.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/miniLLM/MiniLMClient.java @@ -9,7 +9,7 @@ import ai.djl.training.util.ProgressBar; import com.edgechain.lib.embeddings.miniLLM.enums.MiniLMModel; import com.edgechain.lib.embeddings.miniLLM.response.MiniLMResponse; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.MiniLMEndpoint; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import io.reactivex.rxjava3.core.Observable; import org.springframework.stereotype.Service; @@ -21,8 +21,6 @@ @Service public class MiniLMClient { - private MiniLMEndpoint endpoint; - private static volatile ZooModel allMiniL6V2; private static volatile ZooModel allMiniL12V2; @@ -30,25 +28,17 @@ public class MiniLMClient { private static volatile ZooModel multiQAMiniLML6CosV1; - public MiniLMEndpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(MiniLMEndpoint endpoint) { - this.endpoint = endpoint; - } - - public EdgeChain createEmbeddings(String input) { + public EdgeChain createEmbeddings(String input, MiniLMEndpoint endpoint) { return new EdgeChain<>( Observable.create( emitter -> { try { - if (this.endpoint.getMiniLMModel().equals(MiniLMModel.ALL_MINILM_L6_V2)) { + if (endpoint.getMiniLMModel().equals(MiniLMModel.ALL_MINILM_L6_V2)) { Predictor predictor = - loadAllMiniL6V2(this.endpoint.getMiniLMModel()).newPredictor(); + loadAllMiniL6V2(endpoint.getMiniLMModel()).newPredictor(); float[] predict = predictor.predict(input); @@ -59,10 +49,10 @@ public EdgeChain createEmbeddings(String input) { emitter.onNext(new MiniLMResponse(floatList)); emitter.onComplete(); - } else if (this.endpoint.getMiniLMModel().equals(MiniLMModel.ALL_MINILM_L12_V2)) { + } else if (endpoint.getMiniLMModel().equals(MiniLMModel.ALL_MINILM_L12_V2)) { Predictor predictor = - loadAllMiniL12V2(this.endpoint.getMiniLMModel()).newPredictor(); + loadAllMiniL12V2(endpoint.getMiniLMModel()).newPredictor(); float[] predict = predictor.predict(input); @@ -73,11 +63,9 @@ public EdgeChain createEmbeddings(String input) { emitter.onNext(new MiniLMResponse(floatList)); emitter.onComplete(); - } else if (this.endpoint - .getMiniLMModel() - .equals(MiniLMModel.PARAPHRASE_MINILM_L3_V2)) { + } else if (endpoint.getMiniLMModel().equals(MiniLMModel.PARAPHRASE_MINILM_L3_V2)) { Predictor predictor = - loadParaphraseMiniLML3v2(this.endpoint.getMiniLMModel()).newPredictor(); + loadParaphraseMiniLML3v2(endpoint.getMiniLMModel()).newPredictor(); float[] predict = predictor.predict(input); @@ -92,7 +80,7 @@ public EdgeChain createEmbeddings(String input) { System.out.println("d"); ZooModel zooModel = - loadMultiQAMiniLML6CosV1(this.endpoint.getMiniLMModel()); + loadMultiQAMiniLML6CosV1(endpoint.getMiniLMModel()); Predictor predictor = zooModel.newPredictor(); diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/request/OpenAiEmbeddingRequest.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/request/OpenAiEmbeddingRequest.java index b7143cc25..b460fbfa9 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/request/OpenAiEmbeddingRequest.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/request/OpenAiEmbeddingRequest.java @@ -4,6 +4,8 @@ public class OpenAiEmbeddingRequest { private String input; private String model; + public OpenAiEmbeddingRequest() {} + public OpenAiEmbeddingRequest(String model, String input) { this.model = model; this.input = input; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbedding.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbedding.java index dfcf38cc0..1a946e054 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbedding.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbedding.java @@ -1,6 +1,7 @@ package com.edgechain.lib.embeddings.response; import com.edgechain.lib.response.ArkObject; +import org.json.JSONArray; import org.json.JSONObject; import java.util.List; @@ -50,10 +51,20 @@ public String toString() { @Override public JSONObject toJson() { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("object", object); - jsonObject.put("embedding", embedding); - jsonObject.put("index", index); - return jsonObject; + JSONObject json = new JSONObject(); + + if (object != null) { + json.put("object", object); + } + + if (embedding != null) { + json.put("embedding", new JSONArray(embedding)); + } + + if (index != null) { + json.put("index", index); + } + + return json; } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbeddingResponse.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbeddingResponse.java index ebf52ad5e..0d65ce0f5 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbeddingResponse.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/OpenAiEmbeddingResponse.java @@ -63,11 +63,24 @@ public String toString() { @Override public JSONObject toJson() { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("model", model); - jsonObject.put("object", object); - jsonObject.put("data", data.stream().map(OpenAiEmbedding::toJson).collect(Collectors.toList())); - jsonObject.put("usage", usage.toJson()); - return jsonObject; + JSONObject json = new JSONObject(); + + if (model != null) { + json.put("model", model); + } + + if (object != null) { + json.put("object", object); + } + + if (data != null) { + json.put("data", data.stream().map(OpenAiEmbedding::toJson).collect(Collectors.toList())); + } + + if (usage != null) { + json.put("usage", usage.toJson()); // Assuming Usage has a toJson method + } + + return json; } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/Usage.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/Usage.java index 28b4914b8..c30c10bbc 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/Usage.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/embeddings/response/Usage.java @@ -36,8 +36,15 @@ public String toString() { @Override public JSONObject toJson() { JSONObject json = new JSONObject(); - json.put("prompt_tokens", prompt_tokens); - json.put("total_tokens", total_tokens); + + if (prompt_tokens != 0L) { + json.put("prompt_tokens", prompt_tokens); + } + + if (total_tokens != 0L) { + json.put("total_tokens", total_tokens); + } + return json; } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/Endpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/Endpoint.java index 5128f9894..2bdc54901 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/Endpoint.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/Endpoint.java @@ -36,6 +36,14 @@ public Endpoint(String url, String apiKey, RetryPolicy retryPolicy) { this.retryPolicy = retryPolicy; } + public void setUrl(String url) { + this.url = url; + } + + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } + public String getApiKey() { return this.apiKey; } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/BgeSmallEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/BgeSmallEndpoint.java deleted file mode 100644 index 0ab920b58..000000000 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/BgeSmallEndpoint.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.request.ArkRequest; -import com.edgechain.lib.retrofit.BgeSmallService; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import retrofit2.Retrofit; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.URL; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; -import java.util.Objects; - -public class BgeSmallEndpoint extends Endpoint { - - private Logger logger = LoggerFactory.getLogger(BgeSmallEndpoint.class); - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final BgeSmallService bgeSmallService = retrofit.create(BgeSmallService.class); - - private String input; - - private String modelUrl; - private String tokenizerUrl; - - private String callIdentifier; - private final String MODEL_PATH = "./model/model.onnx"; - private final String TOKENIZER_PATH = "./model/tokenizer.json"; - private final String MODEL_FOLDER = "./model"; - - public BgeSmallEndpoint() {} - - public BgeSmallEndpoint(String modelUrl, String tokenizerUrl) { - this.modelUrl = modelUrl; - this.tokenizerUrl = tokenizerUrl; - - logger.info("Downloading bge-small-en model. Please wait..."); - File modelFile = new File(MODEL_PATH); - File tokenizerFile = new File(TOKENIZER_PATH); - - // check if the file already exists - if (!modelFile.exists()) downloadFile(modelUrl, MODEL_PATH); - if (!tokenizerFile.exists()) downloadFile(tokenizerUrl, TOKENIZER_PATH); - logger.info("Model downloaded successfully!"); - } - - public String getModelUrl() { - return modelUrl; - } - - public String getTokenizerUrl() { - return tokenizerUrl; - } - - public String getInput() { - return input; - } - - public String getCallIdentifier() { - return callIdentifier; - } - - public BgeSmallEndpoint(RetryPolicy retryPolicy, String modelUrl, String tokenizerUrl) { - super(retryPolicy); - this.modelUrl = modelUrl; - this.tokenizerUrl = tokenizerUrl; - } - - public WordEmbeddings embeddings(String input, ArkRequest arkRequest) { - - this.input = input; // set Input - - if (Objects.nonNull(arkRequest)) { - this.callIdentifier = arkRequest.getRequestURI(); - } - - return bgeSmallService - .embeddings(this) - .map(m -> new WordEmbeddings(input, m.getEmbedding())) - .blockingGet(); - } - - private void downloadFile(String urlStr, String path) { - - File modelFolderFile = new File(MODEL_FOLDER); - - if (!modelFolderFile.exists()) { - modelFolderFile.mkdir(); - } - - ReadableByteChannel rbc = null; - FileOutputStream fos = null; - try { - URL url = new URL(urlStr); - rbc = Channels.newChannel(url.openStream()); - fos = new FileOutputStream(path); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - } catch (IOException e) { - logger.info("Error downloading model"); - e.printStackTrace(); - } finally { - assert fos != null; - try { - fos.close(); - rbc.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } -} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PineconeEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PineconeEndpoint.java deleted file mode 100644 index 5d2938906..000000000 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PineconeEndpoint.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.retrofit.PineconeService; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import retrofit2.Retrofit; - -import java.util.List; - -public class PineconeEndpoint extends Endpoint { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final PineconeService pineconeService = retrofit.create(PineconeService.class); - - private String namespace; - - // Getters; - private WordEmbeddings wordEmbeddings; - - private int topK; - - public PineconeEndpoint() {} - - public PineconeEndpoint(String namespace) { - this.namespace = namespace; - } - - public PineconeEndpoint(String url, String apiKey) { - super(url, apiKey); - } - - public PineconeEndpoint(String url, String apiKey, RetryPolicy retryPolicy) { - super(url, apiKey, retryPolicy); - } - - public PineconeEndpoint(String url, String apiKey, String namespace) { - super(url, apiKey); - this.namespace = namespace; - } - - public PineconeEndpoint(String url, String apiKey, String namespace, RetryPolicy retryPolicy) { - super(url, apiKey, retryPolicy); - this.namespace = namespace; - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - // Getters - - public WordEmbeddings getWordEmbeddings() { - return wordEmbeddings; - } - - public void setWordEmbeddings(WordEmbeddings wordEmbeddings) { - this.wordEmbeddings = wordEmbeddings; - } - - public int getTopK() { - return topK; - } - - public void setTopK(int topK) { - this.topK = topK; - } - - public StringResponse upsert(WordEmbeddings wordEmbeddings) { - this.wordEmbeddings = wordEmbeddings; - return this.pineconeService.upsert(this).blockingGet(); - } - - public Observable> query(WordEmbeddings wordEmbeddings, int topK) { - this.wordEmbeddings = wordEmbeddings; - this.topK = topK; - return Observable.fromSingle(this.pineconeService.query(this)); - } - - public StringResponse deleteAll() { - return this.pineconeService.deleteAll(this).blockingGet(); - } -} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgresEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgresEndpoint.java deleted file mode 100644 index fc8443d28..000000000 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgresEndpoint.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.index.domain.PostgresWordEmbeddings; -import com.edgechain.lib.index.enums.PostgresDistanceMetric; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.retrofit.PostgresService; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import retrofit2.Retrofit; - -import java.util.List; - -public class PostgresEndpoint extends Endpoint { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final PostgresService postgresService = retrofit.create(PostgresService.class); - - private String tableName; - - private int lists; - - private String namespace; - - private String filename; - - // Getters - private WordEmbeddings wordEmbeddings; - private PostgresDistanceMetric metric; - private int dimensions; - private int topK; - - private int probes; - - public PostgresEndpoint() {} - - public PostgresEndpoint(RetryPolicy retryPolicy) { - super(retryPolicy); - } - - public PostgresEndpoint(String tableName) { - this.tableName = tableName; - } - - public PostgresEndpoint(String tableName, RetryPolicy retryPolicy) { - super(retryPolicy); - this.tableName = tableName; - } - - public String getTableName() { - return tableName; - } - - public String getNamespace() { - return namespace; - } - - public void setTableName(String tableName) { - this.tableName = tableName; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - // Getters - - public WordEmbeddings getWordEmbeddings() { - return wordEmbeddings; - } - - public int getDimensions() { - return dimensions; - } - - public int getTopK() { - return topK; - } - - public String getFilename() { - return filename; - } - - public PostgresDistanceMetric getMetric() { - return metric; - } - - public int getLists() { - return lists; - } - - public int getProbes() { - return probes; - } - - // Convenience Methods - - public StringResponse upsert( - WordEmbeddings wordEmbeddings, - String filename, - int dimension, - PostgresDistanceMetric metric, - int lists) { - this.wordEmbeddings = wordEmbeddings; - this.dimensions = dimension; - this.filename = filename; - this.metric = metric; - this.lists = lists; - return this.postgresService.upsert(this).blockingGet(); - } - - public Observable> query( - WordEmbeddings wordEmbeddings, PostgresDistanceMetric metric, int topK) { - this.wordEmbeddings = wordEmbeddings; - this.topK = topK; - this.metric = metric; - this.probes = 1; - return Observable.fromSingle(this.postgresService.query(this)); - } - - public Observable> query( - WordEmbeddings wordEmbeddings, PostgresDistanceMetric metric, int topK, int probes) { - this.wordEmbeddings = wordEmbeddings; - this.topK = topK; - this.metric = metric; - this.probes = probes; - return Observable.fromSingle(this.postgresService.query(this)); - } - - public StringResponse deleteAll() { - return this.postgresService.deleteAll(this).blockingGet(); - } -} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisEndpoint.java deleted file mode 100644 index 1dad38b37..000000000 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisEndpoint.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.edgechain.lib.endpoint.impl; - -import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.Endpoint; -import com.edgechain.lib.retrofit.RedisService; -import com.edgechain.lib.index.enums.RedisDistanceMetric; -import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.retrofit.client.RetrofitClientInstance; -import com.edgechain.lib.rxjava.retry.RetryPolicy; -import io.reactivex.rxjava3.core.Observable; -import retrofit2.Retrofit; -import java.util.List; - -public class RedisEndpoint extends Endpoint { - - private final Retrofit retrofit = RetrofitClientInstance.getInstance(); - private final RedisService redisService = retrofit.create(RedisService.class); - - private String indexName; - private String namespace; - - // Getters; - private WordEmbeddings wordEmbeddings; - - private int dimensions; - - private RedisDistanceMetric metric; - - private int topK; - - public RedisEndpoint() {} - - public RedisEndpoint(RetryPolicy retryPolicy) { - super(retryPolicy); - } - - public RedisEndpoint(String indexName) { - this.indexName = indexName; - } - - public RedisEndpoint(String indexName, RetryPolicy retryPolicy) { - super(retryPolicy); - this.indexName = indexName; - } - - public RedisEndpoint(String indexName, String namespace) { - this.indexName = indexName; - this.namespace = namespace; - } - - public RedisEndpoint(String indexName, String namespace, RetryPolicy retryPolicy) { - super(retryPolicy); - this.indexName = indexName; - this.namespace = namespace; - } - - public String getIndexName() { - return indexName; - } - - public void setIndexName(String indexName) { - this.indexName = indexName; - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } - - // Getters - public WordEmbeddings getWordEmbeddings() { - return wordEmbeddings; - } - - public void setWordEmbeddings(WordEmbeddings wordEmbeddings) { - this.wordEmbeddings = wordEmbeddings; - } - - public int getDimensions() { - return dimensions; - } - - public void setDimensions(int dimensions) { - this.dimensions = dimensions; - } - - public RedisDistanceMetric getMetric() { - return metric; - } - - public void setMetric(RedisDistanceMetric metric) { - this.metric = metric; - } - - public int getTopK() { - return topK; - } - - public void setTopK(int topK) { - this.topK = topK; - } - - // Convenience Methods - public StringResponse upsert( - WordEmbeddings wordEmbeddings, int dimension, RedisDistanceMetric metric) { - - this.wordEmbeddings = wordEmbeddings; - this.dimensions = dimension; - this.metric = metric; - - return this.redisService.upsert(this).blockingGet(); - } - - public Observable> query(WordEmbeddings embeddings, int topK) { - this.topK = topK; - this.wordEmbeddings = embeddings; - return Observable.fromSingle(this.redisService.query(this)); - } - - public void delete(String patternName) { - this.redisService.deleteByPattern(patternName, this).blockingAwait(); - } -} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgreSQLHistoryContextEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/context/PostgreSQLHistoryContextEndpoint.java similarity index 96% rename from Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgreSQLHistoryContextEndpoint.java rename to Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/context/PostgreSQLHistoryContextEndpoint.java index 2fb095412..c99a331da 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/PostgreSQLHistoryContextEndpoint.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/context/PostgreSQLHistoryContextEndpoint.java @@ -1,4 +1,4 @@ -package com.edgechain.lib.endpoint.impl; +package com.edgechain.lib.endpoint.impl.context; import com.edgechain.lib.context.domain.ContextPutRequest; import com.edgechain.lib.context.domain.HistoryContext; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisHistoryContextEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/context/RedisHistoryContextEndpoint.java similarity index 96% rename from Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisHistoryContextEndpoint.java rename to Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/context/RedisHistoryContextEndpoint.java index 1a420722c..9dcfcfb75 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/RedisHistoryContextEndpoint.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/context/RedisHistoryContextEndpoint.java @@ -1,4 +1,4 @@ -package com.edgechain.lib.endpoint.impl; +package com.edgechain.lib.endpoint.impl.context; import com.edgechain.lib.context.domain.ContextPutRequest; import com.edgechain.lib.context.domain.HistoryContext; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/BgeSmallEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/BgeSmallEndpoint.java new file mode 100644 index 000000000..7d115898e --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/BgeSmallEndpoint.java @@ -0,0 +1,120 @@ +package com.edgechain.lib.endpoint.impl.embeddings; + +import com.edgechain.lib.embeddings.WordEmbeddings; +import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.retrofit.BgeSmallService; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import com.edgechain.lib.rxjava.retry.RetryPolicy; +import io.reactivex.rxjava3.core.Observable; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.util.Objects; + +import org.modelmapper.ModelMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BgeSmallEndpoint extends EmbeddingEndpoint { + + private static final Logger logger = LoggerFactory.getLogger(BgeSmallEndpoint.class); + + private final BgeSmallService bgeSmallService = + RetrofitClientInstance.getInstance().create(BgeSmallService.class); + + private ModelMapper modelMapper = new ModelMapper(); + + private String modelUrl; + private String tokenizerUrl; + + public static final String MODEL_FOLDER = "./model"; + public static final String MODEL_PATH = MODEL_FOLDER + "/model.onnx"; + public static final String TOKENIZER_PATH = MODEL_FOLDER + "/tokenizer.json"; + + public BgeSmallEndpoint() {} + + public BgeSmallEndpoint(String modelUrl, String tokenizerUrl) { + this.modelUrl = modelUrl; + this.tokenizerUrl = tokenizerUrl; + + File modelFile = new File(MODEL_PATH); + if (!modelFile.exists()) { + logger.info( + "Downloading bge-small-en model from {} to {}. Please wait...", + modelUrl, + modelFile.getAbsolutePath()); + downloadFile(modelUrl, MODEL_PATH); + } + + File tokenizerFile = new File(TOKENIZER_PATH); + if (!tokenizerFile.exists()) { + logger.info( + "Downloading bge-small-en tokenizer from {} to {}. Please wait...", + tokenizerUrl, + tokenizerFile.getAbsolutePath()); + downloadFile(tokenizerUrl, TOKENIZER_PATH); + } + + logger.info("Model downloaded successfully!"); + } + + public String getModelUrl() { + return modelUrl; + } + + public String getTokenizerUrl() { + return tokenizerUrl; + } + + public void setModelUrl(String modelUrl) { + this.modelUrl = modelUrl; + } + + public void setTokenizerUrl(String tokenizerUrl) { + this.tokenizerUrl = tokenizerUrl; + } + + public BgeSmallEndpoint(RetryPolicy retryPolicy, String modelUrl, String tokenizerUrl) { + super(retryPolicy); + this.modelUrl = modelUrl; + this.tokenizerUrl = tokenizerUrl; + } + + @Override + public Observable embeddings(String input, ArkRequest arkRequest) { + BgeSmallEndpoint mapper = modelMapper.map(this, BgeSmallEndpoint.class); + mapper.setRawText(input); + + if (Objects.nonNull(arkRequest)) mapper.setCallIdentifier(arkRequest.getRequestURI()); + else mapper.setCallIdentifier("URI wasn't provided"); + + return Observable.fromSingle( + bgeSmallService.embeddings(mapper).map(m -> new WordEmbeddings(input, m.getEmbedding()))); + } + + private void downloadFile(String urlStr, String path) { + + File modelFolderFile = new File(MODEL_FOLDER); + + if (!modelFolderFile.exists()) { + logger.info("Creating directory {}", MODEL_FOLDER); + modelFolderFile.mkdir(); + } + + try { + URL url = new URL(urlStr); + try (InputStream is = url.openStream(); + ReadableByteChannel rbc = Channels.newChannel(is); + FileOutputStream fos = new FileOutputStream(path)) { + long transferred = fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + logger.info("Downloaded {} bytes", transferred); + } + } catch (IOException e) { + logger.error("Error downloading model", e); + } + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/EmbeddingEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/EmbeddingEndpoint.java new file mode 100644 index 000000000..609332c4b --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/EmbeddingEndpoint.java @@ -0,0 +1,64 @@ +package com.edgechain.lib.endpoint.impl.embeddings; + +import com.edgechain.lib.embeddings.WordEmbeddings; +import com.edgechain.lib.endpoint.Endpoint; +import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.rxjava.retry.RetryPolicy; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import io.reactivex.rxjava3.core.Observable; + +import java.io.Serializable; + +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") +@JsonSubTypes({ + @JsonSubTypes.Type(value = OpenAiEmbeddingEndpoint.class, name = "type1"), + @JsonSubTypes.Type(value = MiniLMEndpoint.class, name = "type2"), + @JsonSubTypes.Type(value = BgeSmallEndpoint.class, name = "type3"), +}) +public abstract class EmbeddingEndpoint extends Endpoint implements Serializable { + + private static final long serialVersionUID = 4201794264326630184L; + private String callIdentifier; + private String rawText; + + public EmbeddingEndpoint() {} + + public EmbeddingEndpoint(RetryPolicy retryPolicy) { + super(retryPolicy); + } + + public EmbeddingEndpoint(String url) { + super(url); + } + + public EmbeddingEndpoint(String url, RetryPolicy retryPolicy) { + super(url, retryPolicy); + } + + public EmbeddingEndpoint(String url, String apiKey) { + super(url, apiKey); + } + + public EmbeddingEndpoint(String url, String apiKey, RetryPolicy retryPolicy) { + super(url, apiKey, retryPolicy); + } + + public abstract Observable embeddings(String input, ArkRequest arkRequest); + + public void setRawText(String rawText) { + this.rawText = rawText; + } + + public void setCallIdentifier(String callIdentifier) { + this.callIdentifier = callIdentifier; + } + + public String getRawText() { + return rawText; + } + + public String getCallIdentifier() { + return callIdentifier; + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/MiniLMEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/MiniLMEndpoint.java similarity index 62% rename from Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/MiniLMEndpoint.java rename to Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/MiniLMEndpoint.java index f50f247d4..840cfac2c 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/MiniLMEndpoint.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/MiniLMEndpoint.java @@ -1,8 +1,7 @@ -package com.edgechain.lib.endpoint.impl; +package com.edgechain.lib.endpoint.impl.embeddings; import com.edgechain.lib.embeddings.WordEmbeddings; import com.edgechain.lib.embeddings.miniLLM.enums.MiniLMModel; -import com.edgechain.lib.endpoint.Endpoint; import com.edgechain.lib.request.ArkRequest; import com.edgechain.lib.retrofit.MiniLMService; import com.edgechain.lib.retrofit.client.RetrofitClientInstance; @@ -10,55 +9,46 @@ import java.util.Objects; import io.reactivex.rxjava3.core.Observable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.modelmapper.ModelMapper; import retrofit2.Retrofit; -public class MiniLMEndpoint extends Endpoint { - - private Logger logger = LoggerFactory.getLogger(MiniLMEndpoint.class); +public class MiniLMEndpoint extends EmbeddingEndpoint { private final Retrofit retrofit = RetrofitClientInstance.getInstance(); private final MiniLMService miniLMService = retrofit.create(MiniLMService.class); - - private String input; + private ModelMapper modelMapper = new ModelMapper(); private MiniLMModel miniLMModel; - private String callIdentifier; - public MiniLMEndpoint() {} public MiniLMEndpoint(MiniLMModel miniLMModel) { this.miniLMModel = miniLMModel; } - public String getInput() { - return input; + public void setMiniLMModel(MiniLMModel miniLMModel) { + this.miniLMModel = miniLMModel; } public MiniLMModel getMiniLMModel() { return miniLMModel; } - public String getCallIdentifier() { - return callIdentifier; - } - public MiniLMEndpoint(RetryPolicy retryPolicy, MiniLMModel miniLMModel) { super(retryPolicy); this.miniLMModel = miniLMModel; } + @Override public Observable embeddings(String input, ArkRequest arkRequest) { - this.input = input; // set Input + MiniLMEndpoint mapper = modelMapper.map(this, MiniLMEndpoint.class); + mapper.setRawText(input); - if (Objects.nonNull(arkRequest)) { - this.callIdentifier = arkRequest.getRequestURI(); - } + if (Objects.nonNull(arkRequest)) mapper.setCallIdentifier(arkRequest.getRequestURI()); + else mapper.setCallIdentifier("URI wasn't provided"); return Observable.fromSingle( - miniLMService.embeddings(this).map(m -> new WordEmbeddings(input, m.getEmbedding()))); + miniLMService.embeddings(mapper).map(m -> new WordEmbeddings(input, m.getEmbedding()))); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/OpenAiEmbeddingEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/OpenAiEmbeddingEndpoint.java new file mode 100644 index 000000000..6dc9dea4f --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/embeddings/OpenAiEmbeddingEndpoint.java @@ -0,0 +1,71 @@ +package com.edgechain.lib.endpoint.impl.embeddings; + +import com.edgechain.lib.embeddings.WordEmbeddings; +import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.retrofit.OpenAiService; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import com.edgechain.lib.rxjava.retry.RetryPolicy; +import io.reactivex.rxjava3.core.Observable; +import org.modelmapper.ModelMapper; +import retrofit2.Retrofit; + +import java.util.Objects; + +public class OpenAiEmbeddingEndpoint extends EmbeddingEndpoint { + + private final Retrofit retrofit = RetrofitClientInstance.getInstance(); + private final OpenAiService openAiService = retrofit.create(OpenAiService.class); + + private ModelMapper modelMapper = new ModelMapper(); + + private String orgId; + private String model; + + public OpenAiEmbeddingEndpoint() {} + + public OpenAiEmbeddingEndpoint(String url, String apiKey, String orgId, String model) { + super(url, apiKey); + this.orgId = orgId; + this.model = model; + } + + public OpenAiEmbeddingEndpoint( + String url, String apiKey, String orgId, String model, RetryPolicy retryPolicy) { + super(url, apiKey, retryPolicy); + this.orgId = orgId; + this.model = model; + } + + public String getModel() { + return model; + } + + public String getOrgId() { + return orgId; + } + + public void setOrgId(String orgId) { + this.orgId = orgId; + } + + public void setModel(String model) { + this.model = model; + } + + @Override + public Observable embeddings(String input, ArkRequest arkRequest) { + + OpenAiEmbeddingEndpoint mapper = modelMapper.map(this, OpenAiEmbeddingEndpoint.class); + mapper.setRawText(input); + + if (Objects.nonNull(arkRequest)) mapper.setCallIdentifier(arkRequest.getRequestURI()); + else mapper.setCallIdentifier("URI wasn't provided"); + + return Observable.fromSingle( + openAiService + .embeddings(mapper) + .map( + embeddingResponse -> + new WordEmbeddings(input, embeddingResponse.getData().get(0).getEmbedding()))); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/index/PineconeEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/index/PineconeEndpoint.java new file mode 100644 index 000000000..366a06992 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/index/PineconeEndpoint.java @@ -0,0 +1,162 @@ +package com.edgechain.lib.endpoint.impl.index; + +import com.edgechain.lib.embeddings.WordEmbeddings; +import com.edgechain.lib.endpoint.impl.embeddings.EmbeddingEndpoint; +import com.edgechain.lib.endpoint.Endpoint; +import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.retrofit.PineconeService; +import com.edgechain.lib.response.StringResponse; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import com.edgechain.lib.rxjava.retry.RetryPolicy; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import io.reactivex.rxjava3.core.Observable; +import org.modelmapper.ModelMapper; +import retrofit2.Retrofit; + +import java.util.List; + +public class PineconeEndpoint extends Endpoint { + + private static final String QUERY_API = "/query"; + private static final String UPSERT_API = "/vectors/upsert"; + private static final String DELETE_API = "/vectors/delete"; + + private final Retrofit retrofit = RetrofitClientInstance.getInstance(); + private final PineconeService pineconeService = retrofit.create(PineconeService.class); + private ModelMapper modelMapper = new ModelMapper(); + + private String originalUrl; + private String namespace; + + // Getters; + private WordEmbeddings wordEmbedding; + + private List wordEmbeddingsList; + + private int topK; + + private EmbeddingEndpoint embeddingEndpoint; + + public PineconeEndpoint() {} + + public PineconeEndpoint(String url, String apiKey, EmbeddingEndpoint embeddingEndpoint) { + super(url, apiKey); + this.originalUrl = url; + this.embeddingEndpoint = embeddingEndpoint; + } + + public PineconeEndpoint( + String url, String apiKey, EmbeddingEndpoint embeddingEndpoint, RetryPolicy retryPolicy) { + super(url, apiKey, retryPolicy); + this.embeddingEndpoint = embeddingEndpoint; + this.originalUrl = url; + } + + public PineconeEndpoint( + String url, String apiKey, String namespace, EmbeddingEndpoint embeddingEndpoint) { + super(url, apiKey); + this.originalUrl = url; + this.namespace = namespace; + this.embeddingEndpoint = embeddingEndpoint; + } + + public PineconeEndpoint( + String url, + String apiKey, + String namespace, + EmbeddingEndpoint embeddingEndpoint, + RetryPolicy retryPolicy) { + super(url, apiKey, retryPolicy); + this.originalUrl = url; + this.namespace = namespace; + this.embeddingEndpoint = embeddingEndpoint; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + // Getters + + public void setOriginalUrl(String originalUrl) { + this.originalUrl = originalUrl; + } + + public void setEmbeddingEndpoint(EmbeddingEndpoint embeddingEndpoint) { + this.embeddingEndpoint = embeddingEndpoint; + } + + public WordEmbeddings getWordEmbedding() { + return wordEmbedding; + } + + public List getWordEmbeddingsList() { + return wordEmbeddingsList; + } + + private void setWordEmbedding(WordEmbeddings wordEmbedding) { + this.wordEmbedding = wordEmbedding; + } + + private void setWordEmbeddingsList(List wordEmbeddingsList) { + this.wordEmbeddingsList = wordEmbeddingsList; + } + + public int getTopK() { + return topK; + } + + public EmbeddingEndpoint getEmbeddingEndpoint() { + return embeddingEndpoint; + } + + public String getOriginalUrl() { + return originalUrl; + } + + private void setTopK(int topK) { + this.topK = topK; + } + + public StringResponse upsert(WordEmbeddings wordEmbedding, String namespace) { + PineconeEndpoint mapper = modelMapper.map(this, PineconeEndpoint.class); + mapper.setWordEmbedding(wordEmbedding); + mapper.setUrl(mapper.getOriginalUrl().concat(UPSERT_API)); + mapper.setNamespace(namespace); + + return this.pineconeService.upsert(mapper).blockingGet(); + } + + public StringResponse batchUpsert(List wordEmbeddingsList, String namespace) { + PineconeEndpoint mapper = modelMapper.map(this, PineconeEndpoint.class); + mapper.setWordEmbeddingsList(wordEmbeddingsList); + mapper.setUrl(mapper.getOriginalUrl().concat(UPSERT_API)); + mapper.setNamespace(namespace); + + return this.pineconeService.batchUpsert(mapper).blockingGet(); + } + + public Observable> query( + String query, String namespace, int topK, ArkRequest arkRequest) { + WordEmbeddings wordEmbeddings = + new EdgeChain<>(getEmbeddingEndpoint().embeddings(query, arkRequest)).get(); + + PineconeEndpoint mapper = modelMapper.map(this, PineconeEndpoint.class); + mapper.setWordEmbedding(wordEmbeddings); + mapper.setUrl(mapper.getOriginalUrl().concat(QUERY_API)); + mapper.setNamespace(namespace); + mapper.setTopK(topK); + return Observable.fromSingle(this.pineconeService.query(mapper)); + } + + public StringResponse deleteAll(String namespace) { + PineconeEndpoint mapper = modelMapper.map(this, PineconeEndpoint.class); + mapper.setUrl(mapper.getOriginalUrl().concat(DELETE_API)); + mapper.setNamespace(namespace); + return this.pineconeService.deleteAll(mapper).blockingGet(); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/index/PostgresEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/index/PostgresEndpoint.java new file mode 100644 index 000000000..8fcee3b52 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/index/PostgresEndpoint.java @@ -0,0 +1,564 @@ +package com.edgechain.lib.endpoint.impl.index; + +import com.edgechain.lib.embeddings.WordEmbeddings; +import com.edgechain.lib.endpoint.Endpoint; +import com.edgechain.lib.endpoint.impl.embeddings.EmbeddingEndpoint; +import com.edgechain.lib.index.domain.PostgresWordEmbeddings; +import com.edgechain.lib.index.domain.RRFWeight; +import com.edgechain.lib.index.enums.OrderRRFBy; +import com.edgechain.lib.index.enums.PostgresDistanceMetric; +import com.edgechain.lib.index.enums.PostgresLanguage; +import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.response.StringResponse; +import com.edgechain.lib.retrofit.PostgresService; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import com.edgechain.lib.rxjava.retry.RetryPolicy; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.schedulers.Schedulers; +import org.modelmapper.ModelMapper; +import retrofit2.Retrofit; + +import java.util.List; + +public class PostgresEndpoint extends Endpoint { + + private final Retrofit retrofit = RetrofitClientInstance.getInstance(); + private final PostgresService postgresService = retrofit.create(PostgresService.class); + private ModelMapper modelMapper = new ModelMapper(); + private String tableName; + private int lists; + + private String id; + private String namespace; + + private String filename; + + // Getters + private WordEmbeddings wordEmbedding; + + private List wordEmbeddingsList; + + private PostgresDistanceMetric metric; + private int dimensions; + private int topK; + private int upperLimit; + + private int probes; + private String embeddingChunk; + + // Fields for metadata table + private List metadataTableNames; + private String metadata; + private String metadataId; + private List metadataList; + private String documentDate; + + /** RRF * */ + private RRFWeight textWeight; + + private RRFWeight similarityWeight; + private RRFWeight dateWeight; + + private OrderRRFBy orderRRFBy; + private String searchQuery; + + private PostgresLanguage postgresLanguage; + + // Join Table + private List idList; + + private EmbeddingEndpoint embeddingEndpoint; + + public PostgresEndpoint() {} + + public PostgresEndpoint(RetryPolicy retryPolicy) { + super(retryPolicy); + } + + public PostgresEndpoint(String tableName, EmbeddingEndpoint embeddingEndpoint) { + this.tableName = tableName; + this.embeddingEndpoint = embeddingEndpoint; + } + + public PostgresEndpoint(String tableName, String namespace, EmbeddingEndpoint embeddingEndpoint) { + this.tableName = tableName; + this.namespace = namespace; + this.embeddingEndpoint = embeddingEndpoint; + } + + public PostgresEndpoint( + String tableName, EmbeddingEndpoint embeddingEndpoint, RetryPolicy retryPolicy) { + super(retryPolicy); + this.tableName = tableName; + this.embeddingEndpoint = embeddingEndpoint; + } + + public PostgresEndpoint( + String tableName, + String namespace, + EmbeddingEndpoint embeddingEndpoint, + RetryPolicy retryPolicy) { + super(retryPolicy); + this.tableName = tableName; + this.namespace = namespace; + this.embeddingEndpoint = embeddingEndpoint; + } + + public String getTableName() { + return tableName; + } + + public String getNamespace() { + return namespace; + } + + public EmbeddingEndpoint getEmbeddingEndpoint() { + return embeddingEndpoint; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public void setMetadata(String metadata) { + this.metadata = metadata; + } + + public void setId(String id) { + this.id = id; + } + + public void setMetadataId(String metadataId) { + this.metadataId = metadataId; + } + + public void setMetadataList(List metadataList) { + this.metadataList = metadataList; + } + + public void setEmbeddingChunk(String embeddingChunk) { + this.embeddingChunk = embeddingChunk; + } + + public int getUpperLimit() { + return upperLimit; + } + + public void setUpperLimit(int upperLimit) { + this.upperLimit = upperLimit; + } + + private void setLists(int lists) { + this.lists = lists; + } + + private void setFilename(String filename) { + this.filename = filename; + } + + private void setWordEmbedding(WordEmbeddings wordEmbedding) { + this.wordEmbedding = wordEmbedding; + } + + private void setWordEmbeddingsList(List wordEmbeddingsList) { + this.wordEmbeddingsList = wordEmbeddingsList; + } + + private void setMetric(PostgresDistanceMetric metric) { + this.metric = metric; + } + + private void setDimensions(int dimensions) { + this.dimensions = dimensions; + } + + private void setTopK(int topK) { + this.topK = topK; + } + + private void setProbes(int probes) { + this.probes = probes; + } + + private void setMetadataTableNames(List metadataTableNames) { + this.metadataTableNames = metadataTableNames; + } + + private void setDocumentDate(String documentDate) { + this.documentDate = documentDate; + } + + private void setTextWeight(RRFWeight textWeight) { + this.textWeight = textWeight; + } + + private void setSimilarityWeight(RRFWeight similarityWeight) { + this.similarityWeight = similarityWeight; + } + + private void setDateWeight(RRFWeight dateWeight) { + this.dateWeight = dateWeight; + } + + private void setOrderRRFBy(OrderRRFBy orderRRFBy) { + this.orderRRFBy = orderRRFBy; + } + + private void setSearchQuery(String searchQuery) { + this.searchQuery = searchQuery; + } + + private void setPostgresLanguage(PostgresLanguage postgresLanguage) { + this.postgresLanguage = postgresLanguage; + } + + private void setIdList(List idList) { + this.idList = idList; + } + + public void setEmbeddingEndpoint(EmbeddingEndpoint embeddingEndpoint) { + this.embeddingEndpoint = embeddingEndpoint; + } + + // Getters + + public WordEmbeddings getWordEmbedding() { + return wordEmbedding; + } + + public int getDimensions() { + return dimensions; + } + + public int getTopK() { + return topK; + } + + public String getFilename() { + return filename; + } + + public List getWordEmbeddingsList() { + return wordEmbeddingsList; + } + + public PostgresDistanceMetric getMetric() { + return metric; + } + + public int getLists() { + return lists; + } + + public int getProbes() { + return probes; + } + + public List getMetadataTableNames() { + return metadataTableNames; + } + + public String getMetadata() { + return metadata; + } + + public String getMetadataId() { + return metadataId; + } + + public String getId() { + return id; + } + + public List getMetadataList() { + return metadataList; + } + + public String getEmbeddingChunk() { + return embeddingChunk; + } + + public String getDocumentDate() { + return documentDate; + } + + public RRFWeight getTextWeight() { + return textWeight; + } + + public RRFWeight getSimilarityWeight() { + return similarityWeight; + } + + public RRFWeight getDateWeight() { + return dateWeight; + } + + public OrderRRFBy getOrderRRFBy() { + return orderRRFBy; + } + + public String getSearchQuery() { + return searchQuery; + } + + public PostgresLanguage getPostgresLanguage() { + return postgresLanguage; + } + + public List getIdList() { + return idList; + } + + public StringResponse upsert( + WordEmbeddings wordEmbeddings, + String filename, + int dimension, + PostgresDistanceMetric metric) { + + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setWordEmbedding(wordEmbeddings); + mapper.setFilename(filename); + mapper.setDimensions(dimension); + mapper.setMetric(metric); + return this.postgresService.upsert(mapper).blockingGet(); + } + + public StringResponse createTable(int dimensions, PostgresDistanceMetric metric, int lists) { + + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setDimensions(dimensions); + mapper.setMetric(metric); + mapper.setLists(lists); + + return this.postgresService.createTable(mapper).blockingGet(); + } + + public StringResponse createMetadataTable(String metadataTableName) { + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setMetadataTableNames(List.of(metadataTableName)); + return this.postgresService.createMetadataTable(mapper).blockingGet(); + } + + public List upsert( + List wordEmbeddingsList, String filename, PostgresLanguage postgresLanguage) { + + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setWordEmbeddingsList(wordEmbeddingsList); + mapper.setFilename(filename); + mapper.setPostgresLanguage(postgresLanguage); + + return this.postgresService.batchUpsert(mapper).blockingGet(); + } + + public StringResponse insertMetadata( + String metadataTableName, String metadata, String documentDate) { + + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setMetadata(metadata); + mapper.setDocumentDate(documentDate); + mapper.setMetadataTableNames(List.of(metadataTableName)); + return this.postgresService.insertMetadata(mapper).blockingGet(); + } + + public List batchInsertMetadata(List metadataList) { + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setMetadataList(metadataList); + return this.postgresService.batchInsertMetadata(mapper).blockingGet(); + } + + public StringResponse insertIntoJoinTable( + String metadataTableName, String id, String metadataId) { + + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setId(id); + mapper.setMetadataId(metadataId); + mapper.setMetadataTableNames(List.of(metadataTableName)); + + return this.postgresService.insertIntoJoinTable(mapper).blockingGet(); + } + + public StringResponse batchInsertIntoJoinTable( + String metadataTableName, List idList, String metadataId) { + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setIdList(idList); + mapper.setMetadataId(metadataId); + mapper.setMetadataTableNames(List.of(metadataTableName)); + return this.postgresService.batchInsertIntoJoinTable(mapper).blockingGet(); + } + + public Observable> query( + List inputList, + PostgresDistanceMetric metric, + int topK, + int upperLimit, + ArkRequest arkRequest) { + + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + + List endpointEmbeddingList = + Observable.fromIterable(inputList) + .buffer(inputList.size() > 1 ? inputList.size() / 2 : 1) + .flatMap( + bufferedList -> + Observable.fromIterable(bufferedList) + .flatMap( + res -> + Observable.fromCallable( + () -> + new EdgeChain<>( + embeddingEndpoint.embeddings(res, arkRequest)) + .get()) + .subscribeOn(Schedulers.io()))) + .toList() + .blockingGet(); + + mapper.setWordEmbeddingsList(endpointEmbeddingList); + mapper.setTopK(topK); + mapper.setUpperLimit(upperLimit); + mapper.setMetric(metric); + mapper.setProbes(1); + return Observable.fromSingle(this.postgresService.query(mapper)); + } + + public Observable> query( + List inputList, + PostgresDistanceMetric metric, + int topK, + int upperLimit, + int probes, + ArkRequest arkRequest) { + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + + List endpointEmbeddingList = + Observable.fromIterable(inputList) + .buffer(inputList.size() > 1 ? inputList.size() / 2 : 1) + .flatMap( + bufferedList -> + Observable.fromIterable(bufferedList) + .flatMap( + res -> + Observable.fromCallable( + () -> + new EdgeChain<>( + embeddingEndpoint.embeddings(res, arkRequest)) + .get()) + .subscribeOn(Schedulers.io()))) + .toList() + .blockingGet(); + + mapper.setWordEmbeddingsList(endpointEmbeddingList); + mapper.setMetric(metric); + mapper.setProbes(probes); + mapper.setTopK(topK); + mapper.setUpperLimit(upperLimit); + return Observable.fromSingle(this.postgresService.query(mapper)); + } + + public Observable> queryRRF( + String metadataTable, + List inputList, + RRFWeight textWeight, + RRFWeight similarityWeight, + RRFWeight dateWeight, + OrderRRFBy orderRRFBy, + String searchQuery, + PostgresLanguage postgresLanguage, + int probes, + PostgresDistanceMetric metric, + int topK, + int upperLimit, + ArkRequest arkRequest) { + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setMetadataTableNames(List.of(metadataTable)); + + List endpointEmbeddingList = + Observable.fromIterable(inputList) + .buffer(inputList.size() > 1 ? inputList.size() / 2 : 1) + .flatMap( + bufferedList -> + Observable.fromIterable(bufferedList) + .flatMap( + res -> + Observable.fromCallable( + () -> + new EdgeChain<>( + embeddingEndpoint.embeddings(res, arkRequest)) + .get()) + .subscribeOn(Schedulers.io()))) + .toList() + .blockingGet(); + + mapper.setWordEmbeddingsList(endpointEmbeddingList); + mapper.setTextWeight(textWeight); + mapper.setSimilarityWeight(similarityWeight); + mapper.setDateWeight(dateWeight); + mapper.setOrderRRFBy(orderRRFBy); + mapper.setSearchQuery(searchQuery); + mapper.setPostgresLanguage(postgresLanguage); + mapper.setProbes(probes); + mapper.setMetric(metric); + mapper.setTopK(topK); + mapper.setUpperLimit(upperLimit); + return Observable.fromSingle(this.postgresService.queryRRF(mapper)); + } + + public Observable> queryWithMetadata( + List metadataTableNames, + WordEmbeddings wordEmbeddings, + PostgresDistanceMetric metric, + int topK) { + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setMetadataTableNames(metadataTableNames); + mapper.setWordEmbedding(wordEmbeddings); + mapper.setTopK(topK); + mapper.setMetric(metric); + mapper.setProbes(1); + return Observable.fromSingle(this.postgresService.queryWithMetadata(mapper)); + } + + public Observable> queryWithMetadata( + List metadataTableNames, + String input, + PostgresDistanceMetric metric, + int topK, + ArkRequest arkRequest) { + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + + WordEmbeddings wordEmbeddings = + new EdgeChain<>(embeddingEndpoint.embeddings(input, arkRequest)).get(); + + mapper.setMetadataTableNames(metadataTableNames); + mapper.setWordEmbedding(wordEmbeddings); + mapper.setTopK(topK); + mapper.setMetric(metric); + mapper.setProbes(1); + return Observable.fromSingle(this.postgresService.queryWithMetadata(mapper)); + } + + public Observable> getSimilarMetadataChunk(String embeddingChunk) { + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setEmbeddingChunk(embeddingChunk); + return Observable.fromSingle(this.postgresService.getSimilarMetadataChunk(mapper)); + } + + public Observable> getAllChunks(String tableName, String filename) { + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setTableName(tableName); + mapper.setFilename(filename); + + return Observable.fromSingle(this.postgresService.getAllChunks(this)); + } + + public StringResponse deleteAll(String tableName, String namespace) { + PostgresEndpoint mapper = modelMapper.map(this, PostgresEndpoint.class); + mapper.setTableName(tableName); + mapper.setNamespace(namespace); + return this.postgresService.deleteAll(mapper).blockingGet(); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/index/RedisEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/index/RedisEndpoint.java new file mode 100644 index 000000000..dbc8941f8 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/index/RedisEndpoint.java @@ -0,0 +1,190 @@ +package com.edgechain.lib.endpoint.impl.index; + +import com.edgechain.lib.embeddings.WordEmbeddings; +import com.edgechain.lib.endpoint.Endpoint; +import com.edgechain.lib.endpoint.impl.embeddings.EmbeddingEndpoint; +import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.retrofit.RedisService; +import com.edgechain.lib.index.enums.RedisDistanceMetric; +import com.edgechain.lib.response.StringResponse; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import com.edgechain.lib.rxjava.retry.RetryPolicy; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import io.reactivex.rxjava3.core.Observable; +import org.modelmapper.ModelMapper; +import retrofit2.Retrofit; +import java.util.List; + +public class RedisEndpoint extends Endpoint { + + private final Retrofit retrofit = RetrofitClientInstance.getInstance(); + private final RedisService redisService = retrofit.create(RedisService.class); + + private ModelMapper modelMapper = new ModelMapper(); + + private String indexName; + private String namespace; + + // Getters; + private WordEmbeddings wordEmbedding; + private List wordEmbeddingsList; + + private int dimensions; + + private RedisDistanceMetric metric; + + private int topK; + + private String pattern; + + private EmbeddingEndpoint embeddingEndpoint; + + public RedisEndpoint() {} + + public RedisEndpoint(RetryPolicy retryPolicy) { + super(retryPolicy); + } + + public RedisEndpoint(String indexName, EmbeddingEndpoint embeddingEndpoint) { + this.indexName = indexName; + this.embeddingEndpoint = embeddingEndpoint; + } + + public RedisEndpoint( + String indexName, EmbeddingEndpoint embeddingEndpoint, RetryPolicy retryPolicy) { + super(retryPolicy); + this.indexName = indexName; + this.embeddingEndpoint = embeddingEndpoint; + } + + public RedisEndpoint(String indexName, String namespace, EmbeddingEndpoint embeddingEndpoint) { + this.indexName = indexName; + this.namespace = namespace; + this.embeddingEndpoint = embeddingEndpoint; + } + + public RedisEndpoint( + String indexName, + String namespace, + EmbeddingEndpoint embeddingEndpoint, + RetryPolicy retryPolicy) { + super(retryPolicy); + this.indexName = indexName; + this.namespace = namespace; + this.embeddingEndpoint = embeddingEndpoint; + } + + public EmbeddingEndpoint getEmbeddingEndpoint() { + return embeddingEndpoint; + } + + public void setEmbeddingEndpoint(EmbeddingEndpoint embeddingEndpoint) { + this.embeddingEndpoint = embeddingEndpoint; + } + + public void setPattern(String pattern) { + this.pattern = pattern; + } + + public String getIndexName() { + return indexName; + } + + public void setIndexName(String indexName) { + this.indexName = indexName; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + // Getters + public WordEmbeddings getWordEmbedding() { + return wordEmbedding; + } + + public void setWordEmbedding(WordEmbeddings wordEmbedding) { + this.wordEmbedding = wordEmbedding; + } + + public int getDimensions() { + return dimensions; + } + + public void setDimensions(int dimensions) { + this.dimensions = dimensions; + } + + public void setWordEmbeddingsList(List wordEmbeddingsList) { + this.wordEmbeddingsList = wordEmbeddingsList; + } + + public RedisDistanceMetric getMetric() { + return metric; + } + + public List getWordEmbeddingsList() { + return wordEmbeddingsList; + } + + public void setMetric(RedisDistanceMetric metric) { + this.metric = metric; + } + + public int getTopK() { + return topK; + } + + public void setTopK(int topK) { + this.topK = topK; + } + + public String getPattern() { + return pattern; + } + + // Convenience Methods + public StringResponse createIndex(String namespace, int dimension, RedisDistanceMetric metric) { + RedisEndpoint mapper = modelMapper.map(this, RedisEndpoint.class); + mapper.setDimensions(dimension); + mapper.setMetric(metric); + mapper.setNamespace(namespace); + + return this.redisService.createIndex(mapper).blockingGet(); + } + + public void batchUpsert(List wordEmbeddingsList) { + RedisEndpoint mapper = modelMapper.map(this, RedisEndpoint.class); + mapper.setWordEmbeddingsList(wordEmbeddingsList); + + this.redisService.batchUpsert(mapper).ignoreElement().blockingAwait(); + } + + public StringResponse upsert(WordEmbeddings wordEmbedding) { + RedisEndpoint mapper = modelMapper.map(this, RedisEndpoint.class); + mapper.setWordEmbedding(wordEmbedding); + + return this.redisService.upsert(mapper).blockingGet(); + } + + public Observable> query(String input, int topK, ArkRequest arkRequest) { + + WordEmbeddings wordEmbedding = + new EdgeChain<>(embeddingEndpoint.embeddings(input, arkRequest)).get(); + + RedisEndpoint mapper = modelMapper.map(this, RedisEndpoint.class); + mapper.setTopK(topK); + mapper.setWordEmbedding(wordEmbedding); + return Observable.fromSingle(this.redisService.query(mapper)); + } + + public void delete(String patternName) { + RedisEndpoint mapper = modelMapper.map(this, RedisEndpoint.class); + mapper.setPattern(patternName); + this.redisService.deleteByPattern(mapper).blockingAwait(); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/integration/AirtableEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/integration/AirtableEndpoint.java new file mode 100644 index 000000000..1ca7f4943 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/integration/AirtableEndpoint.java @@ -0,0 +1,182 @@ +package com.edgechain.lib.endpoint.impl.integration; + +import com.edgechain.lib.endpoint.Endpoint; +import com.edgechain.lib.integration.airtable.query.AirtableQueryBuilder; +import com.edgechain.lib.retrofit.AirtableService; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import dev.fuxing.airtable.AirtableRecord; +import io.reactivex.rxjava3.core.Observable; +import org.modelmapper.ModelMapper; +import retrofit2.Retrofit; + +import java.util.List; +import java.util.Map; + +public class AirtableEndpoint extends Endpoint { + + private final Retrofit retrofit = RetrofitClientInstance.getInstance(); + private final AirtableService airtableService = retrofit.create(AirtableService.class); + + private ModelMapper modelMapper = new ModelMapper(); + + private String baseId; + private String apiKey; + + private List ids; + private String tableName; + private List airtableRecordList; + private boolean typecast = false; + + private AirtableQueryBuilder airtableQueryBuilder; + + public AirtableEndpoint() {} + + public AirtableEndpoint(String baseId, String apiKey) { + this.baseId = baseId; + this.apiKey = apiKey; + } + + public void setIds(List ids) { + this.ids = ids; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public void setAirtableRecordList(List airtableRecordList) { + this.airtableRecordList = airtableRecordList; + } + + public void setTypecast(boolean typecast) { + this.typecast = typecast; + } + + public void setAirtableQueryBuilder(AirtableQueryBuilder airtableQueryBuilder) { + this.airtableQueryBuilder = airtableQueryBuilder; + } + + public void setBaseId(String baseId) { + this.baseId = baseId; + } + + @Override + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } + + public String getBaseId() { + return baseId; + } + + public String getApiKey() { + return apiKey; + } + + public String getTableName() { + return tableName; + } + + public List getIds() { + return ids; + } + + public List getAirtableRecordList() { + return airtableRecordList; + } + + public boolean isTypecast() { + return typecast; + } + + public AirtableQueryBuilder getAirtableQueryBuilder() { + return airtableQueryBuilder; + } + + public Observable> findAll(String tableName, AirtableQueryBuilder builder) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + ; + mapper.setTableName(tableName); + mapper.setAirtableQueryBuilder(builder); + return Observable.fromSingle(this.airtableService.findAll(mapper)); + } + + public Observable> findAll(String tableName) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + mapper.setTableName(tableName); + mapper.setAirtableQueryBuilder(new AirtableQueryBuilder()); + + return Observable.fromSingle(this.airtableService.findAll(mapper)); + } + + public Observable findById(String tableName, String id) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + mapper.setTableName(tableName); + mapper.setIds(List.of(id)); + return Observable.fromSingle(this.airtableService.findById(mapper)); + } + + public Observable> create( + String tableName, List airtableRecordList) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + mapper.setAirtableRecordList(airtableRecordList); + mapper.setTableName(tableName); + return Observable.fromSingle(this.airtableService.create(mapper)); + } + + public Observable> create( + String tableName, List airtableRecordList, boolean typecast) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + mapper.setAirtableRecordList(airtableRecordList); + mapper.setTableName(tableName); + mapper.setTypecast(typecast); + return Observable.fromSingle(this.airtableService.create(mapper)); + } + + public Observable> create(String tableName, AirtableRecord airtableRecord) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + mapper.setAirtableRecordList(List.of(airtableRecord)); + mapper.setTableName(tableName); + return Observable.fromSingle(this.airtableService.create(mapper)); + } + + public Observable> update( + String tableName, List airtableRecordList) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + mapper.setAirtableRecordList(airtableRecordList); + mapper.setTableName(tableName); + + return Observable.fromSingle(this.airtableService.update(mapper)); + } + + public Observable> update( + String tableName, List airtableRecordList, boolean typecast) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + mapper.setAirtableRecordList(airtableRecordList); + mapper.setTableName(tableName); + mapper.setTypecast(typecast); + + return Observable.fromSingle(this.airtableService.update(mapper)); + } + + public Observable> update(String tableName, AirtableRecord airtableRecord) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + mapper.setAirtableRecordList(List.of(airtableRecord)); + mapper.setTableName(tableName); + return Observable.fromSingle(this.airtableService.update(mapper)); + } + + public Observable> delete(String tableName, List ids) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + mapper.setIds(ids); + mapper.setTableName(tableName); + return Observable.fromSingle(this.airtableService.delete(mapper)); + } + + public Observable> delete(String tableName, String id) { + AirtableEndpoint mapper = modelMapper.map(this, AirtableEndpoint.class); + mapper.setIds(List.of(id)); + mapper.setTableName(tableName); + return Observable.fromSingle(this.airtableService.delete(mapper)); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/llm/LLamaQuickstart.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/llm/LLamaQuickstart.java new file mode 100644 index 000000000..03e52f6da --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/llm/LLamaQuickstart.java @@ -0,0 +1,47 @@ +package com.edgechain.lib.endpoint.impl.llm; + +import com.edgechain.lib.endpoint.Endpoint; +import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.retrofit.Llama2Service; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import com.edgechain.lib.rxjava.retry.RetryPolicy; +import io.reactivex.rxjava3.core.Observable; +import org.modelmapper.ModelMapper; +import retrofit2.Retrofit; + +public class LLamaQuickstart extends Endpoint { + private final Retrofit retrofit = RetrofitClientInstance.getInstance(); + private final Llama2Service llama2Service = retrofit.create(Llama2Service.class); + private final ModelMapper modelMapper = new ModelMapper(); + private String query; + + public LLamaQuickstart() {} + + public LLamaQuickstart(String url, RetryPolicy retryPolicy) { + super(url, retryPolicy); + } + + public LLamaQuickstart(String url, RetryPolicy retryPolicy, String query) { + super(url, retryPolicy); + this.query = query; + } + + public String getQuery() { + return query; + } + + public void setQuery(String query) { + this.query = query; + } + + public Observable chatCompletion(String query, ArkRequest arkRequest) { + LLamaQuickstart mapper = modelMapper.map(this, LLamaQuickstart.class); + mapper.setQuery(query); + return chatCompletion(mapper, arkRequest); + } + + private Observable chatCompletion( + LLamaQuickstart lLamaQuickstart, ArkRequest arkRequest) { + return Observable.fromSingle(this.llama2Service.llamaCompletion(lLamaQuickstart)); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/llm/Llama2Endpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/llm/Llama2Endpoint.java new file mode 100644 index 000000000..96ba9912d --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/llm/Llama2Endpoint.java @@ -0,0 +1,180 @@ +package com.edgechain.lib.endpoint.impl.llm; + +import com.edgechain.lib.endpoint.Endpoint; +import com.edgechain.lib.llama2.response.Llama2ChatCompletionResponse; +import com.edgechain.lib.request.ArkRequest; +import com.edgechain.lib.retrofit.Llama2Service; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import com.edgechain.lib.rxjava.retry.RetryPolicy; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.reactivex.rxjava3.core.Observable; +import org.json.JSONObject; +import org.modelmapper.ModelMapper; +import retrofit2.Retrofit; + +import java.util.List; +import java.util.Objects; + +public class Llama2Endpoint extends Endpoint { + private final Retrofit retrofit = RetrofitClientInstance.getInstance(); + private final Llama2Service llama2Service = retrofit.create(Llama2Service.class); + + private final ModelMapper modelMapper = new ModelMapper(); + + private String inputs; + private JSONObject parameters; + private Double temperature; + + @JsonProperty("top_k") + private Integer topK; + + @JsonProperty("top_p") + private Double topP; + + @JsonProperty("do_sample") + private Boolean doSample; + + @JsonProperty("max_new_tokens") + private Integer maxNewTokens; + + @JsonProperty("repetition_penalty") + private Double repetitionPenalty; + + private List stop; + private String chainName; + private String callIdentifier; + + public Llama2Endpoint() {} + + public Llama2Endpoint( + String url, + RetryPolicy retryPolicy, + Double temperature, + Integer topK, + Double topP, + Boolean doSample, + Integer maxNewTokens, + Double repetitionPenalty, + List stop) { + super(url, retryPolicy); + this.temperature = temperature; + this.topK = topK; + this.topP = topP; + this.doSample = doSample; + this.maxNewTokens = maxNewTokens; + this.repetitionPenalty = repetitionPenalty; + this.stop = stop; + } + + public Llama2Endpoint(String url, RetryPolicy retryPolicy) { + super(url, retryPolicy); + this.temperature = 0.7; + this.maxNewTokens = 512; + } + + public String getInputs() { + return inputs; + } + + public void setInputs(String inputs) { + this.inputs = inputs; + } + + public JSONObject getParameters() { + return parameters; + } + + public void setParameters(JSONObject parameters) { + this.parameters = parameters; + } + + public Double getTemperature() { + return temperature; + } + + public void setTemperature(Double temperature) { + this.temperature = temperature; + } + + public Integer getTopK() { + return topK; + } + + public void setTopK(Integer topK) { + this.topK = topK; + } + + public Double getTopP() { + return topP; + } + + public void setTopP(Double topP) { + this.topP = topP; + } + + public Boolean getDoSample() { + return doSample; + } + + public void setDoSample(Boolean doSample) { + this.doSample = doSample; + } + + public Integer getMaxNewTokens() { + return maxNewTokens; + } + + public void setMaxNewTokens(Integer maxNewTokens) { + this.maxNewTokens = maxNewTokens; + } + + public Double getRepetitionPenalty() { + return repetitionPenalty; + } + + public void setRepetitionPenalty(Double repetitionPenalty) { + this.repetitionPenalty = repetitionPenalty; + } + + public List getStop() { + return stop; + } + + public void setStop(List stop) { + this.stop = stop; + } + + public String getChainName() { + return chainName; + } + + public void setChainName(String chainName) { + this.chainName = chainName; + } + + public String getCallIdentifier() { + return callIdentifier; + } + + public void setCallIdentifier(String callIdentifier) { + this.callIdentifier = callIdentifier; + } + + public Observable> chatCompletion( + String inputs, String chainName, ArkRequest arkRequest) { + + Llama2Endpoint mapper = modelMapper.map(this, Llama2Endpoint.class); + mapper.setInputs(inputs); + mapper.setChainName(chainName); + return chatCompletion(mapper, arkRequest); + } + + private Observable> chatCompletion( + Llama2Endpoint mapper, ArkRequest arkRequest) { + + if (Objects.nonNull(arkRequest)) mapper.setCallIdentifier(arkRequest.getRequestURI()); + else mapper.setCallIdentifier("URI wasn't provided"); + + return Observable.fromSingle(this.llama2Service.chatCompletion(mapper)); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/OpenAiEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/llm/OpenAiChatEndpoint.java similarity index 50% rename from Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/OpenAiEndpoint.java rename to Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/llm/OpenAiChatEndpoint.java index d21685899..19d571ef8 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/OpenAiEndpoint.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/llm/OpenAiChatEndpoint.java @@ -1,22 +1,25 @@ -package com.edgechain.lib.endpoint.impl; +package com.edgechain.lib.endpoint.impl.llm; import com.edgechain.lib.configuration.context.ApplicationContextHolder; -import com.edgechain.lib.embeddings.WordEmbeddings; +import com.edgechain.lib.endpoint.Endpoint; +import com.edgechain.lib.jsonnet.JsonnetLoader; import com.edgechain.lib.openai.request.ChatMessage; +import com.edgechain.lib.openai.response.CompletionResponse; import com.edgechain.lib.request.ArkRequest; import com.edgechain.lib.retrofit.client.OpenAiStreamService; import com.edgechain.lib.retrofit.OpenAiService; -import com.edgechain.lib.endpoint.Endpoint; import com.edgechain.lib.openai.response.ChatCompletionResponse; import com.edgechain.lib.retrofit.client.RetrofitClientInstance; import com.edgechain.lib.rxjava.retry.RetryPolicy; import io.reactivex.rxjava3.core.Observable; +import org.modelmapper.ModelMapper; import retrofit2.Retrofit; import java.util.List; +import java.util.Map; import java.util.Objects; -public class OpenAiEndpoint extends Endpoint { +public class OpenAiChatEndpoint extends Endpoint { private final OpenAiStreamService openAiStreamService = ApplicationContextHolder.getContext().getBean(OpenAiStreamService.class); @@ -24,15 +27,23 @@ public class OpenAiEndpoint extends Endpoint { private final Retrofit retrofit = RetrofitClientInstance.getInstance(); private final OpenAiService openAiService = retrofit.create(OpenAiService.class); + private ModelMapper modelMapper = new ModelMapper(); + private String orgId; private String model; - private String role; - private Double temperature; + private Double temperature; + private List chatMessages; private Boolean stream; + private Double topP; + private Integer n; + private List stop; + private Double presencePenalty; + private Double frequencyPenalty; + private Map logitBias; + private String user; - /** Getter Fields ** */ - private List chatMessages; + private String role; private String input; @@ -41,26 +52,24 @@ public class OpenAiEndpoint extends Endpoint { private String callIdentifier; - public OpenAiEndpoint() {} + private JsonnetLoader jsonnetLoader; - public OpenAiEndpoint(String url, String apiKey, String model) { - super(url, apiKey, null); - this.model = model; - } + public OpenAiChatEndpoint() {} - public OpenAiEndpoint(String url, String apiKey, String model, RetryPolicy retryPolicy) { - super(url, apiKey, retryPolicy); + public OpenAiChatEndpoint(String url, String apiKey, String model) { + super(url, apiKey, null); this.model = model; } - public OpenAiEndpoint( - String url, String apiKey, String model, String role, RetryPolicy retryPolicy) { + // For Embeddings.... + public OpenAiChatEndpoint( + String url, String apiKey, String orgId, String model, RetryPolicy retryPolicy) { super(url, apiKey, retryPolicy); + this.orgId = orgId; this.model = model; - this.role = role; } - public OpenAiEndpoint( + public OpenAiChatEndpoint( String url, String apiKey, String model, @@ -73,7 +82,7 @@ public OpenAiEndpoint( this.temperature = temperature; } - public OpenAiEndpoint( + public OpenAiChatEndpoint( String url, String apiKey, String model, String role, Double temperature, Boolean stream) { super(url, apiKey, null); this.model = model; @@ -82,22 +91,22 @@ public OpenAiEndpoint( this.stream = stream; } - public OpenAiEndpoint( + public OpenAiChatEndpoint( String url, String apiKey, + String orgId, String model, String role, Double temperature, - Boolean stream, RetryPolicy retryPolicy) { super(url, apiKey, retryPolicy); this.model = model; this.role = role; this.temperature = temperature; - this.stream = stream; + this.orgId = orgId; } - public OpenAiEndpoint( + public OpenAiChatEndpoint( String url, String apiKey, String orgId, @@ -113,7 +122,7 @@ public OpenAiEndpoint( this.stream = stream; } - public OpenAiEndpoint( + public OpenAiChatEndpoint( String url, String apiKey, String orgId, @@ -130,14 +139,22 @@ public OpenAiEndpoint( this.stream = stream; } - public String getModel() { - return model; - } - public String getRole() { return role; } + public void setRole(String role) { + this.role = role; + } + + public void setInput(String input) { + this.input = input; + } + + public String getModel() { + return model; + } + public Double getTemperature() { return temperature; } @@ -158,10 +175,6 @@ public void setModel(String model) { this.model = model; } - public void setRole(String role) { - this.role = role; - } - public void setTemperature(Double temperature) { this.temperature = temperature; } @@ -170,14 +183,86 @@ public void setStream(Boolean stream) { this.stream = stream; } - public List getChatMessages() { - return chatMessages; + public Double getTopP() { + return topP; + } + + public void setTopP(Double topP) { + this.topP = topP; + } + + public Integer getN() { + return n; + } + + public void setN(Integer n) { + this.n = n; + } + + public List getStop() { + return stop; } public String getInput() { return input; } + public void setStop(List stop) { + this.stop = stop; + } + + public Double getPresencePenalty() { + return presencePenalty; + } + + public void setPresencePenalty(Double presencePenalty) { + this.presencePenalty = presencePenalty; + } + + public Double getFrequencyPenalty() { + return frequencyPenalty; + } + + public void setFrequencyPenalty(Double frequencyPenalty) { + this.frequencyPenalty = frequencyPenalty; + } + + public Map getLogitBias() { + return logitBias; + } + + public void setLogitBias(Map logitBias) { + this.logitBias = logitBias; + } + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public void setCallIdentifier(String callIdentifier) { + this.callIdentifier = callIdentifier; + } + + public List getChatMessages() { + return chatMessages; + } + + public void setChatMessages(List chatMessages) { + this.chatMessages = chatMessages; + } + + public void setJsonnetLoader(JsonnetLoader jsonnetLoader) { + this.jsonnetLoader = jsonnetLoader; + } + + public JsonnetLoader getJsonnetLoader() { + return jsonnetLoader; + } + public String getChainName() { return chainName; } @@ -193,41 +278,55 @@ public String getCallIdentifier() { public Observable chatCompletion( String input, String chainName, ArkRequest arkRequest) { - this.chatMessages = List.of(new ChatMessage(this.role, input)); - this.chainName = chainName; + OpenAiChatEndpoint mapper = modelMapper.map(this, OpenAiChatEndpoint.class); + mapper.setChatMessages(List.of(new ChatMessage(this.role, input))); + mapper.setChainName(chainName); - if (Objects.nonNull(arkRequest)) { - this.callIdentifier = arkRequest.getRequestURI(); - } + return chatCompletion(mapper, arkRequest); + } - if (Objects.nonNull(this.getStream()) && this.getStream()) - return this.openAiStreamService - .chatCompletion(this) - .map( - chatResponse -> { - if (!Objects.isNull(chatResponse.getChoices().get(0).getFinishReason())) { - chatResponse.getChoices().get(0).getMessage().setContent(""); - return chatResponse; - } else return chatResponse; - }); - else return Observable.fromSingle(this.openAiService.chatCompletion(this)); + public Observable chatCompletion( + String input, String chainName, JsonnetLoader loader, ArkRequest arkRequest) { + + OpenAiChatEndpoint mapper = modelMapper.map(this, OpenAiChatEndpoint.class); + mapper.setChatMessages(List.of(new ChatMessage(this.role, input))); + mapper.setChainName(chainName); + mapper.setJsonnetLoader(loader); + + return chatCompletion(mapper, arkRequest); } public Observable chatCompletion( List chatMessages, String chainName, ArkRequest arkRequest) { + OpenAiChatEndpoint mapper = modelMapper.map(this, OpenAiChatEndpoint.class); + mapper.setChatMessages(chatMessages); + mapper.setChainName(chainName); + return chatCompletion(mapper, arkRequest); + } - this.chainName = chainName; - this.chatMessages = chatMessages; + public Observable chatCompletion( + List chatMessages, + String chainName, + JsonnetLoader loader, + ArkRequest arkRequest) { + + OpenAiChatEndpoint mapper = modelMapper.map(this, OpenAiChatEndpoint.class); + mapper.setChatMessages(chatMessages); + mapper.setChainName(chainName); + mapper.setJsonnetLoader(loader); + + return chatCompletion(mapper, arkRequest); + } + + private Observable chatCompletion( + OpenAiChatEndpoint mapper, ArkRequest arkRequest) { - if (Objects.nonNull(arkRequest)) { - this.callIdentifier = arkRequest.getRequestURI(); - } else { - this.callIdentifier = "URI wasn't provided"; - } + if (Objects.nonNull(arkRequest)) mapper.setCallIdentifier(arkRequest.getRequestURI()); + else mapper.setCallIdentifier("URI wasn't provided"); - if (Objects.nonNull(this.getStream()) && this.getStream()) + if (Objects.nonNull(getStream()) && getStream()) return this.openAiStreamService - .chatCompletion(this) + .chatCompletion(mapper) .map( chatResponse -> { if (!Objects.isNull(chatResponse.getChoices().get(0).getFinishReason())) { @@ -235,21 +334,14 @@ public Observable chatCompletion( return chatResponse; } else return chatResponse; }); - else return Observable.fromSingle(this.openAiService.chatCompletion(this)); + else return Observable.fromSingle(this.openAiService.chatCompletion(mapper)); } - public Observable embeddings(String input, ArkRequest arkRequest) { - this.input = input; // set Input - - if (Objects.nonNull(arkRequest)) { - this.callIdentifier = arkRequest.getRequestURI(); - } + public Observable completion(String input, ArkRequest arkRequest) { + if (Objects.nonNull(arkRequest)) this.callIdentifier = arkRequest.getRequestURI(); + else this.callIdentifier = "URI wasn't provided"; - return Observable.fromSingle( - openAiService - .embeddings(this) - .map( - embeddingResponse -> - new WordEmbeddings(input, embeddingResponse.getData().get(0).getEmbedding()))); + this.input = input; + return Observable.fromSingle(this.openAiService.completion(this)); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/SupabaseEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/supabase/SupabaseEndpoint.java similarity index 96% rename from Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/SupabaseEndpoint.java rename to Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/supabase/SupabaseEndpoint.java index 7ff111733..22acc7921 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/SupabaseEndpoint.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/supabase/SupabaseEndpoint.java @@ -1,4 +1,4 @@ -package com.edgechain.lib.endpoint.impl; +package com.edgechain.lib.endpoint.impl.supabase; import com.edgechain.lib.endpoint.Endpoint; import com.edgechain.lib.retrofit.SupabaseService; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/WikiEndpoint.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/wiki/WikiEndpoint.java similarity index 78% rename from Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/WikiEndpoint.java rename to Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/wiki/WikiEndpoint.java index cc9e95871..f03cf381d 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/WikiEndpoint.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/endpoint/impl/wiki/WikiEndpoint.java @@ -1,4 +1,4 @@ -package com.edgechain.lib.endpoint.impl; +package com.edgechain.lib.endpoint.impl.wiki; import com.edgechain.lib.endpoint.Endpoint; import com.edgechain.lib.retrofit.WikiService; @@ -6,6 +6,7 @@ import com.edgechain.lib.rxjava.retry.RetryPolicy; import com.edgechain.lib.wiki.response.WikiResponse; import io.reactivex.rxjava3.core.Observable; +import org.modelmapper.ModelMapper; import retrofit2.Retrofit; public class WikiEndpoint extends Endpoint { @@ -13,13 +14,14 @@ public class WikiEndpoint extends Endpoint { private final Retrofit retrofit = RetrofitClientInstance.getInstance(); private final WikiService wikiService = retrofit.create(WikiService.class); + private ModelMapper modelMapper = new ModelMapper(); + private String input; public WikiEndpoint() {} public WikiEndpoint(RetryPolicy retryPolicy) { super(retryPolicy); - this.input = input; } public String getInput() { @@ -31,7 +33,8 @@ public void setInput(String input) { } public Observable getPageContent(String input) { - this.input = input; - return Observable.fromSingle(this.wikiService.getPageContent(this)); + WikiEndpoint mapper = modelMapper.map(this, WikiEndpoint.class); + mapper.setInput(input); + return Observable.fromSingle(this.wikiService.getPageContent(mapper)); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/ProjectRunner.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/ProjectRunner.java index 488460574..f2f8669cd 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/ProjectRunner.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/ProjectRunner.java @@ -1,11 +1,19 @@ package com.edgechain.lib.flyfly.commands.run; -import static java.nio.file.StandardWatchEventKinds.*; - import com.edgechain.lib.flyfly.utils.ProjectSetup; import jakarta.annotation.PreDestroy; -import java.io.*; -import java.nio.file.*; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.WatchEvent; +import java.nio.file.WatchKey; +import java.nio.file.WatchService; import java.nio.file.attribute.BasicFileAttributes; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -15,11 +23,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.zeroturnaround.exec.ProcessExecutor; +import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; +import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; +import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; @Component public class ProjectRunner { - private final Logger log = LoggerFactory.getLogger(this.getClass()); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired TestContainersStarter testContainersStarter; @Autowired ProjectSetup projectSetup; @@ -31,30 +42,35 @@ public class ProjectRunner { public void run() { try { - log.info("Configuring the project"); - log.info("Checking if initscript exists"); + logger.info("Configuring the project"); + logger.info("Checking if initscript exists"); if (!projectSetup.initscriptExists()) { - log.info("Initscript doesn't exist"); - log.info("Adding flyfly.gradle to initscripts"); + logger.info("Initscript doesn't exist"); + logger.info("Adding flyfly.gradle to initscripts"); projectSetup.addInitscript(); } projectSetup.addAutorouteJar(); allowInfrastructureServices = isDockerInstalled(); if (allowInfrastructureServices) checkAndConfigureServices(); - log.debug("registering watcher for src files changes"); + logger.debug("registering watcher for src files changes"); registerFilesWatcher(); - log.debug("registering watcher for build file changes"); + logger.debug("registering watcher for build file changes"); registerBuildFileWatcher(); - log.info("Starting the project"); + logger.info("Starting the project"); runTheProject(); loop(); + + } catch (InterruptedException ie) { + logger.warn("interrupted", ie); + Thread.currentThread().interrupt(); + } catch (Exception e) { - e.printStackTrace(); + logger.error("failed", e); } } boolean isDockerInstalled() throws IOException, InterruptedException { - log.info("Checking if docker is installed to allow infrastructure services"); + logger.info("Checking if docker is installed to allow infrastructure services"); int exitCode; try { String[] command; @@ -62,11 +78,19 @@ boolean isDockerInstalled() throws IOException, InterruptedException { else command = new String[] {"docker", "info"}; exitCode = new ProcessExecutor().command(command).start().getProcess().waitFor(); + + } catch (InterruptedException ie) { + logger.warn("interrupted", ie); + Thread.currentThread().interrupt(); + exitCode = -1; + } catch (Exception e) { + logger.error("failed", e); exitCode = -1; } + if (exitCode != 0) { - log.warn("Couldn't find docker. Disabling infrastructure services."); + logger.warn("Couldn't find docker. Disabling infrastructure services."); return false; } return true; @@ -82,9 +106,9 @@ void runTheProject() throws IOException { } void checkAndConfigureServices() throws IOException { - log.info("Checking if services are needed"); - // Set supportedDBGroupIds = - // Set.of("mysql", "com.mysql", "org.postgresql", "org.mariadb.jdbc"); + logger.info("Checking if services are needed"); + // Set supportedDBGroupIds = + // Set.of("mysql", "com.mysql", "org.postgresql", "org.mariadb.jdbc"); Set supportedDBGroupIds = Set.of("org.postgresql"); BufferedReader reader = new BufferedReader(new FileReader("build.gradle")); String line; @@ -96,12 +120,12 @@ void checkAndConfigureServices() throws IOException { if (start < 0 || end < 0) continue; String groupID = line.substring(start + 1, end); if (supportedDBGroupIds.contains(groupID)) { - if (!testContainersStarter.isServiesNeeded()) break; - log.info("Found : " + groupID); + if (!testContainersStarter.isServiceNeeded()) break; + logger.info("Found : {}", groupID); switch (groupID) { - // case "mysql", "com.mysql" -> testContainersStarter.startMySQL(); + // case "mysql", "com.mysql" -> testContainersStarter.startMySQL(); case "org.postgresql" -> testContainersStarter.startPostgreSQL(); - // case "org.mariadb.jdbc" -> testContainersStarter.startMariaDB(); + // case "org.mariadb.jdbc" -> testContainersStarter.startMariaDB(); } break; } @@ -167,7 +191,7 @@ boolean didBuildFileChange() throws InterruptedException { if (p.endsWith("build.gradle")) found = true; } key.reset(); - if (found) log.info("Detected build file change ..."); + if (found) logger.info("Detected build file change ..."); return found; } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/TestContainersStarter.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/TestContainersStarter.java index edea76f91..2ba68603a 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/TestContainersStarter.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/commands/run/TestContainersStarter.java @@ -1,9 +1,12 @@ package com.edgechain.lib.flyfly.commands.run; import jakarta.annotation.PreDestroy; -import java.io.*; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; import java.nio.file.FileSystems; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -14,121 +17,152 @@ public class TestContainersStarter { private final Logger log = LoggerFactory.getLogger(this.getClass()); - private static final String dbName = "test"; - private static final String userName = "test"; - private static final String password = "test"; - // private MySQLContainer mysql; + private static final String DBNAME = "test"; + private static final String USERNAME = "test"; + private static final String PASSWORD = "test"; + // private MySQLContainer mysql; private PostgreSQLContainer postgre; - // private MariaDBContainer mariaDB; - private String flyflyTempTag = "#flyfly_temp_property"; - - // public void startMySQL() throws IOException { - // if (mysql != null && mysql.isRunning()) return; - // log.info("Starting a temporary MySQL database."); - // mysql = - // new MySQLContainer<>(DockerImageName.parse("mysql:5.7")) - // .withDatabaseName(dbName) - // .withUsername(userName) - // .withPassword(password); - // mysql.addParameter("TC_MY_CNF", null); - // mysql.start(); - // log.info("Database started."); - // log.info("DB URL: " + mysql.getJdbcUrl()); - // log.info("DB Username: " + mysql.getUsername()); - // log.info("DB Password: " + mysql.getPassword()); - // addTempProperties(mysql.getJdbcUrl()); - // } + // private MariaDBContainer mariaDB; + static final String FLYFLYTEMPTAG = "#flyfly_temp_property"; + + private String propertiesPath; + + public TestContainersStarter() { + propertiesPath = buildPropertiesPath(); + } + + public String getPropertiesPath() { + return propertiesPath; + } + + public void setPropertiesPath(String propertiesPath) { + this.propertiesPath = propertiesPath; + } + + // public void startMySQL() throws IOException { + // if (mysql != null && mysql.isRunning()) return; + // log.info("Starting a temporary MySQL database."); + // mysql = + // new MySQLContainer<>(DockerImageName.parse("mysql:5.7")) + // .withDatabaseName(dbName) + // .withUsername(userName) + // .withPassword(password); + // mysql.addParameter("TC_MY_CNF", null); + // mysql.start(); + // log.info("Database started."); + // log.info("DB URL: " + mysql.getJdbcUrl()); + // log.info("DB Username: " + mysql.getUsername()); + // log.info("DB Password: " + mysql.getPassword()); + // addTempProperties(mysql.getJdbcUrl()); + // } public void startPostgreSQL() throws IOException { if (postgre != null && postgre.isRunning()) return; log.info("Starting a temporary PostgreSQL database."); postgre = new PostgreSQLContainer<>("postgres:14.5") - .withDatabaseName(dbName) - .withUsername(userName) - .withPassword(password); + .withDatabaseName(DBNAME) + .withUsername(USERNAME) + .withPassword(PASSWORD); postgre.addParameter("TC_MY_CNF", null); postgre.start(); + log.info("Database started."); - log.info("DB URL: " + postgre.getJdbcUrl()); - log.info("DB Username: " + postgre.getUsername()); - log.info("DB Password: " + postgre.getPassword()); + log.info("DB URL: {}", postgre.getJdbcUrl()); + log.info("DB Username: {}", postgre.getUsername()); + log.info("DB Password: {}", postgre.getPassword()); + addTempProperties(postgre.getJdbcUrl()); } - // public void startMariaDB() throws IOException { - // if (postgre != null && postgre.isRunning()) return; - // log.info("Starting a temporary MariaDB database."); - // mariaDB = - // new MariaDBContainer<>("mariadb:10.3.6") - // .withDatabaseName(dbName) - // .withUsername(userName) - // .withPassword(password); - // mariaDB.addParameter("TC_MY_CNF", null); - // mariaDB.start(); - // log.info("Database started."); - // log.info("DB URL: " + mariaDB.getJdbcUrl()); - // log.info("DB Username: " + mariaDB.getUsername()); - // log.info("DB Password: " + mariaDB.getPassword()); - // addTempProperties(mariaDB.getJdbcUrl()); - // } + public void stopPostgreSQL() throws IOException { + try { + removeTempProperties(); + } catch (IOException e) { + } + // if (mysql != null && mysql.isRunning()) mysql.close(); + log.info("Stopping temporary PostgreSQL database."); + if (postgre != null && postgre.isRunning()) postgre.close(); + // if (mariaDB != null && mariaDB.isRunning()) mariaDB.close(); + } + + // public void startMariaDB() throws IOException { + // if (postgre != null && postgre.isRunning()) return; + // log.info("Starting a temporary MariaDB database."); + // mariaDB = + // new MariaDBContainer<>("mariadb:10.3.6") + // .withDatabaseName(dbName) + // .withUsername(userName) + // .withPassword(password); + // mariaDB.addParameter("TC_MY_CNF", null); + // mariaDB.start(); + // log.info("Database started."); + // log.info("DB URL: " + mariaDB.getJdbcUrl()); + // log.info("DB Username: " + mariaDB.getUsername()); + // log.info("DB Password: " + mariaDB.getPassword()); + // addTempProperties(mariaDB.getJdbcUrl()); + // } public void addTempProperties(String url) throws IOException { log.info("Appending temporary DB configuration to application.properties"); - BufferedWriter writer = new BufferedWriter(new FileWriter(getPropertiesPath(), true)); - writer.newLine(); - writer.append(flyflyTempTag); - writer.newLine(); - writer.append("spring.datasource.url=" + url); - writer.newLine(); - writer.append(flyflyTempTag); - writer.newLine(); - writer.append("spring.datasource.username=" + userName); - writer.newLine(); - writer.append(flyflyTempTag); - writer.newLine(); - writer.append("spring.datasource.password=" + password); - writer.flush(); - writer.close(); + try (FileWriter fw = new FileWriter(propertiesPath, true); + BufferedWriter writer = new BufferedWriter(fw)) { + writer.newLine(); + writer.append(FLYFLYTEMPTAG); + writer.newLine(); + writer.append("spring.datasource.url=").append(url); + writer.newLine(); + writer.append(FLYFLYTEMPTAG); + writer.newLine(); + writer.append("spring.datasource.username=").append(USERNAME); + writer.newLine(); + writer.append(FLYFLYTEMPTAG); + writer.newLine(); + writer.append("spring.datasource.password=").append(PASSWORD); + writer.flush(); + } } public void removeTempProperties() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(getPropertiesPath())); - StringBuilder sb = new StringBuilder(); + log.info("Removing temporary DB configuration from application.properties"); boolean tempNotFound = true; - String line; - while ((line = reader.readLine()) != null) { - if (line.contains(flyflyTempTag)) { - tempNotFound = false; - reader.readLine(); - continue; + StringBuilder sb = new StringBuilder(); + try (FileReader fr = new FileReader(propertiesPath); + BufferedReader reader = new BufferedReader(fr)) { + String line; + while ((line = reader.readLine()) != null) { + if (line.contains(FLYFLYTEMPTAG)) { + tempNotFound = false; + reader.readLine(); // skip next line + continue; + } + sb.append(line).append("\n"); } - sb.append(line + "\n"); } - reader.close(); if (tempNotFound) return; - BufferedWriter writer = new BufferedWriter(new FileWriter(getPropertiesPath())); - writer.write(sb.toString()); - writer.flush(); - writer.close(); + try (FileWriter fw = new FileWriter(propertiesPath); + BufferedWriter writer = new BufferedWriter(fw)) { + writer.write(sb.toString()); + writer.flush(); + } } - public boolean isServiesNeeded() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(getPropertiesPath())); - String line; - String datafield = "spring.datasource.url"; - while ((line = reader.readLine()) != null) { - if (line.contains(datafield)) { - reader.close(); - return false; + public boolean isServiceNeeded() throws IOException { + final String datafield = "spring.datasource.url"; + try (FileReader fr = new FileReader(propertiesPath); + BufferedReader reader = new BufferedReader(fr)) { + String line; + while ((line = reader.readLine()) != null) { + if (line.contains(datafield)) { + return false; + } } } - reader.close(); return true; } - public String getPropertiesPath() { + private static String buildPropertiesPath() { String separator = FileSystems.getDefault().getSeparator(); return System.getProperty("user.dir") + separator @@ -144,11 +178,8 @@ public String getPropertiesPath() { @PreDestroy public void destroy() { try { - removeTempProperties(); + stopPostgreSQL(); } catch (IOException e) { } - // if (mysql != null && mysql.isRunning()) mysql.close(); - if (postgre != null && postgre.isRunning()) postgre.close(); - // if (mariaDB != null && mariaDB.isRunning()) mariaDB.close(); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/ProjectSetup.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/ProjectSetup.java index d6b86789d..cf26a9e7d 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/ProjectSetup.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/flyfly/utils/ProjectSetup.java @@ -25,7 +25,7 @@ public class ProjectSetup { private String glowrootDir = flyflyDir + separator + "glowroot"; public boolean initscriptExists() { - log.debug("Checking if flyfly.gradle exists in " + initscriptDir); + log.debug("Checking if flyfly.gradle exists in {}", initscriptDir); return new File(initscriptDir).exists(); } @@ -44,7 +44,7 @@ public void addAutorouteJar() throws IOException { } public boolean formatScriptExists() { - log.debug("Checking if format.gradle exists in " + formatScriptDir); + log.debug("Checking if format.gradle exists in {}", formatScriptDir); return new File(formatScriptDir).exists(); } @@ -55,7 +55,7 @@ public void addFormatScript() throws IOException { } public boolean glowrootAgentExists() { - log.debug("Checking if glowroot folder exists in " + glowrootDir); + log.debug("Checking if glowroot folder exists in {}", glowrootDir); return new File(glowrootDir).exists(); } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PineconeClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PineconeClient.java index adcfd1c65..6b5d84f75 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PineconeClient.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PineconeClient.java @@ -1,6 +1,6 @@ package com.edgechain.lib.index.client.impl; -import com.edgechain.lib.endpoint.impl.PineconeEndpoint; +import com.edgechain.lib.endpoint.impl.index.PineconeEndpoint; import com.edgechain.lib.index.request.pinecone.PineconeUpsert; import com.edgechain.lib.embeddings.WordEmbeddings; import com.edgechain.lib.response.StringResponse; @@ -18,36 +18,51 @@ @Service public class PineconeClient { - private PineconeEndpoint endpoint; - private String namespace; + public EdgeChain upsert(PineconeEndpoint endpoint) { + return new EdgeChain<>( + Observable.create( + emitter -> { + try { - public PineconeEndpoint getEndpoint() { - return endpoint; - } + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set("Api-Key", endpoint.getApiKey()); + + PineconeUpsert pinecone = new PineconeUpsert(); + pinecone.setVectors(List.of(endpoint.getWordEmbedding())); + pinecone.setNamespace(getNamespace(endpoint)); + + HttpEntity entity = new HttpEntity<>(pinecone, headers); + + ResponseEntity response = + new RestTemplate() + .exchange(endpoint.getUrl(), HttpMethod.POST, entity, String.class); + + emitter.onNext(new StringResponse(response.getBody())); + emitter.onComplete(); - public void setEndpoint(PineconeEndpoint endpoint) { - this.endpoint = endpoint; + } catch (final Exception e) { + emitter.onError(e); + } + }), + endpoint); } - public EdgeChain upsert(WordEmbeddings wordEmbeddings) { + public EdgeChain batchUpsert(PineconeEndpoint endpoint) { return new EdgeChain<>( Observable.create( emitter -> { try { - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "" - : endpoint.getNamespace(); - HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Api-Key", endpoint.getApiKey()); PineconeUpsert pinecone = new PineconeUpsert(); - pinecone.setVectors(List.of(wordEmbeddings)); - pinecone.setNamespace(namespace); + pinecone.setVectors(endpoint.getWordEmbeddingsList()); + pinecone.setNamespace(getNamespace(endpoint)); HttpEntity entity = new HttpEntity<>(pinecone, headers); @@ -65,18 +80,13 @@ public EdgeChain upsert(WordEmbeddings wordEmbeddings) { endpoint); } - public EdgeChain> query(WordEmbeddings wordEmbeddings, int topK) { + public EdgeChain> query(PineconeEndpoint endpoint) { return new EdgeChain<>( Observable.create( emitter -> { try { - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "" - : endpoint.getNamespace(); - HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setContentType(MediaType.APPLICATION_JSON); @@ -86,9 +96,9 @@ public EdgeChain> query(WordEmbeddings wordEmbeddings, int Map payload = new LinkedHashMap<>(); payload.put("includeValues", true); payload.put("includeMetadata", false); - payload.put("vector", wordEmbeddings.getValues()); - payload.put("top_k", topK); - payload.put("namespace", this.namespace); + payload.put("vector", endpoint.getWordEmbedding().getValues()); + payload.put("top_k", endpoint.getTopK()); + payload.put("namespace", getNamespace(endpoint)); HttpEntity> entity = new HttpEntity<>(payload, headers); @@ -105,18 +115,13 @@ public EdgeChain> query(WordEmbeddings wordEmbeddings, int endpoint); } - public EdgeChain deleteAll() { + public EdgeChain deleteAll(PineconeEndpoint endpoint) { return new EdgeChain<>( Observable.create( emitter -> { try { - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "" - : endpoint.getNamespace(); - HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setContentType(MediaType.APPLICATION_JSON); @@ -124,7 +129,7 @@ public EdgeChain deleteAll() { Map body = new HashMap<>(); body.put("deleteAll", true); - body.put("namespace", namespace); + body.put("namespace", getNamespace(endpoint)); HttpEntity> entity = new HttpEntity<>(body, headers); @@ -134,7 +139,7 @@ public EdgeChain deleteAll() { emitter.onNext( new StringResponse( "Word embeddings are successfully deleted for namespace:" - + this.namespace)); + + getNamespace(endpoint))); emitter.onComplete(); } catch (final Exception e) { @@ -158,4 +163,10 @@ private List parsePredict(String body) throws IOException { return words2VecList; } + + public String getNamespace(PineconeEndpoint endpoint) { + return (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) + ? "" + : endpoint.getNamespace(); + } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PostgresClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PostgresClient.java index e3652b284..44b3425b4 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PostgresClient.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/PostgresClient.java @@ -1,71 +1,214 @@ package com.edgechain.lib.index.client.impl; -import com.edgechain.lib.configuration.context.ApplicationContextHolder; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; import com.edgechain.lib.index.domain.PostgresWordEmbeddings; -import com.edgechain.lib.index.enums.PostgresDistanceMetric; +import com.edgechain.lib.index.repositories.PostgresClientMetadataRepository; import com.edgechain.lib.index.repositories.PostgresClientRepository; import com.edgechain.lib.response.StringResponse; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import io.reactivex.rxjava3.core.Observable; -import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.sql.Date; import java.sql.Timestamp; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import org.postgresql.util.PGobject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; @Service public class PostgresClient { - private PostgresEndpoint postgresEndpoint; - private String namespace; + private static final Logger logger = LoggerFactory.getLogger(PostgresClient.class); + + private static final TypeReference> FLOAT_TYPE_REF = new TypeReference<>() {}; - private final PostgresClientRepository repository = - ApplicationContextHolder.getContext().getBean(PostgresClientRepository.class); + @Autowired private PostgresClientRepository repository; - public PostgresEndpoint getPostgresEndpoint() { - return postgresEndpoint; + @Autowired private PostgresClientMetadataRepository metadataRepository; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + public EdgeChain createTable(PostgresEndpoint postgresEndpoint) { + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + this.repository.createTable(postgresEndpoint); + emitter.onNext(new StringResponse("Table: " + postgresEndpoint.getTableName())); + emitter.onComplete(); + } catch (final Exception e) { + emitter.onError(e); + } + })); } - public void setPostgresEndpoint(PostgresEndpoint postgresEndpoint) { - this.postgresEndpoint = postgresEndpoint; + public EdgeChain createMetadataTable(PostgresEndpoint postgresEndpoint) { + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + this.metadataRepository.createTable(postgresEndpoint); + emitter.onNext( + new StringResponse( + "Table: " + postgresEndpoint.getMetadataTableNames().get(0))); + emitter.onComplete(); + } catch (final Exception e) { + emitter.onError(e); + } + })); } - public String getNamespace() { - return namespace; + public EdgeChain> batchUpsert(PostgresEndpoint postgresEndpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + // Upsert Embeddings + List strings = + this.repository.batchUpsertEmbeddings( + postgresEndpoint.getTableName(), + postgresEndpoint.getWordEmbeddingsList(), + postgresEndpoint.getFilename(), + getNamespace(postgresEndpoint), + postgresEndpoint.getPostgresLanguage()); + + List stringResponseList = + strings.stream().map(StringResponse::new).toList(); + + emitter.onNext(stringResponseList); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + }), + postgresEndpoint); } - public void setNamespace(String namespace) { - this.namespace = namespace; + public EdgeChain upsert(PostgresEndpoint postgresEndpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + // Upsert Embeddings + String embeddingId = + this.repository.upsertEmbeddings( + postgresEndpoint.getTableName(), + postgresEndpoint.getWordEmbedding(), + postgresEndpoint.getFilename(), + getNamespace(postgresEndpoint), + postgresEndpoint.getPostgresLanguage()); + + emitter.onNext(new StringResponse(embeddingId)); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + }), + postgresEndpoint); } - public EdgeChain upsert(WordEmbeddings wordEmbeddings) { + public EdgeChain insertMetadata(PostgresEndpoint postgresEndpoint) { return new EdgeChain<>( Observable.create( emitter -> { try { + String metadata = postgresEndpoint.getMetadata(); + String input = metadata.replace("'", ""); - this.namespace = - (Objects.isNull(postgresEndpoint.getNamespace()) - || postgresEndpoint.getNamespace().isEmpty()) - ? "knowledge" - : postgresEndpoint.getNamespace(); + String metadataId = + this.metadataRepository.insertMetadata( + postgresEndpoint.getTableName(), + postgresEndpoint.getMetadataTableNames().get(0), + input, + postgresEndpoint.getDocumentDate()); - // Create Table - this.repository.createTable(postgresEndpoint); + emitter.onNext(new StringResponse(metadataId)); + emitter.onComplete(); - String input = wordEmbeddings.getId().replaceAll("'", ""); + } catch (final Exception e) { + emitter.onError(e); + } + }), + postgresEndpoint); + } - // Upsert Embeddings - this.repository.upsertEmbeddings( + public EdgeChain> batchInsertMetadata(PostgresEndpoint postgresEndpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + // Insert metadata + List strings = + this.metadataRepository.batchInsertMetadata( + postgresEndpoint.getTableName(), + postgresEndpoint.getMetadataTableNames().get(0), + postgresEndpoint.getMetadataList()); + + List stringResponseList = + strings.stream().map(StringResponse::new).toList(); + + emitter.onNext(stringResponseList); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + }), + postgresEndpoint); + } + + public EdgeChain insertIntoJoinTable(PostgresEndpoint postgresEndpoint) { + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + this.metadataRepository.insertIntoJoinTable(postgresEndpoint); + + emitter.onNext(new StringResponse("Inserted")); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + }), + postgresEndpoint); + } + + public EdgeChain batchInsertIntoJoinTable(PostgresEndpoint postgresEndpoint) { + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + this.metadataRepository.batchInsertIntoJoinTable( postgresEndpoint.getTableName(), - input, - postgresEndpoint.getFilename(), - wordEmbeddings, - this.namespace); + postgresEndpoint.getMetadataTableNames().get(0), + postgresEndpoint.getIdList(), + postgresEndpoint.getMetadataId()); - emitter.onNext(new StringResponse("Upserted")); + emitter.onNext(new StringResponse("Inserted")); emitter.onComplete(); } catch (final Exception e) { @@ -75,39 +218,290 @@ public EdgeChain upsert(WordEmbeddings wordEmbeddings) { postgresEndpoint); } - public EdgeChain> query( - WordEmbeddings wordEmbeddings, PostgresDistanceMetric metric, int topK, int probes) { + public EdgeChain> query(PostgresEndpoint postgresEndpoint) { return new EdgeChain<>( Observable.create( emitter -> { try { - this.namespace = - (Objects.isNull(postgresEndpoint.getNamespace()) - || postgresEndpoint.getNamespace().isEmpty()) - ? "knowledge" - : postgresEndpoint.getNamespace(); + List wordEmbeddingsList = new ArrayList<>(); + + List> embeddings = + postgresEndpoint.getWordEmbeddingsList().stream() + .map(WordEmbeddings::getValues) + .toList(); List> rows = this.repository.query( postgresEndpoint.getTableName(), - this.namespace, - probes, - metric, - wordEmbeddings, - topK); + getNamespace(postgresEndpoint), + postgresEndpoint.getProbes(), + postgresEndpoint.getMetric(), + embeddings, + postgresEndpoint.getTopK(), + postgresEndpoint.getUpperLimit()); + + for (Map row : rows) { + + PostgresWordEmbeddings val = new PostgresWordEmbeddings(); + val.setId(Objects.nonNull(row.get("id")) ? row.get("id").toString() : null); + val.setRawText( + Objects.nonNull(row.get("raw_text")) ? (String) row.get("raw_text") : null); + val.setFilename( + Objects.nonNull(row.get("filename")) ? (String) row.get("filename") : null); + val.setTimestamp( + Objects.nonNull(row.get("timestamp")) + ? ((Timestamp) row.get("timestamp")).toLocalDateTime() + : null); + val.setNamespace( + Objects.nonNull(row.get("namespace")) ? (String) row.get("namespace") : null); + + val.setScore( + Objects.nonNull(row.get("score")) ? (Double) row.get("score") : null); + + PGobject pgObject = (PGobject) row.get("embedding"); + String jsonString = pgObject.getValue(); + List values = objectMapper.readerFor(FLOAT_TYPE_REF).readValue(jsonString); + val.setValues(values); + + wordEmbeddingsList.add(val); + } + emitter.onNext(wordEmbeddingsList); + emitter.onComplete(); + } catch (final Exception e) { + emitter.onError(e); + } + }), + postgresEndpoint); + } + + public EdgeChain> queryRRF(PostgresEndpoint postgresEndpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { List wordEmbeddingsList = new ArrayList<>(); + List> embeddings = + postgresEndpoint.getWordEmbeddingsList().stream() + .map(WordEmbeddings::getValues) + .toList(); - for (Map row : rows) { + List> rows = + this.repository.queryRRF( + postgresEndpoint.getTableName(), + getNamespace(postgresEndpoint), + postgresEndpoint.getMetadataTableNames().get(0), + embeddings, + postgresEndpoint.getTextWeight(), + postgresEndpoint.getSimilarityWeight(), + postgresEndpoint.getDateWeight(), + postgresEndpoint.getSearchQuery(), + postgresEndpoint.getPostgresLanguage(), + postgresEndpoint.getProbes(), + postgresEndpoint.getMetric(), + postgresEndpoint.getTopK(), + postgresEndpoint.getUpperLimit(), + postgresEndpoint.getOrderRRFBy()); + + for (Map row : rows) { PostgresWordEmbeddings val = new PostgresWordEmbeddings(); - val.setId((String) row.get("id")); + val.setId(Objects.nonNull(row.get("id")) ? row.get("id").toString() : null); + val.setRawText( + Objects.nonNull(row.get("raw_text")) ? (String) row.get("raw_text") : null); + + val.setFilename( + Objects.nonNull(row.get("filename")) ? (String) row.get("filename") : null); + val.setTimestamp( + Objects.nonNull(row.get("timestamp")) + ? ((Timestamp) row.get("timestamp")).toLocalDateTime() + : null); + val.setNamespace( + Objects.nonNull(row.get("namespace")) ? (String) row.get("namespace") : null); + + BigDecimal bigDecimal = + Objects.nonNull(row.get("rrf_score")) + ? (BigDecimal) row.get("rrf_score") + : null; + val.setScore(bigDecimal.doubleValue()); + + if (postgresEndpoint.getMetadataTableNames().get(0).contains("title")) { + val.setTitleMetadata( + Objects.nonNull(row.get("metadata")) ? (String) row.get("metadata") : null); + } else { + val.setMetadata( + Objects.nonNull(row.get("metadata")) ? (String) row.get("metadata") : null); + } + Date documentDate = + Objects.nonNull(row.get("document_date")) + ? (Date) row.get("document_date") + : null; + val.setDocumentDate(documentDate.toString()); + + wordEmbeddingsList.add(val); + } + emitter.onNext(wordEmbeddingsList); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + }), + postgresEndpoint); + } + + public EdgeChain> queryWithMetadata( + PostgresEndpoint postgresEndpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + List wordEmbeddingsList = new ArrayList<>(); + if (postgresEndpoint.getMetadataTableNames() != null) { + try { + List metadataTableNames = postgresEndpoint.getMetadataTableNames(); + int numberOfMetadataTables = metadataTableNames.size(); + + /* + * This map will store the pairs + * We need to extract the title info from another metadata table. + * So instead of having extra PostgresWordEmbeddings objects for the title info + * We can store the title info in a map corresponding to the id key of the embeddings table + * Then after the loop is over we can inject the title field in the correct PostgresWordEmbeddings object by using the id key. + */ + Map titleMetadataMap = new HashMap<>(); + Map dateMetadataMap = new HashMap<>(); + for (String metadataTableName : metadataTableNames) { + List> rows = + this.metadataRepository.queryWithMetadata( + postgresEndpoint.getTableName(), + metadataTableName, + getNamespace(postgresEndpoint), + postgresEndpoint.getProbes(), + postgresEndpoint.getMetric(), + postgresEndpoint.getWordEmbedding().getValues(), + postgresEndpoint.getTopK()); + + // To filter out duplicate context chunks + Set contextChunkIds = new HashSet<>(); + for (Map row : rows) { + String metadataId = row.get("metadata_id").toString(); + if (!metadataTableName.contains("title_metadata") + && contextChunkIds.contains(metadataId)) continue; + + PostgresWordEmbeddings val = new PostgresWordEmbeddings(); + final String idStr = + Objects.nonNull(row.get("id")) ? row.get("id").toString() : null; + val.setId(idStr); + val.setRawText( + Objects.nonNull(row.get("raw_text")) + ? (String) row.get("raw_text") + : null); + val.setFilename( + Objects.nonNull(row.get("filename")) + ? (String) row.get("filename") + : null); + val.setTimestamp( + Objects.nonNull(row.get("timestamp")) + ? ((Timestamp) row.get("timestamp")).toLocalDateTime() + : null); + val.setNamespace( + Objects.nonNull(row.get("namespace")) + ? (String) row.get("namespace") + : null); + val.setScore( + Objects.nonNull(row.get("score")) ? (Double) row.get("score") : null); + + // Add metadata fields in response + if (metadataTableName.contains("title_metadata")) { + titleMetadataMap.put(idStr, (String) row.get("metadata")); + dateMetadataMap.put(idStr, (String) row.get("document_date")); + + // For checking if only one metadata table is present which is the title + // table + if (numberOfMetadataTables > 1) continue; + } else { + val.setMetadata((String) row.get("metadata")); + } + contextChunkIds.add(metadataId); + wordEmbeddingsList.add(val); + } + + // Insert the title and date fields into their respective + // PostgresWordEmbeddings + for (PostgresWordEmbeddings wordEmbedding : wordEmbeddingsList) { + String id = wordEmbedding.getId(); + if (titleMetadataMap.containsKey(id)) { + wordEmbedding.setTitleMetadata(titleMetadataMap.get(id)); + } + if (dateMetadataMap.containsKey(id)) { + wordEmbedding.setDocumentDate(dateMetadataMap.get(id)); + } + } + } + } catch (Exception e) { + logger.warn("ignored query error", e); + } + } + + emitter.onNext(wordEmbeddingsList); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + }), + postgresEndpoint); + } + + public EdgeChain> getAllChunks(PostgresEndpoint postgresEndpoint) { + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + List wordEmbeddingsList = new ArrayList<>(); + List> rows = this.repository.getAllChunks(postgresEndpoint); + for (Map row : rows) { + PostgresWordEmbeddings val = new PostgresWordEmbeddings(); + val.setId(row.get("id").toString()); val.setRawText((String) row.get("raw_text")); val.setFilename((String) row.get("filename")); - val.setTimestamp(((Timestamp) row.get("timestamp")).toLocalDateTime()); - val.setNamespace((String) row.get("namespace")); - val.setScore((Double) row.get("score")); + PGobject pgObject = (PGobject) row.get("embedding"); + String jsonString = pgObject.getValue(); + List values = objectMapper.readerFor(FLOAT_TYPE_REF).readValue(jsonString); + val.setValues(values); + wordEmbeddingsList.add(val); + } + emitter.onNext(wordEmbeddingsList); + emitter.onComplete(); + } catch (final Exception e) { + emitter.onError(e); + } + }), + postgresEndpoint); + } + + public EdgeChain> getSimilarMetadataChunk( + PostgresEndpoint postgresEndpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + List wordEmbeddingsList = new ArrayList<>(); + List> rows = + this.metadataRepository.getSimilarMetadataChunk( + postgresEndpoint.getTableName(), + postgresEndpoint.getMetadataTableNames().get(0), + postgresEndpoint.getEmbeddingChunk()); + for (Map row : rows) { + + PostgresWordEmbeddings val = new PostgresWordEmbeddings(); + val.setMetadataId(row.get("metadata_id").toString()); + val.setMetadata((String) row.get("metadata")); wordEmbeddingsList.add(val); } @@ -122,23 +516,17 @@ public EdgeChain> query( postgresEndpoint); } - public EdgeChain deleteAll() { + public EdgeChain deleteAll(PostgresEndpoint postgresEndpoint) { return new EdgeChain<>( Observable.create( emitter -> { - this.namespace = - (Objects.isNull(postgresEndpoint.getNamespace()) - || postgresEndpoint.getNamespace().isEmpty()) - ? "knowledge" - : postgresEndpoint.getNamespace(); - + String namespace = getNamespace(postgresEndpoint); try { - this.repository.deleteAll(postgresEndpoint.getTableName(), this.namespace); + this.repository.deleteAll(postgresEndpoint.getTableName(), namespace); emitter.onNext( new StringResponse( - "Word embeddings are successfully deleted for namespace:" - + this.namespace)); + "Word embeddings are successfully deleted for namespace:" + namespace)); emitter.onComplete(); } catch (final Exception e) { emitter.onError(e); @@ -146,4 +534,11 @@ public EdgeChain deleteAll() { }), postgresEndpoint); } + + private String getNamespace(PostgresEndpoint postgresEndpoint) { + return (Objects.isNull(postgresEndpoint.getNamespace()) + || postgresEndpoint.getNamespace().isEmpty()) + ? "knowledge" + : postgresEndpoint.getNamespace(); + } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/RedisClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/RedisClient.java index 7f1c3790b..c436e1033 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/RedisClient.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/client/impl/RedisClient.java @@ -1,7 +1,7 @@ package com.edgechain.lib.index.client.impl; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.RedisEndpoint; +import com.edgechain.lib.endpoint.impl.index.RedisEndpoint; import com.edgechain.lib.index.enums.RedisDistanceMetric; import com.edgechain.lib.index.responses.RedisDocument; import com.edgechain.lib.index.responses.RedisProperty; @@ -16,7 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import redis.clients.jedis.JedisPooled; +import redis.clients.jedis.*; import redis.clients.jedis.search.*; import java.util.*; @@ -30,84 +30,105 @@ public class RedisClient { + " local res = redis.call('del', k)" + " end"; - private RedisEndpoint endpoint; - - private String indexName; - private String namespace; - - public RedisEndpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(RedisEndpoint endpoint) { - this.endpoint = endpoint; - } - private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private JedisPooled jedisPooled; - public EdgeChain upsert( - WordEmbeddings words2Vec, int dimension, RedisDistanceMetric metric) { - + public EdgeChain createIndex(RedisEndpoint endpoint) { return new EdgeChain<>( Observable.create( emitter -> { try { + this.createSearchIndex( + getNamespace(endpoint), + endpoint.getIndexName(), + endpoint.getDimensions(), + endpoint.getMetric()); + emitter.onNext(new StringResponse("Created Index ~ ")); + emitter.onComplete(); + } catch (final Exception e) { + emitter.onError(e); + } + })); + } - this.indexName = endpoint.getIndexName(); - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "knowledge" - : endpoint.getNamespace(); + public EdgeChain upsert(RedisEndpoint endpoint) { - this.createSearchIndex(dimension, RedisDistanceMetric.getDistanceMetric(metric)); + return new EdgeChain<>( + Observable.create( + emitter -> { + try (Jedis jedis = new Jedis(jedisPooled.getPool().getResource())) { Map map = new HashMap<>(); - map.put("id".getBytes(), words2Vec.getId().getBytes()); + map.put("id".getBytes(), endpoint.getWordEmbedding().getId().getBytes()); map.put( "values".getBytes(), - FloatUtils.toByteArray(FloatUtils.toFloatArray(words2Vec.getValues()))); + FloatUtils.toByteArray( + FloatUtils.toFloatArray(endpoint.getWordEmbedding().getValues()))); long v = - jedisPooled.hset((this.namespace + ":" + words2Vec.getId()).getBytes(), map); - - jedisPooled.getPool().returnResource(jedisPooled.getPool().getResource()); + jedis.hset( + (getNamespace(endpoint) + ":" + endpoint.getWordEmbedding().getId()) + .getBytes(), + map); emitter.onNext(new StringResponse("Created ~ " + v)); emitter.onComplete(); } catch (Exception ex) { - jedisPooled.getPool().returnBrokenResource(jedisPooled.getPool().getResource()); emitter.onError(ex); } }), endpoint); } - public EdgeChain> query(WordEmbeddings words2Vec, int topK) { - + public EdgeChain batchUpsert(RedisEndpoint endpoint) { return new EdgeChain<>( Observable.create( emitter -> { - try { + try (Jedis jedis = new Jedis(jedisPooled.getPool().getResource())) { + + Pipeline pipeline = jedis.pipelined(); + + for (WordEmbeddings w : endpoint.getWordEmbeddingsList()) { + Map map = new HashMap<>(); + map.put("id".getBytes(), w.getId().getBytes()); + map.put( + "values".getBytes(), + FloatUtils.toByteArray(FloatUtils.toFloatArray(w.getValues()))); + + pipeline.hmset((getNamespace(endpoint) + ":" + w.getId()).getBytes(), map); + } - this.indexName = endpoint.getIndexName(); - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "knowledge" - : endpoint.getNamespace(); + pipeline.sync(); + emitter.onNext(new StringResponse("Batch Processing Completed")); + emitter.onComplete(); + } catch (Exception ex) { + + emitter.onError(ex); + } + }), + endpoint); + } + + public EdgeChain> query(RedisEndpoint endpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { Query query = new Query("*=>[KNN $k @values $values]") .addParam( "values", - FloatUtils.toByteArray(FloatUtils.toFloatArray(words2Vec.getValues()))) - .addParam("k", topK) + FloatUtils.toByteArray( + FloatUtils.toFloatArray(endpoint.getWordEmbedding().getValues()))) + .addParam("k", endpoint.getTopK()) .returnFields("id", "__values_score") .setSortBy("__values_score", false) .dialect(2); - SearchResult searchResult = jedisPooled.ftSearch(this.indexName, query); + SearchResult searchResult = jedisPooled.ftSearch(endpoint.getIndexName(), query); String body = JsonUtils.convertToString(searchResult); @@ -121,53 +142,46 @@ public EdgeChain> query(WordEmbeddings words2Vec, int topK) ArrayList properties = iterator.next().getProperties(); words2VecList.add( new WordEmbeddings( - properties.get(1).getId(), - String.valueOf(properties.get(0).get__values_score()))); + properties.get(1).getId(), properties.get(0).get__values_score())); } emitter.onNext(words2VecList); emitter.onComplete(); } catch (Exception ex) { + jedisPooled.getPool().returnBrokenResource(jedisPooled.getPool().getResource()); emitter.onError(ex); } }), endpoint); } - public EdgeChain deleteByPattern(String pattern) { + public EdgeChain deleteByPattern(RedisEndpoint endpoint) { return new EdgeChain<>( Observable.create( emitter -> { - try { + try (Jedis jedis = new Jedis(jedisPooled.getPool().getResource())) { - this.indexName = endpoint.getIndexName(); - this.namespace = - (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) - ? "knowledge" - : endpoint.getNamespace(); - - jedisPooled.eval(String.format(REDIS_DELETE_SCRIPT_IN_LUA, pattern)); - - jedisPooled.getPool().returnResource(jedisPooled.getPool().getResource()); + jedis.eval(String.format(REDIS_DELETE_SCRIPT_IN_LUA, endpoint.getPattern())); emitter.onNext( new StringResponse( - "Word embeddings are successfully deleted for pattern:" + pattern)); + "Word embeddings are successfully deleted for pattern:" + + endpoint.getPattern())); emitter.onComplete(); } catch (Exception ex) { - jedisPooled.getPool().returnBrokenResource(jedisPooled.getPool().getResource()); emitter.onError(ex); } }), endpoint); } - private void createSearchIndex(int dimension, String metric) { + private void createSearchIndex( + String namespace, String indexName, int dimension, RedisDistanceMetric metric) { try { - Map map = jedisPooled.ftInfo(this.indexName); + Map map = jedisPooled.ftInfo(indexName); if (Objects.nonNull(map)) { return; } @@ -184,12 +198,18 @@ private void createSearchIndex(int dimension, String metric) { .addTextField("id", 1) .addVectorField("values", Schema.VectorField.VectorAlgo.HNSW, attributes); - IndexDefinition indexDefinition = new IndexDefinition().setPrefixes(this.namespace); + IndexDefinition indexDefinition = new IndexDefinition().setPrefixes(namespace); String ftCreate = jedisPooled.ftCreate( - this.indexName, IndexOptions.defaultOptions().setDefinition(indexDefinition), schema); + indexName, IndexOptions.defaultOptions().setDefinition(indexDefinition), schema); logger.info("Redis search vector_index created ~ " + ftCreate); } + + private String getNamespace(RedisEndpoint endpoint) { + return (Objects.isNull(endpoint.getNamespace()) || endpoint.getNamespace().isEmpty()) + ? "knowledge" + : endpoint.getNamespace(); + } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/domain/PostgresWordEmbeddings.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/domain/PostgresWordEmbeddings.java index 862c44025..cd2263fe8 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/domain/PostgresWordEmbeddings.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/domain/PostgresWordEmbeddings.java @@ -9,8 +9,9 @@ public class PostgresWordEmbeddings implements ArkObject { - private Long embedding_id; - + // private Long embedding_id; + // + // private Integer embedding_id; private String id; private String rawText; @@ -23,15 +24,20 @@ public class PostgresWordEmbeddings implements ArkObject { private LocalDateTime timestamp; - private Double score; // will be added + private Double score; - public Long getEmbedding_id() { - return embedding_id; - } + private String metadata; + private String metadataId; + private String titleMetadata; + private String documentDate; - public void setEmbedding_id(Long embedding_id) { - this.embedding_id = embedding_id; - } + // public Integer getEmbedding_id() { + // return embedding_id; + // } + // + // public void setEmbedding_id(Integer embedding_id) { + // this.embedding_id = embedding_id; + // } public String getId() { return id; @@ -89,16 +95,104 @@ public void setFilename(String filename) { this.filename = filename; } + public String getMetadata() { + return metadata; + } + + public void setMetadata(String metadata) { + this.metadata = metadata; + } + + public String getMetadataId() { + return metadataId; + } + + public void setMetadataId(String metadataId) { + this.metadataId = metadataId; + } + + public String getTitleMetadata() { + return titleMetadata; + } + + public void setTitleMetadata(String titleMetadata) { + this.titleMetadata = titleMetadata; + } + + public String getDocumentDate() { + return documentDate; + } + + public void setDocumentDate(String documentDate) { + this.documentDate = documentDate; + } + @Override public JSONObject toJson() { JSONObject json = new JSONObject(); - json.put("id", id); - json.put("rawText", rawText); - json.put("namespace", namespace); - json.put("filename", filename); - json.put("values", new JSONArray(values)); - json.put("timestamp", timestamp.toString()); - json.put("score", score); + + // if (embedding_id != null) { + // json.put("embedding_id", embedding_id); + // } + + if (id != null) { + json.put("id", id); + } + + if (rawText != null) { + json.put("rawText", rawText); + } + + if (namespace != null) { + json.put("namespace", namespace); + } + + if (filename != null) { + json.put("filename", filename); + } + + if (values != null) { + json.put("values", new JSONArray(values)); + } + + if (timestamp != null) { + json.put("timestamp", timestamp.toString()); + } + + if (score != null && !Double.isNaN(score)) { + json.put("score", score); + } + + if (titleMetadata != null) { + json.put("titleMetadata", titleMetadata); + } + + if (documentDate != null) { + json.put("documentDate", documentDate); + } + + if (metadata != null) { + json.put("metadata", metadata); + } + if (metadataId != null) { + json.put("metadataId", metadataId); + } + return json; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + PostgresWordEmbeddings that = (PostgresWordEmbeddings) o; + + return id.equals(that.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/domain/RRFWeight.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/domain/RRFWeight.java new file mode 100644 index 000000000..19b6f6974 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/domain/RRFWeight.java @@ -0,0 +1,45 @@ +package com.edgechain.lib.index.domain; + +import com.edgechain.lib.index.enums.BaseWeight; + +import java.util.StringJoiner; + +public class RRFWeight { + + private BaseWeight baseWeight = BaseWeight.W1_0; + private double fineTuneWeight = 0.5; + + public RRFWeight() {} + + public RRFWeight(BaseWeight baseWeight, double fineTuneWeight) { + this.baseWeight = baseWeight; + this.fineTuneWeight = fineTuneWeight; + + if (fineTuneWeight < 0 || fineTuneWeight > 1.0) + throw new IllegalArgumentException("Weights must be between 0 and 1."); + } + + public void setBaseWeight(BaseWeight baseWeight) { + this.baseWeight = baseWeight; + } + + public void setFineTuneWeight(double fineTuneWeight) { + this.fineTuneWeight = fineTuneWeight; + } + + public BaseWeight getBaseWeight() { + return baseWeight; + } + + public double getFineTuneWeight() { + return fineTuneWeight; + } + + @Override + public String toString() { + return new StringJoiner(", ", RRFWeight.class.getSimpleName() + "[", "]") + .add("baseWeight=" + baseWeight) + .add("fineTuneWeight=" + fineTuneWeight) + .toString(); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/BaseWeight.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/BaseWeight.java new file mode 100644 index 000000000..e998f8a09 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/BaseWeight.java @@ -0,0 +1,32 @@ +package com.edgechain.lib.index.enums; + +public enum BaseWeight { + W1_0(1.0), + W1_25(1.25), + W1_5(1.5), + W1_75(1.75), + W2_0(2.0), + W2_25(2.25), + W2_5(2.5), + W2_75(2.75), + W3_0(3.0); + + private final double value; + + BaseWeight(double value) { + this.value = value; + } + + public double getValue() { + return value; + } + + public static BaseWeight fromDouble(double value) { + for (BaseWeight baseWeight : BaseWeight.values()) { + if (baseWeight.getValue() == value) { + return baseWeight; + } + } + throw new IllegalArgumentException("Invalid BaseWeight value: " + value); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/OrderRRFBy.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/OrderRRFBy.java new file mode 100644 index 000000000..db857d0e2 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/OrderRRFBy.java @@ -0,0 +1,23 @@ +package com.edgechain.lib.index.enums; + +public enum OrderRRFBy { + DEFAULT, // Preferred Way; ordered by rrf_score; (relevance over freshness) + TEXT_RANK, // First Ordered By Text_Rank; then ordered by rrf_score (text_rank preferred, then + // relevance) + SIMILARITY, // First Ordered by Similarity; then ordered by rrf_score; (similarity preferred, then + // relevance) + DATE_RANK; // First Ordered by date_rank; then ordered by rrf_score; (freshness preferred, then + + // relevance) + + public static OrderRRFBy fromString(String value) { + if (value != null) { + for (OrderRRFBy orderRRFBy : OrderRRFBy.values()) { + if (orderRRFBy.name().equalsIgnoreCase(value)) { + return orderRRFBy; + } + } + } + throw new IllegalArgumentException("Invalid OrderRRFBy value: " + value); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/PostgresLanguage.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/PostgresLanguage.java new file mode 100644 index 000000000..01f7e82df --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/enums/PostgresLanguage.java @@ -0,0 +1,43 @@ +package com.edgechain.lib.index.enums; + +public enum PostgresLanguage { + SIMPLE("simple"), + ARABIC("arabic"), + ARMENIAN("armenian"), + BASQUE("basque"), + CATALAN("catalan"), + DANISH("danish"), + DUTCH("dutch"), + ENGLISH("english"), + FINNISH("finnish"), + FRENCH("french"), + GERMAN("german"), + GREEK("greek"), + HINDI("hindi"), + HUNGARIAN("hungarian"), + INDONESIAN("indonesian"), + IRISH("irish"), + ITALIAN("italian"), + LITHUANIAN("lithuanian"), + NEPALI("nepali"), + NORWEGIAN("norwegian"), + PORTUGUESE("portuguese"), + ROMANIAN("romanian"), + RUSSIAN("russian"), + SERBIAN("serbian"), + SPANISH("spanish"), + SWEDISH("swedish"), + TAMIL("tamil"), + TURKISH("turkish"), + YIDDISH("yiddish"); + + private final String value; + + PostgresLanguage(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/repositories/PostgresClientMetadataRepository.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/repositories/PostgresClientMetadataRepository.java new file mode 100644 index 000000000..5f340aed3 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/repositories/PostgresClientMetadataRepository.java @@ -0,0 +1,208 @@ +package com.edgechain.lib.index.repositories; + +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; +import com.edgechain.lib.index.enums.PostgresDistanceMetric; +import com.edgechain.lib.utils.FloatUtils; +import com.github.f4b6a3.uuid.UuidCreator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +@Repository +public class PostgresClientMetadataRepository { + + @Autowired private JdbcTemplate jdbcTemplate; + + @Transactional + public void createTable(PostgresEndpoint postgresEndpoint) { + String metadataTable = postgresEndpoint.getMetadataTableNames().get(0); + jdbcTemplate.execute( + String.format( + "CREATE TABLE IF NOT EXISTS %s (metadata_id UUID PRIMARY KEY, metadata TEXT NOT NULL," + + " document_date DATE);", + postgresEndpoint.getTableName() + "_" + metadataTable)); + + // Create a JOIN table + jdbcTemplate.execute( + String.format( + "CREATE TABLE IF NOT EXISTS %s (id UUID UNIQUE NOT NULL, metadata_id UUID NOT NULL, " + + "FOREIGN KEY (id) REFERENCES %s(id) ON DELETE CASCADE, " + + "FOREIGN KEY (metadata_id) REFERENCES %s(metadata_id) ON DELETE CASCADE, " + + "PRIMARY KEY (id, metadata_id));", + postgresEndpoint.getTableName() + "_join_" + metadataTable, + postgresEndpoint.getTableName(), + postgresEndpoint.getTableName() + "_" + metadataTable)); + + jdbcTemplate.execute( + String.format( + "CREATE INDEX IF NOT EXISTS idx_%s ON %s (metadata_id);", + postgresEndpoint.getTableName() + "_join_" + metadataTable, + postgresEndpoint.getTableName() + "_join_" + metadataTable)); + } + + @Transactional + public List batchInsertMetadata( + String table, String metadataTableName, List metadataList) { + + Set uuidSet = new HashSet<>(); + + for (int i = 0; i < metadataList.size(); i++) { + + String metadata = metadataList.get(i).replace("'", ""); + + UUID metadataId = + jdbcTemplate.queryForObject( + String.format( + "INSERT INTO %s (metadata_id, metadata) VALUES ('%s', ?) RETURNING metadata_id;", + table.concat("_").concat(metadataTableName), UuidCreator.getTimeOrderedEpoch()), + UUID.class, + metadata); + + if (metadataId != null) { + uuidSet.add(metadataId.toString()); + } + } + + return new ArrayList<>(uuidSet); + } + + @Transactional + public String insertMetadata( + String table, String metadataTableName, String metadata, String documentDate) { + + metadata = metadata.replace("'", ""); + + UUID metadataId = + jdbcTemplate.queryForObject( + String.format( + "INSERT INTO %s (metadata_id, metadata, document_date) VALUES ('%s', ?," + + " TO_DATE(NULLIF(?, ''), 'Month DD, YYYY')) RETURNING metadata_id;", + table.concat("_").concat(metadataTableName), UuidCreator.getTimeOrderedEpoch()), + UUID.class, + metadata, + documentDate); + + return Objects.requireNonNull(metadataId).toString(); + } + + @Transactional + public void insertIntoJoinTable(PostgresEndpoint postgresEndpoint) { + String joinTableName = + postgresEndpoint.getTableName() + + "_join_" + + postgresEndpoint.getMetadataTableNames().get(0); + jdbcTemplate.execute( + String.format( + "INSERT INTO %s (id, metadata_id) VALUES ('%s', '%s') ON CONFLICT (id) DO UPDATE SET" + + " metadata_id = EXCLUDED.metadata_id;", + joinTableName, + UUID.fromString(postgresEndpoint.getId()), + UUID.fromString(postgresEndpoint.getMetadataId()))); + } + + @Transactional + public void batchInsertIntoJoinTable( + String tableName, String metadataTableName, List idList, String metadataId) { + String joinTableName = tableName + "_join_" + metadataTableName; + List sqlStatements = new ArrayList<>(); + for (String id : idList) { + sqlStatements.add( + String.format( + "INSERT INTO %s (id, metadata_id) VALUES ('%s', '%s') ON CONFLICT (id) DO UPDATE SET" + + " metadata_id = EXCLUDED.metadata_id;", + joinTableName, UUID.fromString(id), UUID.fromString(metadataId))); + } + jdbcTemplate.batchUpdate(sqlStatements.toArray(new String[0])); + } + + @Transactional(readOnly = true, propagation = Propagation.REQUIRED) + public List> queryWithMetadata( + String tableName, + String metadataTableName, + String namespace, + int probes, + PostgresDistanceMetric metric, + List values, + int topK) { + + String embeddings = Arrays.toString(FloatUtils.toFloatArray(values)); + + jdbcTemplate.execute(String.format("SET LOCAL ivfflat.probes = %s;", probes)); + String joinTable = tableName + "_join_" + metadataTableName; + + if (metric.equals(PostgresDistanceMetric.IP)) { + return jdbcTemplate.queryForList( + String.format( + "SELECT e.id, metadata, TO_CHAR(document_date, 'Month DD, YYYY') as document_date," + + " j.metadata_id, raw_text, namespace, filename, timestamp, ( embedding <#>" + + " '%s') * -1 AS score FROM %s e INNER JOIN %s j ON e.id = j.id INNER JOIN %s m" + + " ON j.metadata_id = m.metadata_id WHERE namespace='%s' ORDER BY embedding %s" + + " '%s' LIMIT %s;", + embeddings, + tableName, + joinTable, + tableName.concat("_").concat(metadataTableName), + namespace, + PostgresDistanceMetric.getDistanceMetric(metric), + embeddings, + topK)); + + } else if (metric.equals(PostgresDistanceMetric.COSINE)) { + return jdbcTemplate.queryForList( + String.format( + "SELECT e.id, metadata, TO_CHAR(document_date, 'Month DD, YYYY') as document_date," + + " j.metadata_id, raw_text, namespace, filename, timestamp, 1 - ( embedding <=>" + + " '%s') AS score FROM %s e INNER JOIN %s j ON e.id = j.id INNER JOIN %s m ON" + + " j.metadata_id = m.metadata_id WHERE namespace='%s' ORDER BY embedding %s '%s'" + + " LIMIT %s;", + embeddings, + tableName, + joinTable, + tableName.concat("_").concat(metadataTableName), + namespace, + PostgresDistanceMetric.getDistanceMetric(metric), + embeddings, + topK)); + } else { + return jdbcTemplate.queryForList( + String.format( + "SELECT e.id, metadata, TO_CHAR(document_date, 'Month DD, YYYY') as document_date," + + " j.metadata_id, raw_text, namespace, filename, timestamp, (embedding <-> '%s')" + + " AS score FROM %s e INNER JOIN %s j ON e.id = j.id INNER JOIN %s m ON" + + " j.metadata_id = m.metadata_id WHERE namespace='%s' ORDER BY embedding %s '%s'" + + " ASC LIMIT %s;", + embeddings, + tableName, + joinTable, + tableName.concat("_").concat(metadataTableName), + namespace, + PostgresDistanceMetric.getDistanceMetric(metric), + embeddings, + topK)); + } + } + + // Full-text search + @Transactional(readOnly = true, propagation = Propagation.REQUIRED) + public List> getSimilarMetadataChunk( + String table, String metadataTableName, String embeddingChunk) { + // Remove special characters and replace with a space + String cleanEmbeddingChunk = + embeddingChunk.replaceAll("[^a-zA-Z0-9\\s]", " ").replaceAll("\\s+", " ").trim(); + + String tableName = table.concat("_").concat(metadataTableName); + + // Split the embeddingChunk into words and join them with the '|' (OR) operator + String tsquery = String.join(" | ", cleanEmbeddingChunk.split("\\s+")); + return jdbcTemplate.queryForList( + String.format( + "SELECT *, ts_rank(to_tsvector(%s.metadata), query) as rank_metadata " + + "FROM %s, to_tsvector(%s.metadata) document, to_tsquery('%s') query " + + "WHERE query @@ document ORDER BY rank_metadata DESC", + tableName, tableName, tableName, tsquery)); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/repositories/PostgresClientRepository.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/repositories/PostgresClientRepository.java index ea3e641c7..a626c5741 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/repositories/PostgresClientRepository.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/index/repositories/PostgresClientRepository.java @@ -1,8 +1,11 @@ package com.edgechain.lib.index.repositories; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; +import com.edgechain.lib.index.domain.RRFWeight; +import com.edgechain.lib.index.enums.OrderRRFBy; import com.edgechain.lib.index.enums.PostgresDistanceMetric; +import com.edgechain.lib.index.enums.PostgresLanguage; import com.edgechain.lib.utils.FloatUtils; import com.github.f4b6a3.uuid.UuidCreator; import org.springframework.beans.factory.annotation.Autowired; @@ -23,60 +26,142 @@ public class PostgresClientRepository { public void createTable(PostgresEndpoint postgresEndpoint) { jdbcTemplate.execute("CREATE EXTENSION IF NOT EXISTS vector;"); - jdbcTemplate.execute( + jdbcTemplate.execute("CREATE EXTENSION IF NOT EXISTS pg_trgm;"); + + String checkTableQuery = String.format( - "CREATE TABLE IF NOT EXISTS %s (embedding_id SERIAL PRIMARY KEY, id VARCHAR(255) NOT" - + " NULL UNIQUE, raw_text TEXT NOT NULL UNIQUE, embedding vector(%s), timestamp" - + " TIMESTAMP NOT NULL, namespace TEXT, filename VARCHAR(255));", - postgresEndpoint.getTableName(), postgresEndpoint.getDimensions())); + "SELECT COUNT(*) FROM information_schema.tables WHERE table_name = '%s'", + postgresEndpoint.getTableName()); + + int tableExists = jdbcTemplate.queryForObject(checkTableQuery, Integer.class); + + String indexName; + String vectorOps; if (PostgresDistanceMetric.L2.equals(postgresEndpoint.getMetric())) { - jdbcTemplate.execute( - String.format( - "CREATE INDEX IF NOT EXISTS %s ON %s USING ivfflat (embedding vector_l2_ops) WITH" - + " (lists = %s);", - postgresEndpoint.getTableName().concat("_").concat("l2_idx"), - postgresEndpoint.getTableName(), - postgresEndpoint.getLists())); + indexName = postgresEndpoint.getTableName().concat("_").concat("l2_idx"); + vectorOps = "vector_l2_ops"; } else if (PostgresDistanceMetric.COSINE.equals(postgresEndpoint.getMetric())) { + indexName = postgresEndpoint.getTableName().concat("_").concat("cosine_idx"); + vectorOps = "vector_cosine_ops"; + } else { + indexName = postgresEndpoint.getTableName().concat("_").concat("ip_idx"); + vectorOps = "vector_ip_ops"; + } + + String indexQuery = + String.format( + "CREATE INDEX IF NOT EXISTS %s ON %s USING ivfflat (embedding %s) WITH" + + " (lists = %s);", + indexName, postgresEndpoint.getTableName(), vectorOps, postgresEndpoint.getLists()); + + String tsvIndexQuery = + String.format( + "CREATE INDEX IF NOT EXISTS %s ON %s USING GIN(tsv);", + postgresEndpoint.getTableName().concat("_tsv_idx"), postgresEndpoint.getTableName()); + + if (tableExists == 0) { + jdbcTemplate.execute( String.format( - "CREATE INDEX IF NOT EXISTS %s ON %s USING ivfflat (embedding vector_cosine_ops) WITH" - + " (lists = %s);", - postgresEndpoint.getTableName().concat("_").concat("cosine_idx"), - postgresEndpoint.getTableName(), - postgresEndpoint.getLists())); + "CREATE TABLE IF NOT EXISTS %s (id UUID PRIMARY KEY, " + + " raw_text TEXT NOT NULL UNIQUE, embedding vector(%s), timestamp" + + " TIMESTAMP NOT NULL, namespace TEXT, filename VARCHAR(255), tsv TSVECTOR);", + postgresEndpoint.getTableName(), postgresEndpoint.getDimensions())); + + jdbcTemplate.execute(indexQuery); + jdbcTemplate.execute(tsvIndexQuery); + } else { - jdbcTemplate.execute( + + String checkIndexQuery = String.format( - "CREATE INDEX IF NOT EXISTS %s ON %s USING ivfflat (embedding vector_ip_ops) WITH" - + " (lists = %s);", - postgresEndpoint.getTableName().concat("_").concat("ip_idx"), - postgresEndpoint.getTableName(), - postgresEndpoint.getLists())); + "SELECT COUNT(*) FROM pg_indexes WHERE tablename = '%s' AND indexname = '%s';", + postgresEndpoint.getTableName(), indexName); + + Integer indexExists = jdbcTemplate.queryForObject(checkIndexQuery, Integer.class); + + if (indexExists != null && indexExists != 1) + throw new RuntimeException( + "No index is specified therefore use the following SQL:\n" + indexQuery); } } @Transactional - public void upsertEmbeddings( + public List batchUpsertEmbeddings( String tableName, - String input, + List wordEmbeddingsList, String filename, + String namespace, + PostgresLanguage language) { + + Set uuidSet = new HashSet<>(); + + for (int i = 0; i < wordEmbeddingsList.size(); i++) { + WordEmbeddings wordEmbeddings = wordEmbeddingsList.get(i); + + if (wordEmbeddings != null && wordEmbeddings.getValues() != null) { + + float[] floatArray = FloatUtils.toFloatArray(wordEmbeddings.getValues()); + String rawText = wordEmbeddings.getId().replace("'", ""); + + UUID id = + jdbcTemplate.queryForObject( + String.format( + "INSERT INTO %s (id, raw_text, embedding, timestamp, namespace, filename, tsv)" + + " VALUES ('%s', ?, '%s', '%s', '%s', '%s', TO_TSVECTOR('%s', '%s')) ON" + + " CONFLICT (raw_text) DO UPDATE SET embedding = EXCLUDED.embedding" + + " RETURNING id;", + tableName, + UuidCreator.getTimeOrderedEpoch(), + Arrays.toString(floatArray), + LocalDateTime.now(), + namespace, + filename, + language.getValue(), + rawText), + UUID.class, + rawText); + + if (id != null) { + uuidSet.add(id.toString()); + } + } + } + + return new ArrayList<>(uuidSet); + } + + @Transactional + public String upsertEmbeddings( + String tableName, WordEmbeddings wordEmbeddings, - String namespace) { + String filename, + String namespace, + PostgresLanguage language) { - jdbcTemplate.execute( - String.format( - "INSERT INTO %s (id, raw_text, embedding, timestamp, namespace, filename) VALUES ('%s'," - + " '%s', '%s', '%s', '%s', '%s') ON CONFLICT (raw_text) DO UPDATE SET embedding =" - + " EXCLUDED.embedding;", - tableName, - UuidCreator.getTimeOrderedEpoch().toString(), - input, - Arrays.toString(FloatUtils.toFloatArray(wordEmbeddings.getValues())), - LocalDateTime.now(), - namespace, - filename)); + float[] floatArray = FloatUtils.toFloatArray(wordEmbeddings.getValues()); + String rawText = wordEmbeddings.getId().replace("'", ""); + + UUID uuid = + jdbcTemplate.queryForObject( + String.format( + "INSERT INTO %s (id, raw_text, embedding, timestamp, namespace, filename, tsv)" + + " VALUES ('%s', ?, '%s', '%s', '%s', '%s', TO_TSVECTOR('%s', '%s')) ON" + + " CONFLICT (raw_text) DO UPDATE SET embedding = EXCLUDED.embedding RETURNING" + + " id;", + tableName, + UuidCreator.getTimeOrderedEpoch(), + Arrays.toString(floatArray), + LocalDateTime.now(), + namespace, + filename, + language.getValue(), + rawText), + UUID.class, + rawText); + + return Objects.requireNonNull(uuid).toString(); } @Transactional(readOnly = true, propagation = Propagation.REQUIRED) @@ -85,51 +170,220 @@ public List> query( String namespace, int probes, PostgresDistanceMetric metric, - WordEmbeddings wordEmbeddings, - int topK) { - - String embeddings = Arrays.toString(FloatUtils.toFloatArray(wordEmbeddings.getValues())); + List> values, + int topK, + int upperLimit) { jdbcTemplate.execute(String.format("SET LOCAL ivfflat.probes = %s;", probes)); - if (metric.equals(PostgresDistanceMetric.IP)) { - return jdbcTemplate.queryForList( - String.format( - "SELECT id, raw_text, namespace, filename, timestamp, ( embedding <#> '%s') * -1 AS" - + " score FROM %s WHERE namespace='%s' ORDER BY embedding %s '%s' LIMIT %s;", - embeddings, - tableName, - namespace, - PostgresDistanceMetric.getDistanceMetric(metric), - Arrays.toString(FloatUtils.toFloatArray(wordEmbeddings.getValues())), - topK)); + StringBuilder query = new StringBuilder(); + + for (int i = 0; i < values.size(); i++) { + + String embeddings = Arrays.toString(FloatUtils.toFloatArray(values.get(i))); - } else if (metric.equals(PostgresDistanceMetric.COSINE)) { + query.append("(").append("SELECT id, raw_text, embedding, namespace, filename, timestamp,"); + switch (metric) { + case COSINE -> query + .append(String.format("1 - (embedding <=> '%s') AS score ", embeddings)) + .append(" FROM ") + .append(tableName) + .append(" WHERE namespace = ") + .append("'") + .append(namespace) + .append("'") + .append(" ORDER BY embedding <=> ") + .append("'") + .append(embeddings) + .append("'") + .append(" LIMIT "); + case IP -> query + .append(String.format("(embedding <#> '%s') * -1 AS score ", embeddings)) + .append(" FROM ") + .append(tableName) + .append(" WHERE namespace = ") + .append("'") + .append(namespace) + .append("'") + .append(" ORDER BY embedding <#> ") + .append("'") + .append(embeddings) + .append("'") + .append(" LIMIT "); + case L2 -> query + .append(String.format("embedding <-> '%s' AS score ", embeddings)) + .append(" FROM ") + .append(tableName) + .append(" WHERE namespace = ") + .append("'") + .append(namespace) + .append("'") + .append(" ORDER BY embedding <-> ") + .append("'") + .append(embeddings) + .append("'") + .append(" LIMIT "); + default -> throw new IllegalArgumentException("Invalid similarity measure: " + metric); + } + query.append(topK).append(")"); + + if (i < values.size() - 1) { + query.append(" UNION ALL ").append("\n"); + } + } + + if (values.size() > 1) { return jdbcTemplate.queryForList( String.format( - "SELECT id, raw_text, namespace, filename, timestamp, 1 - ( embedding <=> '%s') AS" - + " score FROM %s WHERE namespace='%s' ORDER BY embedding %s '%s' LIMIT %s;", - embeddings, - tableName, - namespace, - PostgresDistanceMetric.getDistanceMetric(metric), - Arrays.toString(FloatUtils.toFloatArray(wordEmbeddings.getValues())), - topK)); + "SELECT * FROM (SELECT DISTINCT ON (result.id) * FROM ( %s ) result) subquery ORDER" + + " BY score DESC LIMIT %s;", + query, upperLimit)); } else { + return jdbcTemplate.queryForList(query.toString()); + } + } + + public List> queryRRF( + String tableName, + String namespace, + String metadataTableName, + List> values, + RRFWeight textWeight, + RRFWeight similarityWeight, + RRFWeight dateWeight, + String searchQuery, + PostgresLanguage language, + int probes, + PostgresDistanceMetric metric, + int topK, + int upperLimit, + OrderRRFBy orderRRFBy) { + + jdbcTemplate.execute(String.format("SET LOCAL ivfflat.probes = %s;", probes)); + + StringBuilder query = new StringBuilder(); + + for (int i = 0; i < values.size(); i++) { + String embeddings = Arrays.toString(FloatUtils.toFloatArray(values.get(i))); + + query + .append("(") + .append( + "SELECT id, raw_text, document_date, metadata, namespace, filename, timestamp, \n") + .append( + String.format( + "%s / (ROW_NUMBER() OVER (ORDER BY text_rank DESC) + %s) + \n", + textWeight.getBaseWeight().getValue(), textWeight.getFineTuneWeight())) + .append( + String.format( + "%s / (ROW_NUMBER() OVER (ORDER BY similarity DESC) + %s) + \n", + similarityWeight.getBaseWeight().getValue(), + similarityWeight.getFineTuneWeight())) + .append( + String.format( + "%s / (ROW_NUMBER() OVER (ORDER BY date_rank DESC) + %s) AS rrf_score\n", + dateWeight.getBaseWeight().getValue(), dateWeight.getFineTuneWeight())) + .append("FROM ( ") + .append( + "SELECT sv.id, sv.raw_text, sv.namespace, sv.filename, sv.timestamp," + + " svtm.document_date, svtm.metadata, ") + .append( + String.format( + "ts_rank_cd(sv.tsv, plainto_tsquery('%s', '%s')) AS text_rank, ", + language.getValue(), searchQuery)); + + switch (metric) { + case COSINE -> query.append( + String.format("1 - (sv.embedding <=> '%s') AS similarity, ", embeddings)); + case IP -> query.append( + String.format("(sv.embedding <#> '%s') * -1 AS similarity, ", embeddings)); + case L2 -> query.append(String.format("sv.embedding <-> '%s' AS similarity, ", embeddings)); + default -> throw new IllegalArgumentException("Invalid similarity measure: " + metric); + } + + query + .append("CASE ") + .append("WHEN svtm.document_date IS NULL THEN 0 ") // Null date handling + .append( + "ELSE EXTRACT(YEAR FROM svtm.document_date) * 365 + EXTRACT(DOY FROM" + + " svtm.document_date) ") + .append("END AS date_rank ") + .append("FROM ") + .append( + String.format( + "(SELECT id, raw_text, embedding, tsv, namespace, filename, timestamp from %s" + + " WHERE namespace = '%s'", + tableName, namespace)); + + switch (metric) { + case COSINE -> query + .append(" ORDER BY embedding <=> ") + .append("'") + .append(embeddings) + .append("'") + .append(" LIMIT ") + .append(topK); + case IP -> query + .append(" ORDER BY embedding <#> ") + .append("'") + .append(embeddings) + .append("'") + .append(" LIMIT ") + .append(topK); + case L2 -> query + .append(" ORDER BY embedding <-> ") + .append("'") + .append(embeddings) + .append("'") + .append(" LIMIT ") + .append(topK); + default -> throw new IllegalArgumentException("Invalid metric: " + metric); + } + query + .append(")") + .append(" sv ") + .append("JOIN ") + .append(tableName.concat("_join_").concat(metadataTableName)) + .append(" jtm ON sv.id = jtm.id ") + .append("JOIN ") + .append(tableName.concat("_").concat(metadataTableName)) + .append(" svtm ON jtm.metadata_id = svtm.metadata_id ") + .append(") subquery "); + + switch (orderRRFBy) { + case TEXT_RANK -> query.append("ORDER BY text_rank DESC, rrf_score DESC"); + case SIMILARITY -> query.append("ORDER BY similarity DESC, rrf_score DESC"); + case DATE_RANK -> query.append("ORDER BY date_rank DESC, rrf_score DESC"); + case DEFAULT -> query.append("ORDER BY rrf_score DESC"); + default -> throw new IllegalArgumentException("Invalid orderRRFBy value"); + } + + query.append(" LIMIT ").append(topK).append(")"); + if (i < values.size() - 1) { + query.append(" UNION ALL ").append("\n"); + } + } + + if (values.size() > 1) { return jdbcTemplate.queryForList( String.format( - "SELECT id, raw_text, namespace, filename, timestamp, (embedding <-> '%s') AS score" - + " FROM %s WHERE namespace='%s' ORDER BY embedding %s '%s' ASC LIMIT %s;", - embeddings, - tableName, - namespace, - PostgresDistanceMetric.getDistanceMetric(metric), - Arrays.toString(FloatUtils.toFloatArray(wordEmbeddings.getValues())), - topK)); + "SELECT * FROM (SELECT DISTINCT ON (result.id) * FROM ( %s ) result) subquery ORDER" + + " BY rrf_score DESC LIMIT %s;", + query, upperLimit)); + } else { + return jdbcTemplate.queryForList(query.toString()); } } + @Transactional(readOnly = true) + public List> getAllChunks(PostgresEndpoint endpoint) { + return jdbcTemplate.queryForList( + String.format( + "SELECT id, raw_text, embedding, filename from %s WHERE filename = '%s';", + endpoint.getTableName(), endpoint.getFilename())); + } + @Transactional public void deleteAll(String tableName, String namespace) { jdbcTemplate.execute( diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/integration/airtable/client/AirtableClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/integration/airtable/client/AirtableClient.java new file mode 100644 index 000000000..166d7c320 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/integration/airtable/client/AirtableClient.java @@ -0,0 +1,188 @@ +package com.edgechain.lib.integration.airtable.client; + +import com.edgechain.lib.endpoint.impl.integration.AirtableEndpoint; +import com.edgechain.lib.integration.airtable.query.AirtableQueryBuilder; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import dev.fuxing.airtable.AirtableApi; +import dev.fuxing.airtable.AirtableRecord; +import dev.fuxing.airtable.AirtableTable; +import io.reactivex.rxjava3.core.Observable; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@Service +public class AirtableClient { + + public EdgeChain> findAll(AirtableEndpoint endpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + AirtableApi api = new AirtableApi(endpoint.getApiKey()); + AirtableTable table = api.base(endpoint.getBaseId()).table(endpoint.getTableName()); + + AirtableQueryBuilder airtableQueryBuilder = endpoint.getAirtableQueryBuilder(); + + AirtableTable.PaginationList list = + table.list( + querySpec -> { + int maxRecords = airtableQueryBuilder.getMaxRecords(); + int pageSize = airtableQueryBuilder.getPageSize(); + String sortField = airtableQueryBuilder.getSortField(); + String sortDirection = airtableQueryBuilder.getSortDirection(); + String offset = airtableQueryBuilder.getOffset(); + List fields = airtableQueryBuilder.getFields(); + String filterByFormula = airtableQueryBuilder.getFilterByFormula(); + String view = airtableQueryBuilder.getView(); + String cellFormat = airtableQueryBuilder.getCellFormat(); + String timeZone = airtableQueryBuilder.getTimeZone(); + String userLocale = airtableQueryBuilder.getUserLocale(); + + querySpec.maxRecords(maxRecords); + querySpec.pageSize(pageSize); + + if (sortField != null && sortDirection != null) { + querySpec.sort(sortField, sortDirection); + } + + if (offset != null) { + querySpec.offset(offset); + } + + if (fields != null) { + querySpec.fields(fields); + } + + if (filterByFormula != null) { + querySpec.filterByFormula(filterByFormula); + } + + if (view != null) { + querySpec.view(view); + } + + if (cellFormat != null) { + querySpec.cellFormat(cellFormat); + } + + if (timeZone != null) { + querySpec.timeZone(timeZone); + } + + if (userLocale != null) { + querySpec.userLocale(userLocale); + } + }); + + Map mapper = new HashMap<>(); + mapper.put("data", list); + mapper.put("offset", list.getOffset()); + + emitter.onNext(mapper); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + })); + } + + public EdgeChain findById(AirtableEndpoint endpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + AirtableApi api = new AirtableApi(endpoint.getApiKey()); + AirtableTable table = api.base(endpoint.getBaseId()).table(endpoint.getTableName()); + + String id = endpoint.getIds().get(0); + + if (Objects.isNull(id) || id.isEmpty()) + throw new RuntimeException("Id cannot be null"); + + AirtableRecord record = table.get(id); + + if (Objects.isNull(record)) + throw new RuntimeException("Id: " + id + " does not exist"); + + emitter.onNext(record); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + })); + } + + public EdgeChain> create(AirtableEndpoint endpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + AirtableApi api = new AirtableApi(endpoint.getApiKey()); + AirtableTable table = api.base(endpoint.getBaseId()).table(endpoint.getTableName()); + + List airtableRecordList = + table.post(endpoint.getAirtableRecordList(), endpoint.isTypecast()); + + emitter.onNext(airtableRecordList); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + })); + } + + public EdgeChain> update(AirtableEndpoint endpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + AirtableApi api = new AirtableApi(endpoint.getApiKey()); + AirtableTable table = api.base(endpoint.getBaseId()).table(endpoint.getTableName()); + + List airtableRecordList = + table.put(endpoint.getAirtableRecordList(), endpoint.isTypecast()); + + emitter.onNext(airtableRecordList); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + })); + } + + public EdgeChain> delete(AirtableEndpoint endpoint) { + + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + AirtableApi api = new AirtableApi(endpoint.getApiKey()); + AirtableTable table = api.base(endpoint.getBaseId()).table(endpoint.getTableName()); + + List deleteIdsList = table.delete(endpoint.getIds()); + + emitter.onNext(deleteIdsList); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + })); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/integration/airtable/query/AirtableQueryBuilder.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/integration/airtable/query/AirtableQueryBuilder.java new file mode 100644 index 000000000..7e6945568 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/integration/airtable/query/AirtableQueryBuilder.java @@ -0,0 +1,130 @@ +package com.edgechain.lib.integration.airtable.query; + +import dev.fuxing.airtable.formula.AirtableFormula; +import dev.fuxing.airtable.formula.AirtableFunction; +import dev.fuxing.airtable.formula.AirtableOperator; + +import java.time.ZoneId; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +public class AirtableQueryBuilder { + private String offset; + private List fields; + private String filterByFormula; + private int maxRecords = 100; + private int pageSize = 100; + private String sortField; + private String sortDirection; + private String view; + private String cellFormat; + private String timeZone; + private String userLocale; + + public void offset(String offset) { + this.offset = offset; + } + + public void fields(String... fields) { + this.fields = Arrays.asList(fields); + } + + public void filterByFormula(String formula) { + this.filterByFormula = formula; + } + + public void filterByFormula(AirtableFunction function, AirtableFormula.Object... objects) { + this.filterByFormula = function.apply(objects); + } + + public void filterByFormula( + AirtableOperator operator, + AirtableFormula.Object left, + AirtableFormula.Object right, + AirtableFormula.Object... others) { + this.filterByFormula = operator.apply(left, right, others); + } + + public void maxRecords(int maxRecords) { + this.maxRecords = maxRecords; + } + + public void pageSize(int pageSize) { + this.pageSize = pageSize; + } + + public void sort(String field, String direction) { + this.sortField = field; + this.sortDirection = direction; + } + + public void view(String view) { + this.view = view; + } + + public void cellFormat(String cellFormat) { + this.cellFormat = cellFormat; + } + + public void timeZone(String timeZone) { + this.timeZone = timeZone; + } + + public void timeZone(ZoneId zoneId) { + this.timeZone = zoneId.getId(); + } + + public void userLocale(String userLocale) { + this.userLocale = userLocale; + } + + public void userLocale(Locale locale) { + this.userLocale = locale.toLanguageTag().toLowerCase(); + } + + // Getters for QuerySpec fields + public String getOffset() { + return offset; + } + + public List getFields() { + return fields; + } + + public String getFilterByFormula() { + return filterByFormula; + } + + public int getMaxRecords() { + return maxRecords; + } + + public int getPageSize() { + return pageSize; + } + + public String getSortField() { + return sortField; + } + + public String getSortDirection() { + return sortDirection; + } + + public String getView() { + return view; + } + + public String getCellFormat() { + return cellFormat; + } + + public String getTimeZone() { + return timeZone; + } + + public String getUserLocale() { + return userLocale; + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/integration/airtable/query/SortOrder.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/integration/airtable/query/SortOrder.java new file mode 100644 index 000000000..9b203f024 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/integration/airtable/query/SortOrder.java @@ -0,0 +1,25 @@ +package com.edgechain.lib.integration.airtable.query; + +public enum SortOrder { + ASC("asc"), + DESC("desc"); + + private final String value; + + SortOrder(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public static SortOrder fromValue(String value) { + for (SortOrder sortOrder : SortOrder.values()) { + if (sortOrder.value.equalsIgnoreCase(value)) { + return sortOrder; + } + } + throw new IllegalArgumentException("Invalid SortOrder value: " + value); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetArgs.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetArgs.java index 8bdbd4a33..945fd1ca0 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetArgs.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetArgs.java @@ -6,7 +6,9 @@ public class JsonnetArgs { private DataType dataType; - private final String val; + private String val; + + public JsonnetArgs() {} public JsonnetArgs(DataType dataType, String val) { diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetLoader.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetLoader.java index c3a8a932b..c9fcf20eb 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetLoader.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/JsonnetLoader.java @@ -2,6 +2,7 @@ import com.edgechain.lib.jsonnet.enums.DataType; import com.edgechain.lib.jsonnet.exceptions.JsonnetLoaderException; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.databind.ObjectMapper; import io.github.jam01.xtrasonnet.Transformer; import org.apache.commons.io.FileUtils; @@ -14,10 +15,21 @@ import java.io.*; import java.util.*; -public abstract class JsonnetLoader { +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) +public abstract class JsonnetLoader implements Serializable { private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private String f1; + private String f2; + + private String metadata; + private String selectedFile; + + private int threshold = 0; + + private String splitSize; + private Map args = new HashMap<>(); private Map xtraArgsMap = new HashMap<>(); private static final ObjectMapper objectMapper = new ObjectMapper(); @@ -25,6 +37,33 @@ public abstract class JsonnetLoader { public JsonnetLoader() {} + public JsonnetLoader(String f1) { + this.f1 = f1; + } + + public JsonnetLoader(int threshold, String f1, String f2) { + this.f1 = f1; + this.f2 = f2; + if (threshold >= 1 && threshold < 100) { + this.threshold = threshold; + this.splitSize = + String.valueOf(threshold).concat("-").concat(String.valueOf((100 - threshold))); + } else throw new RuntimeException("Threshold has to be b/w 1 and 100"); + } + + public void load(InputStream in1, InputStream in2) { + int randValue = (int) (Math.random() * 101); + if (randValue <= threshold) { + this.selectedFile = getF1(); + logger.info("Using File: " + getF1()); + load(in1); + } else { + this.selectedFile = getF2(); + logger.info("Using File: " + getF2()); + load(in2); + } + } + public void load(InputStream inputStream) { try { preconfigured(); @@ -70,6 +109,8 @@ public void load(InputStream inputStream) { .build() .transform(serializeXtraArgs(xtraArgsMap)); // Get the String Output & Transform it into JsonnetSchema + + this.metadata = res; this.jsonObject = new JSONObject(res); // Delete File @@ -126,4 +167,28 @@ private void preconfigured() { if (Objects.isNull(args.get("keepMaxTokens"))) args.put("keepMaxTokens", new JsonnetArgs(DataType.BOOLEAN, "false")); } + + public String getMetadata() { + return metadata; + } + + public String getSelectedFile() { + return selectedFile; + } + + public String getF1() { + return f1; + } + + public String getF2() { + return f2; + } + + public int getThreshold() { + return threshold; + } + + public String getSplitSize() { + return splitSize; + } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/XtraSonnetCustomFunc.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/XtraSonnetCustomFunc.java index ca3d0665b..33120fc99 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/XtraSonnetCustomFunc.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/XtraSonnetCustomFunc.java @@ -1,6 +1,6 @@ package com.edgechain.lib.jsonnet; -import com.edgechain.lib.endpoint.impl.WikiEndpoint; +import com.edgechain.lib.endpoint.impl.wiki.WikiEndpoint; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import io.github.jam01.xtrasonnet.DataFormatService; import io.github.jam01.xtrasonnet.header.Header; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/impl/FileJsonnetLoader.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/impl/FileJsonnetLoader.java index 0743e402a..529b98902 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/impl/FileJsonnetLoader.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/jsonnet/impl/FileJsonnetLoader.java @@ -2,32 +2,75 @@ import com.edgechain.lib.jsonnet.JsonnetLoader; import com.edgechain.lib.jsonnet.exceptions.JsonnetLoaderException; +import org.apache.commons.io.FilenameUtils; import java.io.*; public class FileJsonnetLoader extends JsonnetLoader { - private String filePath; + private String filePath1; + private String filePath2; + + public String getFilePath1() { + return filePath1; + } + + public void setFilePath1(String filePath1) { + this.filePath1 = filePath1; + } + + public String getFilePath2() { + return filePath2; + } + + public void setFilePath2(String filePath2) { + this.filePath2 = filePath2; + } + + public FileJsonnetLoader() {} public FileJsonnetLoader(String filePath) { - this.filePath = filePath; + super(filePath); + this.filePath1 = filePath; + + if (!new File(filePath).exists()) { + throw new JsonnetLoaderException("File not found - " + filePath); + } } - public FileJsonnetLoader() { - super(); + public FileJsonnetLoader(int threshold, String filePath1, String filePath2) { + super(threshold, FilenameUtils.getName(filePath1), FilenameUtils.getName(filePath2)); + this.filePath1 = filePath1; + this.filePath2 = filePath2; + + if (!new File(filePath1).exists()) { + throw new JsonnetLoaderException("File not found - " + filePath1); + } + + if (!new File(filePath2).exists()) { + throw new JsonnetLoaderException("File not found. " + filePath2); + } } @Override public JsonnetLoader loadOrReload() { - try (InputStream in = new FileInputStream(filePath)) { - this.load(in); - return this; - } catch (final Exception e) { - throw new JsonnetLoaderException(e.getMessage()); - } - } - public String getFilePath() { - return filePath; + if (getThreshold() >= 1 && getThreshold() < 100) { + try (InputStream in1 = new FileInputStream(filePath1); + InputStream in2 = new FileInputStream(filePath2)) { + load(in1, in2); + return this; + } catch (final Exception e) { + throw new JsonnetLoaderException(e.getMessage()); + } + + } else { + try (InputStream in = new FileInputStream(filePath1)) { + load(in); + return this; + } catch (final Exception e) { + throw new JsonnetLoaderException(e.getMessage()); + } + } } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/LLamaClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/LLamaClient.java new file mode 100644 index 000000000..ee47fe298 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/LLamaClient.java @@ -0,0 +1,57 @@ +package com.edgechain.lib.llama2; + +import com.edgechain.lib.endpoint.impl.llm.LLamaQuickstart; +import com.edgechain.lib.llama2.request.LLamaCompletionRequest; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.reactivex.rxjava3.core.Observable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +@Service +public class LLamaClient { + @Autowired private ObjectMapper objectMapper; + private final Logger logger = LoggerFactory.getLogger(getClass()); + private final RestTemplate restTemplate = new RestTemplate(); + + public EdgeChain> createChatCompletion( + LLamaCompletionRequest request, LLamaQuickstart endpoint) { + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + logger.info("Logging ChatCompletion...."); + + logger.info("==============REQUEST DATA================"); + logger.info(request.toString()); + + // Create headers + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity entity = new HttpEntity<>(request, headers); + // + String response = + restTemplate.postForObject(endpoint.getUrl(), entity, String.class); + + List chatCompletionResponse = + objectMapper.readValue(response, new TypeReference<>() {}); + emitter.onNext(chatCompletionResponse); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + }), + endpoint); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/Llama2Client.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/Llama2Client.java new file mode 100644 index 000000000..481a890f8 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/Llama2Client.java @@ -0,0 +1,89 @@ +package com.edgechain.lib.llama2; + +import com.edgechain.lib.endpoint.impl.llm.LLamaQuickstart; +import com.edgechain.lib.endpoint.impl.llm.Llama2Endpoint; +import com.edgechain.lib.llama2.request.Llama2ChatCompletionRequest; +import com.edgechain.lib.llama2.response.Llama2ChatCompletionResponse; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.reactivex.rxjava3.core.Observable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +@Service +public class Llama2Client { + @Autowired private ObjectMapper objectMapper; + private final Logger logger = LoggerFactory.getLogger(getClass()); + private final RestTemplate restTemplate = new RestTemplate(); + + public EdgeChain> createChatCompletion( + Llama2ChatCompletionRequest request, Llama2Endpoint endpoint) { + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + logger.info("Logging ChatCompletion...."); + + logger.info("==============REQUEST DATA================"); + logger.info(request.toString()); + + // Create headers + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity entity = new HttpEntity<>(request, headers); + // + String response = + restTemplate.postForObject(endpoint.getUrl(), entity, String.class); + + List chatCompletionResponse = + objectMapper.readValue(response, new TypeReference<>() {}); + emitter.onNext(chatCompletionResponse); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + }), + endpoint); + } + + public EdgeChain createGetChatCompletion(LLamaQuickstart endpoint) { + return new EdgeChain<>( + Observable.create( + emitter -> { + try { + + // Create headers + HttpHeaders headers = new HttpHeaders(); + headers.set("User-Agent", "insomnia/8.2.0"); + HttpEntity entity = new HttpEntity<>(headers); + + Map param = Collections.singletonMap("query", endpoint.getQuery()); + + String endpointUrl = endpoint.getUrl() + "?query={query}"; + + ResponseEntity response = + restTemplate.exchange(endpointUrl, HttpMethod.GET, entity, String.class, param); + + logger.info("\nRESPONSE DATA {}\n", response.getBody()); + + emitter.onNext(response.getBody()); + emitter.onComplete(); + + } catch (final Exception e) { + emitter.onError(e); + } + }), + endpoint); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/request/LLamaCompletionRequest.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/request/LLamaCompletionRequest.java new file mode 100644 index 000000000..eea4b0d99 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/request/LLamaCompletionRequest.java @@ -0,0 +1,88 @@ +package com.edgechain.lib.llama2.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.StringJoiner; + +public class LLamaCompletionRequest { + @JsonProperty("text_inputs") + private String textInputs; + + @JsonProperty("return_full_text") + private Boolean returnFullText; + + @JsonProperty("top_k") + private Integer topK; + + public LLamaCompletionRequest() {} + + public LLamaCompletionRequest(String textInputs, Boolean returnFullText, Integer topK) { + this.textInputs = textInputs; + this.returnFullText = returnFullText; + this.topK = topK; + } + + @Override + public String toString() { + return new StringJoiner(", ", LLamaCompletionRequest.class.getSimpleName() + "{", "}") + .add("\"text_inputs:\"" + textInputs) + .add("\"return_full_text:\"" + returnFullText) + .add("\"top_k:\"" + topK) + .toString(); + } + + public static LlamaSupportChatCompletionRequestBuilder builder() { + return new LlamaSupportChatCompletionRequestBuilder(); + } + + public String getTextInputs() { + return textInputs; + } + + public void setTextInputs(String textInputs) { + this.textInputs = textInputs; + } + + public Boolean getReturnFullText() { + return returnFullText; + } + + public void setReturnFullText(Boolean returnFullText) { + this.returnFullText = returnFullText; + } + + public Integer getTopK() { + return topK; + } + + public void setTopK(Integer topK) { + this.topK = topK; + } + + public static class LlamaSupportChatCompletionRequestBuilder { + private String textInputs; + private Boolean returnFullText; + private Integer topK; + + private LlamaSupportChatCompletionRequestBuilder() {} + + public LlamaSupportChatCompletionRequestBuilder textInputs(String textInputs) { + this.textInputs = textInputs; + return this; + } + + public LlamaSupportChatCompletionRequestBuilder returnFullText(Boolean returnFullText) { + this.returnFullText = returnFullText; + return this; + } + + public LlamaSupportChatCompletionRequestBuilder topK(Integer topK) { + this.topK = topK; + return this; + } + + public LLamaCompletionRequest build() { + return new LLamaCompletionRequest(textInputs, returnFullText, topK); + } + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/request/Llama2ChatCompletionRequest.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/request/Llama2ChatCompletionRequest.java new file mode 100644 index 000000000..17f190e93 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/request/Llama2ChatCompletionRequest.java @@ -0,0 +1,67 @@ +package com.edgechain.lib.llama2.request; + +import org.json.JSONObject; + +import java.util.StringJoiner; + +public class Llama2ChatCompletionRequest { + + private String inputs; + private JSONObject parameters; + + public Llama2ChatCompletionRequest() {} + + public Llama2ChatCompletionRequest(String inputs, JSONObject parameters) { + this.inputs = inputs; + this.parameters = parameters; + } + + @Override + public String toString() { + return new StringJoiner(", ", Llama2ChatCompletionRequest.class.getSimpleName() + "[{", "}]") + .add("\"inputs:\"" + inputs) + .add("\"parameters:\"" + parameters) + .toString(); + } + + public static Llama2ChatCompletionRequestBuilder builder() { + return new Llama2ChatCompletionRequestBuilder(); + } + + public String getInputs() { + return inputs; + } + + public void setInputs(String inputs) { + this.inputs = inputs; + } + + public JSONObject getParameters() { + return parameters; + } + + public void setParameters(JSONObject parameters) { + this.parameters = parameters; + } + + public static class Llama2ChatCompletionRequestBuilder { + private String inputs; + private JSONObject parameters; + + private Llama2ChatCompletionRequestBuilder() {} + + public Llama2ChatCompletionRequestBuilder inputs(String inputs) { + this.inputs = inputs; + return this; + } + + public Llama2ChatCompletionRequestBuilder parameters(JSONObject parameters) { + this.parameters = parameters; + return this; + } + + public Llama2ChatCompletionRequest build() { + return new Llama2ChatCompletionRequest(inputs, parameters); + } + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/response/Llama2ChatCompletionResponse.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/response/Llama2ChatCompletionResponse.java new file mode 100644 index 000000000..033d78286 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/llama2/response/Llama2ChatCompletionResponse.java @@ -0,0 +1,18 @@ +package com.edgechain.lib.llama2.response; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Llama2ChatCompletionResponse { + @JsonProperty("generated_text") + private String generatedText; + + public Llama2ChatCompletionResponse() {} + + public String getGeneratedText() { + return generatedText; + } + + public void setGeneratedText(String generatedText) { + this.generatedText = generatedText; + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/EmbeddingLogger.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/EmbeddingLogger.java index c1e30b9b5..5fd9129aa 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/EmbeddingLogger.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/EmbeddingLogger.java @@ -1,16 +1,13 @@ package com.edgechain.lib.logger; -import com.edgechain.lib.logger.entities.EmbeddingLog; import com.edgechain.lib.logger.entities.EmbeddingLog; import com.edgechain.lib.retrofit.client.RetrofitClientInstance; import com.edgechain.lib.retrofit.logger.EmbeddingLoggerService; -import com.edgechain.lib.retrofit.logger.EmbeddingLoggerService; +import java.util.HashMap; import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.PathVariable; import retrofit2.Retrofit; -import java.util.HashMap; - public class EmbeddingLogger { private final Retrofit retrofit = RetrofitClientInstance.getInstance(); diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/JsonnetLogger.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/JsonnetLogger.java new file mode 100644 index 000000000..ab8dbe77c --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/JsonnetLogger.java @@ -0,0 +1,37 @@ +package com.edgechain.lib.logger; + +import com.edgechain.lib.logger.entities.JsonnetLog; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import java.util.HashMap; + +import com.edgechain.lib.retrofit.logger.JsonnetLoggerService; +import org.springframework.data.domain.Page; +import retrofit2.Retrofit; + +public class JsonnetLogger { + + private final Retrofit retrofit = RetrofitClientInstance.getInstance(); + private final JsonnetLoggerService jsonnetLoggerService = + retrofit.create(JsonnetLoggerService.class); + + public JsonnetLogger() {} + + public Page findAll(int page, int size) { + return this.jsonnetLoggerService.findAll(page, size).blockingGet(); + } + + public Page findAllOrderByCreatedAtDesc(int page, int size) { + return this.jsonnetLoggerService.findAllOrderByCreatedAtDesc(page, size).blockingGet(); + } + + public Page findAllBySelectedFileOrderByCreatedAtDesc( + String filename, int page, int size) { + + HashMap mapper = new HashMap<>(); + mapper.put("filename", filename); + + return this.jsonnetLoggerService + .findAllBySelectedFileOrderByCreatedAtDesc(mapper, page, size) + .blockingGet(); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/ChatCompletionLog.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/ChatCompletionLog.java index 5960c5352..74b2e0a11 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/ChatCompletionLog.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/ChatCompletionLog.java @@ -5,6 +5,7 @@ import javax.validation.constraints.NotBlank; import java.time.LocalDateTime; +import java.util.StringJoiner; import java.util.UUID; @Table(name = "chat_completion_logs") @@ -45,6 +46,16 @@ public class ChatCompletionLog { @Column(columnDefinition = "TEXT") private String content; + private Double presencePenalty; + private Double frequencyPenalty; + + @Column(name = "top_p") + private Double topP; + + private Integer n; + + private Double temperature; + private Long latency; private Long promptTokens; @@ -159,23 +170,66 @@ public void setCallIdentifier(String callIdentifier) { this.callIdentifier = callIdentifier; } + public Double getTemperature() { + return temperature; + } + + public void setTemperature(Double temperature) { + this.temperature = temperature; + } + + public Double getPresencePenalty() { + return presencePenalty; + } + + public void setPresencePenalty(Double presencePenalty) { + this.presencePenalty = presencePenalty; + } + + public Double getFrequencyPenalty() { + return frequencyPenalty; + } + + public void setFrequencyPenalty(Double frequencyPenalty) { + this.frequencyPenalty = frequencyPenalty; + } + + public Double getTopP() { + return topP; + } + + public void setTopP(Double topP) { + this.topP = topP; + } + + public Integer getN() { + return n; + } + + public void setN(Integer n) { + this.n = n; + } + @Override public String toString() { - final StringBuilder sb = new StringBuilder("ChatCompletionLog{"); - sb.append("chatCompletionId=").append(chatCompletionId); - sb.append(", id='").append(id).append('\''); - sb.append(", name='").append(name).append('\''); - sb.append(", callIdentifier='").append(callIdentifier).append('\''); - sb.append(", type='").append(type).append('\''); - sb.append(", createdAt=").append(createdAt); - sb.append(", completedAt=").append(completedAt); - sb.append(", model='").append(model).append('\''); - sb.append(", input='").append(input).append('\''); - sb.append(", content='").append(content).append('\''); - sb.append(", latency=").append(latency); - sb.append(", promptTokens=").append(promptTokens); - sb.append(", totalTokens=").append(totalTokens); - sb.append('}'); - return sb.toString(); + return new StringJoiner(", ", ChatCompletionLog.class.getSimpleName() + "[", "]") + .add("id='" + id + "'") + .add("name='" + name + "'") + .add("callIdentifier='" + callIdentifier + "'") + .add("type='" + type + "'") + .add("temperature=" + temperature) + .add("createdAt=" + createdAt) + .add("completedAt=" + completedAt) + .add("model='" + model + "'") + .add("input='" + input + "'") + .add("content='" + content + "'") + .add("presencePenalty=" + presencePenalty) + .add("frequencyPenalty=" + frequencyPenalty) + .add("topP=" + topP) + .add("n=" + n) + .add("latency=" + latency) + .add("promptTokens=" + promptTokens) + .add("totalTokens=" + totalTokens) + .toString(); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/JsonnetLog.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/JsonnetLog.java new file mode 100644 index 000000000..d9dce0784 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/entities/JsonnetLog.java @@ -0,0 +1,122 @@ +package com.edgechain.lib.logger.entities; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.StringJoiner; +import java.util.UUID; + +@Table(name = "jsonnet_logs") +@Entity(name = "JsonnetLog") +public class JsonnetLog { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonIgnore + private Long jsonnetLogId; + + @Column(nullable = false, unique = true) + private String id; + + @Column(nullable = false) + private String splitSize; + + @Column(nullable = false, columnDefinition = "TEXT") + private String metadata; + + @Column(columnDefinition = "TEXT") + private String content; + + private String selectedFile; + + @Column(nullable = false) + private String f1; + + @Column(nullable = false) + private String f2; + + private LocalDateTime createdAt; + + @PrePersist + protected void onCreate() { + setId(UUID.randomUUID().toString()); + } + + public void setId(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public String getSplitSize() { + return splitSize; + } + + public void setSplitSize(String splitSize) { + this.splitSize = splitSize; + } + + public String getMetadata() { + return metadata; + } + + public void setMetadata(String jsonString) { + this.metadata = jsonString; + } + + public String getF1() { + return f1; + } + + public void setF1(String f1) { + this.f1 = f1; + } + + public String getF2() { + return f2; + } + + public void setF2(String f2) { + this.f2 = f2; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public String getSelectedFile() { + return selectedFile; + } + + public void setSelectedFile(String selectedFile) { + this.selectedFile = selectedFile; + } + + @Override + public String toString() { + return new StringJoiner(", ", JsonnetLog.class.getSimpleName() + "[", "]") + .add("id='" + id + "'") + .add("splitSize=" + splitSize) + .add("metadata='" + metadata + "'") + .add("content='" + content + "'") + .add("f1='" + f1 + "'") + .add("f2='" + f2 + "'") + .add("createdAt=" + createdAt) + .toString(); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/repositories/JsonnetLogRepository.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/repositories/JsonnetLogRepository.java new file mode 100644 index 000000000..a90955ea8 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/repositories/JsonnetLogRepository.java @@ -0,0 +1,18 @@ +package com.edgechain.lib.logger.repositories; + +import com.edgechain.lib.logger.entities.JsonnetLog; +import org.jetbrains.annotations.NotNull; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface JsonnetLogRepository extends JpaRepository { + + @Override + @NotNull + Page findAll(@NotNull Pageable pageable); + + Page findAllByOrderByCreatedAtDesc(Pageable pageable); + + Page findAllBySelectedFileOrderByCreatedAtDesc(String filename, Pageable pageable); +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/ChatCompletionLogService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/ChatCompletionLogService.java index 9871831f6..2e8142ead 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/ChatCompletionLogService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/ChatCompletionLogService.java @@ -88,9 +88,14 @@ public void createTable() { + " model VARCHAR(255) NOT NULL,\n" + " input TEXT NOT NULL,\n" + " content TEXT,\n" + + " presence_penalty DOUBLE PRECISION,\n" + + " frequency_penalty DOUBLE PRECISION,\n" + + " top_p DOUBLE PRECISION,\n" + + " n INTEGER,\n" + + " temperature DOUBLE PRECISION,\n" + " latency BIGINT,\n" + " prompt_tokens BIGINT,\n" - + " total_tokens BIGINT\n" + + " total_tokens BIGINT" + ");"); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/EmbeddingLogService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/EmbeddingLogService.java index 8f4ad06e6..986c65a40 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/EmbeddingLogService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/EmbeddingLogService.java @@ -1,8 +1,6 @@ package com.edgechain.lib.logger.services; import com.edgechain.lib.logger.entities.EmbeddingLog; -import com.edgechain.lib.logger.entities.EmbeddingLog; -import com.edgechain.lib.logger.repositories.EmbeddingLogRepository; import com.edgechain.lib.logger.repositories.EmbeddingLogRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -17,6 +15,7 @@ public class EmbeddingLogService { @Autowired private EmbeddingLogRepository embeddingLogRepository; @Autowired private JdbcTemplate jdbcTemplate; + @Transactional public EmbeddingLog saveOrUpdate(EmbeddingLog embeddingLog) { this.createTable(); return this.embeddingLogRepository.save(embeddingLog); @@ -64,19 +63,23 @@ public Page findAllByLatencyGreaterThanEqual(long latency, Pageabl return this.embeddingLogRepository.findAllByLatencyGreaterThanEqual(latency, pageable); } + private static final String SQL_CREATE_TABLE = + """ + CREATE TABLE IF NOT EXISTS embedding_logs ( + embedding_id SERIAL PRIMARY KEY, + id VARCHAR(255) NOT NULL UNIQUE, + call_identifier VARCHAR(255) NOT NULL, + created_at TIMESTAMP, + completed_at TIMESTAMP, + model VARCHAR(255) NOT NULL, + latency BIGINT, + prompt_tokens BIGINT, + total_tokens BIGINT + ); + """; + @Transactional public void createTable() { - jdbcTemplate.execute( - "CREATE TABLE IF NOT EXISTS embedding_logs (\n" - + " embedding_id SERIAL PRIMARY KEY,\n" - + " id VARCHAR(255) NOT NULL UNIQUE,\n" - + " call_identifier VARCHAR(255) NOT NULL,\n" - + " created_at TIMESTAMP,\n" - + " completed_at TIMESTAMP,\n" - + " model VARCHAR(255) NOT NULL,\n" - + " latency BIGINT,\n" - + " prompt_tokens BIGINT,\n" - + " total_tokens BIGINT\n" - + ");;"); + jdbcTemplate.execute(SQL_CREATE_TABLE); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/JsonnetLogService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/JsonnetLogService.java new file mode 100644 index 000000000..df4f91d58 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/logger/services/JsonnetLogService.java @@ -0,0 +1,54 @@ +package com.edgechain.lib.logger.services; + +import com.edgechain.lib.logger.entities.JsonnetLog; +import com.edgechain.lib.logger.repositories.JsonnetLogRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class JsonnetLogService { + + @Autowired private JsonnetLogRepository jsonnetLogRepository; + @Autowired private JdbcTemplate jdbcTemplate; + + public JsonnetLog saveOrUpdate(JsonnetLog jsonnetLog) { + this.createTable(); + return jsonnetLogRepository.save(jsonnetLog); + } + + @Transactional(readOnly = true) + public Page findAll(Pageable pageable) { + return this.jsonnetLogRepository.findAll(pageable); + } + + @Transactional(readOnly = true) + public Page findAllOrderByCreatedAtDesc(Pageable pageable) { + return this.jsonnetLogRepository.findAllByOrderByCreatedAtDesc(pageable); + } + + @Transactional(readOnly = true) + public Page findAllBySelectedFileOrderByCreatedAtDesc( + String filename, Pageable pageable) { + return this.jsonnetLogRepository.findAllBySelectedFileOrderByCreatedAtDesc(filename, pageable); + } + + @Transactional + public void createTable() { + jdbcTemplate.execute( + "CREATE TABLE IF NOT EXISTS jsonnet_logs (\n" + + " jsonnet_log_id SERIAL PRIMARY KEY,\n" + + " id VARCHAR(255) NOT NULL UNIQUE,\n" + + " split_size VARCHAR(255) NOT NULL,\n" + + " metadata TEXT NOT NULL,\n" + + " content TEXT,\n" + + " selected_file VARCHAR(255),\n" + + " f1 VARCHAR(255) NOT NULL,\n" + + " f2 VARCHAR(255) NOT NULL,\n" + + " created_at TIMESTAMP\n" + + ");\n"); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/client/OpenAiClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/client/OpenAiClient.java index e406cab3f..fffd19dab 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/client/OpenAiClient.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/client/OpenAiClient.java @@ -3,7 +3,8 @@ import com.edgechain.lib.constants.EndpointConstants; import com.edgechain.lib.embeddings.request.OpenAiEmbeddingRequest; import com.edgechain.lib.embeddings.response.OpenAiEmbeddingResponse; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.OpenAiEmbeddingEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.openai.request.ChatCompletionRequest; import com.edgechain.lib.openai.request.CompletionRequest; import com.edgechain.lib.openai.response.ChatCompletionResponse; @@ -27,17 +28,8 @@ public class OpenAiClient { private final Logger logger = LoggerFactory.getLogger(getClass()); private final RestTemplate restTemplate = new RestTemplate(); - private OpenAiEndpoint endpoint; - - public OpenAiEndpoint getEndpoint() { - return endpoint; - } - - public void setEndpoint(OpenAiEndpoint endpoint) { - this.endpoint = endpoint; - } - - public EdgeChain createChatCompletion(ChatCompletionRequest request) { + public EdgeChain createChatCompletion( + ChatCompletionRequest request, OpenAiChatEndpoint endpoint) { return new EdgeChain<>( Observable.create( @@ -74,9 +66,12 @@ public EdgeChain createChatCompletion(ChatCompletionRequ } public EdgeChain createChatCompletionStream( - ChatCompletionRequest request) { + ChatCompletionRequest request, OpenAiChatEndpoint endpoint) { try { + logger.info("Logging ChatCompletion Stream...."); + logger.info(request.toString()); + return new EdgeChain<>( RxJava3Adapter.fluxToObservable( WebClient.builder() @@ -102,7 +97,8 @@ public EdgeChain createChatCompletionStream( } } - public EdgeChain createCompletion(CompletionRequest request) { + public EdgeChain createCompletion( + CompletionRequest request, OpenAiChatEndpoint endpoint) { return new EdgeChain<>( Observable.create( emitter -> { @@ -128,7 +124,8 @@ public EdgeChain createCompletion(CompletionRequest request) endpoint); } - public EdgeChain createEmbeddings(OpenAiEmbeddingRequest request) { + public EdgeChain createEmbeddings( + OpenAiEmbeddingRequest request, OpenAiEmbeddingEndpoint endpoint) { return new EdgeChain<>( Observable.create( emitter -> { diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/providers/OpenAiCompletionProvider.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/providers/OpenAiCompletionProvider.java index e304a4232..52353f076 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/providers/OpenAiCompletionProvider.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/providers/OpenAiCompletionProvider.java @@ -1,15 +1,15 @@ package com.edgechain.lib.openai.providers; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.openai.request.CompletionRequest; import com.edgechain.lib.response.StringResponse; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; /** Going to be removed * */ public class OpenAiCompletionProvider { - private final OpenAiEndpoint endpoint; + private final OpenAiChatEndpoint endpoint; - public OpenAiCompletionProvider(OpenAiEndpoint endpoint) { + public OpenAiCompletionProvider(OpenAiChatEndpoint endpoint) { this.endpoint = endpoint; } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatCompletionRequest.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatCompletionRequest.java index 952d2e06a..4fe7ce4dd 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatCompletionRequest.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatCompletionRequest.java @@ -1,22 +1,70 @@ package com.edgechain.lib.openai.request; -import java.util.List; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.*; public class ChatCompletionRequest { + private static final Double DEFAULT_TEMPERATURE = 0.7; + private static final Boolean DEFAULT_STREAM = false; + private static final Double DEFAULT_TOP_P = 1.0; + private static final Integer DEFAULT_N = 1; + private static final List DEFAULT_STOP = Collections.emptyList(); + private static final Double DEFAULT_PRESENCE_PENALTY = 0.0; + private static final Double DEFAULT_FREQUENCY_PENALTY = 0.0; + private static final Map DEFAULT_LOGIT_BIAS = Collections.emptyMap(); + private static final String DEFAULT_USER = ""; + private String model; private Double temperature; private List messages; private Boolean stream; + @JsonProperty("top_p") + private Double topP; + + private Integer n; + + private List stop; + + @JsonProperty("presence_penalty") + private Double presencePenalty; + + @JsonProperty("frequency_penalty") + private Double frequencyPenalty; + + @JsonProperty("logit_bias") + private Map logitBias; + + private String user; + public ChatCompletionRequest() {} public ChatCompletionRequest( - String model, List messages, Double temperature, Boolean stream) { + String model, + Double temperature, + List messages, + Boolean stream, + Double topP, + Integer n, + List stop, + Double presencePenalty, + Double frequencyPenalty, + Map logitBias, + String user) { this.model = model; - this.temperature = temperature; + this.temperature = (temperature != null) ? temperature : DEFAULT_TEMPERATURE; this.messages = messages; - this.stream = stream; + this.stream = (stream != null) ? stream : DEFAULT_STREAM; + this.topP = (topP != null) ? topP : DEFAULT_TOP_P; + this.n = (n != null) ? n : DEFAULT_N; + this.stop = (stop != null) ? stop : DEFAULT_STOP; + this.presencePenalty = (presencePenalty != null) ? presencePenalty : DEFAULT_PRESENCE_PENALTY; + this.frequencyPenalty = + (frequencyPenalty != null) ? frequencyPenalty : DEFAULT_FREQUENCY_PENALTY; + this.logitBias = (logitBias != null) ? logitBias : DEFAULT_LOGIT_BIAS; + this.user = (user != null) ? user : DEFAULT_USER; } public String getModel() { @@ -51,15 +99,49 @@ public void setStream(Boolean stream) { this.stream = stream; } + public Double getTopP() { + return topP; + } + + public Integer getN() { + return n; + } + + public List getStop() { + return stop; + } + + public Double getPresencePenalty() { + return presencePenalty; + } + + public Double getFrequencyPenalty() { + return frequencyPenalty; + } + + public Map getLogitBias() { + return logitBias; + } + + public String getUser() { + return user; + } + @Override public String toString() { - final StringBuilder sb = new StringBuilder("ChatCompletionRequest{"); - sb.append("model='").append(model).append('\''); - sb.append(", temperature=").append(temperature); - sb.append(", messages=").append(messages); - sb.append(", stream=").append(stream); - sb.append('}'); - return sb.toString(); + return new StringJoiner(", ", ChatCompletionRequest.class.getSimpleName() + "[", "]") + .add("model='" + model + "'") + .add("temperature=" + temperature) + .add("messages=" + messages) + .add("stream=" + stream) + .add("topP=" + topP) + .add("n=" + n) + .add("stop=" + stop) + .add("presencePenalty=" + presencePenalty) + .add("frequencyPenalty=" + frequencyPenalty) + .add("logitBias=" + logitBias) + .add("user='" + user + "'") + .toString(); } public static ChatCompletionRequestBuilder builder() { @@ -70,8 +152,26 @@ public static class ChatCompletionRequestBuilder { private String model; private Double temperature; private List messages; + private Boolean stream; + + @JsonProperty("top_p") + private Double topP; - private Boolean stream = Boolean.FALSE; + private Integer n; + private List stop; + + @JsonProperty("presence_penalty") + private Double presencePenalty; + + @JsonProperty("frequency_penalty") + private Double frequencyPenalty; + + @JsonProperty("logit_bias") + private Map logitBias; + + private String user; + + private ChatCompletionRequestBuilder() {} public ChatCompletionRequestBuilder model(String model) { this.model = model; @@ -88,13 +188,59 @@ public ChatCompletionRequestBuilder messages(List messages) { return this; } - public ChatCompletionRequestBuilder stream(Boolean value) { - this.stream = value; + public ChatCompletionRequestBuilder stream(Boolean stream) { + this.stream = stream; + return this; + } + + public ChatCompletionRequestBuilder topP(Double topP) { + this.topP = topP; + return this; + } + + public ChatCompletionRequestBuilder n(Integer n) { + this.n = n; + return this; + } + + public ChatCompletionRequestBuilder stop(List stop) { + this.stop = stop; + return this; + } + + public ChatCompletionRequestBuilder presencePenalty(Double presencePenalty) { + this.presencePenalty = presencePenalty; + return this; + } + + public ChatCompletionRequestBuilder frequencyPenalty(Double frequencyPenalty) { + this.frequencyPenalty = frequencyPenalty; + return this; + } + + public ChatCompletionRequestBuilder logitBias(Map logitBias) { + this.logitBias = logitBias; + return this; + } + + public ChatCompletionRequestBuilder user(String user) { + this.user = user; return this; } public ChatCompletionRequest build() { - return new ChatCompletionRequest(model, messages, temperature, stream); + return new ChatCompletionRequest( + model, + temperature, + messages, + stream, + topP, + n, + stop, + presencePenalty, + frequencyPenalty, + logitBias, + user); } } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatMessage.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatMessage.java index 6ea6007b6..44642313b 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatMessage.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/request/ChatMessage.java @@ -22,6 +22,10 @@ public String getContent() { return content; } + public void setRole(String role) { + this.role = role; + } + public void setContent(String content) { this.content = content; } @@ -33,8 +37,15 @@ public String toString() { public JSONObject toJson() { JSONObject json = new JSONObject(); - json.put("role", role); - json.put("content", content); + + if (role != null) { + json.put("role", role); + } + + if (content != null) { + json.put("content", content); + } + return json; } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/ChatCompletionResponse.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/ChatCompletionResponse.java index d44acfc67..fd4ced252 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/ChatCompletionResponse.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/openai/response/ChatCompletionResponse.java @@ -86,13 +86,31 @@ public String toString() { @Override public JSONObject toJson() { JSONObject json = new JSONObject(); - json.put("id", id); - json.put("object", object); + + if (id != null) { + json.put("id", id); + } + + if (object != null) { + json.put("object", object); + } + json.put("created", created); - json.put("model", model); - json.put( - "choices", choices.stream().map(ChatCompletionChoice::toJson).collect(Collectors.toList())); - json.put("usage", usage.toJson()); + + if (model != null) { + json.put("model", model); + } + + if (choices != null) { + json.put( + "choices", + choices.stream().map(ChatCompletionChoice::toJson).collect(Collectors.toList())); + } + + if (usage != null) { + json.put("usage", usage.toJson()); + } + return json; } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/ArkRequest.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/ArkRequest.java index dd047758f..875bba38c 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/ArkRequest.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/request/ArkRequest.java @@ -9,12 +9,12 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import java.io.BufferedReader; import java.io.IOException; import java.security.Principal; import java.util.Collection; import java.util.Enumeration; import java.util.Objects; -import java.util.stream.Collectors; public class ArkRequest { @@ -99,8 +99,15 @@ public int getIntQueryParam(String key) { } public JSONObject getBody() { - try { - return new JSONObject(this.request.getReader().lines().collect(Collectors.joining())); + + StringBuilder jsonContent = new StringBuilder(); + + try (BufferedReader reader = request.getReader()) { + String line; + while ((line = reader.readLine()) != null) { + jsonContent.append(line); + } + return new JSONObject(jsonContent.toString()); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitter.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitter.java index 97a26403e..b2dda1187 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitter.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitter.java @@ -12,6 +12,6 @@ public ArkEmitter(EdgeChain edgeChain) { } public ArkEmitter(Observable observable) { - this.observer = new ArkEmitterObserver(observable, this); + this.observer = new ArkEmitterObserver<>(observable, this); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitterObserver.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitterObserver.java index fc0f2fbd8..16140aab7 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitterObserver.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkEmitterObserver.java @@ -39,6 +39,7 @@ public void onError(@NonNull Throwable e) { @Override public void onComplete() { + if (!completed) { completed = true; responseBodyEmitter.complete(); diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObservable.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObservable.java index 88c816f56..8f1f56fdd 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObservable.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/response/ArkObservable.java @@ -9,7 +9,7 @@ public class ArkObservable extends DeferredResult implements ArkResponse { private final ArkObserver observer; public ArkObservable(EdgeChain edgeChain) { - observer = new ArkObserver<>(edgeChain.getScheduledObservable(), this); + observer = new ArkObserver<>(edgeChain.getObservable(), this); } public ArkObservable(Observable observable) { diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/AirtableService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/AirtableService.java new file mode 100644 index 000000000..dc5744a9d --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/AirtableService.java @@ -0,0 +1,29 @@ +package com.edgechain.lib.retrofit; + +import com.edgechain.lib.endpoint.impl.integration.AirtableEndpoint; +import dev.fuxing.airtable.AirtableRecord; +import io.reactivex.rxjava3.core.Single; +import retrofit2.http.Body; +import retrofit2.http.HTTP; +import retrofit2.http.POST; + +import java.util.List; +import java.util.Map; + +public interface AirtableService { + + @POST("airtable/findAll") + Single> findAll(@Body AirtableEndpoint endpoint); + + @POST("airtable/findById") + Single findById(@Body AirtableEndpoint endpoint); + + @POST("airtable/create") + Single> create(@Body AirtableEndpoint endpoint); + + @POST("airtable/update") + Single> update(@Body AirtableEndpoint endpoint); + + @HTTP(method = "DELETE", path = "airtable/delete", hasBody = true) + Single> delete(@Body AirtableEndpoint endpoint); +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/BgeSmallService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/BgeSmallService.java index 3f8302378..ad7526fe5 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/BgeSmallService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/BgeSmallService.java @@ -1,7 +1,7 @@ package com.edgechain.lib.retrofit; import com.edgechain.lib.embeddings.bgeSmall.response.BgeSmallResponse; -import com.edgechain.lib.endpoint.impl.BgeSmallEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.BgeSmallEndpoint; import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; import retrofit2.http.POST; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/Llama2Service.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/Llama2Service.java new file mode 100644 index 000000000..5f18ace6c --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/Llama2Service.java @@ -0,0 +1,18 @@ +package com.edgechain.lib.retrofit; + +import com.edgechain.lib.endpoint.impl.llm.LLamaQuickstart; +import com.edgechain.lib.endpoint.impl.llm.Llama2Endpoint; +import com.edgechain.lib.llama2.response.Llama2ChatCompletionResponse; +import io.reactivex.rxjava3.core.Single; +import retrofit2.http.Body; +import retrofit2.http.POST; + +import java.util.List; + +public interface Llama2Service { + @POST(value = "llama/chat-completion") + Single> chatCompletion(@Body Llama2Endpoint llama2Endpoint); + + @POST(value = "llama/chat-completion") + Single llamaCompletion(@Body LLamaQuickstart lLamaQuickstart); +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/MiniLMService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/MiniLMService.java index a0cfaff77..96e09ba1b 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/MiniLMService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/MiniLMService.java @@ -2,7 +2,7 @@ import com.edgechain.lib.embeddings.miniLLM.response.MiniLMResponse; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.MiniLMEndpoint; import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; import retrofit2.http.POST; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/OpenAiService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/OpenAiService.java index c1bd2e116..814b815a1 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/OpenAiService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/OpenAiService.java @@ -1,9 +1,10 @@ package com.edgechain.lib.retrofit; import com.edgechain.lib.embeddings.response.OpenAiEmbeddingResponse; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.OpenAiEmbeddingEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.openai.response.ChatCompletionResponse; -import io.reactivex.rxjava3.core.Completable; +import com.edgechain.lib.openai.response.CompletionResponse; import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; import retrofit2.http.POST; @@ -11,11 +12,11 @@ public interface OpenAiService { @POST(value = "openai/chat-completion") - Single chatCompletion(@Body OpenAiEndpoint openAiEndpoint); + Single chatCompletion(@Body OpenAiChatEndpoint OpenAiChatEndpoint); @POST(value = "openai/completion") - Single completion(@Body OpenAiEndpoint openAiEndpoint); + Single completion(@Body OpenAiChatEndpoint openAiChatEndpoint); @POST(value = "openai/embeddings") - Single embeddings(@Body OpenAiEndpoint openAiEndpoint); + Single embeddings(@Body OpenAiEmbeddingEndpoint openAiEmbeddingEndpoint); } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PineconeService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PineconeService.java index 9d5282377..0a74c27dc 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PineconeService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PineconeService.java @@ -1,7 +1,7 @@ package com.edgechain.lib.retrofit; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.PineconeEndpoint; +import com.edgechain.lib.endpoint.impl.index.PineconeEndpoint; import com.edgechain.lib.response.StringResponse; import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; @@ -15,6 +15,9 @@ public interface PineconeService { @POST(value = "index/pinecone/upsert") Single upsert(@Body PineconeEndpoint pineconeEndpoint); + @POST(value = "index/pinecone/batch-upsert") + Single batchUpsert(@Body PineconeEndpoint pineconeEndpoint); + @POST(value = "index/pinecone/query") Single> query(@Body PineconeEndpoint pineconeEndpoint); diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgreSQLContextService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgreSQLContextService.java index b1b8325d9..d4b28f3dc 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgreSQLContextService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgreSQLContextService.java @@ -2,7 +2,7 @@ import com.edgechain.lib.context.domain.ContextPutRequest; import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.PostgreSQLHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.context.PostgreSQLHistoryContextEndpoint; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Single; import retrofit2.http.*; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgresService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgresService.java index bdbd229b7..a8701d952 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgresService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/PostgresService.java @@ -1,6 +1,6 @@ package com.edgechain.lib.retrofit; -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; import com.edgechain.lib.index.domain.PostgresWordEmbeddings; import com.edgechain.lib.response.StringResponse; import io.reactivex.rxjava3.core.Single; @@ -12,13 +12,46 @@ public interface PostgresService { + @POST(value = "index/postgres/create-table") + Single createTable(@Body PostgresEndpoint postgresEndpoint); + + @POST(value = "index/postgres/metadata/create-table") + Single createMetadataTable(@Body PostgresEndpoint postgresEndpoint); + @POST(value = "index/postgres/upsert") Single upsert(@Body PostgresEndpoint postgresEndpoint); - // + @POST(value = "index/postgres/batch-upsert") + Single> batchUpsert(@Body PostgresEndpoint postgresEndpoint); + + @POST(value = "index/postgres/metadata/insert") + Single insertMetadata(@Body PostgresEndpoint postgresEndpoint); + + @POST(value = "index/postgres/metadata/batch-insert") + Single> batchInsertMetadata(@Body PostgresEndpoint postgresEndpoint); + + @POST(value = "index/postgres/join/insert") + Single insertIntoJoinTable(@Body PostgresEndpoint postgresEndpoint); + + @POST(value = "index/postgres/join/batch-insert") + Single batchInsertIntoJoinTable(@Body PostgresEndpoint postgresEndpoint); + @POST(value = "index/postgres/query") Single> query(@Body PostgresEndpoint postgresEndpoint); + @POST(value = "index/postgres/query-rrf") + Single> queryRRF(@Body PostgresEndpoint postgresEndpoint); + + @POST(value = "index/postgres/metadata/query") + Single> queryWithMetadata(@Body PostgresEndpoint postgresEndpoint); + + @POST(value = "index/postgres/chunks") + Single> getAllChunks(@Body PostgresEndpoint postgresEndpoint); + + @POST(value = "index/postgres/similarity-metadata") + Single> getSimilarMetadataChunk( + @Body PostgresEndpoint postgresEndpoint); + @POST("index/postgres/probes") Single probes(@Body PostgresEndpoint postgresEndpoint); diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisContextService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisContextService.java index bc327e916..faa4843e0 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisContextService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisContextService.java @@ -3,7 +3,7 @@ import com.edgechain.lib.context.domain.ContextPutRequest; import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.RedisHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.context.RedisHistoryContextEndpoint; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Single; import retrofit2.http.*; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisService.java index 513fb5dc5..b29ba59f7 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/RedisService.java @@ -1,25 +1,30 @@ package com.edgechain.lib.retrofit; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.RedisEndpoint; +import com.edgechain.lib.endpoint.impl.index.RedisEndpoint; import com.edgechain.lib.response.StringResponse; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; import retrofit2.http.HTTP; import retrofit2.http.POST; -import retrofit2.http.Query; import java.util.List; public interface RedisService { + @POST(value = "index/redis/create-index") + Single createIndex(@Body RedisEndpoint redisEndpoint); + @POST(value = "index/redis/upsert") Single upsert(@Body RedisEndpoint redisEndpoint); + @POST(value = "index/redis/batch-upsert") + Single batchUpsert(@Body RedisEndpoint redisEndpoint); + @POST(value = "index/redis/query") Single> query(@Body RedisEndpoint redisEndpoint); @HTTP(method = "DELETE", path = "index/redis/delete", hasBody = true) - Completable deleteByPattern(@Query("pattern") String pattern, @Body RedisEndpoint redisEndpoint); + Completable deleteByPattern(@Body RedisEndpoint redisEndpoint); } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/WikiService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/WikiService.java index d5b2d33bf..6b24c965f 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/WikiService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/WikiService.java @@ -1,6 +1,6 @@ package com.edgechain.lib.retrofit; -import com.edgechain.lib.endpoint.impl.WikiEndpoint; +import com.edgechain.lib.endpoint.impl.wiki.WikiEndpoint; import com.edgechain.lib.wiki.response.WikiResponse; import io.reactivex.rxjava3.core.Single; import retrofit2.http.Body; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/OpenAiStreamService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/OpenAiStreamService.java index 4bdab038e..4392bb348 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/OpenAiStreamService.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/OpenAiStreamService.java @@ -2,11 +2,10 @@ import com.edgechain.lib.configuration.WebConfiguration; import com.edgechain.lib.configuration.domain.SecurityUUID; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.openai.response.ChatCompletionResponse; import com.edgechain.lib.utils.JsonUtils; import io.reactivex.rxjava3.core.Observable; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -22,10 +21,7 @@ public class OpenAiStreamService { @Autowired private SecurityUUID securityUUID; - public Observable chatCompletion(OpenAiEndpoint openAiEndpoint) { - - logger.info("Logging Chat Completion Stream...."); - logger.info("Prompt: " + StringUtils.join(openAiEndpoint.getChatMessages())); + public Observable chatCompletion(OpenAiChatEndpoint endpoint) { return RxJava3Adapter.fluxToObservable( WebClient.builder() @@ -43,7 +39,7 @@ public Observable chatCompletion(OpenAiEndpoint openAiEn httpHeaders.set("stream", "true"); httpHeaders.set("Authorization", securityUUID.getAuthKey()); }) - .bodyValue(JsonUtils.convertToString(openAiEndpoint)) + .bodyValue(JsonUtils.convertToString(endpoint)) .retrieve() .bodyToFlux(ChatCompletionResponse.class)); } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/RetrofitClientInstance.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/RetrofitClientInstance.java index f2b7c6b4b..b0fa2921d 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/RetrofitClientInstance.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/client/RetrofitClientInstance.java @@ -13,6 +13,12 @@ import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; +import okhttp3.ConnectionPool; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -21,23 +27,25 @@ import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory; import retrofit2.converter.jackson.JacksonConverterFactory; -import java.lang.reflect.Type; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - public class RetrofitClientInstance { - private static final String BASE_URL = "http://0.0.0.0"; + private RetrofitClientInstance() { + // no + } - private static SecurityUUID securityUUID = - ApplicationContextHolder.getContext().getBean(SecurityUUID.class); + private static final String BASE_URL = "http://0.0.0.0"; + private static SecurityUUID securityUUID; private static Retrofit retrofit; public static Retrofit getInstance() { if (retrofit == null) { + // tests may set this to a mock - do not overwrite it if present. + if (securityUUID == null) { + securityUUID = ApplicationContextHolder.getContext().getBean(SecurityUUID.class); + } + return retrofit = new Retrofit.Builder() .baseUrl( @@ -46,43 +54,49 @@ public static Retrofit getInstance() { + System.getProperty("server.port") + WebConfiguration.CONTEXT_PATH + "/") - .addConverterFactory(JacksonBuilder()) + .addConverterFactory(createJacksonFactory()) .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .client( new OkHttpClient.Builder() + .connectionPool(new ConnectionPool(10, 5, TimeUnit.MINUTES)) .addInterceptor( chain -> { - Request original = chain.request(); - Request request = - original - .newBuilder() - .header("Authorization", securityUUID.getAuthKey()) - .build(); - Response response = chain.proceed(request); - String body = response.body().string(); + try { + Request original = chain.request(); + final String authKey = securityUUID.getAuthKey(); + Request request = + original.newBuilder().header("Authorization", authKey).build(); + Response response = chain.proceed(request); + String body = response.body().string(); - String errorMessage = ""; + String errorMessage = ""; - if (!response.isSuccessful()) { - // Create a new Gson object - Gson gson = new Gson(); + if (!response.isSuccessful()) { + // Create a new Gson object + Gson gson = new Gson(); - // Define the type for the map - Type type = new TypeToken>() {}.getType(); + // Define the type for the map + Type type = new TypeToken>() {}.getType(); - // Convert JSON string into a map - Map map = gson.fromJson(body, type); + // Convert JSON string into a map + Map map = gson.fromJson(body, type); - if (Objects.nonNull(map)) { - errorMessage = map.toString(); + if (Objects.nonNull(map)) { + errorMessage = map.toString(); + } } - } - return response - .newBuilder() - .body(ResponseBody.create(body, response.body().contentType())) - .message(errorMessage) - .build(); + return response + .newBuilder() + .body(ResponseBody.create(body, response.body().contentType())) + .message(errorMessage) + .build(); + } catch (Exception e) { + // Interceptor can handle only IOException. Anything else = stall. + // Solution: wrap any exception in an IOException. + // Read more here: https://github.com/square/retrofit/issues/3453 + throw new IOException(e); + } }) .connectTimeout(15, TimeUnit.MINUTES) .readTimeout(20, TimeUnit.MINUTES) @@ -92,7 +106,7 @@ public static Retrofit getInstance() { return retrofit; } - private static JacksonConverterFactory JacksonBuilder() { + private static JacksonConverterFactory createJacksonFactory() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); objectMapper.registerModule(new JavaTimeModule()); @@ -100,7 +114,6 @@ private static JacksonConverterFactory JacksonBuilder() { objectMapper.registerModule(new Jdk8Module()); objectMapper.registerModule(new PageJacksonModule()); objectMapper.registerModule(new SortJacksonModule()); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); return JacksonConverterFactory.create(objectMapper); } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/logger/JsonnetLoggerService.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/logger/JsonnetLoggerService.java new file mode 100644 index 000000000..85bf99e7f --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/retrofit/logger/JsonnetLoggerService.java @@ -0,0 +1,24 @@ +package com.edgechain.lib.retrofit.logger; + +import com.edgechain.lib.logger.entities.JsonnetLog; +import io.reactivex.rxjava3.core.Single; +import java.util.HashMap; +import org.springframework.data.domain.Page; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Path; + +public interface JsonnetLoggerService { + + @GET(value = "logs/jsonnet/findAll/{page}/{size}") + Single> findAll(@Path("page") int page, @Path("size") int size); + + @GET(value = "logs/jsonnet/findAll/sorted/{page}/{size}") + Single> findAllOrderByCreatedAtDesc( + @Path("page") int page, @Path("size") int size); + + @POST(value = "logs/jsonnet/findByName/sorted/{page}/{size}") + Single> findAllBySelectedFileOrderByCreatedAtDesc( + @Body HashMap mapper, @Path("page") int page, @Path("size") int size); +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/AbstractEdgeChain.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/AbstractEdgeChain.java index 2546488aa..f4e3cdb99 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/AbstractEdgeChain.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/AbstractEdgeChain.java @@ -2,10 +2,19 @@ import com.edgechain.lib.rxjava.retry.RetryPolicy; import io.reactivex.rxjava3.annotations.NonNull; -import io.reactivex.rxjava3.core.*; +import io.reactivex.rxjava3.core.Completable; +import io.reactivex.rxjava3.core.Notification; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.ObservableSource; +import io.reactivex.rxjava3.core.Scheduler; +import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.Disposable; -import io.reactivex.rxjava3.functions.*; - +import io.reactivex.rxjava3.functions.Action; +import io.reactivex.rxjava3.functions.BiFunction; +import io.reactivex.rxjava3.functions.BooleanSupplier; +import io.reactivex.rxjava3.functions.Consumer; +import io.reactivex.rxjava3.functions.Function; +import io.reactivex.rxjava3.functions.Predicate; import java.io.Serializable; public abstract class AbstractEdgeChain implements Serializable { @@ -14,7 +23,7 @@ public abstract class AbstractEdgeChain implements Serializable { protected Observable observable; - public AbstractEdgeChain(Observable observable) { + protected AbstractEdgeChain(Observable observable) { this.observable = observable; } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/EdgeChain.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/EdgeChain.java index a030780d5..7e3f42cb6 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/EdgeChain.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/rxjava/transformer/observable/EdgeChain.java @@ -178,6 +178,13 @@ public Single toSingle() { else return this.observable.subscribeOn(Schedulers.io()).firstOrError(); } + public Single toSingleWithoutScheduler() { + + if (RetryUtils.available(endpoint)) + return this.observable.retryWhen(endpoint.getRetryPolicy()).firstOrError(); + else return this.observable.firstOrError(); + } + @Override public T get() { if (RetryUtils.available(endpoint)) @@ -220,10 +227,10 @@ public void completed(Action onComplete, Consumer onError) { } public ArkResponse getArkResponse() { - return new ArkObservable<>(this.observable.subscribeOn(Schedulers.io())); + return new ArkObservable<>(this.observable); } public ArkResponse getArkStreamResponse() { - return new ArkEmitter<>(this.observable.subscribeOn(Schedulers.io())); + return new ArkEmitter<>(this.observable); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtFilter.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtFilter.java index 9fe5614ca..480b62fc9 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtFilter.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtFilter.java @@ -13,7 +13,6 @@ import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Objects; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; @@ -60,6 +59,9 @@ protected void doFilterInternal( try { claimsJws = jwtHelper.parseToken(token); } catch (final Exception e) { + // use Spring Security logger here instead of SLF4J + logger.info("JWT not accepted: %s".formatted(e.getMessage())); + ErrorResponse errorResponse = new ErrorResponse(e.getMessage()); response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.getWriter().print(JsonUtils.convertToString(errorResponse)); @@ -70,6 +72,9 @@ protected void doFilterInternal( String email = (String) claimsJws.getBody().get("email"); String role = (String) claimsJws.getBody().get("role"); + // use Spring Security logger here instead of SLF4J + logger.info("JWT email=%s role=%s".formatted(email, role)); + User user = new User(); user.setEmail(email); user.setAccessToken(token); diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtHelper.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtHelper.java index a97d6112b..2ff8fcf58 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtHelper.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/JwtHelper.java @@ -2,6 +2,7 @@ import io.jsonwebtoken.*; import java.security.Key; +import java.util.Objects; import javax.crypto.spec.SecretKeySpec; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; @@ -14,10 +15,10 @@ public class JwtHelper { public Jws parseToken(String accessToken) { try { - Key hmacKey = - new SecretKeySpec( - env.getProperty("jwt.secret").getBytes(), SignatureAlgorithm.HS256.getJcaName()); - + final String secret = env.getProperty("jwt.secret"); + Objects.requireNonNull(secret, "JWT secret not set"); + final byte[] bytes = secret.getBytes(); + final Key hmacKey = new SecretKeySpec(bytes, SignatureAlgorithm.HS256.getJcaName()); return Jwts.parser().setSigningKey(hmacKey).parseClaimsJws(accessToken); } catch (MalformedJwtException e) { @@ -33,27 +34,12 @@ public Jws parseToken(String accessToken) { } } - // validate public boolean validate(String accessToken) { try { - Key hmacKey = - new SecretKeySpec( - env.getProperty("jwt.secret").getBytes(), SignatureAlgorithm.HS256.getJcaName()); - - // String encoded = - // Base64.getEncoder().encodeToString(this.supabaseEnv.getJwtSecret().getBytes()); - Jwts.parser().setSigningKey(hmacKey).parseClaimsJws(accessToken); + parseToken(accessToken); return true; - } catch (MalformedJwtException e) { - throw new JwtException("Token Malformed"); - } catch (UnsupportedJwtException e) { - throw new JwtException("Token Unsupported"); - } catch (ExpiredJwtException e) { - throw new JwtException("Token Expired"); - } catch (IllegalArgumentException e) { - throw new JwtException("Token Empty"); - } catch (SignatureException e) { - throw new JwtException("Token Signature Failed"); + } catch (JwtException e) { + return false; } } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/WebSecurity.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/WebSecurity.java index cd35fabc8..bc6494253 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/WebSecurity.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/supabase/security/WebSecurity.java @@ -2,6 +2,9 @@ import com.edgechain.lib.configuration.WebConfiguration; import com.edgechain.lib.configuration.domain.AuthFilter; +import java.util.Arrays; +import java.util.Objects; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; @@ -15,6 +18,7 @@ import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @@ -25,9 +29,6 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; -import java.util.Arrays; -import java.util.Objects; - @EnableWebSecurity @EnableMethodSecurity @Configuration @@ -38,62 +39,94 @@ public class WebSecurity { @Autowired private JwtFilter jwtFilter; @Bean - public AuthenticationManager authenticationManager(AuthenticationConfiguration config) - throws Exception { + AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { return config.getAuthenticationManager(); } @Bean - public PasswordEncoder passwordEncoder() { + PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - - return http.cors() - .configurationSource(corsConfiguration()) - .and() - .csrf() - .disable() - .authorizeHttpRequests( - (auth) -> { - try { - auth.requestMatchers("" + WebConfiguration.CONTEXT_PATH + "/**") - .permitAll() - .requestMatchers(HttpMethod.POST, authFilter.getRequestPost().getRequests()) - .hasAnyAuthority(authFilter.getRequestPost().getAuthorities()) - // - .requestMatchers(HttpMethod.GET, authFilter.getRequestGet().getRequests()) - .hasAnyAuthority(authFilter.getRequestGet().getAuthorities()) - .requestMatchers(HttpMethod.DELETE, authFilter.getRequestDelete().getRequests()) - .hasAnyAuthority(authFilter.getRequestDelete().getAuthorities()) - .requestMatchers(HttpMethod.PUT, authFilter.getRequestPut().getRequests()) - .hasAnyAuthority(authFilter.getRequestPut().getAuthorities()) - .requestMatchers(HttpMethod.PATCH, authFilter.getRequestPatch().getRequests()) - .hasAnyAuthority(authFilter.getRequestPatch().getAuthorities()) - .anyRequest() - .permitAll(); - - } catch (Exception e) { - throw new RuntimeException(e); - } - }) + SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + + http.cors(cors -> cors.configurationSource(corsConfiguration())) + .csrf(csrf -> csrf.disable()) + .authorizeHttpRequests(auth -> buildAuth(auth)) .httpBasic(Customizer.withDefaults()) .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class) - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .exceptionHandling() - .and() + .sessionManagement( + management -> management.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .exceptionHandling(Customizer.withDefaults()) .securityContext(c -> c.requireExplicitSave(false)) - .formLogin() - .disable() - .build(); + .formLogin(login -> login.disable()); + return http.build(); + } + + private AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry + buildAuth( + AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry + auth) { + AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry reg = + auth.requestMatchers("" + WebConfiguration.CONTEXT_PATH + "/**").permitAll(); + + reg = + applyAuth( + reg.requestMatchers( + HttpMethod.POST, safeRequests(authFilter.getRequestPost().getRequests(), "POST")), + authFilter.getRequestPost().getAuthorities()); + reg = + applyAuth( + reg.requestMatchers( + HttpMethod.GET, safeRequests(authFilter.getRequestGet().getRequests(), "GET")), + authFilter.getRequestGet().getAuthorities()); + reg = + applyAuth( + reg.requestMatchers( + HttpMethod.DELETE, + safeRequests(authFilter.getRequestDelete().getRequests(), "DELETE")), + authFilter.getRequestDelete().getAuthorities()); + reg = + applyAuth( + reg.requestMatchers( + HttpMethod.PUT, safeRequests(authFilter.getRequestPut().getRequests(), "PUT")), + authFilter.getRequestPut().getAuthorities()); + reg = + applyAuth( + reg.requestMatchers( + HttpMethod.PATCH, + safeRequests(authFilter.getRequestPatch().getRequests(), "PATCH")), + authFilter.getRequestPatch().getAuthorities()); + + reg = reg.anyRequest().permitAll(); + return reg; + } + + private String[] safeRequests(String[] src, String method) { + if (src == null || src.length == 0 || (src.length == 1 && src[0].isEmpty())) { + LoggerFactory.getLogger(getClass()) + .warn( + "Http {} security request patterns outdated. Fixed to a list with one String \"**\" -" + + " please update your configuration", + method); + return new String[] {"**"}; + } else { + return src; + } + } + + private AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry + applyAuth(AuthorizeHttpRequestsConfigurer.AuthorizedUrl url, String[] auths) { + if (auths == null || auths.length == 0 || (auths.length == 1 && auths[0].isEmpty())) { + return url.permitAll(); + } else { + return url.hasAnyAuthority(auths); + } } @Bean - public CorsConfigurationSource corsConfiguration() { + CorsConfigurationSource corsConfiguration() { CorsConfiguration configuration = new CorsConfiguration(); @@ -126,7 +159,7 @@ public CorsConfigurationSource corsConfiguration() { } @Bean - public FilterRegistrationBean corsFilter() { + FilterRegistrationBean corsFilter() { FilterRegistrationBean bean = new FilterRegistrationBean<>(new CorsFilter(corsConfiguration())); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); @@ -134,7 +167,7 @@ public FilterRegistrationBean corsFilter() { } @Bean - public FilterRegistrationBean jwtFilterFilterRegistrationBean(JwtFilter jwtFilter) { + FilterRegistrationBean jwtFilterFilterRegistrationBean(JwtFilter jwtFilter) { FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(jwtFilter); registrationBean.setEnabled(false); return registrationBean; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/ContextReorder.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/ContextReorder.java new file mode 100644 index 000000000..a3fb83282 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/utils/ContextReorder.java @@ -0,0 +1,50 @@ +package com.edgechain.lib.utils; + +import com.edgechain.lib.embeddings.WordEmbeddings; +import com.edgechain.lib.index.domain.PostgresWordEmbeddings; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +@Component +public class ContextReorder { + + public List reorderWordEmbeddings(List wordEmbeddingsList) { + + wordEmbeddingsList.sort(Comparator.comparingDouble(WordEmbeddings::getScore).reversed()); + + int mid = wordEmbeddingsList.size() / 2; + + List modifiedList = new ArrayList<>(wordEmbeddingsList.subList(0, mid)); + + List secondHalfList = + wordEmbeddingsList.subList(mid, wordEmbeddingsList.size()); + secondHalfList.sort(Comparator.comparingDouble(WordEmbeddings::getScore)); + + modifiedList.addAll(secondHalfList); + + return modifiedList; + } + + public List reorderPostgresWordEmbeddings( + List postgresWordEmbeddings) { + + postgresWordEmbeddings.sort( + Comparator.comparingDouble(PostgresWordEmbeddings::getScore).reversed()); + + int mid = postgresWordEmbeddings.size() / 2; + + List modifiedList = + new ArrayList<>(postgresWordEmbeddings.subList(0, mid)); + + List secondHalfList = + postgresWordEmbeddings.subList(mid, postgresWordEmbeddings.size()); + secondHalfList.sort(Comparator.comparingDouble(PostgresWordEmbeddings::getScore)); + + modifiedList.addAll(secondHalfList); + + return modifiedList; + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/wiki/client/WikiClient.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/wiki/client/WikiClient.java index bd647cd72..677b543c4 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/wiki/client/WikiClient.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/lib/wiki/client/WikiClient.java @@ -1,6 +1,6 @@ package com.edgechain.lib.wiki.client; -import com.edgechain.lib.endpoint.impl.WikiEndpoint; +import com.edgechain.lib.endpoint.impl.wiki.WikiEndpoint; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import com.edgechain.lib.wiki.response.WikiResponse; import com.fasterxml.jackson.databind.JsonNode; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/bgeSmall/BgeSmallController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/bgeSmall/BgeSmallController.java index 41210f1cc..57e23b21a 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/bgeSmall/BgeSmallController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/bgeSmall/BgeSmallController.java @@ -3,7 +3,7 @@ import com.edgechain.lib.configuration.WebConfiguration; import com.edgechain.lib.embeddings.bgeSmall.BgeSmallClient; import com.edgechain.lib.embeddings.bgeSmall.response.BgeSmallResponse; -import com.edgechain.lib.endpoint.impl.BgeSmallEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.BgeSmallEndpoint; import com.edgechain.lib.logger.entities.EmbeddingLog; import com.edgechain.lib.logger.services.EmbeddingLogService; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; @@ -32,10 +32,8 @@ public class BgeSmallController { @PostMapping public Single embeddings(@RequestBody BgeSmallEndpoint bgeSmallEndpoint) { - this.bgeSmallClient.setEndpoint(bgeSmallEndpoint); - EdgeChain edgeChain = - this.bgeSmallClient.createEmbeddings(bgeSmallEndpoint.getInput()); + this.bgeSmallClient.createEmbeddings(bgeSmallEndpoint.getRawText(), bgeSmallEndpoint); if (Objects.nonNull(env.getProperty("postgres.db.host"))) { @@ -53,9 +51,9 @@ public Single embeddings(@RequestBody BgeSmallEndpoint bgeSmal embeddingLog.setLatency(duration.toMillis()); embeddingLogService.saveOrUpdate(embeddingLog); }) - .toSingle(); + .toSingleWithoutScheduler(); } - return edgeChain.toSingle(); + return edgeChain.toSingleWithoutScheduler(); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/PostgreSQLHistoryContextController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/PostgreSQLHistoryContextController.java index cf5d8d16b..fce8831c0 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/PostgreSQLHistoryContextController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/PostgreSQLHistoryContextController.java @@ -4,7 +4,7 @@ import com.edgechain.lib.context.client.impl.PostgreSQLHistoryContextClient; import com.edgechain.lib.context.domain.ContextPutRequest; import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.PostgreSQLHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.context.PostgreSQLHistoryContextEndpoint; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Single; import org.springframework.beans.factory.annotation.Autowired; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/RedisHistoryContextController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/RedisHistoryContextController.java index ce97d689a..1a4c4a402 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/RedisHistoryContextController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/context/RedisHistoryContextController.java @@ -4,7 +4,7 @@ import com.edgechain.lib.context.client.impl.RedisHistoryContextClient; import com.edgechain.lib.context.domain.ContextPutRequest; import com.edgechain.lib.context.domain.HistoryContext; -import com.edgechain.lib.endpoint.impl.RedisHistoryContextEndpoint; +import com.edgechain.lib.endpoint.impl.context.RedisHistoryContextEndpoint; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Single; import org.springframework.beans.factory.annotation.Autowired; diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PineconeController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PineconeController.java index 8a7a8a527..98d3cd9f3 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PineconeController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PineconeController.java @@ -2,10 +2,9 @@ import com.edgechain.lib.configuration.WebConfiguration; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.PineconeEndpoint; +import com.edgechain.lib.endpoint.impl.index.PineconeEndpoint; import com.edgechain.lib.index.client.impl.PineconeClient; import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import io.reactivex.rxjava3.core.Single; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,32 +19,21 @@ public class PineconeController { @PostMapping("/upsert") public Single upsert(@RequestBody PineconeEndpoint pineconeEndpoint) { + return pineconeClient.upsert(pineconeEndpoint).toSingle(); + } - pineconeClient.setEndpoint(pineconeEndpoint); - - EdgeChain edgeChain = - pineconeClient.upsert(pineconeEndpoint.getWordEmbeddings()); - - return edgeChain.toSingle(); + @PostMapping("/batch-upsert") + public Single batchUpsert(@RequestBody PineconeEndpoint pineconeEndpoint) { + return pineconeClient.batchUpsert(pineconeEndpoint).toSingleWithoutScheduler(); } @PostMapping("/query") public Single> query(@RequestBody PineconeEndpoint pineconeEndpoint) { - - pineconeClient.setEndpoint(pineconeEndpoint); - - EdgeChain> edgeChain = - pineconeClient.query(pineconeEndpoint.getWordEmbeddings(), pineconeEndpoint.getTopK()); - - return edgeChain.toSingle(); + return pineconeClient.query(pineconeEndpoint).toSingle(); } @DeleteMapping("/deleteAll") public Single deleteAll(@RequestBody PineconeEndpoint pineconeEndpoint) { - - pineconeClient.setEndpoint(pineconeEndpoint); - - EdgeChain edgeChain = pineconeClient.deleteAll(); - return edgeChain.toSingle(); + return pineconeClient.deleteAll(pineconeEndpoint).toSingle(); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PostgresController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PostgresController.java index 58491b687..a83f48db3 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PostgresController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/PostgresController.java @@ -1,7 +1,7 @@ package com.edgechain.service.controllers.index; import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.endpoint.impl.PostgresEndpoint; +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; import com.edgechain.lib.index.client.impl.PostgresClient; import com.edgechain.lib.index.domain.PostgresWordEmbeddings; import com.edgechain.lib.response.StringResponse; @@ -20,38 +20,85 @@ public class PostgresController { @Autowired @Lazy private PostgresClient postgresClient; + @PostMapping("/create-table") + public Single createTable(@RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.createTable(postgresEndpoint).toSingle(); + } + + @PostMapping("/metadata/create-table") + public Single createMetadataTable( + @RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.createMetadataTable(postgresEndpoint).toSingle(); + } + @PostMapping("/upsert") public Single upsert(@RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.upsert(postgresEndpoint).toSingle(); + } - this.postgresClient.setPostgresEndpoint(postgresEndpoint); - EdgeChain edgeChain = - this.postgresClient.upsert(postgresEndpoint.getWordEmbeddings()); + @PostMapping("/batch-upsert") + public Single> batchUpsert(@RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.batchUpsert(postgresEndpoint).toSingleWithoutScheduler(); + } + + @PostMapping("/metadata/insert") + public Single insertMetadata(@RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.insertMetadata(postgresEndpoint).toSingle(); + } + + @PostMapping("/metadata/batch-insert") + public Single> batchInsertMetadata( + @RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.batchInsertMetadata(postgresEndpoint).toSingle(); + } + + @PostMapping("/join/insert") + public Single insertIntoJoinTable( + @RequestBody PostgresEndpoint postgresEndpoint) { + EdgeChain edgeChain = this.postgresClient.insertIntoJoinTable(postgresEndpoint); + return edgeChain.toSingle(); + } + @PostMapping("/join/batch-insert") + public Single batchInsertIntoJoinTable( + @RequestBody PostgresEndpoint postgresEndpoint) { + EdgeChain edgeChain = + this.postgresClient.batchInsertIntoJoinTable(postgresEndpoint); return edgeChain.toSingle(); } @PostMapping("/query") public Single> query( @RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.query(postgresEndpoint).toSingle(); + } + + @PostMapping("/query-rrf") + public Single> queryRRF( + @RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.queryRRF(postgresEndpoint).toSingle(); + } - this.postgresClient.setPostgresEndpoint(postgresEndpoint); + @PostMapping("/metadata/query") + public Single> queryWithMetadata( + @RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.queryWithMetadata(postgresEndpoint).toSingle(); + } - EdgeChain> edgeChain = - this.postgresClient.query( - postgresEndpoint.getWordEmbeddings(), - postgresEndpoint.getMetric(), - postgresEndpoint.getTopK(), - postgresEndpoint.getProbes()); + @PostMapping("/chunks") + public Single> getAllChunks( + @RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.getAllChunks(postgresEndpoint).toSingle(); + } - return edgeChain.toSingle(); + @PostMapping("/similarity-metadata") + public Single> getSimilarMetadataChunk( + @RequestBody PostgresEndpoint postgresEndpoint) { + return this.postgresClient.getSimilarMetadataChunk(postgresEndpoint).toSingle(); } @DeleteMapping("/deleteAll") public Single deleteAll(@RequestBody PostgresEndpoint postgresEndpoint) { - - this.postgresClient.setPostgresEndpoint(postgresEndpoint); - - EdgeChain edgeChain = this.postgresClient.deleteAll(); - return edgeChain.toSingle(); + return this.postgresClient.deleteAll(postgresEndpoint).toSingle(); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/RedisController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/RedisController.java index 6fcd2e566..1d4916f38 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/RedisController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/index/RedisController.java @@ -2,10 +2,9 @@ import com.edgechain.lib.configuration.WebConfiguration; import com.edgechain.lib.embeddings.WordEmbeddings; -import com.edgechain.lib.endpoint.impl.RedisEndpoint; +import com.edgechain.lib.endpoint.impl.index.RedisEndpoint; import com.edgechain.lib.index.client.impl.RedisClient; import com.edgechain.lib.response.StringResponse; -import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Single; import org.springframework.beans.factory.annotation.Autowired; @@ -20,38 +19,28 @@ public class RedisController { @Autowired @Lazy private RedisClient redisClient; + @PostMapping("/create-index") + public Single createIndex(@RequestBody RedisEndpoint redisEndpoint) { + return this.redisClient.createIndex(redisEndpoint).toSingle(); + } + @PostMapping("/upsert") public Single upsert(@RequestBody RedisEndpoint redisEndpoint) { + return this.redisClient.upsert(redisEndpoint).toSingle(); + } - this.redisClient.setEndpoint(redisEndpoint); - - EdgeChain edgeChain = - this.redisClient.upsert( - redisEndpoint.getWordEmbeddings(), - redisEndpoint.getDimensions(), - redisEndpoint.getMetric()); - - return edgeChain.toSingle(); + @PostMapping("/batch-upsert") + public Single batchUpsert(@RequestBody RedisEndpoint redisEndpoint) { + return this.redisClient.batchUpsert(redisEndpoint).toSingleWithoutScheduler(); } @PostMapping("/query") public Single> query(@RequestBody RedisEndpoint redisEndpoint) { - - this.redisClient.setEndpoint(redisEndpoint); - - EdgeChain> edgeChain = - this.redisClient.query(redisEndpoint.getWordEmbeddings(), redisEndpoint.getTopK()); - - return edgeChain.toSingle(); + return this.redisClient.query(redisEndpoint).toSingle(); } @DeleteMapping("/delete") - public Completable deleteByPattern( - @RequestParam("pattern") String pattern, @RequestBody RedisEndpoint redisEndpoint) { - - this.redisClient.setEndpoint(redisEndpoint); - - EdgeChain edgeChain = this.redisClient.deleteByPattern(pattern); - return edgeChain.await(); + public Completable deleteByPattern(@RequestBody RedisEndpoint redisEndpoint) { + return this.redisClient.deleteByPattern(redisEndpoint).await(); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/integration/AirtableController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/integration/AirtableController.java new file mode 100644 index 000000000..741fe2362 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/integration/AirtableController.java @@ -0,0 +1,44 @@ +package com.edgechain.service.controllers.integration; + +import com.edgechain.lib.configuration.WebConfiguration; +import com.edgechain.lib.endpoint.impl.integration.AirtableEndpoint; +import com.edgechain.lib.integration.airtable.client.AirtableClient; +import dev.fuxing.airtable.AirtableRecord; +import io.reactivex.rxjava3.core.Single; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController("Service AirtableController") +@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/airtable") +public class AirtableController { + + @Autowired private AirtableClient airtableClient; + + @PostMapping("/findAll") + public Single> findAll(@RequestBody AirtableEndpoint endpoint) { + return airtableClient.findAll(endpoint).toSingleWithoutScheduler(); + } + + @PostMapping("/findById") + public Single findById(@RequestBody AirtableEndpoint endpoint) { + return airtableClient.findById(endpoint).toSingleWithoutScheduler(); + } + + @PostMapping("/create") + public Single> create(@RequestBody AirtableEndpoint endpoint) { + return airtableClient.create(endpoint).toSingleWithoutScheduler(); + } + + @PostMapping("/update") + public Single> update(@RequestBody AirtableEndpoint endpoint) { + return airtableClient.update(endpoint).toSingleWithoutScheduler(); + } + + @DeleteMapping("/delete") + public Single> delete(@RequestBody AirtableEndpoint endpoint) { + return airtableClient.delete(endpoint).toSingleWithoutScheduler(); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/llama2/Llama2Controller.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/llama2/Llama2Controller.java new file mode 100644 index 000000000..d998c28bf --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/llama2/Llama2Controller.java @@ -0,0 +1,30 @@ +package com.edgechain.service.controllers.llama2; + +import com.edgechain.lib.configuration.WebConfiguration; +import com.edgechain.lib.endpoint.impl.llm.LLamaQuickstart; +import com.edgechain.lib.llama2.Llama2Client; +import com.edgechain.lib.logger.services.ChatCompletionLogService; +import com.edgechain.lib.logger.services.JsonnetLogService; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import io.reactivex.rxjava3.core.Single; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.*; + +@RestController("Service Llama2Controller") +@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/llama") +public class Llama2Controller { + @Autowired private ChatCompletionLogService chatCompletionLogService; + + @Autowired private JsonnetLogService jsonnetLogService; + + @Autowired private Environment env; + @Autowired private Llama2Client llama2Client; + + @PostMapping(value = "/chat-completion") + public Single getChatCompletion(@RequestBody LLamaQuickstart endpoint) { + + EdgeChain edgeChain = llama2Client.createGetChatCompletion(endpoint); + return edgeChain.toSingle(); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/EmbeddingLogController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/EmbeddingLogController.java index d01d214b5..3cad9c5b0 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/EmbeddingLogController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/EmbeddingLogController.java @@ -3,13 +3,16 @@ import com.edgechain.lib.configuration.WebConfiguration; import com.edgechain.lib.logger.entities.EmbeddingLog; import com.edgechain.lib.logger.services.EmbeddingLogService; -import com.edgechain.lib.logger.services.EmbeddingLogService; +import java.util.HashMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController("Service EmbeddingLogController") @RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/logs/embeddings") diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/JsonnetLogController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/JsonnetLogController.java new file mode 100644 index 000000000..80da69078 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/logging/JsonnetLogController.java @@ -0,0 +1,36 @@ +package com.edgechain.service.controllers.logging; + +import com.edgechain.lib.configuration.WebConfiguration; +import com.edgechain.lib.logger.entities.JsonnetLog; +import java.util.HashMap; + +import com.edgechain.lib.logger.services.JsonnetLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.web.bind.annotation.*; + +@RestController("Service JsonnetLogControllers") +@RequestMapping(value = WebConfiguration.CONTEXT_PATH + "/logs/jsonnet") +public class JsonnetLogController { + + @Autowired private JsonnetLogService jsonnetLogService; + + @GetMapping("/findAll/{page}/{size}") + public Page findAll(@PathVariable int page, @PathVariable int size) { + return this.jsonnetLogService.findAll(PageRequest.of(page, size)); + } + + @GetMapping("/findAll/sorted/{page}/{size}") + public Page findAllByOrderByCreatedAtDesc( + @PathVariable int page, @PathVariable int size) { + return this.jsonnetLogService.findAllOrderByCreatedAtDesc(PageRequest.of(page, size)); + } + + @PostMapping("/findByName/sorted/{page}/{size}") + public Page findAllBySelectedFileOrderByCreatedAtDesc( + @RequestBody HashMap mapper, @PathVariable int page, @PathVariable int size) { + return this.jsonnetLogService.findAllBySelectedFileOrderByCreatedAtDesc( + mapper.get("filename"), PageRequest.of(page, size)); + } +} diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/miniLM/MiniLMController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/miniLM/MiniLMController.java index 56824fc07..9ab3ea75e 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/miniLM/MiniLMController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/miniLM/MiniLMController.java @@ -3,7 +3,7 @@ import com.edgechain.lib.configuration.WebConfiguration; import com.edgechain.lib.embeddings.miniLLM.MiniLMClient; import com.edgechain.lib.embeddings.miniLLM.response.MiniLMResponse; -import com.edgechain.lib.endpoint.impl.MiniLMEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.MiniLMEndpoint; import com.edgechain.lib.logger.entities.EmbeddingLog; import com.edgechain.lib.logger.services.EmbeddingLogService; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; @@ -32,10 +32,8 @@ public class MiniLMController { @PostMapping public Single embeddings(@RequestBody MiniLMEndpoint miniLMEndpoint) { - this.miniLMClient.setEndpoint(miniLMEndpoint); - EdgeChain edgeChain = - this.miniLMClient.createEmbeddings(miniLMEndpoint.getInput()); + this.miniLMClient.createEmbeddings(miniLMEndpoint.getRawText(), miniLMEndpoint); if (Objects.nonNull(env.getProperty("postgres.db.host"))) { @@ -53,9 +51,9 @@ public Single embeddings(@RequestBody MiniLMEndpoint miniLMEndpo embeddingLog.setLatency(duration.toMillis()); embeddingLogService.saveOrUpdate(embeddingLog); }) - .toSingle(); + .toSingleWithoutScheduler(); } - return edgeChain.toSingle(); + return edgeChain.toSingleWithoutScheduler(); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/openai/OpenAiController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/openai/OpenAiController.java index addb60116..6d3c6f8a1 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/openai/OpenAiController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/openai/OpenAiController.java @@ -3,11 +3,14 @@ import com.edgechain.lib.configuration.WebConfiguration; import com.edgechain.lib.embeddings.request.OpenAiEmbeddingRequest; import com.edgechain.lib.embeddings.response.OpenAiEmbeddingResponse; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; +import com.edgechain.lib.endpoint.impl.embeddings.OpenAiEmbeddingEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.logger.entities.ChatCompletionLog; import com.edgechain.lib.logger.entities.EmbeddingLog; +import com.edgechain.lib.logger.entities.JsonnetLog; import com.edgechain.lib.logger.services.ChatCompletionLogService; import com.edgechain.lib.logger.services.EmbeddingLogService; +import com.edgechain.lib.logger.services.JsonnetLogService; import com.edgechain.lib.openai.client.OpenAiClient; import com.edgechain.lib.openai.request.ChatCompletionRequest; import com.edgechain.lib.openai.request.ChatMessage; @@ -32,8 +35,6 @@ import java.sql.SQLException; import java.time.Duration; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -44,12 +45,14 @@ public class OpenAiController { @Autowired private ChatCompletionLogService chatCompletionLogService; @Autowired private EmbeddingLogService embeddingLogService; + @Autowired private JsonnetLogService jsonnetLogService; @Autowired private Environment env; @Autowired private OpenAiClient openAiClient; @PostMapping(value = "/chat-completion") - public Single chatCompletion(@RequestBody OpenAiEndpoint openAiEndpoint) { + public Single chatCompletion( + @RequestBody OpenAiChatEndpoint openAiEndpoint) { ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() @@ -57,38 +60,61 @@ public Single chatCompletion(@RequestBody OpenAiEndpoint .temperature(openAiEndpoint.getTemperature()) .messages(openAiEndpoint.getChatMessages()) .stream(false) + .topP(openAiEndpoint.getTopP()) + .n(openAiEndpoint.getN()) + .stop(openAiEndpoint.getStop()) + .presencePenalty(openAiEndpoint.getPresencePenalty()) + .frequencyPenalty(openAiEndpoint.getFrequencyPenalty()) + .logitBias(openAiEndpoint.getLogitBias()) + .user(openAiEndpoint.getUser()) .build(); - this.openAiClient.setEndpoint(openAiEndpoint); - EdgeChain edgeChain = - openAiClient.createChatCompletion(chatCompletionRequest); + openAiClient.createChatCompletion(chatCompletionRequest, openAiEndpoint); if (Objects.nonNull(env.getProperty("postgres.db.host"))) { - ChatCompletionLog chatCompletionLog = new ChatCompletionLog(); - chatCompletionLog.setName(openAiEndpoint.getChainName()); - chatCompletionLog.setCreatedAt(LocalDateTime.now()); - chatCompletionLog.setCallIdentifier(openAiEndpoint.getCallIdentifier()); - chatCompletionLog.setInput(StringUtils.join(openAiEndpoint.getChatMessages())); - chatCompletionLog.setModel(openAiEndpoint.getModel()); + ChatCompletionLog chatLog = new ChatCompletionLog(); + chatLog.setName(openAiEndpoint.getChainName()); + chatLog.setCreatedAt(LocalDateTime.now()); + chatLog.setCallIdentifier(openAiEndpoint.getCallIdentifier()); + chatLog.setInput(StringUtils.join(chatCompletionRequest.getMessages())); + chatLog.setModel(chatCompletionRequest.getModel()); + + chatLog.setPresencePenalty(chatCompletionRequest.getPresencePenalty()); + chatLog.setFrequencyPenalty(chatCompletionRequest.getFrequencyPenalty()); + chatLog.setTopP(chatCompletionRequest.getTopP()); + chatLog.setN(chatCompletionRequest.getN()); + chatLog.setTemperature(chatCompletionRequest.getTemperature()); return edgeChain .doOnNext( c -> { - chatCompletionLog.setPromptTokens(c.getUsage().getPrompt_tokens()); - chatCompletionLog.setTotalTokens(c.getUsage().getTotal_tokens()); - chatCompletionLog.setContent(c.getChoices().get(0).getMessage().getContent()); - chatCompletionLog.setType(c.getObject()); + chatLog.setPromptTokens(c.getUsage().getPrompt_tokens()); + chatLog.setTotalTokens(c.getUsage().getTotal_tokens()); + chatLog.setContent(c.getChoices().get(0).getMessage().getContent()); + chatLog.setType(c.getObject()); - chatCompletionLog.setCompletedAt(LocalDateTime.now()); + chatLog.setCompletedAt(LocalDateTime.now()); Duration duration = - Duration.between( - chatCompletionLog.getCreatedAt(), chatCompletionLog.getCompletedAt()); - chatCompletionLog.setLatency(duration.toMillis()); - - chatCompletionLogService.saveOrUpdate(chatCompletionLog); + Duration.between(chatLog.getCreatedAt(), chatLog.getCompletedAt()); + chatLog.setLatency(duration.toMillis()); + + chatCompletionLogService.saveOrUpdate(chatLog); + + if (Objects.nonNull(openAiEndpoint.getJsonnetLoader()) + && openAiEndpoint.getJsonnetLoader().getThreshold() >= 1) { + JsonnetLog jsonnetLog = new JsonnetLog(); + jsonnetLog.setMetadata(openAiEndpoint.getJsonnetLoader().getMetadata()); + jsonnetLog.setContent(c.getChoices().get(0).getMessage().getContent()); + jsonnetLog.setF1(openAiEndpoint.getJsonnetLoader().getF1()); + jsonnetLog.setF2(openAiEndpoint.getJsonnetLoader().getF2()); + jsonnetLog.setSplitSize(openAiEndpoint.getJsonnetLoader().getSplitSize()); + jsonnetLog.setCreatedAt(LocalDateTime.now()); + jsonnetLog.setSelectedFile(openAiEndpoint.getJsonnetLoader().getSelectedFile()); + jsonnetLogService.saveOrUpdate(jsonnetLog); + } }) .toSingle(); @@ -98,7 +124,7 @@ public Single chatCompletion(@RequestBody OpenAiEndpoint @PostMapping( value = "/chat-completion-stream", consumes = {MediaType.APPLICATION_JSON_VALUE}) - public SseEmitter chatCompletionStream(@RequestBody OpenAiEndpoint openAiEndpoint) { + public SseEmitter chatCompletionStream(@RequestBody OpenAiChatEndpoint openAiEndpoint) { ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder() @@ -106,10 +132,14 @@ public SseEmitter chatCompletionStream(@RequestBody OpenAiEndpoint openAiEndpoin .temperature(openAiEndpoint.getTemperature()) .messages(openAiEndpoint.getChatMessages()) .stream(true) + .topP(openAiEndpoint.getTopP()) + .n(openAiEndpoint.getN()) + .stop(openAiEndpoint.getStop()) + .presencePenalty(openAiEndpoint.getPresencePenalty()) + .frequencyPenalty(openAiEndpoint.getFrequencyPenalty()) + .logitBias(openAiEndpoint.getLogitBias()) + .user(openAiEndpoint.getUser()) .build(); - - this.openAiClient.setEndpoint(openAiEndpoint); - SseEmitter emitter = new SseEmitter(); ExecutorService executorService = Executors.newSingleThreadExecutor(); @@ -117,18 +147,24 @@ public SseEmitter chatCompletionStream(@RequestBody OpenAiEndpoint openAiEndpoin () -> { try { EdgeChain edgeChain = - openAiClient.createChatCompletionStream(chatCompletionRequest); + openAiClient.createChatCompletionStream(chatCompletionRequest, openAiEndpoint); AtomInteger chunks = AtomInteger.of(0); if (Objects.nonNull(env.getProperty("postgres.db.host"))) { - ChatCompletionLog chatCompletionLog = new ChatCompletionLog(); - chatCompletionLog.setName(openAiEndpoint.getChainName()); - chatCompletionLog.setCallIdentifier(openAiEndpoint.getCallIdentifier()); - chatCompletionLog.setInput(StringUtils.join(openAiEndpoint.getChatMessages())); - chatCompletionLog.setModel(openAiEndpoint.getModel()); - chatCompletionLog.setCreatedAt(LocalDateTime.now()); + ChatCompletionLog chatLog = new ChatCompletionLog(); + chatLog.setName(openAiEndpoint.getChainName()); + chatLog.setCreatedAt(LocalDateTime.now()); + chatLog.setCallIdentifier(openAiEndpoint.getCallIdentifier()); + chatLog.setInput(StringUtils.join(chatCompletionRequest.getMessages())); + chatLog.setModel(chatCompletionRequest.getModel()); + + chatLog.setPresencePenalty(chatCompletionRequest.getPresencePenalty()); + chatLog.setFrequencyPenalty(chatCompletionRequest.getFrequencyPenalty()); + chatLog.setTopP(chatCompletionRequest.getTopP()); + chatLog.setN(chatCompletionRequest.getN()); + chatLog.setTemperature(chatCompletionRequest.getTemperature()); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("<|im_start|>"); @@ -139,12 +175,7 @@ public SseEmitter chatCompletionStream(@RequestBody OpenAiEndpoint openAiEndpoin EncodingRegistry registry = Encodings.newDefaultEncodingRegistry(); Encoding enc = registry.getEncoding(EncodingType.CL100K_BASE); - List strings = new ArrayList<>(); - for (ChatMessage chatMessage : openAiEndpoint.getChatMessages()) { - strings.add(chatMessage.getContent()); - } - - chatCompletionLog.setPromptTokens((long) enc.countTokens(stringBuilder.toString())); + chatLog.setPromptTokens((long) enc.countTokens(stringBuilder.toString())); StringBuilder content = new StringBuilder(); @@ -162,20 +193,30 @@ public SseEmitter chatCompletionStream(@RequestBody OpenAiEndpoint openAiEndpoin if (Objects.nonNull(res.getChoices().get(0).getFinishReason())) { emitter.complete(); - - chatCompletionLog.setType(res.getObject()); - chatCompletionLog.setContent(content.toString()); - chatCompletionLog.setCompletedAt(LocalDateTime.now()); - chatCompletionLog.setTotalTokens( - chunks.get() + chatCompletionLog.getPromptTokens()); + chatLog.setType(res.getObject()); + chatLog.setContent(content.toString()); + chatLog.setCompletedAt(LocalDateTime.now()); + chatLog.setTotalTokens(chunks.get() + chatLog.getPromptTokens()); Duration duration = - Duration.between( - chatCompletionLog.getCreatedAt(), - chatCompletionLog.getCompletedAt()); - chatCompletionLog.setLatency(duration.toMillis()); - - chatCompletionLogService.saveOrUpdate(chatCompletionLog); + Duration.between(chatLog.getCreatedAt(), chatLog.getCompletedAt()); + chatLog.setLatency(duration.toMillis()); + + chatCompletionLogService.saveOrUpdate(chatLog); + + if (Objects.nonNull(openAiEndpoint.getJsonnetLoader()) + && openAiEndpoint.getJsonnetLoader().getThreshold() >= 1) { + JsonnetLog jsonnetLog = new JsonnetLog(); + jsonnetLog.setMetadata(openAiEndpoint.getJsonnetLoader().getMetadata()); + jsonnetLog.setContent(content.toString()); + jsonnetLog.setF1(openAiEndpoint.getJsonnetLoader().getF1()); + jsonnetLog.setF2(openAiEndpoint.getJsonnetLoader().getF2()); + jsonnetLog.setSplitSize(openAiEndpoint.getJsonnetLoader().getSplitSize()); + jsonnetLog.setCreatedAt(LocalDateTime.now()); + jsonnetLog.setSelectedFile( + openAiEndpoint.getJsonnetLoader().getSelectedFile()); + jsonnetLogService.saveOrUpdate(jsonnetLog); + } } } catch (final Exception e) { @@ -209,7 +250,7 @@ public SseEmitter chatCompletionStream(@RequestBody OpenAiEndpoint openAiEndpoin } @PostMapping("/completion") - public Single completion(@RequestBody OpenAiEndpoint openAiEndpoint) { + public Single completion(@RequestBody OpenAiChatEndpoint openAiEndpoint) { CompletionRequest completionRequest = CompletionRequest.builder() @@ -218,22 +259,20 @@ public Single completion(@RequestBody OpenAiEndpoint openAiE .temperature(openAiEndpoint.getTemperature()) .build(); - this.openAiClient.setEndpoint(openAiEndpoint); - - EdgeChain edgeChain = openAiClient.createCompletion(completionRequest); + EdgeChain edgeChain = + openAiClient.createCompletion(completionRequest, openAiEndpoint); return edgeChain.toSingle(); } @PostMapping("/embeddings") - public Single embeddings(@RequestBody OpenAiEndpoint openAiEndpoint) - throws SQLException { - - this.openAiClient.setEndpoint(openAiEndpoint); + public Single embeddings( + @RequestBody OpenAiEmbeddingEndpoint openAiEndpoint) throws SQLException { EdgeChain edgeChain = openAiClient.createEmbeddings( - new OpenAiEmbeddingRequest(openAiEndpoint.getModel(), openAiEndpoint.getInput())); + new OpenAiEmbeddingRequest(openAiEndpoint.getModel(), openAiEndpoint.getRawText()), + openAiEndpoint); if (Objects.nonNull(env.getProperty("postgres.db.host"))) { @@ -255,9 +294,9 @@ public Single embeddings(@RequestBody OpenAiEndpoint op embeddingLogService.saveOrUpdate(embeddingLog); }) - .toSingle(); + .toSingleWithoutScheduler(); } - return edgeChain.toSingle(); + return edgeChain.toSingleWithoutScheduler(); } } diff --git a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/wiki/WikiController.java b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/wiki/WikiController.java index f7ef9660b..f1d394e8b 100644 --- a/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/wiki/WikiController.java +++ b/Java/FlySpring/edgechain-app/src/main/java/com/edgechain/service/controllers/wiki/WikiController.java @@ -1,7 +1,7 @@ package com.edgechain.service.controllers.wiki; import com.edgechain.lib.configuration.WebConfiguration; -import com.edgechain.lib.endpoint.impl.WikiEndpoint; +import com.edgechain.lib.endpoint.impl.wiki.WikiEndpoint; import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; import com.edgechain.lib.wiki.client.WikiClient; import com.edgechain.lib.wiki.response.WikiResponse; diff --git a/Java/FlySpring/edgechain-app/src/main/resources/application-test.properties b/Java/FlySpring/edgechain-app/src/main/resources/application-test.properties new file mode 100644 index 000000000..311c86783 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/resources/application-test.properties @@ -0,0 +1,5 @@ +# this profile will be used only when @ActiveProfiles("test") + +# uncomment these log level lines to follow what Spring is doing for ROLES +# logging.level.org.springframework.security=TRACE +# logging.level.org.springframework.security.web.FilterChainProxy=INFO diff --git a/Java/FlySpring/edgechain-app/src/main/resources/schema.sql b/Java/FlySpring/edgechain-app/src/main/resources/schema.sql new file mode 100644 index 000000000..a4fed6928 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/main/resources/schema.sql @@ -0,0 +1,5 @@ +CREATE TABLE history_context ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + response VARCHAR(1024), + created_at TIMESTAMP +); \ No newline at end of file diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/EdgeChainApplicationTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/EdgeChainApplicationTest.java new file mode 100644 index 000000000..978b58089 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/EdgeChainApplicationTest.java @@ -0,0 +1,13 @@ +package com.edgechain; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class EdgeChainApplicationTest { + + @Test + void test() { + // simply checks server can start + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/chunker/ChunkerTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/chunker/ChunkerTest.java index e6edef4d7..08f6df3e0 100644 --- a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/chunker/ChunkerTest.java +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/chunker/ChunkerTest.java @@ -1,10 +1,9 @@ package com.edgechain.chunker; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.Timeout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; @@ -12,6 +11,11 @@ import com.edgechain.lib.chunk.Chunker; import com.edgechain.lib.chunk.enums.LangType; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.*; + @SpringBootTest public class ChunkerTest { @@ -82,4 +86,61 @@ public void chunker_BySentenceWithEmptyInput_ReturnEmptyArray(TestInfo testInfo) String[] expected = {"This is a test."}; assertArrayEquals(expected, result); } + + @Test + @DisplayName("Test By Very Small ChunkSize ") + void chunker_ByVerySmallChunkSize_ReturnedExpectedValue() { + String input = "This is Testing"; + Chunker chunker = new Chunker(input); + + String[] result = chunker.byChunkSize(1); + + String[] expected = {"T", "h", "i", "s", "i", "s", "T", "e", "s", "t", "i", "n", "g"}; + assertNotEquals(expected, result); + } + + @Test + @DisplayName("Test By ChunkSize - Input Contains Whitespace") + void chunker_ByChunkSize_InputWhiteSpaceCharacter_ReturnedExpectedValue() { + String input = "\n\t\t"; + Chunker chunker = new Chunker(input); + int chunkSize = 5; + + String[] result = chunker.byChunkSize(chunkSize); + + String[] expected = {""}; + assertArrayEquals(expected, result); + } + + @Test + @DisplayName("Test By Sentence - Contains Only Spaces") + void chunker_BySentence_InputContainsOnlySpaces_ReturnedExpectedValue() { + String input = " "; + Chunker chunker = new Chunker(input); + + String[] result = chunker.bySentence(LangType.EN); + logger.info(Arrays.toString(result)); + String[] expected = {}; + assertArrayEquals(expected, result); + assertEquals(expected.length, result.length); + } + + @Test + @DisplayName("Performance Test With Large String") + @Timeout(value = 5, unit = TimeUnit.SECONDS) + void chunker_Performance_LargeInputString_ReturnedExpectedValue() { + String input = "E".repeat(10000); + Chunker chunker = new Chunker(input); + int chunkSize = 5; + + long startTime = System.currentTimeMillis(); + String[] result = chunker.byChunkSize(chunkSize); + long endTime = System.currentTimeMillis(); + long totalExecutionTime = endTime - startTime; + logger.info(String.valueOf(totalExecutionTime)); + + long maxExecutionTime = 5000; // Execution time in mills + assertEquals(2000, result.length); + assertTrue(totalExecutionTime <= maxExecutionTime); + } } diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/codeInterpreter/CodeInterpreterTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/codeInterpreter/CodeInterpreterTest.java index e4d0527aa..ff6d22dde 100644 --- a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/codeInterpreter/CodeInterpreterTest.java +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/codeInterpreter/CodeInterpreterTest.java @@ -1,9 +1,7 @@ package com.edgechain.codeInterpreter; import static org.junit.Assert.assertFalse; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -65,4 +63,14 @@ public void test_empty_example_extraction() throws Exception { assertNotNull(extractedValue); assertFalse(extractedValue.contains(prompt)); } + + @Test + @DisplayName("Test for empty input") + void test_emptyInput_ReturnedExpectedValue() { + String inputJsonnet = ""; + InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); + JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); + + assertThrows(Exception.class, () -> jsonnetLoader.load(inputStream)); + } } diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/jsonnet/JsonnetLoaderTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/jsonnet/JsonnetLoaderTest.java index 5dcdcbfc8..12e6b77fa 100644 --- a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/jsonnet/JsonnetLoaderTest.java +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/jsonnet/JsonnetLoaderTest.java @@ -1,9 +1,5 @@ package com.edgechain.jsonnet; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -20,6 +16,9 @@ import com.edgechain.lib.jsonnet.JsonnetLoader; import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertThrows; + @SpringBootTest public class JsonnetLoaderTest { @@ -106,4 +105,36 @@ public void test_external_variable_xtrasonnet() throws Exception { assertNotNull(externalVar); assertEquals(externalVar, "5"); } + + @Test + void jsonLoader_LoadJsonnet_WithInvalidJsonnet_ThrowsException() { + String inputJsonnet = "This is a test sentence."; + InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); + JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); + assertThrows(Exception.class, () -> jsonnetLoader.load(inputStream)); + } + + @Test + void jsonLoader_LoadJsonnet_WithEmptyJsonnet_ThrowsExpcetion() { + String inputJsonnet = "{}"; + InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); + JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); + jsonnetLoader.load(inputStream); + assertThrows(Exception.class, () -> jsonnetLoader.get("jsonnet")); + } + + @Test + void jsonLoader_LoadJsonnetWithArrayOfObjects_ReturnExpectedValue(TestInfo testInfo) { + String inputJsonnet = "{ \"objects\": [{ \"key\": \"value1\" }, { \"key\": \"value2\" }] }"; + InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); + JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); + + jsonnetLoader.load(inputStream); + JSONArray objects = jsonnetLoader.getArray("objects"); + + assertNotNull(objects); + assertEquals(2, objects.length()); + assertEquals("value1", objects.getJSONObject(0).getString("key")); + assertEquals("value2", objects.getJSONObject(1).getString("key")); + } } diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/context/client/impl/PostgreSQLHistoryContextClientTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/context/client/impl/PostgreSQLHistoryContextClientTest.java new file mode 100644 index 000000000..5e4228e33 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/context/client/impl/PostgreSQLHistoryContextClientTest.java @@ -0,0 +1,91 @@ +package com.edgechain.lib.context.client.impl; + +import com.edgechain.lib.context.domain.HistoryContext; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import com.edgechain.testutil.PostgresTestContainer; +import com.edgechain.testutil.PostgresTestContainer.PostgresImage; +import com.zaxxer.hikari.HikariConfig; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.annotation.DirtiesContext; +import org.testcontainers.junit.jupiter.Testcontainers; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@Testcontainers(disabledWithoutDocker = true) +@SpringBootTest(webEnvironment = WebEnvironment.NONE) +@DirtiesContext +class PostgreSQLHistoryContextClientTest { + + private static final Logger LOGGER = + LoggerFactory.getLogger(PostgreSQLHistoryContextClientTest.class); + + private static PostgresTestContainer instance = new PostgresTestContainer(PostgresImage.PLAIN); + + @BeforeAll + static void baseSetupAll() { + instance.start(); + } + + @AfterAll + static void baseTeardownAll() { + instance.stop(); + } + + @Autowired private HikariConfig hikariConfig; + @Autowired private PostgreSQLHistoryContextClient service; + + @Test + void allMethods() { + // hikari has own copy of properties so set these here + hikariConfig.setJdbcUrl(instance.getJdbcUrl()); + hikariConfig.setUsername(instance.getUsername()); + hikariConfig.setPassword(instance.getPassword()); + + final Data data = new Data(); + + final EdgeChain create = service.create("DAVE", null); + create.toSingle().blockingSubscribe(s -> data.id = s.getId(), e -> data.failed = true); + assertFalse(data.failed); + assertNotNull(data.id); + LOGGER.info("create OK id={}", data.id); + + final EdgeChain put = service.put(data.id, "COW", null); + put.toSingle().blockingSubscribe(s -> {}, e -> data.failed = true); + assertFalse(data.failed); + LOGGER.info("put OK"); + + final EdgeChain get = service.get(data.id, null); + get.toSingle().blockingSubscribe(s -> data.val = s.getResponse(), e -> data.failed = true); + assertFalse(data.failed); + assertEquals("COW", data.val); + LOGGER.info("get OK val={}", data.val); + + EdgeChain delete = service.delete(data.id, null); + delete.toSingle().blockingSubscribe(s -> data.val = s, e -> data.failed = true); + assertFalse(data.failed); + assertEquals("", data.val); + LOGGER.info("delete OK val={}", data.val); + + final EdgeChain getMissing = service.get("not_there", null); + getMissing + .toSingle() + .blockingSubscribe(s -> data.failed = true, e -> data.val = e.getMessage()); + assertFalse(data.failed); + assertEquals("PostgreSQL history_context id isn't found.", data.val); + LOGGER.info("get-NotFound OK val={}", data.val); + } + + private static class Data { + public boolean failed; + public String id; + public String val; + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/context/client/repositories/PostgreSQLHistoryContextRepositoryTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/context/client/repositories/PostgreSQLHistoryContextRepositoryTest.java new file mode 100644 index 000000000..88801627b --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/context/client/repositories/PostgreSQLHistoryContextRepositoryTest.java @@ -0,0 +1,85 @@ +package com.edgechain.lib.context.client.repositories; + +import com.edgechain.lib.context.domain.HistoryContext; +import com.edgechain.testutil.PostgresTestContainer; +import org.junit.jupiter.api.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.springframework.test.context.jdbc.Sql; + +import java.time.LocalDateTime; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +@Sql(scripts = {"classpath:schema.sql"}) +class PostgreSQLHistoryContextRepositoryTest { + + Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired private PostgreSQLHistoryContextRepository repository; + + private static final PostgresTestContainer instance = + new PostgresTestContainer(PostgresTestContainer.PostgresImage.VECTOR); + + @BeforeAll + static void setupAll() { + instance.start(); + } + + @AfterAll + static void tearAll() { + instance.stop(); + } + + @BeforeEach + void setUp() { + repository.deleteAll(); + } + + @DynamicPropertySource + static void setProperties(DynamicPropertyRegistry registry) { + registry.add("spring.datasource.url", instance::getJdbcUrl); + registry.add("spring.datasource.username", instance::getUsername); + registry.add("spring.datasource.password", instance::getPassword); + } + + @Test + void test_Save_And_Retrieve_History_Context() { + HistoryContext historyContext = getHistoryContext(); + repository.save(historyContext); + + Optional result = repository.findById("1"); + logger.info("history context {}", result); + + assertTrue(result.isPresent()); + } + + @Test + void test_Delete_History_Context() { + HistoryContext historyContext = getHistoryContext(); + repository.save(historyContext); + + repository.deleteById("1"); + Optional result = repository.findById("1"); + + assertTrue(result.isEmpty()); + } + + @Test + void test_Find_By_Non_Exist_Context() { + Optional result = repository.findById("10"); + assertTrue(result.isEmpty()); + } + + private HistoryContext getHistoryContext() { + return new HistoryContext("1", "testing history context", LocalDateTime.now()); + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/endpoint/impl/BgeSmallEndpointTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/endpoint/impl/BgeSmallEndpointTest.java new file mode 100644 index 000000000..b7cae1606 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/endpoint/impl/BgeSmallEndpointTest.java @@ -0,0 +1,60 @@ +package com.edgechain.lib.endpoint.impl; + +import com.edgechain.lib.configuration.domain.SecurityUUID; +import com.edgechain.lib.endpoint.impl.embeddings.BgeSmallEndpoint; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import java.io.File; + +import org.junit.jupiter.api.Test; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.util.ReflectionTestUtils; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; + +class BgeSmallEndpointTest { + + @Test + @DirtiesContext + void downloadFiles() { + // Retrofit needs a port + System.setProperty("server.port", "8888"); + + // give Retrofit a mock securityUUI instance so it goes not call context + SecurityUUID mockSecurityUUID = mock(SecurityUUID.class); + ReflectionTestUtils.setField(RetrofitClientInstance.class, "securityUUID", mockSecurityUUID); + + try { + // GIVEN we have no local files + deleteFiles(); + + // WHEN we create the endpoint instance + // (get tiny JSON files as example download data) + new BgeSmallEndpoint( + "https://jsonplaceholder.typicode.com/posts/1", + "https://jsonplaceholder.typicode.com/posts/2"); + + // THEN the files now exist + File modelFile = new File(BgeSmallEndpoint.MODEL_PATH); + assertTrue(modelFile.exists()); + + File tokenizerFile = new File(BgeSmallEndpoint.TOKENIZER_PATH); + assertTrue(tokenizerFile.exists()); + } finally { + // reset the Retrofit instance + ReflectionTestUtils.setField(RetrofitClientInstance.class, "securityUUID", null); + ReflectionTestUtils.setField(RetrofitClientInstance.class, "retrofit", null); + + deleteFiles(); // make sure we clean up files afterwards + } + } + + // === HELPER METHODS === + + private static void deleteFiles() { + File modelFile = new File(BgeSmallEndpoint.MODEL_PATH); + modelFile.delete(); + + File tokenizerFile = new File(BgeSmallEndpoint.TOKENIZER_PATH); + tokenizerFile.delete(); + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/flyfly/commands/run/TestContainersStarterTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/flyfly/commands/run/TestContainersStarterTest.java new file mode 100644 index 000000000..b74c11936 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/flyfly/commands/run/TestContainersStarterTest.java @@ -0,0 +1,105 @@ +package com.edgechain.lib.flyfly.commands.run; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.DockerClientFactory; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +class TestContainersStarterTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(TestContainersStarterTest.class); + + private TestContainersStarter starter; + + private String tempFilename; + + @BeforeEach + void setup() { + tempFilename = org.assertj.core.util.Files.newTemporaryFile().getAbsolutePath(); + + starter = new TestContainersStarter(); + starter.setPropertiesPath(tempFilename); + } + + @AfterEach + void teardown() { + new File(tempFilename).delete(); + } + + @Test + void addTempProperties() { + try { + starter.addTempProperties("DAVE"); + + List lines = + org.assertj.core.util.Files.linesOf(new File(tempFilename), StandardCharsets.UTF_8); + assertEquals(TestContainersStarter.FLYFLYTEMPTAG, lines.get(1)); + assertTrue(lines.get(2).contains("=DAVE")); + assertEquals(TestContainersStarter.FLYFLYTEMPTAG, lines.get(3)); + assertEquals(TestContainersStarter.FLYFLYTEMPTAG, lines.get(5)); + } catch (IOException e) { + fail("could not finish test", e); + } + } + + @Test + void addTempAndThenRemove() { + try { + Files.writeString(Paths.get(tempFilename), "FIRST LINE\n", StandardCharsets.UTF_8); + + assertTrue(starter.isServiceNeeded()); + + starter.addTempProperties("DAVE"); + assertFalse(starter.isServiceNeeded()); + + starter.removeTempProperties(); + assertTrue(starter.isServiceNeeded()); + + String result = Files.readString(Paths.get(tempFilename), StandardCharsets.UTF_8); + assertEquals("FIRST LINE\n\n", result); // addTemp.. adds a blank line at the start + } catch (IOException e) { + fail("could not finish test", e); + } + } + + @Test + void startAndStopContainer() { + if (!isDockerAvailable()) { + LOGGER.warn("Docker is not running - test skipped"); + return; + } + + try { + starter.startPostgreSQL(); + } catch (IOException e) { + fail("not able to start PostgreSQL", e); + } finally { + try { + starter.stopPostgreSQL(); + } catch (IOException e2) { + fail("failed to stop PostgreSQL", e2); + } + } + } + + boolean isDockerAvailable() { + try { + DockerClientFactory.instance().client(); + return true; + } catch (Throwable ex) { + return false; + } + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/index/client/impl/PostgresClientTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/index/client/impl/PostgresClientTest.java new file mode 100644 index 000000000..5178bfd63 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/index/client/impl/PostgresClientTest.java @@ -0,0 +1,387 @@ +package com.edgechain.lib.index.client.impl; + +import com.edgechain.lib.embeddings.WordEmbeddings; +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; +import com.edgechain.lib.index.domain.PostgresWordEmbeddings; +import com.edgechain.lib.index.enums.PostgresDistanceMetric; +import com.edgechain.lib.index.enums.PostgresLanguage; +import com.edgechain.lib.response.StringResponse; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import com.edgechain.testutil.PostgresTestContainer; +import com.edgechain.testutil.PostgresTestContainer.PostgresImage; +import com.zaxxer.hikari.HikariConfig; +import java.util.List; +import java.util.stream.Collectors; + +import io.reactivex.rxjava3.observers.TestObserver; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.annotation.DirtiesContext; +import org.testcontainers.junit.jupiter.Testcontainers; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@Testcontainers(disabledWithoutDocker = true) +@SpringBootTest(webEnvironment = WebEnvironment.NONE) +@DirtiesContext +class PostgresClientTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(PostgresClientTest.class); + + private static final float FLOAT_ERROR_MARGIN = 0.0001f; + + private static PostgresTestContainer instance = new PostgresTestContainer(PostgresImage.VECTOR); + + @BeforeAll + static void setupAll() { + instance.start(); + } + + @AfterAll + static void teardownAll() { + instance.stop(); + } + + @Autowired private HikariConfig hikariConfig; + + @Autowired private PostgresClient service; + + @Test + void allMethods() { + // hikari has own copy of properties so set these here + hikariConfig.setJdbcUrl(instance.getJdbcUrl()); + hikariConfig.setUsername(instance.getUsername()); + hikariConfig.setPassword(instance.getPassword()); + + createTable(); + createMetadataTable(); + + deleteAll(); // check delete before we get foreign keys + + String uuid1 = upsert(); + batchUpsert(); + + query_noMeta(); + + String uuid2 = insertMetadata(); + + batchInsertMetadata(); + insertIntoJoinTable(uuid1, uuid2); + + query_meta(); + getChunks(); + getSimilarChunks(); + } + + private void createTable() { + createTable_metric(PostgresDistanceMetric.COSINE, "t_embedding"); + } + + private void createTable_metric(PostgresDistanceMetric metric, String tableName) { + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn(tableName); + when(mockPe.getLists()).thenReturn(1); + when(mockPe.getDimensions()).thenReturn(2); + when(mockPe.getMetric()).thenReturn(metric); + + TestObserver test = service.createTable(mockPe).getObservable().test(); + + try { + test.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + test.assertNoErrors(); + LOGGER.info("createTable (metric={}) response: '{}'", metric, tableName); + } + + private void createMetadataTable() { + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getMetadataTableNames()).thenReturn(List.of("title_metadata")); + + TestObserver test = service.createMetadataTable(mockPe).getObservable().test(); + try { + test.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + LOGGER.info("createMetadataTable response: '{}'", test.values().get(0).getResponse()); + } + + private String upsert() { + WordEmbeddings we = new WordEmbeddings(); + we.setId("WE1"); + we.setScore(0.86914713); + we.setValues(List.of(0.25f, 0.5f)); + + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getWordEmbedding()).thenReturn(we); + when(mockPe.getFilename()).thenReturn("readme.pdf"); + when(mockPe.getNamespace()).thenReturn("testns"); + when(mockPe.getPostgresLanguage()).thenReturn(PostgresLanguage.ENGLISH); + + TestObserver test = service.upsert(mockPe).getObservable().test(); + try { + test.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + test.assertNoErrors(); + + return test.values().get(0).getResponse(); + } + + private String insertMetadata() { + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getMetadataTableNames()).thenReturn(List.of("title_metadata")); + when(mockPe.getMetadata()).thenReturn("This is a sample text"); + when(mockPe.getDocumentDate()).thenReturn("November 11, 2015"); + + TestObserver test = service.insertMetadata(mockPe).getObservable().test(); + try { + test.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + test.assertNoErrors(); + return test.values().get(0).getResponse(); + } + + private void batchUpsert() { + WordEmbeddings we1 = new WordEmbeddings(); + we1.setId("WE1"); + we1.setScore(1.05689); + we1.setValues(List.of(0.25f, 0.5f)); + + WordEmbeddings we2 = new WordEmbeddings(); + we2.setId("WE2"); + we2.setScore(2.02689); + we2.setValues(List.of(0.75f, 0.9f)); + + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getWordEmbeddingsList()).thenReturn(List.of(we1, we2)); + when(mockPe.getFilename()).thenReturn("readme.pdf"); + when(mockPe.getNamespace()).thenReturn("testns"); + when(mockPe.getPostgresLanguage()).thenReturn(PostgresLanguage.ENGLISH); + + final Data data = new Data(); + EdgeChain> result = service.batchUpsert(mockPe); + result + .toSingle() + .blockingSubscribe( + s -> data.val = s.stream().map(r -> r.getResponse()).collect(Collectors.joining(",")), + e -> data.error = e); + if (data.error != null) { + fail("batchUpsert failed", data.error); + } + LOGGER.info("batchUpsert response: '{}'", data.val); + } + + private void batchInsertMetadata() { + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getMetadataTableNames()).thenReturn(List.of("title_metadata")); + when(mockPe.getMetadataList()).thenReturn(List.of("text1", "text2")); + + final Data data = new Data(); + EdgeChain> result = service.batchInsertMetadata(mockPe); + result + .toSingle() + .blockingSubscribe( + s -> data.val = s.stream().map(r -> r.getResponse()).collect(Collectors.joining(",")), + e -> data.error = e); + if (data.error != null) { + fail("batchInsertMetadata failed", data.error); + } + LOGGER.info("batchInsertMetadata response: '{}'", data.val); + } + + private void insertIntoJoinTable(String uuid1, String uuid2) { + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getMetadataTableNames()).thenReturn(List.of("title_metadata")); + when(mockPe.getId()).thenReturn(uuid1); + when(mockPe.getMetadataId()).thenReturn(uuid2); + + TestObserver test = service.insertIntoJoinTable(mockPe).getObservable().test(); + + try { + test.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + test.assertNoErrors(); + } + + private void deleteAll() { + deleteAll_namespace(null, "knowledge"); + deleteAll_namespace("", "knowledge"); + deleteAll_namespace("testns", "testns"); + } + + private void deleteAll_namespace(String namespace, String expected) { + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getNamespace()).thenReturn(namespace); + + final Data data = new Data(); + EdgeChain result = service.deleteAll(mockPe); + result.toSingle().blockingSubscribe(s -> data.val = s.getResponse(), e -> data.error = e); + if (data.error != null) { + fail("deleteAll failed", data.error); + } + LOGGER.info("deleteAll (namespace={}) response: '{}'", namespace, data.val); + assertTrue(data.val.endsWith(expected)); + } + + private void query_noMeta() { + query_noMeta_metric(PostgresDistanceMetric.COSINE); + query_noMeta_metric(PostgresDistanceMetric.IP); + query_noMeta_metric(PostgresDistanceMetric.L2); + } + + private void query_noMeta_metric(PostgresDistanceMetric metric) { + WordEmbeddings we1 = new WordEmbeddings(); + we1.setId("WEQUERY"); + we1.setScore(1.05589); + we1.setValues(List.of(0.25f, 0.5f)); + + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getNamespace()).thenReturn("testns"); + when(mockPe.getProbes()).thenReturn(5); + when(mockPe.getMetric()).thenReturn(metric); + when(mockPe.getWordEmbeddingsList()).thenReturn(List.of(we1)); + when(mockPe.getTopK()).thenReturn(5); + when(mockPe.getUpperLimit()).thenReturn(5); + when(mockPe.getMetadataTableNames()).thenReturn(null); + + final Data data = new Data(); + EdgeChain> result = service.query(mockPe); + result + .toSingle() + .blockingSubscribe( + s -> data.val = s.stream().map(r -> r.getRawText()).collect(Collectors.joining(",")), + e -> data.error = e); + if (data.error != null) { + fail("query (no meta) failed", data.error); + } + LOGGER.info("query no meta (metric={}) response: '{}'", metric, data.val); + + // WE1 from single upsert, and WE2 from batch upsert + assertTrue(data.val.contains("WE1") && data.val.contains("WE2")); + } + + private void query_meta() { + query_meta_metric(PostgresDistanceMetric.COSINE); + query_meta_metric(PostgresDistanceMetric.IP); + query_meta_metric(PostgresDistanceMetric.L2); + } + + private void query_meta_metric(PostgresDistanceMetric metric) { + WordEmbeddings we1 = new WordEmbeddings(); + we1.setId("WEQUERY"); + we1.setScore(1.258); + we1.setValues(List.of(0.25f, 0.5f)); + + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getNamespace()).thenReturn("testns"); + when(mockPe.getProbes()).thenReturn(20); + when(mockPe.getMetric()).thenReturn(metric); + when(mockPe.getWordEmbedding()).thenReturn(we1); + when(mockPe.getTopK()).thenReturn(5); + when(mockPe.getUpperLimit()).thenReturn(5); + when(mockPe.getMetadataTableNames()).thenReturn(List.of("title_metadata")); + + final Data data = new Data(); + EdgeChain> result = service.queryWithMetadata(mockPe); + result + .toSingle() + .blockingSubscribe( + s -> data.val = s.stream().map(r -> r.getRawText()).collect(Collectors.joining(",")), + e -> data.error = e); + if (data.error != null) { + fail("query (meta) failed", data.error); + } + LOGGER.info("query with meta (metric={}) response: '{}'", metric, data.val); + + // WE1 from single joined upsert + assertTrue(data.val.contains("WE1")); + } + + private void getChunks() { + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getFilename()).thenReturn("readme.pdf"); + + final Data data = new Data(); + EdgeChain> result = service.getAllChunks(mockPe); + result + .toSingle() + .blockingSubscribe( + s -> { + data.list = s; + data.val = s.stream().map(r -> r.getRawText()).collect(Collectors.joining(",")); + }, + e -> data.error = e); + if (data.error != null) { + fail("getChunks failed", data.error); + } + LOGGER.info("getChunks response: '{}'", data.val); + + // WE1 from single upsert, and WE2 from batch upsert + assertTrue(data.val.contains("WE1") && data.val.contains("WE2")); + + PostgresWordEmbeddings first = data.list.get(0); + assertEquals(0.25f, first.getValues().get(0), FLOAT_ERROR_MARGIN); + assertEquals(0.5f, first.getValues().get(1), FLOAT_ERROR_MARGIN); + + PostgresWordEmbeddings second = data.list.get(1); + assertEquals(0.75f, second.getValues().get(0), FLOAT_ERROR_MARGIN); + assertEquals(0.9f, second.getValues().get(1), FLOAT_ERROR_MARGIN); + } + + private void getSimilarChunks() { + PostgresEndpoint mockPe = mock(PostgresEndpoint.class); + when(mockPe.getTableName()).thenReturn("t_embedding"); + when(mockPe.getMetadataTableNames()).thenReturn(List.of("title_metadata")); + when(mockPe.getEmbeddingChunk()).thenReturn("how to test this"); + + final Data data = new Data(); + EdgeChain> result = service.getSimilarMetadataChunk(mockPe); + result + .toSingle() + .blockingSubscribe( + s -> { + data.list = s; + data.val = s.stream().map(r -> r.getRawText()).collect(Collectors.joining(",")); + }, + e -> data.error = e); + if (data.error != null) { + fail("getSimilarMetadataChunk failed", data.error); + } + LOGGER.info("getSimilarMetadataChunk response: '{}'", data.val); + } + + private static class Data { + public Throwable error; + public String val; + public List list; + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/logger/services/EmbeddingLogServiceTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/logger/services/EmbeddingLogServiceTest.java new file mode 100644 index 000000000..37054dd1e --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/logger/services/EmbeddingLogServiceTest.java @@ -0,0 +1,67 @@ +package com.edgechain.lib.logger.services; + +import org.junit.jupiter.api.Test; +import org.postgresql.ds.PGSimpleDataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.util.ReflectionTestUtils; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.junit.jupiter.Testcontainers; +import static org.junit.jupiter.api.Assertions.fail; + +@Testcontainers(disabledWithoutDocker = true) +class EmbeddingLogServiceTest { + + private static PostgresTestContainer instance = new PostgresTestContainer(); + + @Test + void test() { + instance.start(); + try { + // create datasource and template using Docker properties + final PGSimpleDataSource datasource = new PGSimpleDataSource(); + datasource.setUrl(instance.getJdbcUrl()); + datasource.setUser(instance.getUsername()); + datasource.setPassword(instance.getPassword()); + + final JdbcTemplate template = new JdbcTemplate(datasource); + + // create service using template + final EmbeddingLogService service = new EmbeddingLogService(); + ReflectionTestUtils.setField(service, "jdbcTemplate", template); + + service.createTable(); + + } catch (Exception e) { + fail("could not create table", e); + + } finally { + instance.stop(); + } + } + + public static class PostgresTestContainer extends PostgreSQLContainer { + + private static final Logger LOGGER = LoggerFactory.getLogger(PostgresTestContainer.class); + + private static final String DOCKER_IMAGE = + PostgreSQLContainer.IMAGE + ":" + PostgreSQLContainer.DEFAULT_TAG; + + public PostgresTestContainer() { + super(DOCKER_IMAGE); + } + + @Override + public void start() { + LOGGER.info("starting container"); + super.start(); + } + + @Override + public void stop() { + LOGGER.info("stopping container"); + super.stop(); + } + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityConfigFixTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityConfigFixTest.java new file mode 100644 index 000000000..01d0ba63d --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityConfigFixTest.java @@ -0,0 +1,119 @@ +package com.edgechain.lib.supabase.security; + +import com.edgechain.lib.configuration.domain.AuthFilter; +import com.edgechain.lib.configuration.domain.MethodAuthentication; +import com.edgechain.testutil.TestJwtCreator; +import java.util.List; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@AutoConfigureMockMvc +@ContextConfiguration(name = "contextWithEmptyPatternsAuthFilter") +class WebSecurityConfigFixTest { + + // ====== TEST JWT-BASED SECURITY WITH NO ROLES (bearer token must be in header) ====== + + private static final String FULL_NONCONTEXT_PATH = "/v0/endpoint/"; + + @BeforeAll + static void setupAll() { + System.setProperty("jwt.secret", "edge-chain-unit-test-jwt-secret"); + } + + @TestConfiguration + public static class AuthFilterTestConfig { + @Bean + AuthFilter authFilter() { + // provide an AuthFilter with an empty string in the patterns list. + // the security class should fix this to ** + AuthFilter auth = new AuthFilter(); + auth.setRequestGet(new MethodAuthentication(List.of(""), "")); + auth.setRequestDelete(new MethodAuthentication(List.of(""), "")); + auth.setRequestPatch(new MethodAuthentication(List.of(""), "")); + auth.setRequestPost(new MethodAuthentication(List.of(""), "")); + auth.setRequestPut(new MethodAuthentication(List.of(""), "")); + return auth; + } + } + + @Autowired private MockMvc mvc; + + @Autowired private JwtHelper jwtHelper; + + @Test + void validateJwt() { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + assertTrue(jwtHelper.validate(jwt)); + } + + @Test + void getEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + mvc.perform( + get(FULL_NONCONTEXT_PATH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void postEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + mvc.perform( + post(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void deleteEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + mvc.perform( + delete(FULL_NONCONTEXT_PATH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void patchEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + mvc.perform( + patch(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void putEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + mvc.perform( + put(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityContextPathTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityContextPathTest.java new file mode 100644 index 000000000..9b6482670 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityContextPathTest.java @@ -0,0 +1,79 @@ +package com.edgechain.lib.supabase.security; + +import com.edgechain.lib.configuration.WebConfiguration; +import com.edgechain.lib.configuration.domain.SecurityUUID; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@AutoConfigureMockMvc +class WebSecurityContextPathTest { + + // ====== TEST CONTEXT-BASED SECURITY (uuid must be in header) ====== + + private static final String FULL_CONTEXT_PATH = WebConfiguration.CONTEXT_PATH + "/"; + + @Autowired private MockMvc mvc; + + @Autowired private SecurityUUID securityUUID; + + @Test + void getContextEndpoint() throws Exception { + mvc.perform( + get(FULL_CONTEXT_PATH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", securityUUID.getAuthKey())) + .andExpect(status().isNotFound()); + } + + @Test + void postContextEndpoint() throws Exception { + mvc.perform( + post(FULL_CONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", securityUUID.getAuthKey())) + .andExpect(status().isNotFound()); + } + + @Test + void deleteContextEndpoint() throws Exception { + mvc.perform( + delete(FULL_CONTEXT_PATH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", securityUUID.getAuthKey())) + .andExpect(status().isNotFound()); + } + + @Test + void patchContextEndpoint() throws Exception { + mvc.perform( + patch(FULL_CONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", securityUUID.getAuthKey())) + .andExpect(status().isNotFound()); + } + + @Test + void putContextEndpoint() throws Exception { + mvc.perform( + put(FULL_CONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", securityUUID.getAuthKey())) + .andExpect(status().isNotFound()); + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityJwtNoRoleTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityJwtNoRoleTest.java new file mode 100644 index 000000000..6d401409e --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityJwtNoRoleTest.java @@ -0,0 +1,96 @@ +package com.edgechain.lib.supabase.security; + +import com.edgechain.testutil.TestJwtCreator; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@AutoConfigureMockMvc +class WebSecurityJwtNoRoleTest { + + // ====== TEST JWT-BASED SECURITY WITH NO ROLES (bearer token must be in header) ====== + + private static final String FULL_NONCONTEXT_PATH = "/v0/endpoint/"; + + @BeforeAll + static void setupAll() { + System.setProperty("jwt.secret", "edge-chain-unit-test-jwt-secret"); + } + + @Autowired private MockMvc mvc; + + @Autowired private JwtHelper jwtHelper; + + @Test + void validateJwt() { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + assertTrue(jwtHelper.validate(jwt)); + } + + @Test + void getEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + mvc.perform( + get(FULL_NONCONTEXT_PATH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void postEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + mvc.perform( + post(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void deleteEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + mvc.perform( + delete(FULL_NONCONTEXT_PATH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void patchEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + mvc.perform( + patch(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void putEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_IGNORED"); + mvc.perform( + put(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityJwtWithRoleTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityJwtWithRoleTest.java new file mode 100644 index 000000000..81da385eb --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/lib/supabase/security/WebSecurityJwtWithRoleTest.java @@ -0,0 +1,173 @@ +package com.edgechain.lib.supabase.security; + +import com.edgechain.lib.configuration.domain.AuthFilter; +import com.edgechain.lib.configuration.domain.MethodAuthentication; +import com.edgechain.testutil.TestJwtCreator; +import java.util.List; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@ActiveProfiles("test") +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@AutoConfigureMockMvc +@ContextConfiguration(name = "contextWithTestRolesAuthFilter") +class WebSecurityJwtWithRoleTest { + + // ====== TEST JWT-BASED SECURITY WITH ROLES (bearer token must be in header) ====== + + private static final String FULL_NONCONTEXT_PATH = "/v0/endpoint/"; + + @TestConfiguration + public static class AuthFilterTestConfig { + @Bean + AuthFilter authFilter() { + // provide an AuthFilter with roles to check we test the correct role for each method + AuthFilter auth = new AuthFilter(); + auth.setRequestGet(new MethodAuthentication(List.of("**"), "ROLE_ADMIN1", "ROLE_AI1")); + auth.setRequestDelete(new MethodAuthentication(List.of("**"), "ROLE_ADMIN2", "ROLE_AI2")); + auth.setRequestPatch(new MethodAuthentication(List.of("**"), "ROLE_ADMIN3", "ROLE_AI3")); + auth.setRequestPost(new MethodAuthentication(List.of("**"), "ROLE_ADMIN4", "ROLE_AI4")); + auth.setRequestPut(new MethodAuthentication(List.of("**"), "ROLE_ADMIN5", "ROLE_AI5")); + return auth; + } + } + + @BeforeAll + static void setupAll() { + System.setProperty("jwt.secret", "edge-chain-unit-test-jwt-secret"); + } + + @Autowired private MockMvc mvc; + + @Autowired private JwtHelper jwtHelper; + + @Test + void validateJwt() { + String jwt = TestJwtCreator.generate("ROLE_TEST"); + assertTrue(jwtHelper.validate(jwt)); + } + + @Test + void getEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_ADMIN1"); + mvc.perform( + get(FULL_NONCONTEXT_PATH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void getEndpoint_notAuth() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_NO_ACCESS"); + mvc.perform( + get(FULL_NONCONTEXT_PATH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isForbidden()); + } + + @Test + void postEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_ADMIN4"); + mvc.perform( + post(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void postEndpoint_notAuth() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_NO_ACCESS"); + mvc.perform( + post(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isForbidden()); + } + + @Test + void deleteEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_ADMIN2"); + mvc.perform( + delete(FULL_NONCONTEXT_PATH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void deleteEndpoint_notAuth() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_NO_ACCESS"); + mvc.perform( + delete(FULL_NONCONTEXT_PATH) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isForbidden()); + } + + @Test + void patchEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_ADMIN3"); + mvc.perform( + patch(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void patchEndpoint_notAuth() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_NO_ACCESS"); + mvc.perform( + patch(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isForbidden()); + } + + @Test + void putEndpoint() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_ADMIN5"); + mvc.perform( + put(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isNotFound()); + } + + @Test + void putEndpoint_notAuth() throws Exception { + String jwt = TestJwtCreator.generate("ROLE_NO_ACCESS"); + mvc.perform( + put(FULL_NONCONTEXT_PATH) + .content("{}") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("Authorization", "Bearer " + jwt)) + .andExpect(status().isForbidden()); + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/openai/OpenAiClientTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/openai/OpenAiClientTest.java index cf8c8be36..9b8ac08aa 100644 --- a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/openai/OpenAiClientTest.java +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/openai/OpenAiClientTest.java @@ -1,6 +1,6 @@ package com.edgechain.openai; -import com.edgechain.lib.endpoint.impl.OpenAiEndpoint; +import com.edgechain.lib.endpoint.impl.llm.OpenAiChatEndpoint; import com.edgechain.lib.openai.request.ChatCompletionRequest; import com.edgechain.lib.openai.request.ChatMessage; import com.edgechain.lib.openai.response.ChatCompletionResponse; @@ -88,15 +88,15 @@ public void testOpenAiClient_ChatCompletionResponse_ShouldMappedToPOJO(Class } @Test - @DisplayName("Test OpenAiEndpoint With Retry Mechanism") + @DisplayName("Test OpenAiChatEndpoint With Retry Mechanism") @Order(3) public void testOpenAiClient_WithRetryMechanism_ShouldThrowExceptionWithRetry(TestInfo testInfo) throws InterruptedException { System.out.println("======== " + testInfo.getDisplayName() + " ========"); - OpenAiEndpoint endpoint = - new OpenAiEndpoint( + OpenAiChatEndpoint endpoint = + new OpenAiChatEndpoint( OPENAI_CHAT_COMPLETION_API, "", // apiKey "", // orgId @@ -120,7 +120,7 @@ public void testOpenAiClient_WithRetryMechanism_ShouldThrowExceptionWithRetry(Te } @Test - @DisplayName("Test OpenAiEndpoint With No Retry Mechanism") + @DisplayName("Test OpenAiChatEndpoint With No Retry Mechanism") @Order(4) public void testOpenAiClient_WithNoRetryMechanism_ShouldThrowExceptionWithNoRetry( TestInfo testInfo) throws InterruptedException { @@ -128,8 +128,8 @@ public void testOpenAiClient_WithNoRetryMechanism_ShouldThrowExceptionWithNoRetr System.out.println("======== " + testInfo.getDisplayName() + " ========"); // Step 1 : Create OpenAi Endpoint - OpenAiEndpoint endpoint = - new OpenAiEndpoint( + OpenAiChatEndpoint endpoint = + new OpenAiChatEndpoint( OPENAI_CHAT_COMPLETION_API, "", // apiKey "", // orgId diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/pinecone/PineconeClientTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/pinecone/PineconeClientTest.java index 0f49fb8d6..f300ac6b8 100644 --- a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/pinecone/PineconeClientTest.java +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/pinecone/PineconeClientTest.java @@ -1,6 +1,107 @@ package com.edgechain.pinecone; +import com.edgechain.lib.endpoint.impl.index.PineconeEndpoint; +import com.edgechain.lib.index.client.impl.PineconeClient; +import com.edgechain.lib.response.StringResponse; +import com.edgechain.lib.rxjava.transformer.observable.EdgeChain; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; -@SpringBootTest -public class PineconeClientTest {} +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class PineconeClientTest { + + @LocalServerPort private int port; + + @Autowired private PineconeClient pineconeClient; + + private PineconeEndpoint pineconeEndpoint; + + @BeforeEach + void setUp() { + System.setProperty("server.port", String.valueOf(port)); + pineconeEndpoint = new PineconeEndpoint("https://arakoo.ai", "apiKey", "Pinecone", null); + } + + @Test + @DisplayName("Test Upsert") + public void test_Upsert() { + RestTemplate restTemplate = mock(RestTemplate.class); + ResponseEntity responseEntity = ResponseEntity.ok("some dummy data"); + when(restTemplate.exchange(anyString(), any(), any(), eq(String.class))) + .thenReturn(responseEntity); + + EdgeChain result = pineconeClient.upsert(pineconeEndpoint); + + assertNotNull(result); + } + + @Test + @DisplayName("Test Batch Upsert") + public void test_Batch_Upsert() { + RestTemplate restTemplate = mock(RestTemplate.class); + ResponseEntity responseEntity = ResponseEntity.ok("some dummy data"); + when(restTemplate.exchange(anyString(), any(), any(), eq(String.class))) + .thenReturn(responseEntity); + + EdgeChain result = pineconeClient.batchUpsert(pineconeEndpoint); + + assertNotNull(result); + } + + @Test + @DisplayName("Test Query") + public void test_Query() { + RestTemplate restTemplate = mock(RestTemplate.class); + ResponseEntity responseEntity = ResponseEntity.ok("some dummy data"); + when(restTemplate.exchange(anyString(), any(), any(), eq(String.class))) + .thenReturn(responseEntity); + + EdgeChain queryResult = pineconeClient.batchUpsert(pineconeEndpoint); + + assertNotNull(queryResult); + assertNull(queryResult.get().getResponse()); + } + + @Test + @DisplayName("Test Delete All") + public void test_Delete_All() { + RestTemplate restTemplate = mock(RestTemplate.class); + ResponseEntity responseEntity = ResponseEntity.ok("some dummy data"); + when(restTemplate.exchange(anyString(), any(), any(), eq(String.class))) + .thenReturn(responseEntity); + + EdgeChain deleteResult = pineconeClient.deleteAll(pineconeEndpoint); + + assertNotNull(deleteResult); + assertTrue(deleteResult.get().getResponse().endsWith("Pinecone")); + } + + @Test + @DisplayName("Test Get Namespace") + public void test_GetNamespace() { + // Test for non-empty namespace + String nonEmptyNamespace = pineconeClient.getNamespace(pineconeEndpoint); + assertEquals("Pinecone", nonEmptyNamespace); + + // Test for empty namespace + pineconeEndpoint.setNamespace(""); + String emptyNamespace = pineconeClient.getNamespace(pineconeEndpoint); + assertEquals("", emptyNamespace); + + // Test for null namespace + pineconeEndpoint.setNamespace(null); + String nullNamespace = pineconeClient.getNamespace(pineconeEndpoint); + assertEquals("", nullNamespace); + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/postgres/PostgresClientMetadataRepositoryTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/postgres/PostgresClientMetadataRepositoryTest.java new file mode 100644 index 000000000..012c7dc16 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/postgres/PostgresClientMetadataRepositoryTest.java @@ -0,0 +1,185 @@ +package com.edgechain.postgres; + +import com.edgechain.lib.embeddings.WordEmbeddings; +import com.edgechain.lib.endpoint.impl.index.PostgresEndpoint; +import com.edgechain.lib.index.enums.PostgresDistanceMetric; +import com.edgechain.lib.index.repositories.PostgresClientMetadataRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@SpringBootTest +@RunWith(MockitoJUnitRunner.class) +public class PostgresClientMetadataRepositoryTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Mock private JdbcTemplate jdbcTemplate; + + PostgresEndpoint postgresEndpoint; + @InjectMocks private PostgresClientMetadataRepository repository; + + @Captor private ArgumentCaptor sqlQueryCaptor; + + @BeforeEach + public void setUp() { + postgresEndpoint = mock(PostgresEndpoint.class); + } + + @Test + @DisplayName( + "Test if jdbcTemplate execute method is called twice for createTable() and verifying sql" + + " queries") + public void testCreateTable_NonEmptyMetadataTableNames() { + // Arrange + when(postgresEndpoint.getMetadataTableNames()) + .thenReturn(Collections.singletonList("metadataTestTable")); + + // Act + repository.createTable(postgresEndpoint); + + // Assert + verify(jdbcTemplate, times(3)).execute(sqlQueryCaptor.capture()); + } + + @Test + @DisplayName("createTable() should throw error when the metadata table names list is empty") + public void testCreateTable_EmptyMetadataTableNames() { + // Arrange + when(postgresEndpoint.getMetadataTableNames()).thenReturn(Collections.emptyList()); + + // Act and Assert + assertThrows(IndexOutOfBoundsException.class, () -> repository.createTable(postgresEndpoint)); + verify(jdbcTemplate, times(0)).execute(sqlQueryCaptor.capture()); + } + + @Test + @DisplayName("Insert metadata must throw NullPointerException when metadata ID is null") + public void testInsertMetadata_ThrowsNullPointerException() { + + // Arrange + String tablename = "table"; + String metadataTableName = "metadata_table"; + String metadata = "example_metadata"; + String documentDate = "Aug 01, 2023"; + + // Mock jdbcTemplate.queryForObject to return null + when(jdbcTemplate.queryForObject(anyString(), eq(UUID.class), any(Object[].class))) + .thenReturn(null); + + // Act and Assert + assertThrows( + NullPointerException.class, + () -> { + repository.insertMetadata(tablename, metadataTableName, metadata, documentDate); + }); + + // Verify that jdbcTemplate.queryForObject was called with the correct SQL query and arguments + verify(jdbcTemplate, times(1)) + .queryForObject(sqlQueryCaptor.capture(), eq(UUID.class), any(Object[].class)); + } + + @Test + @DisplayName("Insert entry into the join table") + public void testInsertIntoJoinTable() { + // Arrange + String id = UUID.randomUUID().toString(); + String metadataId = UUID.randomUUID().toString(); + when(postgresEndpoint.getTableName()).thenReturn("embedding_table"); + when(postgresEndpoint.getMetadataTableNames()) + .thenReturn(Collections.singletonList("metadata_table")); + when(postgresEndpoint.getId()).thenReturn(id); + when(postgresEndpoint.getMetadataId()).thenReturn(metadataId); + String joinTable = + postgresEndpoint.getTableName() + + "_join_" + + postgresEndpoint.getMetadataTableNames().get(0); + + // Act + repository.insertIntoJoinTable(postgresEndpoint); + + // Assert + verify(jdbcTemplate, times(1)).execute(sqlQueryCaptor.capture()); + + // Verify the captured query and actual query is same or not + String capturedQuery = sqlQueryCaptor.getValue(); + String expectedQuery = + String.format( + "INSERT INTO %s (id, metadata_id) VALUES ('%s', '%s') ON CONFLICT (id) DO UPDATE SET" + + " metadata_id = EXCLUDED.metadata_id;", + joinTable, postgresEndpoint.getId(), postgresEndpoint.getMetadataId()); + assertEquals(expectedQuery, capturedQuery); + } + + @Test + @DisplayName("Query with metadata") + public void testQueryWithMetadata() { + // Arrange + String tableName = "embedding_table"; + String metadataTableName = "metadata_table"; + String namespace = "example_namespace"; + int probes = 1; + PostgresDistanceMetric metric = PostgresDistanceMetric.L2; + List wordEmbeddingValues = List.of(0.1f, 0.2f, 0.3f); + WordEmbeddings wordEmbeddings = new WordEmbeddings("", wordEmbeddingValues); + int topK = 5; + String metadataId = UUID.randomUUID().toString(); + String id = UUID.randomUUID().toString(); + + // Mock queryForList method to return a dummy result + List> dummyResult = + List.of( + Map.of( + "id", + id, + "metadata", + "example_metadata", + "document_date", + "Aug 01, 2023", + "metadata_id", + metadataId, + "raw_text", + "example_raw_text", + "namespace", + "example_namespace", + "filename", + "example_filename", + "timestamp", + "example_timestamp", + "score", + 0.5)); + when(jdbcTemplate.queryForList(anyString())).thenReturn(dummyResult); + + // Act + List> result = + repository.queryWithMetadata( + tableName, + metadataTableName, + namespace, + probes, + metric, + wordEmbeddings.getValues(), + topK); + + // Assert + verify(jdbcTemplate).queryForList(sqlQueryCaptor.capture()); + assertEquals(dummyResult, result); + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/reactChain/ReactChainTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/reactChain/ReactChainTest.java index fc8de64ab..9d6ec81be 100644 --- a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/reactChain/ReactChainTest.java +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/reactChain/ReactChainTest.java @@ -1,6 +1,7 @@ package com.edgechain.reactChain; import com.edgechain.lib.jsonnet.JsonnetLoader; +import com.edgechain.lib.jsonnet.exceptions.JsonnetLoaderException; import com.edgechain.lib.jsonnet.impl.FileJsonnetLoader; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -9,8 +10,8 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertThrows; @SpringBootTest public class ReactChainTest { @@ -76,4 +77,48 @@ local callFunction(funcName) = assertNotNull(searchFunction); assertEquals(searchFunction, "udf.fn"); } + + @Test + @DisplayName("Test extractAction with invalid input") + void test_extractAction_WithInvalidJsonnet() throws Exception { + String inputJsonnet = "This is invalid jsonnet."; + InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); + JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); + assertThrows(Exception.class, () -> jsonnetLoader.load(inputStream)); + } + + @Test + @DisplayName("Test extractAction with empty input") + void test_extractAction_withEmptyJsonnet() throws Exception { + String inputJsonnet = ""; + InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); + JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); + assertThrows(Exception.class, () -> jsonnetLoader.get("action")); + assertThrows(Exception.class, () -> jsonnetLoader.load(inputStream)); + } + + @Test + @DisplayName("Test extractThought - invalid input") + void test_extractThought_WithInvalidInput() { + String inputJsonnet = "This is not a valid jsonnet pattern"; + InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); + JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); + assertThrows(Exception.class, () -> jsonnetLoader.load(inputStream)); + } + + @Test + @DisplayName("Test Mapper - Missing function") + public void test_mapper_MissingFunction_ReturnedExpectedResult() { + String inputJsonnet = + """ + local config = { + "edgechains.config": { + "mapper": {}, + }, + }; + """; + InputStream inputStream = new ByteArrayInputStream(inputJsonnet.getBytes()); + JsonnetLoader jsonnetLoader = new FileJsonnetLoader(); + assertThrows(JsonnetLoaderException.class, () -> jsonnetLoader.load(inputStream)); + } } diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/testutil/PostgresTestContainer.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/testutil/PostgresTestContainer.java new file mode 100644 index 000000000..6feab846b --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/testutil/PostgresTestContainer.java @@ -0,0 +1,41 @@ +package com.edgechain.testutil; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.utility.DockerImageName; + +public class PostgresTestContainer extends PostgreSQLContainer { + + public enum PostgresImage { + PLAIN, + VECTOR + }; + + private static final Logger LOGGER = LoggerFactory.getLogger(PostgresTestContainer.class); + + // private static final String DOCKER_IMAGE = PostgreSQLContainer.IMAGE + ":" + + // PostgreSQLContainer.DEFAULT_TAG; + + private static final DockerImageName IMAGE = DockerImageName.parse("postgres").withTag("14.5"); + + private static final DockerImageName VECTOR_IMAGE = + DockerImageName.parse("ankane/pgvector").asCompatibleSubstituteFor("postgres"); + + public PostgresTestContainer(PostgresImage img) { + super(img == PostgresImage.VECTOR ? VECTOR_IMAGE : IMAGE); + } + + @Override + public void start() { + LOGGER.info("starting container"); + super.start(); + LOGGER.info("TEST with Docker PostgreSQL url={}", getJdbcUrl()); + } + + @Override + public void stop() { + LOGGER.info("stopping container"); + super.stop(); + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/testutil/TestConfigSupport.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/testutil/TestConfigSupport.java new file mode 100644 index 000000000..78b605896 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/testutil/TestConfigSupport.java @@ -0,0 +1,77 @@ +package com.edgechain.testutil; + +import com.edgechain.lib.configuration.context.ApplicationContextHolder; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import org.modelmapper.ModelMapper; +import org.springframework.context.ApplicationContext; +import org.springframework.test.util.ReflectionTestUtils; +import retrofit2.Retrofit; +import static org.mockito.Mockito.mock; + +/** Two useful pairs of functions to set private static fields. */ +public final class TestConfigSupport { + + private ApplicationContext prevAppContext; + private String prevServerPort; + + /** + * Creates and forcefully uses a mock application context. Previous value is remembered. Call this + * once in a @BeforeEach setup method. + * + * @return a mock application context + */ + public ApplicationContext setupAppContext() { + prevAppContext = ApplicationContextHolder.getContext(); + + ApplicationContext mockAppContext = mock(ApplicationContext.class); + ReflectionTestUtils.setField(ApplicationContextHolder.class, "context", mockAppContext); + + return mockAppContext; + } + + /** + * Restore a previously saved application context. Call this once in an @AfterEach teardown + * method. + */ + public void tearDownAppContext() { + ReflectionTestUtils.setField(ApplicationContextHolder.class, "context", prevAppContext); + } + + /** + * Creates and forcefully uses a mock Retrofit instance. Call this once in a @BeforeEach setup + * method. + * + * @return a mock Retrofit instance + */ + public Retrofit setupRetrofit() { + Retrofit mockRetrofit = mock(Retrofit.class); + ReflectionTestUtils.setField(RetrofitClientInstance.class, "retrofit", mockRetrofit); + + // Retrofit needs a valid port + prevServerPort = System.getProperty("server.port"); + System.setProperty("server.port", "8888"); + + return mockRetrofit; + } + + private ModelMapper setupModelMapper() { + ModelMapper mockModelMapper = mock(ModelMapper.class); + ReflectionTestUtils.setField(ModelMapper.class, "modelMapper", mockModelMapper); + // Retrofit needs a valid port + prevServerPort = System.getProperty("server.port"); + System.setProperty("server.port", "8888"); + return mockModelMapper; + } + + /** + * Erases the current Retrofit instance so it can be recreated. Call this once in an @AfterEach + * teardown method. + */ + public void tearDownRetrofit() { + ReflectionTestUtils.setField(RetrofitClientInstance.class, "retrofit", null); + + if (prevServerPort != null) { + System.setProperty("server.port", prevServerPort); + } + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/testutil/TestJwtCreator.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/testutil/TestJwtCreator.java new file mode 100644 index 000000000..07a633fcf --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/testutil/TestJwtCreator.java @@ -0,0 +1,25 @@ +package com.edgechain.testutil; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; +import java.util.Date; + +public final class TestJwtCreator { + + private TestJwtCreator() { + // no + } + + public static String generate(String role) { + Algorithm algo = Algorithm.HMAC256(System.getProperty("jwt.secret").getBytes()); + Date d = new Date(); + return JWT.create() + .withSubject("example JWT for testing") + .withClaim("email", "admin@machine.local") + .withClaim("role", role) + .withIssuer("edgechain-tester") + .withIssuedAt(d) + .withExpiresAt(new Date(d.getTime() + 25000)) + .sign(algo); + } +} diff --git a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/wiki/WikiClientTest.java b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/wiki/WikiClientTest.java index 8d8b20a98..ec556317b 100644 --- a/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/wiki/WikiClientTest.java +++ b/Java/FlySpring/edgechain-app/src/test/java/com/edgechain/wiki/WikiClientTest.java @@ -1,19 +1,30 @@ package com.edgechain.wiki; -import com.edgechain.lib.endpoint.impl.WikiEndpoint; +import com.edgechain.lib.configuration.domain.SecurityUUID; +import com.edgechain.lib.endpoint.impl.wiki.WikiEndpoint; +import com.edgechain.lib.retrofit.client.RetrofitClientInstance; +import com.edgechain.lib.wiki.response.WikiResponse; import io.reactivex.rxjava3.observers.TestObserver; -import org.junit.jupiter.api.*; +import java.io.IOException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.TestMethodOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; -import static org.junit.jupiter.api.Assertions.*; - -import com.edgechain.lib.wiki.response.WikiResponse; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.util.ReflectionTestUtils; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class WikiClientTest { +class WikiClientTest { @LocalServerPort private int port; @@ -21,25 +32,36 @@ public class WikiClientTest { @BeforeEach public void setup() { - System.setProperty("server.port", "" + port); + System.setProperty("server.port", String.valueOf(port)); } @Test - @DisplayName("Test WikiContent Method Returns WikiResponse") - @Order(1) - public void wikiControllerTest_TestWikiContentMethod_ReturnsWikiResponse(TestInfo testInfo) + @DisplayName("Test WikiContent Method Handles Exception") + @DirtiesContext + void wikiControllerTest_TestWikiContentMethod_HandlesException(TestInfo testInfo) throws InterruptedException { + try { + // create a mock instance that will generate a non-IOException in the interceptor + SecurityUUID mockSecurityUUID = mock(SecurityUUID.class); + when(mockSecurityUUID.getAuthKey()).thenThrow(new RuntimeException("FORCED TEST EXCEPTION")); + ReflectionTestUtils.setField(RetrofitClientInstance.class, "securityUUID", mockSecurityUUID); + ReflectionTestUtils.setField(RetrofitClientInstance.class, "retrofit", null); - logger.info("======== " + testInfo.getDisplayName() + " ========"); + logger.info("======== {} ========", testInfo.getDisplayName()); - // Prepare test data - WikiEndpoint wikiEndpoint = new WikiEndpoint(); - TestObserver test = wikiEndpoint.getPageContent("Barack Obama").test(); + // Prepare test data + WikiEndpoint wikiEndpoint = new WikiEndpoint(); + TestObserver test = wikiEndpoint.getPageContent("Barack Obama").test(); - test.await(); + test.await(); - logger.info(test.values().toString()); + logger.info("{}", test.values().toString()); - test.assertNoErrors(); + test.assertError(IOException.class); + } finally { + // reset instance + ReflectionTestUtils.setField(RetrofitClientInstance.class, "securityUUID", null); + ReflectionTestUtils.setField(RetrofitClientInstance.class, "retrofit", null); + } } } diff --git a/Java/FlySpring/edgechain-app/src/test/java/resources/ChatCompletionRequest.json b/Java/FlySpring/edgechain-app/src/test/java/resources/ChatCompletionRequest.json index fe735f847..542a34b86 100644 --- a/Java/FlySpring/edgechain-app/src/test/java/resources/ChatCompletionRequest.json +++ b/Java/FlySpring/edgechain-app/src/test/java/resources/ChatCompletionRequest.json @@ -1,9 +1,18 @@ { - "model" : "gpt-3.5-turbo", - "temperature" : 0.7, - "messages" : [ { - "role" : "user", - "content" : "Can you write two unique sentences on Java Language?" - } ], - "stream" : false + "model": "gpt-3.5-turbo", + "temperature": 0.7, + "messages": [ + { + "role": "user", + "content": "Can you write two unique sentences on Java Language?" + } + ], + "stream": false, + "n": 1, + "stop": [], + "user": "", + "top_p": 1.0, + "presence_penalty": 0.0, + "frequency_penalty": 0.0, + "logit_bias": {} } \ No newline at end of file diff --git a/Java/FlySpring/edgechain-app/src/test/resources/logback-test.xml b/Java/FlySpring/edgechain-app/src/test/resources/logback-test.xml new file mode 100644 index 000000000..c050220c4 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/resources/logback-test.xml @@ -0,0 +1,18 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n + + + + + + + + + + + + + + diff --git a/Java/FlySpring/edgechain-app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/Java/FlySpring/edgechain-app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 000000000..1f0955d45 --- /dev/null +++ b/Java/FlySpring/edgechain-app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/Java/FlySpring/flyfly/.DS_Store b/Java/FlySpring/flyfly/.DS_Store new file mode 100644 index 000000000..2ff3bf83d Binary files /dev/null and b/Java/FlySpring/flyfly/.DS_Store differ diff --git a/Java/FlySpring/flyfly/pom.xml b/Java/FlySpring/flyfly/pom.xml index aa917240b..957692182 100644 --- a/Java/FlySpring/flyfly/pom.xml +++ b/Java/FlySpring/flyfly/pom.xml @@ -1,87 +1,85 @@ - + 4.0.0 + - org.springframework.boot - spring-boot-starter-parent - 3.0.0 - + com.flyspring + edgechain-parent + 0.0.1-SNAPSHOT - com.flyspring + flyfly 0.0.1-SNAPSHOT flyfly flyfly CLI + - 17 + 3.3.9 - - - - org.testcontainers - testcontainers-bom - 1.17.6 - pom - import - - - info.picocli picocli-spring-boot-starter - 4.7.0 + ${picocli.version} + org.apache.commons commons-lang3 + commons-io commons-io - 2.11.0 + net.lingala.zip4j zip4j - 2.11.3 + ${zip4j.version} + org.zeroturnaround zt-exec - 1.12 + ${zeroturnaround.version} + org.apache.maven maven-model - 3.3.9 + ${maven-model.version} + org.projectlombok lombok - 1.18.20 - provided + true + org.testcontainers testcontainers - 1.17.6 + org.testcontainers mysql + - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.testcontainers postgresql + org.postgresql postgresql @@ -91,10 +89,12 @@ org.testcontainers mariadb + org.mariadb.jdbc mariadb-java-client + org.springframework.boot spring-boot-starter-test @@ -103,19 +103,21 @@ + clean install org.springframework.boot spring-boot-maven-plugin + ${spring-boot.version} - com.flyspring.flyfly.FlyflyApplication - + com.flyspring.flyfly.FlyflyApplication + org.apache.maven.plugins maven-antrun-plugin - 1.8 + ${maven-antrun.version} download-and-unpack-jbang @@ -126,18 +128,20 @@ - + + dest="${project.build.directory}/jbang" /> - + + file="${project.build.directory}/jbang/jbang/bin/jbang.jar" + tofile="${project.basedir}/src/main/resources/jbang.jar" /> @@ -156,17 +160,21 @@ gofly + + true + maven-antrun-plugin - 3.1.0 + ${maven-antrun.version} package - + @@ -180,13 +188,4 @@ - - - - - - - - - diff --git a/Java/FlySpring/pom.xml b/Java/FlySpring/pom.xml new file mode 100644 index 000000000..46befc706 --- /dev/null +++ b/Java/FlySpring/pom.xml @@ -0,0 +1,102 @@ + + + 4.0.0 + + com.flyspring + edgechain-parent + pom + 0.0.1-SNAPSHOT + EdgeChain parent + Parent POM for EdgeChain + + + 17 + 17 + 17 + + UTF-8 + UTF-8 + + 3.4.1 + 3.1.0 + + 3.1.3 + + 2.7.0 + 2.11.0 + 4.7.0 + 1.2.1 + 1.19.0 + 0.0.7 + 1.12 + 2.11.3 + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + commons-io + commons-io + ${commons-io.version} + + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + org.testcontainers + testcontainers + ${testcontainers.version} + + + + org.testcontainers + junit-jupiter + ${testcontainers.version} + + + + org.testcontainers + mysql + ${testcontainers.version} + + + + org.testcontainers + postgresql + ${testcontainers.version} + + + + org.testcontainers + mariadb + ${testcontainers.version} + + + + + + autoroute + flyfly + edgechain-app + + + + clean install + + diff --git a/Java/FlySpring/readme.md b/Java/FlySpring/readme.md index 891fc9f00..02d5c69bb 100644 --- a/Java/FlySpring/readme.md +++ b/Java/FlySpring/readme.md @@ -1,14 +1,21 @@ # flyfly CLI + ## Installation & Usage + cd to autoroute directory -```console -mvn clean package -P gofly + +```bash +mvn clean package ``` + cd to flyfly directory -```console -mvn clean package -P gofly + +```bash +mvn clean package ``` + Now cd into Examples/starter :- flyfly is ready to roll! + ```bash java -jar flyfly.jar ``` @@ -16,10 +23,13 @@ java -jar flyfly.jar ## Commands ### run + Runs the Spring Boot application. if the project has jpa and a database driver(connector) in the build file and there is not 'spring.datasource.url' in the application.properties. Then the CLI will start a TestContainers database and add temporary values to application.properties to allow the application to run successfully. That's if the driver is supported by the CLI and Docker is installed. -Currently supported DBs are: MySQL, Postgres, and MariaDB. +Currently supported DBs are: MySQL, Postgres, and MariaDB. + ### format + Format the code using Spotless. P.S. - New examples will be added soon! \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b45b76530..cf7259591 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,15 +6,15 @@ "": { "dependencies": { "@microsoft/eslint-formatter-sarif": "^3.0.0", - "@typescript-eslint/eslint-plugin": "^6.13.1", - "@typescript-eslint/parser": "^6.13.1", - "eslint": "^8.54.0", + "@typescript-eslint/eslint-plugin": "^6.16.0", + "@typescript-eslint/parser": "^6.16.0", + "eslint": "^8.56.0", "eslint-config-google": "^0.14.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-prettier": "^5.0.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prettier": "^5.1.2", "express": "^4.18.2", - "prettier": "^3.1.0" + "prettier": "^3.1.1" }, "devDependencies": { "@types/express": "^4.17.21" @@ -51,9 +51,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -94,9 +94,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -330,15 +330,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", - "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.16.0.tgz", + "integrity": "sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==", "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/type-utils": "6.13.1", - "@typescript-eslint/utils": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/type-utils": "6.16.0", + "@typescript-eslint/utils": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -385,14 +385,14 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@typescript-eslint/parser": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", - "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", - "dependencies": { - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/typescript-estree": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.16.0.tgz", + "integrity": "sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==", + "dependencies": { + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4" }, "engines": { @@ -433,12 +433,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", - "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.16.0.tgz", + "integrity": "sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==", "dependencies": { - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1" + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -449,12 +449,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", - "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.16.0.tgz", + "integrity": "sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg==", "dependencies": { - "@typescript-eslint/typescript-estree": "6.13.1", - "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/utils": "6.16.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -496,9 +496,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@typescript-eslint/types": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", - "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.16.0.tgz", + "integrity": "sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -508,15 +508,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", - "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.16.0.tgz", + "integrity": "sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==", "dependencies": { - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -533,6 +534,14 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -549,22 +558,36 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/typescript-estree/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==" }, "node_modules/@typescript-eslint/utils": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", - "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.16.0.tgz", + "integrity": "sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A==", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/typescript-estree": "6.16.0", "semver": "^7.5.4" }, "engines": { @@ -579,11 +602,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", - "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.16.0.tgz", + "integrity": "sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==", "dependencies": { - "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/types": "6.16.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1232,14 +1255,14 @@ } }, "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -1297,9 +1320,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -1360,9 +1383,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -1380,7 +1403,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -1422,22 +1445,23 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", - "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.2.tgz", + "integrity": "sha512-dhlpWc9vOwohcWmClFcA+HjlvUpuyynYs0Rf+L/P6/0iQE6vlHW9l5bkfzN62/Stm9fbq8ku46qzde76T1xlSg==", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.5" + "synckit": "^0.8.6" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/prettier" + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", + "eslint-config-prettier": "*", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -2632,9 +2656,9 @@ } }, "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dependencies": { "path-key": "^4.0.0" }, @@ -2912,9 +2936,9 @@ } }, "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "bin": { "prettier": "bin/prettier.cjs" }, @@ -3493,12 +3517,12 @@ } }, "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.7.tgz", + "integrity": "sha512-Ic2DW4WMr0gJ7z9rXYGlWPNBVzmsIZLFfKeVhmuVBUtw6ZOFB1GZnCcWQLc7OuBFLVLHKFAdaIZNc/yyUEvZ1g==", "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" + "@pkgr/utils": "^2.4.2", + "tslib": "^2.6.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -3554,9 +3578,9 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", diff --git a/package.json b/package.json index e9d3c2a9e..8928474ea 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,15 @@ { "dependencies": { "@microsoft/eslint-formatter-sarif": "^3.0.0", - "@typescript-eslint/eslint-plugin": "^6.13.1", - "@typescript-eslint/parser": "^6.13.1", - "eslint": "^8.54.0", + "@typescript-eslint/eslint-plugin": "^6.16.0", + "@typescript-eslint/parser": "^6.16.0", + "eslint": "^8.56.0", "eslint-config-google": "^0.14.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-prettier": "^5.0.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prettier": "^5.1.2", "express": "^4.18.2", - "prettier": "^3.1.0" + "prettier": "^3.1.1" }, "devDependencies": { "@types/express": "^4.17.21"