From 066f95386363ff33eb05801e1351d3bd2db6e629 Mon Sep 17 00:00:00 2001 From: Krishna Acondy Date: Tue, 7 Jul 2020 19:53:35 +0100 Subject: [PATCH] feat(*): recreate package with new name --- .github/workflows/build.yml | 27 + .github/workflows/npmpublish.yml | 25 + .gitignore | 2 + CHANGELOG.md | 209 + CODE_OF_CONDUCT.md | 76 + CONTRIBUTING.md | 80 + LICENSE | 21 + README.md | 50 + cypress.json | 13 + docs/CNAME | 1 + docs/assets/css/main.css | 1 + docs/assets/css/main.css.map | 1 + docs/assets/images/icons.png | Bin 0 -> 9615 bytes docs/assets/images/icons@2x.png | Bin 0 -> 28144 bytes docs/assets/images/widgets.png | Bin 0 -> 480 bytes docs/assets/images/widgets@2x.png | Bin 0 -> 855 bytes docs/assets/js/main.js | 5 + docs/assets/js/search.json | 1 + docs/classes/_index_.sasjs.html | 1241 ++ docs/classes/_index_.sasjsconfig.html | 263 + .../sas9apiclient.sas9apiclient-1.html | 278 + docs/classes/sasjs.sasjs-1.html | 910 + docs/classes/sasjsconfig.sasjsconfig-1.html | 250 + .../sasviyaapiclient.sasviyaapiclient-1.html | 773 + docs/enums/servertype.servertype-1.html | 153 + docs/globals.html | 131 + docs/index.html | 131 + docs/interfaces/_index_.sasjsrequest.html | 263 + .../_index_.sasjswatingrequest.html | 249 + docs/interfaces/context.context-1.html | 185 + docs/interfaces/csrftoken.csrftoken-1.html | 157 + docs/interfaces/folder.folder-1.html | 171 + docs/interfaces/job.job-1.html | 213 + docs/interfaces/jobresult.jobresult-1.html | 143 + docs/interfaces/link.link-1.html | 199 + .../sasjsrequest.sasjsrequest-1.html | 217 + ...swaitingrequest.sasjswaitingrequest-1.html | 203 + docs/interfaces/session.session-1.html | 143 + docs/modules/_index_.html | 377 + docs/modules/_sasjs_spec_.html | 159 + docs/modules/asyncforeach.html | 139 + docs/modules/comparetimestamps.html | 143 + docs/modules/context.html | 110 + docs/modules/converttocsv.html | 144 + docs/modules/csrftoken.html | 110 + docs/modules/folder.html | 110 + docs/modules/isauthorizeformrequired.html | 136 + docs/modules/isloginrequired.html | 136 + docs/modules/isloginsuccess.html | 136 + docs/modules/job.html | 110 + docs/modules/jobresult.html | 110 + docs/modules/link.html | 110 + docs/modules/makerequest.html | 169 + docs/modules/needsretry.html | 136 + docs/modules/parseandsubmitauthorizeform.html | 139 + docs/modules/parsegeneratedcode.html | 136 + docs/modules/parsesasviyalog.html | 144 + docs/modules/parsesourcecode.html | 136 + docs/modules/sas9apiclient.html | 110 + docs/modules/sasjs.html | 110 + docs/modules/sasjsconfig.html | 110 + docs/modules/sasjsrequest.html | 110 + docs/modules/sasjswaitingrequest.html | 110 + docs/modules/sasviyaapiclient.html | 110 + docs/modules/serialize.html | 136 + docs/modules/servertype.html | 110 + docs/modules/session.html | 110 + docs/modules/splitchunks.html | 136 + example.html | 107 + jest.config.js | 10 + package-lock.json | 18240 ++++++++++++++++ package.json | 64 + sasjs-tests/.env | 1 + sasjs-tests/.gitignore | 23 + sasjs-tests/README.md | 68 + sasjs-tests/package-lock.json | 14799 +++++++++++++ sasjs-tests/package.json | 47 + sasjs-tests/public/config.json | 11 + sasjs-tests/public/favicon.ico | Bin 0 -> 3150 bytes sasjs-tests/public/favicon.png | Bin 0 -> 4332 bytes sasjs-tests/public/index.html | 40 + sasjs-tests/public/logo192.png | Bin 0 -> 5347 bytes sasjs-tests/public/logo512.png | Bin 0 -> 9664 bytes sasjs-tests/public/manifest.json | 25 + sasjs-tests/public/robots.txt | 3 + sasjs-tests/public/sasjs-logo.png | Bin 0 -> 64408 bytes sasjs-tests/src/App.scss | 102 + sasjs-tests/src/App.test.js | 9 + sasjs-tests/src/App.tsx | 58 + sasjs-tests/src/Login.scss | 34 + sasjs-tests/src/Login.tsx | 54 + sasjs-tests/src/PrivateRoute.tsx | 23 + sasjs-tests/src/TestSuiteRunner.scss | 19 + sasjs-tests/src/TestSuiteRunner.tsx | 126 + sasjs-tests/src/components/Test.tsx | 79 + sasjs-tests/src/components/TestCard.scss | 62 + sasjs-tests/src/components/TestCard.tsx | 43 + sasjs-tests/src/components/TestSuite.tsx | 106 + sasjs-tests/src/components/TestSuiteCard.scss | 19 + sasjs-tests/src/components/TestSuiteCard.tsx | 44 + sasjs-tests/src/context/AppContext.tsx | 53 + sasjs-tests/src/index.scss | 63 + sasjs-tests/src/index.tsx | 26 + sasjs-tests/src/react-app-env.d.ts | 1 + sasjs-tests/src/serviceWorker.js | 141 + sasjs-tests/src/setupTests.js | 5 + sasjs-tests/src/testSuites/Basic.ts | 97 + sasjs-tests/src/testSuites/RequestData.ts | 308 + sasjs-tests/src/testSuites/SasjsRequests.ts | 25 + sasjs-tests/src/testSuites/SpecialCases.ts | 235 + sasjs-tests/src/types/index.ts | 15 + sasjs-tests/src/utils/Assert.ts | 22 + sasjs-tests/src/utils/UploadFile.ts | 23 + sasjs-tests/tsconfig.json | 25 + src/SAS9ApiClient.ts | 51 + src/SASViyaApiClient.ts | 850 + src/SASjs.spec.ts | 48 + src/SASjs.ts | 1041 + src/index.ts | 5 + src/types/Context.ts | 6 + src/types/CsrfToken.ts | 4 + src/types/Folder.ts | 7 + src/types/Job.ts | 11 + src/types/JobResult.ts | 3 + src/types/Link.ts | 7 + src/types/SASjsConfig.ts | 30 + src/types/SASjsRequest.ts | 12 + src/types/SASjsWaitingRequest.ts | 14 + src/types/ServerType.ts | 8 + src/types/Session.ts | 3 + src/types/index.ts | 10 + src/utils/asyncForEach.ts | 5 + src/utils/compareTimestamps.ts | 9 + src/utils/convertToCsv.ts | 133 + src/utils/index.ts | 14 + src/utils/isAuthorizeFormRequired.ts | 3 + src/utils/isLoginRequired.ts | 5 + src/utils/isLoginSuccess.ts | 2 + src/utils/makeRequest.ts | 37 + src/utils/needsRetry.ts | 11 + src/utils/parseAndSubmitAuthorizeForm.ts | 49 + src/utils/parseGeneratedCode.ts | 7 + src/utils/parseSasViyaLog.ts | 12 + src/utils/parseSourceCode.ts | 6 + src/utils/serialize.ts | 15 + src/utils/splitChunks.ts | 12 + tsconfig.json | 13 + tslint.json | 9 + typedoc.json | 42 + webpack.config.js | 49 + 150 files changed, 48625 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/npmpublish.yml create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 cypress.json create mode 100644 docs/CNAME create mode 100644 docs/assets/css/main.css create mode 100644 docs/assets/css/main.css.map create mode 100644 docs/assets/images/icons.png create mode 100644 docs/assets/images/icons@2x.png create mode 100644 docs/assets/images/widgets.png create mode 100644 docs/assets/images/widgets@2x.png create mode 100644 docs/assets/js/main.js create mode 100644 docs/assets/js/search.json create mode 100644 docs/classes/_index_.sasjs.html create mode 100644 docs/classes/_index_.sasjsconfig.html create mode 100644 docs/classes/sas9apiclient.sas9apiclient-1.html create mode 100644 docs/classes/sasjs.sasjs-1.html create mode 100644 docs/classes/sasjsconfig.sasjsconfig-1.html create mode 100644 docs/classes/sasviyaapiclient.sasviyaapiclient-1.html create mode 100644 docs/enums/servertype.servertype-1.html create mode 100644 docs/globals.html create mode 100644 docs/index.html create mode 100644 docs/interfaces/_index_.sasjsrequest.html create mode 100644 docs/interfaces/_index_.sasjswatingrequest.html create mode 100644 docs/interfaces/context.context-1.html create mode 100644 docs/interfaces/csrftoken.csrftoken-1.html create mode 100644 docs/interfaces/folder.folder-1.html create mode 100644 docs/interfaces/job.job-1.html create mode 100644 docs/interfaces/jobresult.jobresult-1.html create mode 100644 docs/interfaces/link.link-1.html create mode 100644 docs/interfaces/sasjsrequest.sasjsrequest-1.html create mode 100644 docs/interfaces/sasjswaitingrequest.sasjswaitingrequest-1.html create mode 100644 docs/interfaces/session.session-1.html create mode 100644 docs/modules/_index_.html create mode 100644 docs/modules/_sasjs_spec_.html create mode 100644 docs/modules/asyncforeach.html create mode 100644 docs/modules/comparetimestamps.html create mode 100644 docs/modules/context.html create mode 100644 docs/modules/converttocsv.html create mode 100644 docs/modules/csrftoken.html create mode 100644 docs/modules/folder.html create mode 100644 docs/modules/isauthorizeformrequired.html create mode 100644 docs/modules/isloginrequired.html create mode 100644 docs/modules/isloginsuccess.html create mode 100644 docs/modules/job.html create mode 100644 docs/modules/jobresult.html create mode 100644 docs/modules/link.html create mode 100644 docs/modules/makerequest.html create mode 100644 docs/modules/needsretry.html create mode 100644 docs/modules/parseandsubmitauthorizeform.html create mode 100644 docs/modules/parsegeneratedcode.html create mode 100644 docs/modules/parsesasviyalog.html create mode 100644 docs/modules/parsesourcecode.html create mode 100644 docs/modules/sas9apiclient.html create mode 100644 docs/modules/sasjs.html create mode 100644 docs/modules/sasjsconfig.html create mode 100644 docs/modules/sasjsrequest.html create mode 100644 docs/modules/sasjswaitingrequest.html create mode 100644 docs/modules/sasviyaapiclient.html create mode 100644 docs/modules/serialize.html create mode 100644 docs/modules/servertype.html create mode 100644 docs/modules/session.html create mode 100644 docs/modules/splitchunks.html create mode 100644 example.html create mode 100644 jest.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 sasjs-tests/.env create mode 100644 sasjs-tests/.gitignore create mode 100644 sasjs-tests/README.md create mode 100644 sasjs-tests/package-lock.json create mode 100644 sasjs-tests/package.json create mode 100644 sasjs-tests/public/config.json create mode 100644 sasjs-tests/public/favicon.ico create mode 100644 sasjs-tests/public/favicon.png create mode 100644 sasjs-tests/public/index.html create mode 100644 sasjs-tests/public/logo192.png create mode 100644 sasjs-tests/public/logo512.png create mode 100644 sasjs-tests/public/manifest.json create mode 100644 sasjs-tests/public/robots.txt create mode 100644 sasjs-tests/public/sasjs-logo.png create mode 100644 sasjs-tests/src/App.scss create mode 100644 sasjs-tests/src/App.test.js create mode 100644 sasjs-tests/src/App.tsx create mode 100644 sasjs-tests/src/Login.scss create mode 100644 sasjs-tests/src/Login.tsx create mode 100644 sasjs-tests/src/PrivateRoute.tsx create mode 100644 sasjs-tests/src/TestSuiteRunner.scss create mode 100644 sasjs-tests/src/TestSuiteRunner.tsx create mode 100644 sasjs-tests/src/components/Test.tsx create mode 100644 sasjs-tests/src/components/TestCard.scss create mode 100644 sasjs-tests/src/components/TestCard.tsx create mode 100644 sasjs-tests/src/components/TestSuite.tsx create mode 100644 sasjs-tests/src/components/TestSuiteCard.scss create mode 100644 sasjs-tests/src/components/TestSuiteCard.tsx create mode 100644 sasjs-tests/src/context/AppContext.tsx create mode 100644 sasjs-tests/src/index.scss create mode 100644 sasjs-tests/src/index.tsx create mode 100644 sasjs-tests/src/react-app-env.d.ts create mode 100644 sasjs-tests/src/serviceWorker.js create mode 100644 sasjs-tests/src/setupTests.js create mode 100644 sasjs-tests/src/testSuites/Basic.ts create mode 100644 sasjs-tests/src/testSuites/RequestData.ts create mode 100644 sasjs-tests/src/testSuites/SasjsRequests.ts create mode 100644 sasjs-tests/src/testSuites/SpecialCases.ts create mode 100644 sasjs-tests/src/types/index.ts create mode 100644 sasjs-tests/src/utils/Assert.ts create mode 100644 sasjs-tests/src/utils/UploadFile.ts create mode 100644 sasjs-tests/tsconfig.json create mode 100644 src/SAS9ApiClient.ts create mode 100644 src/SASViyaApiClient.ts create mode 100644 src/SASjs.spec.ts create mode 100644 src/SASjs.ts create mode 100644 src/index.ts create mode 100644 src/types/Context.ts create mode 100644 src/types/CsrfToken.ts create mode 100644 src/types/Folder.ts create mode 100644 src/types/Job.ts create mode 100644 src/types/JobResult.ts create mode 100644 src/types/Link.ts create mode 100644 src/types/SASjsConfig.ts create mode 100644 src/types/SASjsRequest.ts create mode 100644 src/types/SASjsWaitingRequest.ts create mode 100644 src/types/ServerType.ts create mode 100644 src/types/Session.ts create mode 100644 src/types/index.ts create mode 100644 src/utils/asyncForEach.ts create mode 100644 src/utils/compareTimestamps.ts create mode 100644 src/utils/convertToCsv.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/isAuthorizeFormRequired.ts create mode 100644 src/utils/isLoginRequired.ts create mode 100644 src/utils/isLoginSuccess.ts create mode 100644 src/utils/makeRequest.ts create mode 100644 src/utils/needsRetry.ts create mode 100644 src/utils/parseAndSubmitAuthorizeForm.ts create mode 100644 src/utils/parseGeneratedCode.ts create mode 100644 src/utils/parseSasViyaLog.ts create mode 100644 src/utils/parseSourceCode.ts create mode 100644 src/utils/serialize.ts create mode 100644 src/utils/splitChunks.ts create mode 100644 tsconfig.json create mode 100644 tslint.json create mode 100644 typedoc.json create mode 100644 webpack.config.js diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..c8cbd70 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,27 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: SASjs Build + +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - run: npm run package:lib + env: + CI: true diff --git a/.github/workflows/npmpublish.yml b/.github/workflows/npmpublish.yml new file mode 100644 index 0000000..687fc5a --- /dev/null +++ b/.github/workflows/npmpublish.yml @@ -0,0 +1,25 @@ +# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created +# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages + +name: SASjs Build and Publish + +on: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Install Dependencies + run: npm ci + - name: Build Project + run: npm run build + - name: Semantic Release + uses: cycjimmy/semantic-release-action@v2 + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dd87e2d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7cd6756 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,209 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +# [1.9.0](https://github.com/macropeople/sasjs/compare/v1.8.0...v1.9.0) (2020-03-05) + + +### Bug Fixes + +* special chars regex, csv function improvements ([5c8e3fe](https://github.com/macropeople/sasjs/commit/5c8e3fe)) +* splitting tests in different files ([95e1d8b](https://github.com/macropeople/sasjs/commit/95e1d8b)) +* switching crlfs to lfs in values ([277cf3f](https://github.com/macropeople/sasjs/commit/277cf3f)) + + +### Features + +* fixing tests to fit adapter behaviour ([6146189](https://github.com/macropeople/sasjs/commit/6146189)) + + + + +# [1.8.0](https://github.com/macropeople/sasjs/compare/v1.7.2...v1.8.0) (2020-03-03) + + +### Bug Fixes + +* parsing error from response ([ff5fa1b](https://github.com/macropeople/sasjs/commit/ff5fa1b)) + + +### Features + +* update SASjs configuration after initializaton ([ee1255c](https://github.com/macropeople/sasjs/commit/ee1255c)) + + + + +## [1.7.2](https://github.com/macropeople/sasjs/compare/v1.7.1...v1.7.2) (2020-03-02) + + + + +## [1.7.1](https://github.com/macropeople/sasjs/compare/v1.7.0...v1.7.1) (2020-03-02) + + +### Bug Fixes + +* header data types, empty numerics ([c95c9fc](https://github.com/macropeople/sasjs/commit/c95c9fc)) + + + + +# [1.7.0](https://github.com/macropeople/sasjs/compare/v1.6.5...v1.7.0) (2020-03-01) + + +### Bug Fixes + +* adapter upgrade ([7c221dc](https://github.com/macropeople/sasjs/commit/7c221dc)) +* failing test ([12b29b0](https://github.com/macropeople/sasjs/commit/12b29b0)) +* retry on redirect only with SAS9 ([69d08e5](https://github.com/macropeople/sasjs/commit/69d08e5)) +* test rewrite ([aeb636b](https://github.com/macropeople/sasjs/commit/aeb636b)) + + +### Features + +* tests for sasjs, also bumping cypress version and setting cypress tsconfig to ES6 (we'll be using cypress browsers) ([e8193c1](https://github.com/macropeople/sasjs/commit/e8193c1)) +* tests for sasjs, also bumping cypress version and setting cypress tsconfig to ES6 (we'll be using cypress browsers) ([a197344](https://github.com/macropeople/sasjs/commit/a197344)) + + + + +## [1.6.5](https://github.com/macropeople/sasjs/compare/v1.6.4...v1.6.5) (2020-03-01) + + + + +## [1.6.4](https://github.com/macropeople/sasjs/compare/v1.6.3...v1.6.4) (2020-03-01) + + + + +## [1.6.3](https://github.com/macropeople/sasjs/compare/v1.6.2...v1.6.3) (2020-02-26) + + +### Bug Fixes + +* always check session before trying to log in ([6f256ac](https://github.com/macropeople/sasjs/commit/6f256ac)) + + + + +## [1.6.2](https://github.com/macropeople/sasjs/compare/v1.6.1...v1.6.2) (2020-02-26) + + +### Bug Fixes + +* SAS9 response fix ([4917d38](https://github.com/macropeople/sasjs/commit/4917d38)) + + + + +## [1.6.1](https://github.com/macropeople/sasjs/compare/v1.6.0...v1.6.1) (2020-02-23) + + + + +# [1.6.0](https://github.com/macropeople/sasjs/compare/v1.5.4...v1.6.0) (2020-02-23) + + +### Features + +* adding sasjs JS file in dist folder ([a4d7e87](https://github.com/macropeople/sasjs/commit/a4d7e87)) + + + + +## [1.5.4](https://github.com/macropeople/sasjs/compare/v1.5.3...v1.5.4) (2020-02-22) + + +### Bug Fixes + +* splice log only if there is a log in Viya ([d72a987](https://github.com/macropeople/sasjs/commit/d72a987)) + + + + +## [1.5.3](https://github.com/macropeople/sasjs/compare/v1.5.2...v1.5.3) (2020-02-22) + + +### Bug Fixes + +* capturing and parsing program code in Viya, plus replacement of console logs with console errors ([f4d6ac7](https://github.com/macropeople/sasjs/commit/f4d6ac7)) + + + + +## [1.5.2](https://github.com/macropeople/sasjs/compare/v1.5.1...v1.5.2) (2020-02-22) + + + + +## [1.5.1](https://github.com/macropeople/sasjs/compare/v1.5.0...v1.5.1) (2020-02-21) + + +### Bug Fixes + +* parse code only when log is available ([92fadff](https://github.com/macropeople/sasjs/commit/92fadff)) + + + + +# [1.5.0](https://github.com/macropeople/sasjs/compare/v1.4.2...v1.5.0) (2020-02-21) + + +### Bug Fixes + +* fetch login form data if not available ([d7e7b2f](https://github.com/macropeople/sasjs/commit/d7e7b2f)) +* revert unnecessary change ([34ed2a0](https://github.com/macropeople/sasjs/commit/34ed2a0)) + + +### Features + +* add checkSession API ([dc170fe](https://github.com/macropeople/sasjs/commit/dc170fe)) + + + + +## [1.4.2](https://github.com/macropeople/sasjs/compare/v1.4.0...v1.4.2) (2020-02-20) + + +### Bug Fixes + +* premature assignment of loginLink ([0c8a967](https://github.com/macropeople/sasjs/commit/0c8a967)) + + + + +# [1.4.0](https://github.com/macropeople/sasjs/compare/v1.3.0...v1.4.0) (2020-02-20) + + +### Bug Fixes + +* putting param export in right place ([6372ea2](https://github.com/macropeople/sasjs/commit/6372ea2)) + + +### Features + +* switching from file based upload to params for Viya. Fixes [#13](https://github.com/macropeople/sasjs/issues/13) ([2aeba78](https://github.com/macropeople/sasjs/commit/2aeba78)) + + + + +# 1.3.0 (2020-02-17) + + +### Bug Fixes + +* closes #issue6 ([efe1510](https://github.com/macropeople/sasjs/commit/efe1510)), closes [#issue6](https://github.com/macropeople/sasjs/issues/issue6) +* add setter for debug state ([10945a6](https://github.com/macropeople/sasjs/commit/10945a6)) +* config renaming ([f8ace78](https://github.com/macropeople/sasjs/commit/f8ace78)) + + +### Features + +* adding MIT license ([ef19e2a](https://github.com/macropeople/sasjs/commit/ef19e2a)) +* add parsing of source and generated code from response ([892122a](https://github.com/macropeople/sasjs/commit/892122a)) +* add support for SAS9 responses ([96c31c8](https://github.com/macropeople/sasjs/commit/96c31c8)) +* code of conduct ([cf31ce6](https://github.com/macropeople/sasjs/commit/cf31ce6)) +* initial commit ([6957dac](https://github.com/macropeople/sasjs/commit/6957dac)) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..c93e457 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at support@macropeople.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..64c9592 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,80 @@ +# Contributing + +Contributions to SASjs are very welcome! When making a PR, test cases should be included. To help in unit testing, be sure to run the following when making changes: + +``` +# the following creates a tarball in the build folder of SASjs +npm run-script package:lib + +# now go to your app and run: +npm install ../sasjs/build/ +``` + +Tests are run using cypress. Before running tests, you need to define the following backend services: + +# SAS 9 +``` + +filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas?_=1"; +%inc mc; +filename ft15f001 temp; +parmcards4; + %webout(OPEN) + %macro x(); + %do i=1 %to &_webin_file_count; %webout(OBJ,&&_webin_name&i) %end; + %mend; %x() + %webout(CLOSE) +;;;; +%mm_createwebservice(path=/Public/app/common,name=sendObj) +parmcards4; + %webout(OPEN) + %macro x(); + %do i=1 %to &_webin_file_count; %webout(ARR,&&_webin_name&i) %end; + %mend; %x() + %webout(CLOSE) +;;;; +%mm_createwebservice(path=/Public/app/common,name=sendArr) +``` + +# Viya +``` +filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; +%inc mc; + +filename ft15f001 temp; +parmcards4; + %webout(OPEN) + %global sasjs_tables; + %let sasjs_tables=&sasjs_tables; + %put &=sasjs_tables; + %let sasjs_tables=&sasjs_tables; + %macro x(); + %global sasjs_tables; + %do i=1 %to %sysfunc(countw(&sasjs_tables)); + %let table=%scan(&sasjs_tables,&i); + %webout(OBJ,&table) + %end; + %mend; + %x() + %webout(CLOSE) +;;;; +%mv_createwebservice(path=/Public/app/common,name=sendObj) +filename ft15f001 temp; +parmcards4; + %webout(OPEN) + %global sasjs_tables; + %let sasjs_tables=&sasjs_tables; + %put &=sasjs_tables; + %macro x(); + %do i=1 %to %sysfunc(countw(&sasjs_tables)); + %let table=%scan(&sasjs_tables,&i); + %webout(ARR,&table) + %end; + %mend; + %x() + %webout(CLOSE) +;;;; +%mv_createwebservice(path=/Public/app/common,name=sendArr) +``` + +The above services will return anything you send. To run the tests simply launch `npm run cypress`. \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6765f8e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Macro People + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..9eb44d4 --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +[![](https://data.jsdelivr.com/v1/package/npm/sasjs/badge)](https://www.jsdelivr.com/package/npm/sasjs) + +# SASjs + +SASjs is a open-source framework for building Web Apps on SASĀ® platforms. You can use as much or as little of it as you like. This repository contains the JS adapter, the part that handles the to/from SAS communication on the client side. There are 3 ways to install it: + +1 - `npm install sasjs` - for use in a node project + +2 - [Download](https://cdn.jsdelivr.net/npm/sasjs/index.js) and use a copy of the latest JS file + +3 - Reference directly from the CDN - in which case click [here](https://www.jsdelivr.com/package/npm/sasjs?tab=collection) and select "SRI" to get the script tag with the integrity hash. + +If you are short on time and just need to build an app quickly, then check out [this video](https://vimeo.com/393161794) and the [react-seed-app](https://github.com/macropeople/react-seed-app) which provides some boilerplate. + +For more information on building web apps with SAS, check out [sasjs.io](https://sasjs.io) + + +## None of this makes sense. How do I build an app with it? + +Ok ok. Deploy this [example.html](https://github.com/macropeople/sasjs/blob/master/example.html) file to your web server, and update `servertype` to `SAS9` or `SASVIYA` depending on your backend. + +The backend part can be deployed as follows: + +``` +%let appLoc=/Public/app/readme; /* Metadata or Viya Folder location as per SASjs config */ +/* compile macros (can also be downloaded & compiled seperately) */ +filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; +%inc mc; +filename ft15f001 temp; +parmcards4; + %webout(FETCH) /* receive all data as SAS datasets */ + proc sql; + create table areas as select make,mean(invoice) as avprice + from sashelp.cars + where type in (select type from work.fromjs) + group by 1; + %webout(OPEN) + %webout(OBJ,areas) + %webout(CLOSE) +;;;; +%mp_createwebservice(path=&appLoc/common,name=getdata) +``` + +You now have a simple web app with a backend service! + +# More resources + +For more information specific to this adapter you can check out this [user guide](https://sasjs.io/sasjs/sasjs-adapter/) or the [technical](http://adapter.sasjs.io/) documentation. + +For more information on building web apps in general, check out these [resources](https://sasjs.io/training/resources/) or contact the [author](https://www.linkedin.com/in/allanbowe/) directly. \ No newline at end of file diff --git a/cypress.json b/cypress.json new file mode 100644 index 0000000..292b9ae --- /dev/null +++ b/cypress.json @@ -0,0 +1,13 @@ +{ + "defaultCommandTimeout": 10000, + "chromeWebSecurity": false, + "screenshotOnRunFailure": false, + "env": { + "serverUrl": "", + "appLoc": "/Public/app", + "serverType": "SAS9", + "debug": false, + "username": "", + "password": "" + } +} diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 0000000..8cf9617 --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +adapter.sasjs.io \ No newline at end of file diff --git a/docs/assets/css/main.css b/docs/assets/css/main.css new file mode 100644 index 0000000..9d6f1ab --- /dev/null +++ b/docs/assets/css/main.css @@ -0,0 +1 @@ +/*! normalize.css v1.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-family:sans-serif}button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4,.tsd-index-panel h3{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:1em 40px}dfn{font-style:italic}hr{box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:80%}sub{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;top:-0.5em}sub{bottom:-0.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure,form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button]{-webkit-appearance:button;cursor:pointer;*overflow:visible}input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}.hljs{display:inline-block;padding:.5em;background:#fff;color:#000}.hljs-comment,.hljs-annotation,.hljs-template_comment,.diff .hljs-header,.hljs-chunk,.apache .hljs-cbracket{color:green}.hljs-keyword,.hljs-id,.hljs-built_in,.css .smalltalk .hljs-class,.hljs-winutils,.bash .hljs-variable,.tex .hljs-command,.hljs-request,.hljs-status,.nginx .hljs-title{color:blue}.xml .hljs-tag{color:blue}.xml .hljs-tag .hljs-value{color:blue}.hljs-string,.hljs-title,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value{color:#a31515}.ruby .hljs-symbol{color:#a31515}.ruby .hljs-symbol .hljs-string{color:#a31515}.hljs-template_tag,.django .hljs-variable,.hljs-addition,.hljs-flow,.hljs-stream,.apache .hljs-tag,.hljs-date,.tex .hljs-formula,.coffeescript .hljs-attribute{color:#a31515}.ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-pseudo,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.hljs-preprocessor,.hljs-pragma,.userType,.apache .hljs-sqbracket,.nginx .hljs-built_in,.tex .hljs-special,.hljs-prompt{color:#2b91af}.hljs-phpdoc,.hljs-javadoc,.hljs-xmlDocTag{color:gray}.vhdl .hljs-typename{font-weight:bold}.vhdl .hljs-string{color:#666}.vhdl .hljs-literal{color:#a31515}.vhdl .hljs-attribute{color:#00b0e8}.xml .hljs-attribute{color:red}ul.tsd-descriptions>li>:first-child,.tsd-panel>:first-child,.col>:first-child,.col-11>:first-child,.col-10>:first-child,.col-9>:first-child,.col-8>:first-child,.col-7>:first-child,.col-6>:first-child,.col-5>:first-child,.col-4>:first-child,.col-3>:first-child,.col-2>:first-child,.col-1>:first-child,ul.tsd-descriptions>li>:first-child>:first-child,.tsd-panel>:first-child>:first-child,.col>:first-child>:first-child,.col-11>:first-child>:first-child,.col-10>:first-child>:first-child,.col-9>:first-child>:first-child,.col-8>:first-child>:first-child,.col-7>:first-child>:first-child,.col-6>:first-child>:first-child,.col-5>:first-child>:first-child,.col-4>:first-child>:first-child,.col-3>:first-child>:first-child,.col-2>:first-child>:first-child,.col-1>:first-child>:first-child,ul.tsd-descriptions>li>:first-child>:first-child>:first-child,.tsd-panel>:first-child>:first-child>:first-child,.col>:first-child>:first-child>:first-child,.col-11>:first-child>:first-child>:first-child,.col-10>:first-child>:first-child>:first-child,.col-9>:first-child>:first-child>:first-child,.col-8>:first-child>:first-child>:first-child,.col-7>:first-child>:first-child>:first-child,.col-6>:first-child>:first-child>:first-child,.col-5>:first-child>:first-child>:first-child,.col-4>:first-child>:first-child>:first-child,.col-3>:first-child>:first-child>:first-child,.col-2>:first-child>:first-child>:first-child,.col-1>:first-child>:first-child>:first-child{margin-top:0}ul.tsd-descriptions>li>:last-child,.tsd-panel>:last-child,.col>:last-child,.col-11>:last-child,.col-10>:last-child,.col-9>:last-child,.col-8>:last-child,.col-7>:last-child,.col-6>:last-child,.col-5>:last-child,.col-4>:last-child,.col-3>:last-child,.col-2>:last-child,.col-1>:last-child,ul.tsd-descriptions>li>:last-child>:last-child,.tsd-panel>:last-child>:last-child,.col>:last-child>:last-child,.col-11>:last-child>:last-child,.col-10>:last-child>:last-child,.col-9>:last-child>:last-child,.col-8>:last-child>:last-child,.col-7>:last-child>:last-child,.col-6>:last-child>:last-child,.col-5>:last-child>:last-child,.col-4>:last-child>:last-child,.col-3>:last-child>:last-child,.col-2>:last-child>:last-child,.col-1>:last-child>:last-child,ul.tsd-descriptions>li>:last-child>:last-child>:last-child,.tsd-panel>:last-child>:last-child>:last-child,.col>:last-child>:last-child>:last-child,.col-11>:last-child>:last-child>:last-child,.col-10>:last-child>:last-child>:last-child,.col-9>:last-child>:last-child>:last-child,.col-8>:last-child>:last-child>:last-child,.col-7>:last-child>:last-child>:last-child,.col-6>:last-child>:last-child>:last-child,.col-5>:last-child>:last-child>:last-child,.col-4>:last-child>:last-child>:last-child,.col-3>:last-child>:last-child>:last-child,.col-2>:last-child>:last-child>:last-child,.col-1>:last-child>:last-child>:last-child{margin-bottom:0}.container{max-width:1200px;margin:0 auto;padding:0 40px}@media(max-width: 640px){.container{padding:0 20px}}.container-main{padding-bottom:200px}.row{position:relative;margin:0 -10px}.row:after{visibility:hidden;display:block;content:"";clear:both;height:0}.col,.col-11,.col-10,.col-9,.col-8,.col-7,.col-6,.col-5,.col-4,.col-3,.col-2,.col-1{box-sizing:border-box;float:left;padding:0 10px}.col-1{width:8.3333333333%}.offset-1{margin-left:8.3333333333%}.col-2{width:16.6666666667%}.offset-2{margin-left:16.6666666667%}.col-3{width:25%}.offset-3{margin-left:25%}.col-4{width:33.3333333333%}.offset-4{margin-left:33.3333333333%}.col-5{width:41.6666666667%}.offset-5{margin-left:41.6666666667%}.col-6{width:50%}.offset-6{margin-left:50%}.col-7{width:58.3333333333%}.offset-7{margin-left:58.3333333333%}.col-8{width:66.6666666667%}.offset-8{margin-left:66.6666666667%}.col-9{width:75%}.offset-9{margin-left:75%}.col-10{width:83.3333333333%}.offset-10{margin-left:83.3333333333%}.col-11{width:91.6666666667%}.offset-11{margin-left:91.6666666667%}@media(min-width: 1300px){.col-1{width:100px}.offset-1{margin-left:100px}.col-2{width:200px}.offset-2{margin-left:200px}.col-3{width:300px}.offset-3{margin-left:300px}.col-4{width:400px}.offset-4{margin-left:400px}.col-5{width:500px}.offset-5{margin-left:500px}.col-6{width:600px}.offset-6{margin-left:600px}.col-7{width:700px}.offset-7{margin-left:700px}.col-8{width:800px}.offset-8{margin-left:800px}.col-9{width:900px}.offset-9{margin-left:900px}.col-10{width:1000px}.offset-10{margin-left:1000px}.col-11{width:1100px}.offset-11{margin-left:1100px}}.tsd-kind-icon{display:block;position:relative;padding-left:20px;text-indent:-20px}.tsd-kind-icon:before{content:"";display:inline-block;vertical-align:middle;width:17px;height:17px;margin:0 3px 2px 0;background-image:url(../images/icons.png)}@media(-webkit-min-device-pixel-ratio: 1.5),(min-device-pixel-ratio: 1.5),(min-resolution: 144dpi){.tsd-kind-icon:before{background-image:url(../images/icons@2x.png);background-size:238px 204px}}.tsd-signature.tsd-kind-icon:before{background-position:0 -153px}.tsd-kind-object-literal>.tsd-kind-icon:before{background-position:0px -17px}.tsd-kind-object-literal.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -17px}.tsd-kind-object-literal.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -17px}.tsd-kind-class>.tsd-kind-icon:before{background-position:0px -34px}.tsd-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -34px}.tsd-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -34px}.tsd-kind-class.tsd-has-type-parameter>.tsd-kind-icon:before{background-position:0px -51px}.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -51px}.tsd-kind-class.tsd-has-type-parameter.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -51px}.tsd-kind-interface>.tsd-kind-icon:before{background-position:0px -68px}.tsd-kind-interface.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -68px}.tsd-kind-interface.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -68px}.tsd-kind-interface.tsd-has-type-parameter>.tsd-kind-icon:before{background-position:0px -85px}.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -85px}.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -85px}.tsd-kind-module>.tsd-kind-icon:before{background-position:0px -102px}.tsd-kind-module.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -102px}.tsd-kind-module.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -102px}.tsd-kind-external-module>.tsd-kind-icon:before{background-position:0px -102px}.tsd-kind-external-module.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -102px}.tsd-kind-external-module.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -102px}.tsd-kind-enum>.tsd-kind-icon:before{background-position:0px -119px}.tsd-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -119px}.tsd-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -119px}.tsd-kind-enum-member>.tsd-kind-icon:before{background-position:0px -136px}.tsd-kind-enum-member.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -136px}.tsd-kind-enum-member.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -136px}.tsd-kind-signature>.tsd-kind-icon:before{background-position:0px -153px}.tsd-kind-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -153px}.tsd-kind-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -153px}.tsd-kind-type-alias>.tsd-kind-icon:before{background-position:0px -170px}.tsd-kind-type-alias.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -170px}.tsd-kind-type-alias.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -170px}.tsd-kind-type-alias.tsd-has-type-parameter>.tsd-kind-icon:before{background-position:0px -187px}.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected>.tsd-kind-icon:before{background-position:-17px -187px}.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private>.tsd-kind-icon:before{background-position:-34px -187px}.tsd-kind-variable>.tsd-kind-icon:before{background-position:-136px -0px}.tsd-kind-variable.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -0px}.tsd-kind-variable.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-variable.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -0px}.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -0px}.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -0px}.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -0px}.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-variable.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -0px}.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -0px}.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-variable.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -0px}.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -0px}.tsd-kind-property>.tsd-kind-icon:before{background-position:-136px -0px}.tsd-kind-property.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -0px}.tsd-kind-property.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-property.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -0px}.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -0px}.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -0px}.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -0px}.tsd-kind-property.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-property.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -0px}.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -0px}.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -0px}.tsd-kind-property.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -0px}.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -0px}.tsd-kind-get-signature>.tsd-kind-icon:before{background-position:-136px -17px}.tsd-kind-get-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -17px}.tsd-kind-get-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -17px}.tsd-kind-get-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -17px}.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -17px}.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -17px}.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -17px}.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -17px}.tsd-kind-get-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -17px}.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -17px}.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -17px}.tsd-kind-get-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -17px}.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -17px}.tsd-kind-set-signature>.tsd-kind-icon:before{background-position:-136px -34px}.tsd-kind-set-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -34px}.tsd-kind-set-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -34px}.tsd-kind-set-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -34px}.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -34px}.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -34px}.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -34px}.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -34px}.tsd-kind-set-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -34px}.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -34px}.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -34px}.tsd-kind-set-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -34px}.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -34px}.tsd-kind-accessor>.tsd-kind-icon:before{background-position:-136px -51px}.tsd-kind-accessor.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -51px}.tsd-kind-accessor.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -51px}.tsd-kind-accessor.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -51px}.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -51px}.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -51px}.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -51px}.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -51px}.tsd-kind-accessor.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -51px}.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -51px}.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -51px}.tsd-kind-accessor.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -51px}.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -51px}.tsd-kind-function>.tsd-kind-icon:before{background-position:-136px -68px}.tsd-kind-function.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -68px}.tsd-kind-function.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-function.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -68px}.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -68px}.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -68px}.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -68px}.tsd-kind-function.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-function.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -68px}.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -68px}.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-function.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -68px}.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -68px}.tsd-kind-method>.tsd-kind-icon:before{background-position:-136px -68px}.tsd-kind-method.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -68px}.tsd-kind-method.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-method.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -68px}.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -68px}.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -68px}.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -68px}.tsd-kind-method.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-method.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -68px}.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -68px}.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-method.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -68px}.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -68px}.tsd-kind-call-signature>.tsd-kind-icon:before{background-position:-136px -68px}.tsd-kind-call-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -68px}.tsd-kind-call-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-call-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -68px}.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -68px}.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -68px}.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -68px}.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-call-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -68px}.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -68px}.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -68px}.tsd-kind-call-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -68px}.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -68px}.tsd-kind-function.tsd-has-type-parameter>.tsd-kind-icon:before{background-position:-136px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -85px}.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -85px}.tsd-kind-method.tsd-has-type-parameter>.tsd-kind-icon:before{background-position:-136px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -85px}.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -85px}.tsd-kind-constructor>.tsd-kind-icon:before{background-position:-136px -102px}.tsd-kind-constructor.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -102px}.tsd-kind-constructor.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -102px}.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -102px}.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -102px}.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -102px}.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -102px}.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -102px}.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -102px}.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -102px}.tsd-kind-constructor-signature>.tsd-kind-icon:before{background-position:-136px -102px}.tsd-kind-constructor-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -102px}.tsd-kind-constructor-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -102px}.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -102px}.tsd-kind-index-signature>.tsd-kind-icon:before{background-position:-136px -119px}.tsd-kind-index-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -119px}.tsd-kind-index-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -119px}.tsd-kind-index-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -119px}.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -119px}.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -119px}.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -119px}.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -119px}.tsd-kind-index-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -119px}.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -119px}.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -119px}.tsd-kind-index-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -119px}.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -119px}.tsd-kind-event>.tsd-kind-icon:before{background-position:-136px -136px}.tsd-kind-event.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -136px}.tsd-kind-event.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -136px}.tsd-kind-event.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -136px}.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -136px}.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -136px}.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -136px}.tsd-kind-event.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -136px}.tsd-kind-event.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -136px}.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -136px}.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -136px}.tsd-kind-event.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -136px}.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -136px}.tsd-is-static>.tsd-kind-icon:before{background-position:-136px -153px}.tsd-is-static.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -153px}.tsd-is-static.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -153px}.tsd-is-static.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -153px}.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -153px}.tsd-is-static.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -153px}.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -153px}.tsd-is-static.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -153px}.tsd-is-static.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -153px}.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -153px}.tsd-is-static.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -153px}.tsd-is-static.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -153px}.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -153px}.tsd-is-static.tsd-kind-function>.tsd-kind-icon:before{background-position:-136px -170px}.tsd-is-static.tsd-kind-function.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -170px}.tsd-is-static.tsd-kind-function.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -170px}.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -170px}.tsd-is-static.tsd-kind-method>.tsd-kind-icon:before{background-position:-136px -170px}.tsd-is-static.tsd-kind-method.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -170px}.tsd-is-static.tsd-kind-method.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -170px}.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -170px}.tsd-is-static.tsd-kind-call-signature>.tsd-kind-icon:before{background-position:-136px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -170px}.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -170px}.tsd-is-static.tsd-kind-event>.tsd-kind-icon:before{background-position:-136px -187px}.tsd-is-static.tsd-kind-event.tsd-is-protected>.tsd-kind-icon:before{background-position:-153px -187px}.tsd-is-static.tsd-kind-event.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-class>.tsd-kind-icon:before{background-position:-51px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited>.tsd-kind-icon:before{background-position:-68px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected>.tsd-kind-icon:before{background-position:-85px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited>.tsd-kind-icon:before{background-position:-102px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum>.tsd-kind-icon:before{background-position:-170px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected>.tsd-kind-icon:before{background-position:-187px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private>.tsd-kind-icon:before{background-position:-119px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface>.tsd-kind-icon:before{background-position:-204px -187px}.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited>.tsd-kind-icon:before{background-position:-221px -187px}.no-transition{transition:none !important}@keyframes fade-in{from{opacity:0}to{opacity:1}}@keyframes fade-out{from{opacity:1;visibility:visible}to{opacity:0}}@keyframes fade-in-delayed{0%{opacity:0}33%{opacity:0}100%{opacity:1}}@keyframes fade-out-delayed{0%{opacity:1;visibility:visible}66%{opacity:0}100%{opacity:0}}@keyframes shift-to-left{from{transform:translate(0, 0)}to{transform:translate(-25%, 0)}}@keyframes unshift-to-left{from{transform:translate(-25%, 0)}to{transform:translate(0, 0)}}@keyframes pop-in-from-right{from{transform:translate(100%, 0)}to{transform:translate(0, 0)}}@keyframes pop-out-to-right{from{transform:translate(0, 0);visibility:visible}to{transform:translate(100%, 0)}}body{background:#fdfdfd;font-family:"Segoe UI",sans-serif;font-size:16px;color:#222}a{color:#00796b;text-decoration:none}a:hover{text-decoration:underline}code,pre{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:.2em;margin:0;font-size:14px;background-color:rgba(0,0,0,.04)}pre{padding:10px}pre code{padding:0;font-size:100%;background-color:transparent}.tsd-typography{line-height:2em}.tsd-typography ul{list-style:square;padding:0 0 0 20px;margin:0}.tsd-typography h4,.tsd-typography .tsd-index-panel h3,.tsd-index-panel .tsd-typography h3,.tsd-typography h5,.tsd-typography h6{font-size:1em;margin:0}.tsd-typography h5,.tsd-typography h6{font-weight:normal}.tsd-typography p,.tsd-typography ul,.tsd-typography ol{margin:1em 0}@media(min-width: 901px)and (max-width: 1024px){html.default .col-content{width:72%}html.default .col-menu{width:28%}html.default .tsd-navigation{padding-left:10px}}@media(max-width: 900px){html.default .col-content{float:none;width:100%}html.default .col-menu{position:fixed !important;overflow:auto;-webkit-overflow-scrolling:touch;overflow-scrolling:touch;z-index:1024;top:0 !important;bottom:0 !important;left:auto !important;right:0 !important;width:100%;padding:20px 20px 0 0;max-width:450px;visibility:hidden;background-color:#fff;transform:translate(100%, 0)}html.default .col-menu>*:last-child{padding-bottom:20px}html.default .overlay{content:"";display:block;position:fixed;z-index:1023;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.75);visibility:hidden}html.default.to-has-menu .overlay{animation:fade-in .4s}html.default.to-has-menu header,html.default.to-has-menu footer,html.default.to-has-menu .col-content{animation:shift-to-left .4s}html.default.to-has-menu .col-menu{animation:pop-in-from-right .4s}html.default.from-has-menu .overlay{animation:fade-out .4s}html.default.from-has-menu header,html.default.from-has-menu footer,html.default.from-has-menu .col-content{animation:unshift-to-left .4s}html.default.from-has-menu .col-menu{animation:pop-out-to-right .4s}html.default.has-menu body{overflow:hidden}html.default.has-menu .overlay{visibility:visible}html.default.has-menu header,html.default.has-menu footer,html.default.has-menu .col-content{transform:translate(-25%, 0)}html.default.has-menu .col-menu{visibility:visible;transform:translate(0, 0)}}.tsd-page-title{padding:70px 0 20px 0;margin:0 0 40px 0;background:#fff;box-shadow:0 0 5px rgba(0,0,0,.35)}.tsd-page-title h1{margin:0}.tsd-breadcrumb{margin:0;padding:0;color:gray}.tsd-breadcrumb a{color:gray;text-decoration:none}.tsd-breadcrumb a:hover{text-decoration:underline}.tsd-breadcrumb li{display:inline}.tsd-breadcrumb li:after{content:" / "}html.minimal .container{margin:0}html.minimal .container-main{padding-top:50px;padding-bottom:0}html.minimal .content-wrap{padding-left:300px}html.minimal .tsd-navigation{position:fixed !important;overflow:auto;-webkit-overflow-scrolling:touch;overflow-scrolling:touch;box-sizing:border-box;z-index:1;left:0;top:40px;bottom:0;width:300px;padding:20px;margin:0}html.minimal .tsd-member .tsd-member{margin-left:0}html.minimal .tsd-page-toolbar{position:fixed;z-index:2}html.minimal #tsd-filter .tsd-filter-group{right:0;transform:none}html.minimal footer{background-color:transparent}html.minimal footer .container{padding:0}html.minimal .tsd-generator{padding:0}@media(max-width: 900px){html.minimal .tsd-navigation{display:none}html.minimal .content-wrap{padding-left:0}}dl.tsd-comment-tags{overflow:hidden}dl.tsd-comment-tags dt{float:left;padding:1px 5px;margin:0 10px 0 0;border-radius:4px;border:1px solid gray;color:gray;font-size:.8em;font-weight:normal}dl.tsd-comment-tags dd{margin:0 0 10px 0}dl.tsd-comment-tags dd:before,dl.tsd-comment-tags dd:after{display:table;content:" "}dl.tsd-comment-tags dd pre,dl.tsd-comment-tags dd:after{clear:both}dl.tsd-comment-tags p{margin:0}.tsd-panel.tsd-comment .lead{font-size:1.1em;line-height:2em;margin-bottom:2em}.tsd-panel.tsd-comment .lead:last-child{margin-bottom:0}.toggle-protected .tsd-is-private{display:none}.toggle-public .tsd-is-private,.toggle-public .tsd-is-protected,.toggle-public .tsd-is-private-protected{display:none}.toggle-inherited .tsd-is-inherited{display:none}.toggle-only-exported .tsd-is-not-exported{display:none}.toggle-externals .tsd-is-external{display:none}#tsd-filter{position:relative;display:inline-block;height:40px;vertical-align:bottom}.no-filter #tsd-filter{display:none}#tsd-filter .tsd-filter-group{display:inline-block;height:40px;vertical-align:bottom;white-space:nowrap}#tsd-filter input{display:none}@media(max-width: 900px){#tsd-filter .tsd-filter-group{display:block;position:absolute;top:40px;right:20px;height:auto;background-color:#fff;visibility:hidden;transform:translate(50%, 0);box-shadow:0 0 4px rgba(0,0,0,.25)}.has-options #tsd-filter .tsd-filter-group{visibility:visible}.to-has-options #tsd-filter .tsd-filter-group{animation:fade-in .2s}.from-has-options #tsd-filter .tsd-filter-group{animation:fade-out .2s}#tsd-filter label,#tsd-filter .tsd-select{display:block;padding-right:20px}}footer{border-top:1px solid #eee;background-color:#fff}footer.with-border-bottom{border-bottom:1px solid #eee}footer .tsd-legend-group{font-size:0}footer .tsd-legend{display:inline-block;width:25%;padding:0;font-size:16px;list-style:none;line-height:2em;vertical-align:top}@media(max-width: 900px){footer .tsd-legend{width:50%}}.tsd-hierarchy{list-style:square;padding:0 0 0 20px;margin:0}.tsd-hierarchy .target{font-weight:bold}.tsd-index-panel .tsd-index-content{margin-bottom:-30px !important}.tsd-index-panel .tsd-index-section{margin-bottom:30px !important}.tsd-index-panel h3{margin:0 -20px 10px -20px;padding:0 20px 10px 20px;border-bottom:1px solid #eee}.tsd-index-panel ul.tsd-index-list{padding:0;list-style:none;line-height:2em;font-size:13px}.tsd-index-panel ul.tsd-index-list li{-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;-ms-column-break-inside:avoid;-o-column-break-inside:avoid;column-break-inside:avoid;-webkit-page-break-inside:avoid;-moz-page-break-inside:avoid;-ms-page-break-inside:avoid;-o-page-break-inside:avoid;page-break-inside:avoid}.tsd-index-panel a,.tsd-index-panel .tsd-parent-kind-module a{color:#00796b}.tsd-index-panel .tsd-parent-kind-interface a{color:#00796b}.tsd-index-panel .tsd-parent-kind-enum a{color:#00796b}.tsd-index-panel .tsd-parent-kind-class a{color:#00796b}.tsd-index-panel .tsd-kind-module a{color:#00796b}.tsd-index-panel .tsd-kind-interface a{color:#00796b}.tsd-index-panel .tsd-kind-enum a{color:#00796b}.tsd-index-panel .tsd-kind-class a{color:#00796b}.tsd-index-panel .tsd-is-private a{color:gray}@media screen and (max-width: 900px){ul.tsd-index-list{overflow:auto}.container-main .offset-3{width:0px}}.tsd-flag{display:inline-block;padding:1px 5px;border-radius:4px;color:#fff;background-color:gray;text-indent:0;font-size:14px;font-weight:normal}.tsd-anchor{position:absolute;top:-100px}.tsd-member{position:relative}.tsd-member .tsd-anchor+h3{margin-top:0;margin-bottom:0;border-bottom:none}.tsd-navigation{padding:0 0 0 0;height:calc(100vh - 260px);overflow-y:auto}.tsd-navigation a{display:block;padding-top:2px;padding-bottom:2px;border-left:2px solid transparent;color:#222;text-decoration:none;transition:border-left-color .1s;font-size:13px;word-break:break-word;margin-left:1em}.tsd-navigation a:hover{color:blue}.tsd-navigation ul{margin:0;padding:0;list-style:none}.tsd-navigation li{padding:0}.tsd-navigation div{font-size:13px}.tsd-navigation.primary{padding-bottom:40px}.tsd-navigation.primary a,.tsd-navigation.primary div{display:block;height:29px;line-height:29px;box-sizing:border-box;font-size:14px;padding:0}.tsd-navigation.primary a.selected{font-weight:bold}.tsd-navigation.primary ul li a{padding-left:5px}.tsd-navigation.primary ul li li a{padding-left:25px}.tsd-navigation.primary ul li li li a{padding-left:45px}.tsd-navigation.primary ul li li li li a{padding-left:65px}.tsd-navigation.primary ul li li li li li a{padding-left:85px}.tsd-navigation.primary ul li li li li li li a{padding-left:105px}.tsd-navigation.primary>ul{border-bottom:1px solid #eee}.tsd-navigation.primary li{border-top:1px solid #eee}.tsd-navigation.primary li.current>a{font-weight:bold}.tsd-navigation.primary li.label span{display:block;padding:20px 0 6px 5px;color:gray}.tsd-navigation.primary li.globals+li>span,.tsd-navigation.primary li.globals+li>a{padding-top:20px}.tsd-navigation.secondary ul{transition:opacity .2s}.tsd-navigation.secondary ul li a{padding-left:25px}.tsd-navigation.secondary ul li li a{padding-left:45px}.tsd-navigation.secondary ul li li li a{padding-left:65px}.tsd-navigation.secondary ul li li li li a{padding-left:85px}.tsd-navigation.secondary ul li li li li li a{padding-left:105px}.tsd-navigation.secondary ul li li li li li li a{padding-left:125px}.tsd-navigation.secondary ul.current a{border-left-color:#eee}.tsd-navigation.secondary li.focus>a,.tsd-navigation.secondary ul.current li.focus>a{border-left-color:#000}.tsd-navigation.secondary li.current{margin-top:20px;margin-bottom:20px;border-left-color:#eee}.tsd-navigation.secondary li.current>a{font-weight:bold}@media(min-width: 901px){.menu-sticky-wrap{position:static}.no-csspositionsticky .menu-sticky-wrap.sticky{position:fixed}.no-csspositionsticky .menu-sticky-wrap.sticky-current{position:fixed}.no-csspositionsticky .menu-sticky-wrap.sticky-current ul.before-current,.no-csspositionsticky .menu-sticky-wrap.sticky-current ul.after-current{opacity:0}.no-csspositionsticky .menu-sticky-wrap.sticky-bottom{position:absolute;top:auto !important;left:auto !important;bottom:0;right:0}.csspositionsticky .menu-sticky-wrap.sticky{position:-webkit-sticky;position:sticky}.csspositionsticky .menu-sticky-wrap.sticky-current{position:-webkit-sticky;position:sticky}}.col-menu{position:fixed;top:120px}.secondary-menu{margin-left:calc(83% - 50px);overflow-y:auto}@media(min-width: 1300px){.secondary-menu{margin-left:1000px}}.root>ul>.tsd-parent-kind-class{margin-left:16px}.root>ul>.tsd-kind-constructor:before{content:"Constructors";font-size:13px;margin-left:24px}.root>ul>.tsd-kind-constructor~.tsd-kind-constructor::before{content:none}.root>ul>.tsd-kind-property:before{content:"Properties";font-size:13px;margin-left:24px}.root>ul>.tsd-kind-property~.tsd-kind-property::before{content:none}.root>ul>.tsd-kind-get-signature:before{content:"Accessors";font-size:13px;margin-left:24px}.root>ul>.tsd-kind-get-signature~.tsd-kind-get-signature::before{content:none}.root>ul>.tsd-kind-method:before{content:"Methods";font-size:13px;margin-left:24px}.root>ul>.tsd-kind-method~.tsd-kind-method::before{content:none}.root.tsd-kind-class:before{content:"Classes";font-size:13px}.root.tsd-kind-class~.tsd-kind-class::before{content:none}.root.tsd-kind-interface:before{content:"Interfaces";font-size:13px}.root.tsd-kind-interface~.tsd-kind-interface::before{content:none}.root.tsd-kind-type-alias:before{content:"Types";font-size:13px}.root.tsd-kind-type-alias~.tsd-kind-type-alias::before{content:none}.root.tsd-kind-function:before{content:"Functions";font-size:13px}.root.tsd-kind-function~.tsd-kind-function::before{content:none}.tsd-panel{margin:20px 0;padding:20px;background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.25)}.tsd-panel:empty{display:none}.tsd-panel>h1,.tsd-panel>h2,.tsd-panel>h3{margin:1.5em -20px 10px -20px;padding:0 20px 10px 20px;border-bottom:1px solid #eee}.tsd-panel>h1.tsd-before-signature,.tsd-panel>h2.tsd-before-signature,.tsd-panel>h3.tsd-before-signature{margin-bottom:0;border-bottom:0}.tsd-panel table{display:block;width:100%;overflow:auto;margin-top:10px;word-break:normal;word-break:keep-all}.tsd-panel table th{font-weight:bold}.tsd-panel table th,.tsd-panel table td{padding:6px 13px;border:1px solid #ddd}.tsd-panel table tr{background-color:#fff;border-top:1px solid #ccc}.tsd-panel table tr:nth-child(2n){background-color:#f8f8f8}.tsd-panel-group{margin:60px 0}.tsd-panel-group>h1,.tsd-panel-group>h2,.tsd-panel-group>h3{padding-left:20px;padding-right:20px}#tsd-search{transition:background-color .2s}#tsd-search .title{position:relative;z-index:2}#tsd-search .field{position:absolute;left:0;top:0;right:40px;height:40px}#tsd-search .field input{box-sizing:border-box;position:relative;top:-50px;z-index:1;width:100%;padding:0 10px;opacity:0;outline:0;border:0;background:transparent;color:#222}#tsd-search .field label{position:absolute;overflow:hidden;right:-40px}#tsd-search .field input,#tsd-search .title{transition:opacity .2s}#tsd-search .results{position:absolute;visibility:hidden;top:40px;width:100%;margin:0;padding:0;list-style:none;box-shadow:0 0 4px rgba(0,0,0,.25)}#tsd-search .results li{padding:0 10px;background-color:#fdfdfd}#tsd-search .results li:nth-child(even){background-color:#fff}#tsd-search .results li.state{display:none}#tsd-search .results li.current,#tsd-search .results li:hover{background-color:#eee}#tsd-search .results a{display:block}#tsd-search .results a:before{top:10px}#tsd-search .results span.parent{color:gray;font-weight:normal}#tsd-search.has-focus{background-color:#eee}#tsd-search.has-focus .field input{top:0;opacity:1}#tsd-search.has-focus .title{z-index:0;opacity:0}#tsd-search.has-focus .results{visibility:visible}#tsd-search.loading .results li.state.loading{display:block}#tsd-search.failure .results li.state.failure{display:block}.low-priority a,.low-priority span{color:#999 !important;font-size:10pt}.tsd-signature{margin:0 0 1em 0;padding:10px;border:1px solid #eee;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:14px}.tsd-signature.tsd-kind-icon{padding-left:30px}.tsd-signature.tsd-kind-icon:before{top:10px;left:10px}.tsd-panel>.tsd-signature{margin-left:-20px;margin-right:-20px;border-width:1px 0}.tsd-panel>.tsd-signature.tsd-kind-icon{padding-left:40px}.tsd-panel>.tsd-signature.tsd-kind-icon:before{left:20px}.tsd-signature-symbol{color:gray;font-weight:normal}.tsd-signature-type{font-style:italic;font-weight:normal}.tsd-signatures{padding:0;margin:0 0 1em 0;border:1px solid #eee}.tsd-signatures .tsd-signature{margin:0;border-width:1px 0 0 0;transition:background-color .1s}.tsd-signatures .tsd-signature:first-child{border-top-width:0}.tsd-signatures .tsd-signature.current{background-color:#eee}.tsd-signatures.active>.tsd-signature{cursor:pointer}.tsd-panel>.tsd-signatures{margin-left:-20px;margin-right:-20px;border-width:1px 0}.tsd-panel>.tsd-signatures .tsd-signature.tsd-kind-icon{padding-left:40px}.tsd-panel>.tsd-signatures .tsd-signature.tsd-kind-icon:before{left:20px}.tsd-panel>a.anchor+.tsd-signatures{border-top-width:0;margin-top:-20px}ul.tsd-descriptions{position:relative;overflow:hidden;transition:height .3s;padding:0;list-style:none}ul.tsd-descriptions.active>.tsd-description{display:none}ul.tsd-descriptions.active>.tsd-description.current{display:block}ul.tsd-descriptions.active>.tsd-description.fade-in{animation:fade-in-delayed .3s}ul.tsd-descriptions.active>.tsd-description.fade-out{animation:fade-out-delayed .3s;position:absolute;display:block;top:0;left:0;right:0;opacity:0;visibility:hidden}ul.tsd-descriptions h4,ul.tsd-descriptions .tsd-index-panel h3,.tsd-index-panel ul.tsd-descriptions h3{font-size:16px;margin:1em 0 .5em 0}ul.tsd-parameters,ul.tsd-type-parameters{list-style:square;margin:0;padding-left:20px}ul.tsd-parameters>li.tsd-parameter-siganture,ul.tsd-type-parameters>li.tsd-parameter-siganture{list-style:none;margin-left:-20px}ul.tsd-parameters h5,ul.tsd-type-parameters h5{font-size:16px;margin:1em 0 .5em 0}ul.tsd-parameters .tsd-comment,ul.tsd-type-parameters .tsd-comment{margin-top:-0.5em}.tsd-sources{font-size:14px;color:gray;margin:0 0 1em 0}.tsd-sources a{color:gray;text-decoration:underline}.tsd-sources ul,.tsd-sources p{margin:0 !important}.tsd-sources ul{list-style:none;padding:0}.tsd-page-toolbar{position:absolute;z-index:1;top:0;left:0;width:100%;height:40px;color:#333;background:#fff;border-bottom:1px solid #eee}.tsd-page-toolbar a{color:#333;text-decoration:none}.tsd-page-toolbar a.title{font-weight:bold}.tsd-page-toolbar a.title:hover{text-decoration:underline}.tsd-page-toolbar .table-wrap{display:table;width:100%;height:40px}.tsd-page-toolbar .table-cell{display:table-cell;position:relative;white-space:nowrap;line-height:40px}.tsd-page-toolbar .table-cell:first-child{width:100%}.tsd-select .tsd-select-list li:before,.tsd-select .tsd-select-label:before,.tsd-widget:before{content:"";display:inline-block;width:40px;height:40px;margin:0 -8px 0 0;background-image:url(../images/widgets.png);background-repeat:no-repeat;text-indent:-1024px;vertical-align:bottom}@media(-webkit-min-device-pixel-ratio: 1.5),(min-device-pixel-ratio: 1.5),(min-resolution: 144dpi){.tsd-select .tsd-select-list li:before,.tsd-select .tsd-select-label:before,.tsd-widget:before{background-image:url(../images/widgets@2x.png);background-size:320px 40px}}.tsd-widget{display:inline-block;overflow:hidden;opacity:.6;height:40px;transition:opacity .1s,background-color .2s;vertical-align:bottom;cursor:pointer}.tsd-widget:hover{opacity:.8}.tsd-widget.active{opacity:1;background-color:#eee}.tsd-widget.no-caption{width:40px}.tsd-widget.no-caption:before{margin:0}.tsd-widget.search:before{background-position:0 0}.tsd-widget.menu:before{background-position:-40px 0}.tsd-widget.options:before{background-position:-80px 0}.tsd-widget.options,.tsd-widget.menu{display:none}@media(max-width: 900px){.tsd-widget.options,.tsd-widget.menu{display:inline-block}}input[type=checkbox]+.tsd-widget:before{background-position:-120px 0}input[type=checkbox]:checked+.tsd-widget:before{background-position:-160px 0}.tsd-select{position:relative;display:inline-block;height:40px;transition:opacity .1s,background-color .2s;vertical-align:bottom;cursor:pointer}.tsd-select .tsd-select-label{opacity:.6;transition:opacity .2s}.tsd-select .tsd-select-label:before{background-position:-240px 0}.tsd-select.active .tsd-select-label{opacity:.8}.tsd-select.active .tsd-select-list{visibility:visible;opacity:1;transition-delay:0s}.tsd-select .tsd-select-list{position:absolute;visibility:hidden;top:40px;left:0;margin:0;padding:0;opacity:0;list-style:none;box-shadow:0 0 4px rgba(0,0,0,.25);transition:visibility 0s .2s,opacity .2s}.tsd-select .tsd-select-list li{padding:0 20px 0 0;background-color:#fdfdfd}.tsd-select .tsd-select-list li:before{background-position:40px 0}.tsd-select .tsd-select-list li:nth-child(even){background-color:#fff}.tsd-select .tsd-select-list li:hover{background-color:#eee}.tsd-select .tsd-select-list li.selected:before{background-position:-200px 0}@media(max-width: 900px){.tsd-select .tsd-select-list{top:0;left:auto;right:100%;margin-right:-5px}.tsd-select .tsd-select-label:before{background-position:-280px 0}}@media screen and (max-width: 900px){.tsd-page-toolbar{overflow:auto}.tsd-widget.search.no-caption{right:-80px}#tsd-widgets{padding-left:40px}}img{max-width:100%} diff --git a/docs/assets/css/main.css.map b/docs/assets/css/main.css.map new file mode 100644 index 0000000..0bcbf38 --- /dev/null +++ b/docs/assets/css/main.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../../../third_party/src/default/assets/css/vendors/_normalize.sass","../../../../third_party/src/default/assets/css/vendors/_highlight.js.sass","../../../../third_party/src/default/assets/css/setup/_mixins.sass","../../../../third_party/src/default/assets/css/setup/_grid.sass","../../../../third_party/src/default/assets/css/setup/_icons.scss","../../../../third_party/src/default/assets/css/setup/_animations.sass","../../../../third_party/src/default/assets/css/setup/_typography.sass","../../../../third_party/src/default/assets/css/_constants.sass","../../../../third_party/src/default/assets/css/layouts/_default.sass","../../../../third_party/src/default/assets/css/layouts/_minimal.sass","../../../../third_party/src/default/assets/css/elements/_comment.sass","../../../../third_party/src/default/assets/css/elements/_filter.sass","../../../../third_party/src/default/assets/css/elements/_footer.sass","../../../../third_party/src/default/assets/css/elements/_hierarchy.sass","../../../../third_party/src/default/assets/css/elements/_index.sass","../../../../third_party/src/default/assets/css/elements/_member.sass","../../../../third_party/src/default/assets/css/elements/_navigation.sass","../../../../third_party/src/default/assets/css/elements/_panel.sass","../../../../third_party/src/default/assets/css/elements/_search.sass","../../../../third_party/src/default/assets/css/elements/_signatures.sass","../../../../third_party/src/default/assets/css/elements/_sources.sass","../../../../third_party/src/default/assets/css/elements/_toolbar.sass","../../../../third_party/src/default/assets/css/elements/_images.sass"],"names":[],"mappings":"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CA,eACJ,qDACI,aAGJ,iCACI,gBACA,eACJ,uDACI,aAGJ,+BACI,oBACA,eACJ,mDACI,aCxPR,WAEI,cACA,aACA,iBVUU,KUTV,mCAEA,iBACI,aAEJ,0CACI,8BACA,yBACA,6BAEA,yGACI,gBACA,gBAER,iBACI,cACA,WACA,cACA,gBACA,kBACA,oBAEA,oBACI,iBAEJ,wCACI,iBACA,sBAEJ,oBACI,sBACA,0BAEA,kCACI,yBAiBhB,iBACI,cAEA,4DACI,kBACA,mBCrER,YACI,gCAEA,mBACI,kBACA,UAEJ,mBACI,kBACA,OACA,MACA,WACA,YAEA,yBACI,sBACA,kBACA,UACA,UACA,WACA,eACA,UACA,UACA,SACA,uBACA,MXXC,KWaL,yBACI,kBACA,gBACA,YAER,4CAEI,uBAEJ,qBACI,kBACA,kBACA,SACA,WACA,SACA,UACA,gBACA,mCAEA,wBACI,eACA,iBXnCO,QWqCX,wCACI,iBX7BE,KW+BN,8BACI,aAEJ,8DAEI,iBXnCU,KWqCd,uBACI,cAEA,8BACI,SAER,iCACI,MXpDO,KWqDP,mBAER,sBACI,iBXhDc,KWkDd,mCACI,MACA,UAEJ,6BACI,UACA,UAEJ,+BACI,mBAER,8CACI,cAEJ,8CACI,cAGJ,mCACI,sBACA,eChFR,eACI,iBACA,aACA,sBACA,YZde,8CYef,UZZa,KYcb,6BACI,kBAEA,oCACI,SACA,UAER,0BACI,kBACA,mBACA,mBAEA,wCACI,kBAEA,+CACI,UAEhB,sBACI,MZxBe,KYyBf,mBAEJ,oBACI,kBACA,mBAYJ,gBACI,UACA,iBACA,sBAEA,+BACI,SACA,uBACA,gCAEA,2CACI,mBAEJ,uCACI,iBZ/CU,KYiDlB,sCACI,eAEJ,2BACI,kBACA,mBACA,mBAEA,wDACI,kBAEA,+DACI,UAEZ,oCACI,mBACA,iBAeR,oBACI,kBACA,gBACA,sBACA,UACA,gBAKA,4CACI,aAEA,oDACI,cAEJ,oDACI,8BAEJ,qDACI,+BACA,kBACA,cACA,MACA,OACA,QACA,UACA,kBAER,uGACI,UZhII,KYiIJ,oBAER,yCAEI,kBACA,SACA,kBAEA,+FACI,gBACA,kBAEJ,+CACI,UZ9II,KY+IJ,oBAEJ,mEACI,kBC9IR,aACI,UbJa,KaKb,MbIe,KaHf,iBAEA,eACI,WACA,0BAEJ,+BACI,oBAEJ,gBACI,gBACA,UCXR,kBACI,kBACA,UACA,MACA,OACA,WACA,OdoBa,KcnBb,MdkBiB,KcjBjB,WdgBY,KcfZ,6BAEA,oBACI,Mdaa,KcZb,qBAEA,0BACI,iBAEJ,gCACI,0BAER,8BACI,cACA,WACA,OdES,mCcCT,mBACA,kBACA,mBACA,YdJS,KcMT,0CACI,WAGR,+FACI,WACA,qBACA,WACA,YACA,kBACA,4CACA,4BACA,oBACA,sBnBzCJ,mGACI,+FmB2CI,+CACA,4BAEZ,YAEI,qBACA,gBACA,WACA,Od9Ba,Kc+Bb,4CACA,sBACA,eAEA,kBACI,WAEJ,mBACI,UACA,iBdvDc,KcyDlB,uBACI,WAEA,8BACI,SAER,0BACI,wBAEJ,wBACI,4BAEJ,2BACI,4BAEJ,qCAEI,alB5EJ,yBACI,qCkB8EI,sBAER,wCACI,6BAEJ,gDACI,6BAER,YACI,kBACA,qBACA,OdzEa,Kc0Eb,4CACA,sBACA,eAEA,8BAEI,WACA,uBAEA,qCACI,6BAGJ,qCACI,WAEJ,oCACI,mBACA,UACA,oBAER,6BACI,kBACA,kBACA,IdlGS,KcmGT,OACA,SACA,UACA,UACA,gBACA,mCACA,yCAEA,gCAEI,mBACA,iBdvIO,QcyIP,uCACI,2BAEJ,gDACI,iBdpIF,KcsIF,sCACI,iBdtIM,KcwIV,gDACI,6BlB3IZ,yBkB8II,6BACI,MACA,UACA,WACA,kBAEJ,qCACI,8BAEZ,qCAEI,kBACI,cAEJ,8BACI,YAEJ,aACI,mBCpLR,IACI","file":"main.css"} \ No newline at end of file diff --git a/docs/assets/images/icons.png b/docs/assets/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..3836d5fe46e48bbe186116855aae879c23935327 GIT binary patch literal 9615 zcmZ{Kc_36>+`rwViHMAd#!?~-${LfgP1$7)F~(N1WKRsT#$-?;yNq3ylq}iztr1xY z8DtsBI<`UHtDfii{r-60Kg@OSJ?GqW=bZ2NvwY{NzOLpergKbGR8*&KBGn9m;|lQC z2Vwv|y`nSufCHVQijE2uRauuTeKZL;=kiiF^SbTk;N^?*u%}Y7bF;O-aMK0lXm4nb zvU~Kf+x|Kgl@Ro%nu?L%x8-yetd((kCqY|t;-%}@Y3Ez_m(HTRt=ekeUQ2n4-aRvJ zrlKaWct8JSc8Kxl4KHu+3VW1L`9%n~_KC5}g6&tFXqyKT-}R0?EdkYqCmQot47^9Z z6;opqR@7Nq-s|6=e6*0^`}+X1kg>CpuGnbpL7{xFTa|8nymC0{xgx*tI7n4mTKZNA znsd@3eVsV>YhATuv~+5(^Vu4j?)Tn`{x@8ijIA;wdf`+0P3$vnSrcWFXXc{Lx`1Z7 z%-n(BM(owD$7LzqJx)(f^Cusecq>OW z=h6n4YzSVM-V!-DK(sLT`!W~}($=O$9|ie`>_fpH0=1G1tiIFw($?~{5T>`74|p0H z``5=UydE)!CiFvmECW|s^TzG9*7pN|KknkVm3C{fEu30gffX&8iCm? zTFPm6*k%Hog`Q6JGj@dg9Z5nlAc6ApUe>;6xauB0-u!?wMU92jVL|3EcP9gEu5^wH z%tXRy#>HCEs*?KgMf73UcJ!lJ?x<6+)eJ{mEIS|HMDP7(7!(< z@X;?ACT8mncW9*XIaiJPW}Mw@b0W||)!sYnLw)0j4&-rXQgJhnQ2?frg1Nfk&JpmV8F=dDZl)e%#Grs|&0th7_o) z?7hQn<1078qcq?#;)CH=2kBBiGt37EtcXfpTXtHB59dr9=B~jI`yPm-Q?(ys=ajAu zGY;eS^z&WFvztZI3I~}*l}_lI^}6D<&CZ94;|&G9_pMx!C~$~EL4^8`QjT#|tqxxk zhl4CdxppbDiOk!Ht#SVAK4gf6Cr#=U&1sVxZ`y-X zTSi#@wHf(?(Dd6ypNOyshRZ*tneVP^W?y?$ur_!9iD-vY{&Q5(ooX2;`SkUjwEYA~ zwGcylCT4_`MZobm(0v$U(IhfYXxyjNJ@ztpH0sDmfpn|LMp3eM(R4uqKi_q1=D1-d z%GdV<&2+_9k@sc44xhIjqktRA2!Su|vzM0R-@#MK&{RdLoU#$Hc?{{JItvX{hKCtc zQNqZpkfG^@LGJRZM4H_>`F=N;O*+_`>M_ko_XWCgu@}ntqLX8VSeZQ_25Z8|^!d?o z$~}~9|`ZW9d_o<=8&K^~;Cr08b;qgq{(*e*sNt00lO2lZ;m-b<`Rl}=Lr6iQ8+$&br z!RLn{5a}j1Dh^|_1)Q?<;iBSrS0V|c_D@3}mc2d!%tV1VN?BC@clkFdx?HB&9KOTF z)9eHpmUEYsCqx^%JHuNdwY zz9P3oPYuTAXZVY}LRp&2qNl$pbsXL1GJ@wx?@CTO!acs+OFfW_U6?&As-(GJED}RR zO}B+Kxph7aUUm>i3rbPZQGXN}oQq;u`yTnFDAJ*d$4gjEJH!JPyt6V{cOUp*Jbyol zE$8wh)T=vpJOWRbv}HvR(cUSlO}ePIPdJ`J@yp=IC&E6K%r?QfW7F&%p!H~@?%yj5 z&MpiV!hyfukD56A097f!0+ANt`JSB~oLak75oKQN7FH=rQbX#Eak37|4&mqp@S~TA zOo51)xQxX}5NQ(3I_UeR4B;P0Q#x$_lDce78ET`Blo;`Hj*R;b8slZS7Oak(LjDuE z3z?-~-U@vWe*cEOsf^9|duH9};Pe)!=Ky+QQ!jr2VV-jMUH-F>oB>Ds zDJw}jm%V?OT^fu1y`$`yRdaW03L?)6vmInxhAsGrPhWIP8?=speMFf9Inn4^t zs$!88*B~c1A2J6t0~hgK2BJ_Pl23l=oeQQqjI2(4Mcv6U_#9#$PEN|qz36rCZ5$@I zNF1LpRe%ZG4qwuYr7ZdaynrPs?spt;9VbQM$462zbksMVhAOqPunrR7@Nbv#5;VKk zJB7xC?~QXd(e9REiLixHxRGhLcKR#0va}|LMS`AXKGOIGFKQv?=+>zf^ zN5XLjX6^`zh*%1UG_QV1H`@z!HZgC+OT2`+_B( z)J95hk;3C+K4XCswSP}au;fx=47~*$k`RAaYEU-qb03y0#x|&>LAeiXgri5E(!h9k z|9OVt@sk1-4+>0?ELyw|zs`~<95M=%o?Gix$?8z4Gz3Kpw|b>?BcD&s{X)-aXg!GJ zyq&`ZEP{K^u7ActXP$gGnO#F0Sr+QUZe0&d5*Yhw9A?C4(Sx2j3QKAlUpkQz7nji^ z%y8F|W{ypj(T%Bf#Wgyvq4szMo?*U-;3IGBRg1fK9!h-=YRsZ_+t~2!-)=pr;)Vnk zmt95&wMb02toOf`I9>M^Kv3LqKb_-#jauF&cGrWsCnMt?p7*uh zevugda={D04DB#7wR375=1i5}Z9fi3r)!F#7qmX9`SjppE&%8l8bKt+ADRMTWRv21 z4L&PldV8YpHw3b^`p0uWlIm#J&K65-y4lQW0VzZR!4#gfeT{b#fL1e*)Z*Ux}M^}bO%OM7uXip_4! zL@yo@q{utZeVV?3CtXs}i>nI|%26fwuzt0f#96fQ!{=dEX^YKnvIk*D%y9Cin;9R) zi{?)baJhgFs$1$SOZESTpldw2H&FD=v*v@1cA!`|s;avDKHa>Q+uJ8qhy!9%C4&lJSTN4OeydYOm4S?Bj7*e{xRYbU9Xos)R7qZT3dBBD5{ zo+(E3pR{>>)}hFhE+}!yYP0V+CVhyAq+RV{^X`XA3{iXj(ir$k@u|t8ZJ1ZnHq2dd zD$0RHmGJ=!?T5`*T2zOEJ~y}Nsyt7O)%+!0ulRQdsopJJxoznfpusv=2@zLXIq@^& z>0T5k4lzGCG(DnltLIe@6=ZOG@C(dvmYXfh4IhJfMfY8S?KkT znb7~EDE}Yhg$J1LxB7m`L4VMS(+(SXTQvh_mz!x&M3-6Z zFRB*a%_gVEqI^mL5|c%V=l_oi%|~h>gL0SB4QH5uonWd#={KPg6}6ES)zk0~#3^KJ zJq@{iqbHe3gyC))jeQ`W;(u3|q)JxuF24|GMsh%v5>>VY-bok%* z1Yl@(5G2UCK=fQck}pAyWV0n{`ML|rsl_N7vmW|frii__zB;ozrQ7{z)y}M^Sg@m_ z;+?{q3sUZs3WxnBbp~CyyL(TA?C*0KIeDPp7w0$!Ijd+M8#}r~vYW)NB*$mG*7-vH z@s^wK07OMxq>WveCEQFQ*p&2gjD1j%i+#G9z##Th`gew>H5=`RwyfPDg2G%f>x3@c z14Oy}pQK?(i06GWLWu%4cGjDoE-tTEI$`9^E?nLT663vu_>6K1e!N>A-^q&tfl$0& zy&>w~+yUelAa!c@xd8iyt^`B^$cj+}h}0i!40K2Ve1KFCDezBzZO8@=k&r)`TNTJ* zzF4Pim>SYL^=~7kW>EyiVHXNMT2)8l#v^IW!pLB_8ZvVfK&m8QHkjsZ)mvd?o$VYG zX#HiWwWlW>N{D85URJ-d)}_3h73|)X=E(6hFzi#TF{$4aSka4TeY>1a_(RIkFBL#O zE0_FoSQI)}+si51ufAqRHhDU=actTRQl@y#2h}xaDv-A&GP&0Qu9V4ED5aWnX z1E#mRT1QSvL!4~%Ozt84nP{&F>VIm6w2q!EPhh^BF-94$4JhCTcrdbDXA3Q&8mPTh zqdPv|X}??B?bIZPpl}z%(zr<8U-NoXjb*L#xyqHHfpIGAgN$5i(E9#rYPYq_tISC4 z2TDkd*uZ;CIhVI2o!||T)Kz`ER@%rTf-&SfmJFF>;d(RW(B6k!1<)uxHM_1G+9BWe zc)k`gBxYMcztqY5@jccaU)CqQ@^G5TBVx(nNf2}D@);3+{D)GzyT{>%dO6ibggS({N!!=P4=M8J}5R*&fgd(w36z0M0D$ z(SN5a`i%sZ9vmaEjiC4)DF}ix&`?mc-vYwK@+}8Gqzj6r6y)lT|Iqwlpj(LXqvh;- zb>jECiiOZ%&Q7gQg7(ix-?-RE*c(O6NG0F-+VCr;701@%L~fyfHnU<;Vk`m3A2{1MSmpii@G*k?KDq0GdZ)|hd`8OHep z8@6wv_|9NKNpe*sc#?zZ1S#}*qk{k<(I99u6(QT#>wf9w^u9~9_>;2d20T=^g-;b5 ze9x~fHZ-JL=J`hq-;W{2SgN)&m9RsVo=%?`JYp`pxEA_>`18Y>XA$rfWm^pQfG3MQ zxT^I1*({tZz2}+!5$AyNUE*jiYwu_S8v<#qZS4e!bGGBdY`3RkgLMf%Kz8s-;7PF+ z6w#-FwV#)PiKGR79miXmrDyv=ZTjc)j>N=&h4F+#G;unBZhhZz?a*;8@bi5`fV4)O zuU5pCs;tvRzbV@P5%W5xLI4I+w*^KExeVlzP4kNRGp-wi3g$lf-I|(o`JQ|u^XfkP zcik+g-5~2lG*oHfjLCpfNalFwz=4ZY>$Rc-QGpws&tCfFZUuJDL)3et%ap*$Q=-v0 zgLfsn-&%#+wnox~@)6ppx30sK(UJg1dCAvQF&}DkoPI+uX_wH))iaYvWtl}BtVKpU&MN= z0GdENbhdLgIwL-#_phGK;mZRlk4zq8*)akvV5zRX@jFUmvcr#3p99P@4z@m|bz-)^ zbZl8Wt?hR*z(sEZl;2PaILIG#835i@YoZQ@EwrD9IOBl7BpJX(ilLgcd)KCZAzo^b z6Z{|~=H;$D2dD53tejr_jx7^y-zT{SNZpNjn4+wJQX~K#LcrlKOv=D5xk%QXD{tg; z+xh`PvMV*HC*rF?xyjK5@KsMl5*w`r@wL#r13uFpso~#^oYIFc^&gGNS825eqFttU2_sG%_ z;X8VXD#Ol4X&$2B_Z$*&-)ZIUXf9I%mOOXJ3O%GbGpJfl+9(jY^fF_(b!Gt{{HAA3 zusUOCPDHYT@&*H~7a050c7r-_CaFACp$BXx)5==@fC11Gn|n~~+u@6N-}lvdyl3&6 z<#c_zm0Xp1F!8o2OBbFfgzzC4vno}9XEf40dGaVo;jiwiazo8hZ~iPVD(re=5k;H| zotm286$6nnTeIw>1FY$Ri|t{Lp?o(Fg3g_>|y~Z+16tvyLc@r?t9g7 zBuXyVuu9bC#q`?@OFIhgS)6v^XP@H0ukl2X!RPMsg%`YHMGad z4{VsgxaprFss3X%HbZablb6IdaNdbISVWp7yQXPPn=s7?J9qLEH{4>XAv8}%h&TDg zs()1sh}4at3nL3^%q!?P9BbW80e*ZwU63}CV7pt}gVu;~V6c$9p+*wfhw!zeE-z|V z=k{Ksec2)$Hu&?pRh;*TPk0T$Fc~^oAoBT4q?-Q}Y&3DluXeoMQ0LesTk}pVlf5(I z$dl8;zA0&=L&z*F*H>W7IeiPhTo@P0VTB~vyC2Bm7lCN}t7@NNlKFSHGKkh?z_qij zoYju!#D4b28cdslLdIM5Cmqe&!v^IcRr=qq^?l+P^n@6}fh@)IS81hx)SPAY7osk0)^ulqC1F*{hBNQl+Y}b>XjVXnS_Cc!L zIZ@Jq#mp^E&fKT~t4DM_^S17R@YJ@`(7;zv1mz_Y=~q*Gdg#*yXGxotY=#F|lvhPM zjlE)VHS=8=)njE^c7M|ZiBqARx>9Ib!y91$70iC8jPi$c+ysP}5Q3s`ti&1sx>~oG zI^>^1onS%G`mtq&)cZ15dZ{X^#MOfatyH0I=l%Q)n z7*@kZtC_3?=J_}?_G@?F?UK<0_AhYFclyrS-PkfYhAeVHcF z16x+quy10*2V$A%p_|@C(vlf}j3uY83h(#TSr$(;^8(I={_=YQQWmA9-IlwJv>tQm z=vN-I{TO7X`;qBxwb5w$91YLV?ZD5}pddq(7IdMCH zi>`qAn|#FITi!L5;K!(tYm9r416}Wof}P8~?R9I9Gp(?VA;uQg19MO47*gS7fH*&jBO!+ zA*<^BMccHjJIvGHguBb4a`X z3aZw#!c&Xr8&szD1+gu&;vYfoWo>0Pxfr2%m34tC33fmRbzWF9I_Pqb9nNK@N##9_ z7K)v)des!^owH`MoXY_O?|;^9;comiPx0e78xhnnVvTYt+t+cU1rn_>gaFJsL-iPn)?<9P9cF#4)7q&v+d&6|3G@s-AcJy+m zE&u*GUaMK|x|4GmT(CgBICk`2BP@3rqtjKIRD#uBy}y*d;<>`?W&mGsG;i*_}V&^tlP`%;=g39@jxP z+3lrtg*!i6N;irOpUfKcd;iDl5a`<#kr8RwFm9=^m+ouwwjcXmTB}w5V#9IF^&Bl$ zr1$Ly#cQ<3u86>am9}pk&i%nxu(W&s@>qEDtn_xVtH-_EiQ}iAK4Ssfsdn&L9t=)d z`XOQN7*J)g$Jrtq0=-yeLnHg*23LxYA7$cxz^Yc)I6E-!;{LQwu_wfGw4&MYy7{n< z@{g0Hf)N5gAJKQ1Z&HGPn9x9B7U(m(9K&=+LHAc_D{YdMBZs~x)u1Y8|Oq!`C4(3_9<&$ddi6>R$Nsz z*ti?=jA-Sr_97V}feo+}Lq3-cfpgWR;PLI8s{ve9@?e;2o}0MpquOucipz^DrT}QH z*(<{nLb4h9799hx4&%I8KPj}xcQ}llgcaG1!nRb(PP?m)=CzA4v%6>oOe96H9 zv4mUhw`>V$29k?)$Co>qIqq(~3w4jJ;Hv5(RxjB-j_iEhlF;&|DDC|I8IcT>Vn;RY zhtw5mT0ygXAu=M%{^;GqYuYIMu4H;Mj--5CL}|zMEhOum_o51Y7i|D>$XmUFoe;@1 z%GsTUsKgF4w%-Cr3lg#~h)8;Lk%WQTLBS8r*sE{YBUDw4HU#o}E)8pVIEfWv&14?U z-+Za${OFm=>IA358en)nB5Iaqxw&Xi*ty@uDOX8o2c0tq0^sX>ZXD+Hn|;KY!Omm1 z^%wgf&Zy9Azd?vmU`~zuOOA0{TZ*mAC!_>|avcN83F#c+sFn_6tGo!v?95IUR2bL$ zlO(OlhszqAgy)mNt8PRulC#6u^SL#z-O&@{=_!AzBZ>T4ROorj%fx$A;u8u>saum0ha7p zeHRX-z)PW*@v9bruyAtVI@)PhaEs5kp`xyxTQ`U9$Whwz#z$=U$V|&0w@EfCUS!Ob zACSTE{VeC-0V~ZCpkKq~P4CLgdOeBy>vB+0ZxIt_Cp4aa%vI#LS^K}ui07WNo}5r0 zagMHmq-jqTf-OD<kAvu_ob1mUP%1jxeKqB!1&-)_hP{p74hHE%WM!atyx68j5b zSqwh8aKo|NIOL<2_eiX+iOsRP`{MUt{0iQetB*SL!F_8)_;0f$iJ4(o__4KWuvy_! z8TZ{dTb*rL6VmuN-yl2Z>0glL84u^jAH^DQl}VRI=x0CnuF*|;|My-5aPI;>(mo+m z`nyEOe&k$RG11$vEdDPG7^raBCw|#C*4#pIUoZJNx?4|ZC{)l>+jaSiiJ`GBKf}l) zUk1>%A61hqy!KvfRsM^|u6vwbH5WpfH(I5AdpBAg%rar%zW}nccGxfgRV4&v`tEoGyBq!uz^f zVqWEtxn%j&+Q2Fi$rL)H`M_HExP+?mFyN^){c{JXs{IM}f}p>7lfD zLZ;s)%6a(Ow@`(jP}k~pn@!dv6JhJkZf5UoumHv`g-tcCs)w* z#0sc%t9@Li{p}f*$vg$UiQ*RGZUr=ykDIaxRDU_(QfcURuYrpX*7IQcS$(Buw%VW7 zxaffDgn{-=K@iEh)LlPc3MPzc+qM^>RXr6Y8ASnP&dr6fqmwYILTpmh$E%{Iz%Qz( NZmR35l_G4O{0}dcmS_L~ literal 0 HcmV?d00001 diff --git a/docs/assets/images/icons@2x.png b/docs/assets/images/icons@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5a209e2f6d7f915cc9cb6fe7a4264c8be4db87b0 GIT binary patch literal 28144 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 U&wLp6h6BX&boFyt=akR{0G%$)mH+?% literal 0 HcmV?d00001 diff --git a/docs/assets/images/widgets@2x.png b/docs/assets/images/widgets@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4bbbd57272f3b28f47527d4951ad10f950b8ad43 GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xe12~w0Jcmn z@(X6T|9^jgLcx21{)7exgY)a>N6m2F0<`Rqr;B4q1>>88jUdw-7W`c)zLE*mq8W2H z-<&Jl_Hco5BuC5n@AbF5GD82~-e8-v=#zCyUX0F-o}8pPfAv`!GN$ff+TL<~@kgt} z62eO?_|&+>xBmM$@p|z`tIKEdpPf8%qI>4r7@jn<=eta*{3~?g(zz{Ke9zc-G^gr? z-7foa?LcS!hmbwzru}ICvbWLlW8;+l-}!^=c32!^nV`+`C*;0-*Y%l94pC;Cb3GXz zzSf%a!{gVr{Y_lVuUj+a)*Ca+!-Hu%xmP&&X-2CuANY8^i{D7Kg6qzP zXz_ps9+lN8ESH{K4`yu&b~I>N9xGlE&;2u*b?+Go!AhN?m-bxlLvtC#MzDF2kFzfHJ1W7ybqdefSqVhbOykd*Yi%EDuhs z4wF{ft^bv2+DDnKb8gj1FuvcV`M}luS>lO<^)8x>y1#R;a=-ZKwWTQQb)ioBbi;zh zD!f5V)8581to1LL7c9!l^PSC$NBPYif!_vAZhmL4)v4U)4UsrLYiH_9rmQDd?)(e5 z^pcH>qvBg*i0dus2r*mp4;zKvu=P#s-ti;2obl`NjjwoYd>e(oo#j_uyRb<7Pv^If zzZ|mGHmV)8^tbO%^>eqMw(@7(&3g{jEp-Najo7V75xI_ZHK*FA`elF{r5}E*d7+j_R literal 0 HcmV?d00001 diff --git a/docs/assets/js/main.js b/docs/assets/js/main.js new file mode 100644 index 0000000..542f72b --- /dev/null +++ b/docs/assets/js/main.js @@ -0,0 +1,5 @@ +function arrayToNest(array){for(var _a,_b,res={},i=array.length-1;i>=0;i--)i===array.length-1?(_a={},_a[array[i]]=array[i],res=_a):(_b={},_b[array[i]]=res,res=_b);return res}function mergeRecursive(obj1,obj2){for(var p in obj2)try{obj2[p].constructor===Object?(obj1[p].constructor!==Object&&(obj1[p]={Overview:obj1[p]}),obj1[p]=mergeRecursive(obj1[p],obj2[p])):obj1[p]=obj2[p]}catch(e){obj1[p]=obj2[p]}return obj1}function sanitizeModuleName(moduleName){return moduleName.toLowerCase().replace(/[^a-z0-9]/gi,"_")}function renderSimpleHTMLRecursive(obj,package,spacing){void 0===package&&(package=""),void 0===spacing&&(spacing=" ");for(var html="",shownPackages=[],_i=0,_a=Object.keys(obj);_i<_a.length;_i++){var key=_a[_i];if("object"==typeof obj[key])html+=renderSimpleHTMLRecursive(obj[key],package+"_"+key,spacing+" ");else{-1===shownPackages.indexOf(package)&&(html+="
"+package.replace(/_/g,"/")+"
",shownPackages.push(package));var href="";-1===window.location.href.indexOf("/modules/")&&(href="modules/"),(window.location.href.indexOf("/assets/")>-1||window.location.href.indexOf("/classes/")>-1||window.location.href.indexOf("/enums/")>-1||window.location.href.indexOf("/interfaces/")>-1)&&(href="../modules/"),window.location.href.indexOf("/modules/")>-1&&(href="../modules/"+href),href+=package?"Overview"===key?"_"+sanitizeModuleName(package.substr(1))+"_.html":"_"+sanitizeModuleName(package.substr(1))+"_"+sanitizeModuleName(key)+"_.html":"_"+sanitizeModuleName(key)+"_.html",html+=""+key+""}}return html}function renderHTMLRecursive(obj,package,spacing){void 0===package&&(package=""),void 0===spacing&&(spacing=" ");for(var html="",shownPackages=[],_i=0,_a=Object.keys(obj);_i<_a.length;_i++){var key=_a[_i];if("object"==typeof obj[key])html+=renderHTMLRecursive(obj[key],package+"_"+key,spacing+" ");else{-1===shownPackages.indexOf(package)&&(html+="
"+package.replace(/_/g,"/").substr(1)+"
",shownPackages.push(package));var href="";-1===obj[key].indexOf("/")&&(href="modules/"),(window.location.href.indexOf("/assets/")>-1||window.location.href.indexOf("/classes/")>-1||window.location.href.indexOf("/enums/")>-1||window.location.href.indexOf("/interfaces/")>-1||window.location.href.indexOf("/modules/")>-1)&&(href="../"+href);var pageName=href+obj[key],pageNamePath=pageName.replace("../","")+".html";window.location.href.indexOf(pageNamePath)>-1?html+='"+key+"":html+=""+key+""}}return html}!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function s(a){var b=a.length,c=n.type(a);return"function"!==c&&!n.isWindow(a)&&(!(1!==a.nodeType||!b)||("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a))}function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}function D(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),"string"==typeof(c=a.getAttribute(d))){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c)}catch(e){}M.set(a,b,c)}else c=void 0;return c}function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("')[0] : null; + + if (jsonUrl) { + fetch(this.sasjsConfig.serverUrl + jsonUrl) + .then((res) => res.text()) + .then((resText) => { + resolve(resText); + }); + } else { + reject("No debug info in response"); + } + }); + } + + private async getJobUri(sasJob: string) { + if (!this.sasViyaApiClient) return ""; + const jobMap: any = await this.sasViyaApiClient.getAppLocMap(); + let uri = ""; + + if (jobMap.size) { + const jobKey = sasJob.split("/")[0]; + const jobName = sasJob.split("/")[1]; + + const locJobs = jobMap.get(jobKey); + if (locJobs) { + const job = locJobs.find( + (el: any) => el.name === jobName && el.contentType === "jobDefinition" + ); + if (job) { + uri = job.uri; + } + } + } + return uri; + } + + private parseSAS9Response(response: string) { + let sas9Response = ""; + + if (response.includes(">>weboutBEGIN<<")) { + try { + sas9Response = response + .split(">>weboutBEGIN<<")[1] + .split(">>weboutEND<<")[0]; + } catch (e) { + sas9Response = ""; + console.error(e); + } + } + + return sas9Response; + } + + private parseSAS9ErrorResponse(response: string) { + const logLines = response.split("\n"); + const parsedLines: string[] = []; + let firstErrorLineIndex: number = -1; + + logLines.map((line: string, index: number) => { + if ( + line.toLowerCase().includes("error") && + !line.toLowerCase().includes("this request completed with errors.") && + firstErrorLineIndex === -1 + ) { + firstErrorLineIndex = index; + } + }); + + for (let i = firstErrorLineIndex - 10; i <= firstErrorLineIndex + 10; i++) { + parsedLines.push(logLines[i]); + } + + return parsedLines.join(", "); + } + + private parseLogFromResponse(response: any, program: string) { + if (this.sasjsConfig.serverType === ServerType.SAS9) { + this.appendSasjsRequest(response, program, null); + } else { + if (!this.sasjsConfig.debug) { + this.appendSasjsRequest(null, program, null); + } else { + this.appendSasjsRequest(response, program, null); + } + } + } + + private fetchLogFileContent(logLink: string) { + return new Promise((resolve, reject) => { + fetch(logLink, { + method: "GET", + }) + .then((response: any) => response.text()) + .then((response: any) => resolve(response)) + .catch((err: Error) => reject(err)); + }); + } + + private async appendSasjsRequest( + response: any, + program: string, + pgmData: any + ) { + let sourceCode = ""; + let generatedCode = ""; + let sasWork = null; + + if (response) { + sourceCode = parseSourceCode(response); + generatedCode = parseGeneratedCode(response); + sasWork = await this.parseSasWork(response); + } + + this.sasjsRequests.push({ + logFile: response, + serviceLink: program, + timestamp: new Date(), + sourceCode, + generatedCode, + SASWORK: sasWork, + }); + + if (this.sasjsRequests.length > 20) { + this.sasjsRequests.splice(0, 1); + } + } + + private async parseSasWork(response: any) { + if (this.sasjsConfig.debug) { + let jsonResponse; + + if (this.sasjsConfig.serverType === ServerType.SAS9) { + try { + jsonResponse = JSON.parse(this.parseSAS9Response(response)); + } catch (e) { + console.log(e); + } + } else { + await this.parseSASVIYADebugResponse(response).then( + (resText: any) => { + try { + jsonResponse = JSON.parse(resText); + } catch (e) { + console.log(e); + } + }, + (err: any) => { + console.log(err); + } + ); + } + + if (jsonResponse) { + return jsonResponse.WORK; + } + } + return null; + } + + public getSasRequests() { + const sortedRequests = this.sasjsRequests.sort(compareTimestamps); + return sortedRequests; + } + + private setupConfiguration() { + if ( + this.sasjsConfig.serverUrl === undefined || + this.sasjsConfig.serverUrl === "" + ) { + let url = `${location.protocol}//${location.hostname}`; + if (location.port) { + url = `${url}:${location.port}`; + } + this.sasjsConfig.serverUrl = url; + } + + if (this.sasjsConfig.serverUrl.slice(-1) === "/") { + this.sasjsConfig.serverUrl = this.sasjsConfig.serverUrl.slice(0, -1); + } + + this.jobsPath = + this.sasjsConfig.serverType === ServerType.SASViya + ? this.sasjsConfig.pathSASViya + : this.sasjsConfig.pathSAS9; + this.loginUrl = `${this.sasjsConfig.serverUrl}/SASLogon/login`; + this.logoutUrl = + this.sasjsConfig.serverType === ServerType.SAS9 + ? "/SASLogon/logout?" + : "/SASLogon/logout.do?"; + + if (this.sasjsConfig.serverType === ServerType.SASViya) { + if (this.sasViyaApiClient) + this.sasViyaApiClient!.setConfig( + this.sasjsConfig.serverUrl, + this.sasjsConfig.appLoc + ); + else + this.sasViyaApiClient = new SASViyaApiClient( + this.sasjsConfig.serverUrl, + this.sasjsConfig.appLoc + ); + } + if (this.sasjsConfig.serverType === ServerType.SAS9) { + if (this.sas9ApiClient) + this.sas9ApiClient!.setConfig(this.sasjsConfig.serverUrl); + else this.sas9ApiClient = new SAS9ApiClient(this.sasjsConfig.serverUrl); + } + } + + private setLoginUrl = (matches: RegExpExecArray) => { + let parsedURL = matches[1].replace(/\?.*/, ""); + if (parsedURL[0] === "/") { + parsedURL = parsedURL.substr(1); + + const tempLoginLink = this.sasjsConfig.serverUrl + ? `${this.sasjsConfig.serverUrl}/${parsedURL}` + : `${parsedURL}`; + + const loginUrl = tempLoginLink; + + this.loginUrl = + this.sasjsConfig.serverType === ServerType.SASViya + ? tempLoginLink + : loginUrl.replace(".do", ""); + } + }; + + private async getLoginForm() { + const pattern: RegExp = //; + const response = await fetch(this.loginUrl).then((r) => r.text()); + const matches = pattern.exec(response); + const formInputs: any = {}; + if (matches && matches.length) { + this.setLoginUrl(matches); + const inputs = response.match(/]*>/g); + if (inputs) { + inputs.forEach((inputStr: string) => { + const valueMatch = inputStr.match(/name="([^"]*)"\svalue="([^"]*)/); + if (valueMatch && valueMatch.length) { + formInputs[valueMatch[1]] = valueMatch[2]; + } + }); + } + } + return Object.keys(formInputs).length ? formInputs : null; + } + + private async createFoldersAndServices( + parentFolder: string, + membersJson: any[], + accessToken?: string, + sasApiClient?: SASViyaApiClient + ) { + await asyncForEach(membersJson, async (member: any) => { + switch (member.type) { + case "folder": + await this.createFolder( + member.name, + parentFolder, + undefined, + accessToken, + sasApiClient + ); + break; + case "service": + await this.createJobDefinition( + member.name, + member.code, + parentFolder, + undefined, + accessToken, + sasApiClient + ); + break; + default: + throw new Error(`Unidenitied member present in Json: ${member.name}`); + } + if (member.type === "folder" && member.members && member.members.length) + await this.createFoldersAndServices( + `${parentFolder}/${member.name}`, + member.members, + accessToken, + sasApiClient + ); + }); + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..39459c6 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,5 @@ +import SASjs from "./SASjs"; +export * from "./types"; +export * from "./SASViyaApiClient"; +export * from "./SAS9ApiClient"; +export default SASjs; diff --git a/src/types/Context.ts b/src/types/Context.ts new file mode 100644 index 0000000..c5ca093 --- /dev/null +++ b/src/types/Context.ts @@ -0,0 +1,6 @@ +export interface Context { + name: string; + id: string; + createdBy: string; + version: number; +} diff --git a/src/types/CsrfToken.ts b/src/types/CsrfToken.ts new file mode 100644 index 0000000..7161982 --- /dev/null +++ b/src/types/CsrfToken.ts @@ -0,0 +1,4 @@ +export interface CsrfToken { + headerName: string; + value: string; +} diff --git a/src/types/Folder.ts b/src/types/Folder.ts new file mode 100644 index 0000000..849dc7c --- /dev/null +++ b/src/types/Folder.ts @@ -0,0 +1,7 @@ +import { Link } from "./Link"; + +export interface Folder { + id: string; + uri: string; + links: Link[]; +} diff --git a/src/types/Job.ts b/src/types/Job.ts new file mode 100644 index 0000000..f6b93d9 --- /dev/null +++ b/src/types/Job.ts @@ -0,0 +1,11 @@ +import { Link } from "./Link"; +import { JobResult } from "./JobResult"; + +export interface Job { + id: string; + name: string; + uri: string; + createdBy: string; + links: Link[]; + results: JobResult; +} diff --git a/src/types/JobResult.ts b/src/types/JobResult.ts new file mode 100644 index 0000000..624ac08 --- /dev/null +++ b/src/types/JobResult.ts @@ -0,0 +1,3 @@ +export interface JobResult { + "_webout.json": string; +} diff --git a/src/types/Link.ts b/src/types/Link.ts new file mode 100644 index 0000000..7f8c5a3 --- /dev/null +++ b/src/types/Link.ts @@ -0,0 +1,7 @@ +export interface Link { + method: string; + rel: string; + href: string; + uri: string; + type: string; +} diff --git a/src/types/SASjsConfig.ts b/src/types/SASjsConfig.ts new file mode 100644 index 0000000..ee40745 --- /dev/null +++ b/src/types/SASjsConfig.ts @@ -0,0 +1,30 @@ +import { ServerType } from "./ServerType"; + +/** + * Specifies the configuration for the SASjs instance. + * + */ +export class SASjsConfig { + /** + * The location (including http protocol and port) of the SAS Server. + * Can be omitted, eg if serving directly from the SAS Web Server or being + * streamed. + */ + serverUrl: string = ""; + pathSAS9: string = ""; + pathSASViya: string = ""; + /** + * The appLoc is the parent folder under which the SAS services (STPs or Job + * Execution Services) are stored. + */ + appLoc: string = ""; + /** + * Can be SAS9 or SASVIYA + */ + serverType: ServerType | null = null; + /** + * Set to `true` to enable additional debugging. + */ + debug: boolean = true; + contextName: string = ""; +} diff --git a/src/types/SASjsRequest.ts b/src/types/SASjsRequest.ts new file mode 100644 index 0000000..941b5ec --- /dev/null +++ b/src/types/SASjsRequest.ts @@ -0,0 +1,12 @@ +/** + * Represents a SASjs request, its response and logs. + * + */ +export interface SASjsRequest { + serviceLink: string; + timestamp: Date; + sourceCode: string; + generatedCode: string; + logFile: string; + SASWORK: any; +} diff --git a/src/types/SASjsWaitingRequest.ts b/src/types/SASjsWaitingRequest.ts new file mode 100644 index 0000000..f3c289d --- /dev/null +++ b/src/types/SASjsWaitingRequest.ts @@ -0,0 +1,14 @@ +/** + * Represents requests that are queued, pending a signon event + * + */ +export interface SASjsWaitingRequest { + requestPromise: { + promise: any; + resolve: any; + reject: any; + }; + SASjob: string; + data: any; + params?: any; +} diff --git a/src/types/ServerType.ts b/src/types/ServerType.ts new file mode 100644 index 0000000..21fbc81 --- /dev/null +++ b/src/types/ServerType.ts @@ -0,0 +1,8 @@ +/** + * Server type - Viya or SAS9. + * + */ +export enum ServerType { + SASViya = "SASVIYA", + SAS9 = "SAS9", +} diff --git a/src/types/Session.ts b/src/types/Session.ts new file mode 100644 index 0000000..8734fdf --- /dev/null +++ b/src/types/Session.ts @@ -0,0 +1,3 @@ +export interface Session { + id: string; +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..ad95d88 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,10 @@ +export * from "./Context"; +export * from "./CsrfToken"; +export * from "./Folder"; +export * from "./Job"; +export * from "./Link"; +export * from "./SASjsConfig"; +export * from "./SASjsRequest"; +export * from "./SASjsWaitingRequest"; +export * from "./ServerType"; +export * from "./Session"; diff --git a/src/utils/asyncForEach.ts b/src/utils/asyncForEach.ts new file mode 100644 index 0000000..9d71542 --- /dev/null +++ b/src/utils/asyncForEach.ts @@ -0,0 +1,5 @@ +export async function asyncForEach(array: any[], callback: any) { + for (let index = 0; index < array.length; index++) { + await callback(array[index], index, array); + } +} diff --git a/src/utils/compareTimestamps.ts b/src/utils/compareTimestamps.ts new file mode 100644 index 0000000..b7a5800 --- /dev/null +++ b/src/utils/compareTimestamps.ts @@ -0,0 +1,9 @@ +import { SASjsRequest } from "../types/SASjsRequest"; + +/** + * Comparator for SASjs request timestamps + * + */ +export const compareTimestamps = (a: SASjsRequest, b: SASjsRequest) => { + return b.timestamp.getTime() - a.timestamp.getTime(); +}; diff --git a/src/utils/convertToCsv.ts b/src/utils/convertToCsv.ts new file mode 100644 index 0000000..bfe0e01 --- /dev/null +++ b/src/utils/convertToCsv.ts @@ -0,0 +1,133 @@ +/** + * Converts the given JSON object to a CSV string. + * @param data - the JSON object to convert. + */ +export const convertToCSV = (data: any) => { + const replacer = (key: any, value: any) => (value === null ? "" : value); + const headerFields = Object.keys(data[0]); + let csvTest; + let invalidString = false; + const headers = headerFields.map((field) => { + let firstFoundType: string | null = null; + let hasMixedTypes: boolean = false; + let rowNumError: number = -1; + + const longestValueForField = data + .map((row: any, index: number) => { + if (row[field] || row[field] === "") { + if (firstFoundType) { + let currentFieldType = + row[field] === "" || typeof row[field] === "string" + ? "chars" + : "number"; + + if (!hasMixedTypes) { + hasMixedTypes = currentFieldType !== firstFoundType; + rowNumError = hasMixedTypes ? index + 1 : -1; + } + } else { + if (row[field] === "") { + firstFoundType = "chars"; + } else { + firstFoundType = + typeof row[field] === "string" ? "chars" : "number"; + } + } + + let byteSize; + + if (typeof row[field] === "string") { + let doubleQuotesFound = row[field] + .split("") + .filter((char: any) => char === '"'); + + byteSize = getByteSize(row[field]); + + if (doubleQuotesFound.length > 0) { + byteSize += doubleQuotesFound.length; + } + } + + return byteSize; + } + }) + .sort((a: number, b: number) => b - a)[0]; + if (longestValueForField && longestValueForField > 32765) { + invalidString = true; + } + if (hasMixedTypes) { + console.error( + `Row (${rowNumError}), Column (${field}) has mixed types: ERROR` + ); + } + + return `${field}:${firstFoundType === "chars" ? "$" : ""}${ + longestValueForField + ? longestValueForField + : firstFoundType === "chars" + ? "1" + : "best" + }.`; + }); + + if (invalidString) { + return "ERROR: LARGE STRING LENGTH"; + } + csvTest = data.map((row: any) => { + const fields = Object.keys(row).map((fieldName, index) => { + let value; + let containsSpecialChar = false; + const currentCell = row[fieldName]; + + if (JSON.stringify(currentCell).search(/(\\t|\\n|\\r)/gm) > -1) { + value = currentCell.toString(); + containsSpecialChar = true; + } else { + value = JSON.stringify(currentCell, replacer); + } + + value = value.replace(/\\\\/gm, "\\"); + + if (containsSpecialChar) { + if (value.includes(",") || value.includes('"')) { + value = '"' + value + '"'; + } + } else { + if ( + !value.includes(",") && + value.includes('"') && + !value.includes('\\"') + ) { + value = value.substring(1, value.length - 1); + } + + value = value.replace(/\\"/gm, '""'); + } + + value = value.replace(/\r\n/gm, "\n"); + + if (value === "" && headers[index].includes("best")) { + value = "."; + } + + return value; + }); + return fields.join(","); + }); + + let finalCSV = + headers.join(",").replace(/,/g, " ") + "\r\n" + csvTest.join("\r\n"); + + return finalCSV; +}; + +const getByteSize = (str: string) => { + let byteSize = str.length; + for (let i = str.length - 1; i >= 0; i--) { + const code = str.charCodeAt(i); + if (code > 0x7f && code <= 0x7ff) byteSize++; + else if (code > 0x7ff && code <= 0xffff) byteSize += 2; + if (code >= 0xdc00 && code <= 0xdfff) i--; //trail surrogate + } + return byteSize; +}; diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..b107529 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,14 @@ +export * from "./asyncForEach"; +export * from "./compareTimestamps"; +export * from "./convertToCsv"; +export * from "./isAuthorizeFormRequired"; +export * from "./isLoginRequired"; +export * from "./isLoginSuccess"; +export * from "./makeRequest"; +export * from "./needsRetry"; +export * from "./parseAndSubmitAuthorizeForm"; +export * from "./parseGeneratedCode"; +export * from "./parseSourceCode"; +export * from "./parseSasViyaLog"; +export * from "./serialize"; +export * from "./splitChunks"; diff --git a/src/utils/isAuthorizeFormRequired.ts b/src/utils/isAuthorizeFormRequired.ts new file mode 100644 index 0000000..a1d5b38 --- /dev/null +++ b/src/utils/isAuthorizeFormRequired.ts @@ -0,0 +1,3 @@ +export const isAuthorizeFormRequired = (response: string): boolean => { + return //gm.test(response); +}; diff --git a/src/utils/isLoginRequired.ts b/src/utils/isLoginRequired.ts new file mode 100644 index 0000000..65448bc --- /dev/null +++ b/src/utils/isLoginRequired.ts @@ -0,0 +1,5 @@ +export const isLogInRequired = (response: string): boolean => { + const pattern: RegExp = //gm; + const matches = pattern.test(response); + return matches; +}; diff --git a/src/utils/isLoginSuccess.ts b/src/utils/isLoginSuccess.ts new file mode 100644 index 0000000..40d46d2 --- /dev/null +++ b/src/utils/isLoginSuccess.ts @@ -0,0 +1,2 @@ +export const isLogInSuccess = (response: string): boolean => + /You have signed in/gm.test(response); diff --git a/src/utils/makeRequest.ts b/src/utils/makeRequest.ts new file mode 100644 index 0000000..1d28c23 --- /dev/null +++ b/src/utils/makeRequest.ts @@ -0,0 +1,37 @@ +import { CsrfToken } from "../types"; + +export async function makeRequest( + url: string, + request: RequestInit, + callback: (value: CsrfToken) => any, + contentType: "text" | "json" = "json" +): Promise { + const responseTransform = + contentType === "json" + ? (res: Response) => res.json() + : (res: Response) => res.text(); + const result = await fetch(url, request).then((response) => { + if (!response.ok) { + if (response.status === 403) { + const tokenHeader = response.headers.get("X-CSRF-HEADER"); + + if (tokenHeader) { + const token = response.headers.get(tokenHeader); + callback({ + headerName: tokenHeader, + value: token || "", + }); + + const retryRequest = { + ...request, + headers: { ...request.headers, [tokenHeader]: token }, + }; + return fetch(url, retryRequest).then(responseTransform); + } + } + } else { + return responseTransform(response); + } + }); + return result; +} diff --git a/src/utils/needsRetry.ts b/src/utils/needsRetry.ts new file mode 100644 index 0000000..cb70c6c --- /dev/null +++ b/src/utils/needsRetry.ts @@ -0,0 +1,11 @@ +export const needsRetry = (responseText: string): boolean => { + return ( + (responseText.includes('"errorCode":403') && + responseText.includes("_csrf") && + responseText.includes("X-CSRF-TOKEN")) || + (responseText.includes('"status":403') && + responseText.includes('"error":"Forbidden"')) || + (responseText.includes('"status":449') && + responseText.includes("Authentication success, retry original request")) + ); +}; diff --git a/src/utils/parseAndSubmitAuthorizeForm.ts b/src/utils/parseAndSubmitAuthorizeForm.ts new file mode 100644 index 0000000..7a3bf96 --- /dev/null +++ b/src/utils/parseAndSubmitAuthorizeForm.ts @@ -0,0 +1,49 @@ +export const parseAndSubmitAuthorizeForm = async ( + response: string, + serverUrl: string +) => { + let authUrl: string | null = null; + const params: any = {}; + + const responseBody = response.split("")[1].split("")[0]; + const bodyElement = document.createElement("div"); + bodyElement.innerHTML = responseBody; + + const form = bodyElement.querySelector("#application_authorization"); + authUrl = form ? serverUrl + form.getAttribute("action") : null; + + const inputs: any = form?.querySelectorAll("input"); + + for (const input of inputs) { + if (input.name === "user_oauth_approval") { + input.value = "true"; + } + + params[input.name] = input.value; + } + + const formData = new FormData(); + + for (const key in params) { + if (params.hasOwnProperty(key)) { + formData.append(key, params[key]); + } + } + + return new Promise((resolve, reject) => { + if (authUrl) { + fetch(authUrl, { + method: "POST", + credentials: "include", + body: formData, + referrerPolicy: "same-origin", + }) + .then((res) => res.text()) + .then((res) => { + resolve(res); + }); + } else { + reject("Auth form url is null"); + } + }); +}; diff --git a/src/utils/parseGeneratedCode.ts b/src/utils/parseGeneratedCode.ts new file mode 100644 index 0000000..74acce8 --- /dev/null +++ b/src/utils/parseGeneratedCode.ts @@ -0,0 +1,7 @@ +export const parseGeneratedCode = (log: string) => { + const startsWith = "MPRINT"; + const isGeneratedCodeLine = (line: string) => + line.trim().startsWith(startsWith); + const logLines = log.split("\n").filter(isGeneratedCodeLine); + return logLines.join("\r\n"); +}; diff --git a/src/utils/parseSasViyaLog.ts b/src/utils/parseSasViyaLog.ts new file mode 100644 index 0000000..2a29d78 --- /dev/null +++ b/src/utils/parseSasViyaLog.ts @@ -0,0 +1,12 @@ +export const parseSasViyaLog = (logResponse: { items: any[] }) => { + let log; + try { + log = logResponse.items + ? logResponse.items.map((i) => i.line).join("\n") + : JSON.stringify(logResponse); + } catch (e) { + console.error("An error has occurred while parsing the log response", e); + log = logResponse; + } + return log; +}; diff --git a/src/utils/parseSourceCode.ts b/src/utils/parseSourceCode.ts new file mode 100644 index 0000000..d5b8ac6 --- /dev/null +++ b/src/utils/parseSourceCode.ts @@ -0,0 +1,6 @@ +export const parseSourceCode = (log: string): string => { + const isSourceCodeLine = (line: string) => + line.trim().substring(0, 10).trimStart().match(/^\d/); + const logLines = log.split("\n").filter(isSourceCodeLine); + return logLines.join("\r\n"); +}; diff --git a/src/utils/serialize.ts b/src/utils/serialize.ts new file mode 100644 index 0000000..4816a5a --- /dev/null +++ b/src/utils/serialize.ts @@ -0,0 +1,15 @@ +export const serialize = (obj: any) => { + const str: any[] = []; + for (const p in obj) { + if (obj.hasOwnProperty(p)) { + if (obj[p] instanceof Array) { + for (let i = 0, n = obj[p].length; i < n; i++) { + str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p][i])); + } + } else { + str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); + } + } + } + return str.join("&"); +}; diff --git a/src/utils/splitChunks.ts b/src/utils/splitChunks.ts new file mode 100644 index 0000000..fa43fbc --- /dev/null +++ b/src/utils/splitChunks.ts @@ -0,0 +1,12 @@ +export const splitChunks = (content: string) => { + const size = 16000; + + const numChunks = Math.ceil(content.length / size); + const chunks = new Array(numChunks); + + for (let i = 0, o = 0; i < numChunks; ++i, o += size) { + chunks[i] = content.substr(o, size); + } + + return chunks; +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e3dc154 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "lib": ["ES2018", "DOM", "ES2019.String"], + "target": "es5", + "module": "commonjs", + "declaration": true, + "outDir": "./build", + "strict": true, + "sourceMap": true + }, + "include": ["src"], + "exclude": ["node_modules", "**/*.spec.ts"] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..63a462d --- /dev/null +++ b/tslint.json @@ -0,0 +1,9 @@ +{ + "extends": ["tslint:recommended", "tslint-config-prettier"], + "rules": { + "no-string-literal": false, + "forin": false, + "no-console": false, + "max-classes-per-file": false + } +} diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 0000000..49a1857 --- /dev/null +++ b/typedoc.json @@ -0,0 +1,42 @@ +{ + "out": "docs", + "includeDeclarations": true, + "exclude": "**/*+(index|.spec|.e2e).ts", + "ignoreCompilerErrors": true, + "disableOutputCheck": true, + "excludeExternals": true, + "excludePrivate": true, + "excludeNotExported": true, + "theme": "./node_modules/typedoc-neo-theme/bin/default", + "outline": [ + { + "SAS Adapter": { + "SASjs": "modules/sasjs", + "SASjsConfig": "classes/sasjsconfig.sasjsconfig-1", + "ServerType": "enums/servertype.servertype-1", + "SASjsRequest": "interfaces/sasjsrequest.sasjsrequest-1", + "SASjsWaitingRequest": "interfaces/sasjswaitingrequest.sasjswaitingrequest-1" + }, + "SAS Viya API Client": "classes/sasviyaapiclient.sasviyaapiclient-1", + "SAS 9 API Client": "classes/sas9apiclient.sas9apiclient-1" + } + ], + "links": [ + { + "label": "SASjs on Github", + "url": "https://github.com/macropeople/sasjs" + }, + { + "label": "SASjs.io", + "url": "https://sasjs.io" + }, + { + "label": "SASjs CLI", + "url": "https://github.com/macropeople/sasjs-cli" + }, + { + "label": "React Seed App", + "url": "https://github.com/macropeople/react-seed-app" + } + ] +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..4765d95 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,49 @@ +const path = require("path"); +const webpack = require("webpack"); +const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); + +const browserConfig = { + entry: "./src/index.ts", + devtool: "inline-source-map", + mode: "development", + optimization: { + minimize: false, + }, + module: { + rules: [ + { + test: /\.ts?$/, + use: "ts-loader", + exclude: /node_modules/, + }, + ], + }, + resolve: { + extensions: [".ts", ".js"], + }, + output: { + filename: "index.js", + path: path.resolve(__dirname, "build"), + libraryTarget: "umd", + library: "SASjs", + }, + plugins: [ + new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/), + new webpack.SourceMapDevToolPlugin({ + filename: null, + exclude: [/node_modules/], + test: /\.ts($|\?)/i, + }), + ], +}; + +const nodeConfig = { + ...browserConfig, + target: "node", + output: { + ...browserConfig.output, + path: path.resolve(__dirname, "build", "node"), + }, +}; + +module.exports = [browserConfig, nodeConfig];