Author SHA1 Message Date
Stevan Freeborn 9810482eef feat: wip on getAllApps method 2026-03-27 08:10:07 -05:00
Stevan Freeborn 944e84802c chore: update package.json scripts 2026-03-27 08:08:30 -05:00
StevanFreeborn 321baac650 docs: update docs 2026-03-25 19:54:58 +00:00
Stevan Freeborn b2af266eb4 Merge pull request #28 from StevanFreeborn/stevanfreeborn/fix/address-vuln-deps
fix: update dependencies to address vulnerabilities
2026-03-25 14:53:11 -05:00
Stevan Freeborn d83403e88d fix: update dependencies to address vulnerabilities 2026-03-25 14:45:12 -05:00
Stevan Freeborn 50fd735808 Merge pull request #23 from StevanFreeborn/stevanfreeborn/fix/address-vulns-in-deps
fix: update dependencies and address vulnerabilities in dependencies
2025-10-07 11:36:31 -05:00
StevanFreeborn e4a7e5c7c3 fix: resolve linter errors 2025-10-07 16:31:25 +00:00
Stevan Freeborn 5218f5598a chore: update github actions workflow 2025-10-07 11:30:45 -05:00
Stevan Freeborn b9f8929635 chore: update prettier config 2025-10-07 11:26:07 -05:00
Stevan Freeborn 0bf8f06952 fix: update dependencies and address vulnerabilities in dependencies 2025-10-07 11:19:07 -05:00
StevanFreeborn 22d6f5c1bc docs: update docs 2025-04-16 02:47:49 +00:00
Stevan Freeborn a9e12ca81f chore: remove testing from build and publish workflow 2025-04-15 21:45:21 -05:00
Stevan Freeborn 437dab014e chore: separate build step 2025-04-15 21:34:05 -05:00
Stevan Freeborn 1b76de3812 Merge pull request #20 from StevanFreeborn/stevanfreeborn/fix/pass-correct-ids-in-report-constructor
fix: make sure proper ids are passed to constructor
2025-04-15 21:21:00 -05:00
Stevan Freeborn cecf975255 chore: update workflows 2025-04-15 21:18:36 -05:00
Stevan Freeborn ca34b036a7 fix: make sure proper ids are passed to constructor
- swapped ids being passed to correct appId and id properties
  are set
- upgraded out of date dependencies
- addressed vulnerable dependcies
2025-04-15 21:02:11 -05:00
Stevan Freeborn b89c1cfa45 Merge pull request #16 from StevanFreeborn/dependabot/github_actions/dot-github/workflows/actions/download-artifact-4.1.7
chore(deps): bump actions/download-artifact from 3.0.2 to 4.1.7 in /.github/workflows
2024-09-04 09:02:05 -05:00
dependabot[bot] cece16c03f chore(deps): bump actions/download-artifact in /.github/workflows
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3.0.2 to 4.1.7.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v3.0.2...v4.1.7)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-04 14:00:36 +00:00
11 changed files with 1430 additions and 1042 deletions
+24 -11
View File
@@ -1,12 +1,25 @@
################################################################################# #/-------------------.env.vault---------------------/
# # #/ cloud-agnostic vaulting standard /
# This file uniquely identifies your project in dotenv-vault. # #/ [how it works](https://dotenv.org/env-vault) /
# You SHOULD commit this file to source control. # #/--------------------------------------------------/
# #
# Generated with 'npx dotenv-vault new' #
# #
# Learn more at https://dotenv.org/env-vault #
# #
#################################################################################
DOTENV_VAULT=vlt_ec81c3b4428f6b230fe7295edceef4214cd1b7b5b04982ab652b12393652128a # development
DOTENV_VAULT_DEVELOPMENT="EET3bpW+THawI82WM7Y9pQjrM01fy6ll19KJe3j/PeOGvKL03yMoX9UO/F9WAWYL/2+IQSuRIH20MHo0VlnCzUBOVDqwtLHZu9Cp9Sx7NJVZx58JvOLmKUwJxTgVkyQ82TnjiwDiblrvRshXD4fMKvX+PeONQBP2QrQQ8wmkb/q9ftMlZ3sSt/QnWl8xz6Ima5YCrnAHJxmZDSToCQ6nALhmZMxeJr3JlHQwCQ4g3MA4e55+okvC6HbAYrRMnDO15PKjP9t09SkzbMutk0HLDGrgufcrXJwezgQttj1eW5MykwUV035Ll9G+RZ5PLIOy4ZabTGfrJawdnCytBNjwCze/iOwAl6Po6nKWf7oKu3sw8D+s2mW99mVa9n2s6ynnPLFv8C26h5C+G361e/mV6HaQwAaXlWeCRb5Px59R7kWllsOl9SCll0qeBSzYkB6ML4Bs01dVCmDxEcdc7bImm/pl5NrmwreCvbhNSJjjJOY8nKdMr57xdzdZJPLeNNcEf3M5EHuPbUvQTaddSl3xzt6kz4f1Ri/P2yG/WsFxfvNQmmvUCZJ9Eo3wrqnXY4SAHBqxrhYs/gGVpcw7xudzUdHeAcCJA5tBbLwUWzP1rYdwvKzQZBFKSvDIvh1ltKUXxwF+A2y/7CIneQ41v9KXc6yP40tprmmHxXbJ+JJB0CmWCiCVciL2FymWYXXLNUn6HC6/qCaKC809qMM2aIgpPkRdNvQFB90kbDNbhCY2+s/0JUzy+SpmIS2UXC9sltW8yi7fLfeTdoSTCAw+CQqarQMYwtpCJBKNSQidXwWHzj9uXx1dw8993brAJnfweQxJmS61kkz23+y4j9owWxbwItmf3LAvNFXnjPyHml9vPr+aISY0qAL8qUMStXAU1i5vL01xKAsKYEwkEbNZ6U7aCBkrdKQSPKspyHlFqqvhAkzSnK1cffOkKTrUG7U5pMYuCp8HGshvoWXzItxuvke3BjgCf3eeCZFWFDr6iWo5oMa/Nh6ZLUQCdYdv0lbtKldconb64UJl+a+7I+MtlpZo8NhiuSKrJGkbFJO8j8XWfosqNHbocjMMyAyZ6KzWjuxhuSTWRkLERCrbrz8mnVMnNLBYCCdd676XMPkLjo3/w9rCVrWXA5gCdaaUNmn16w=="
DOTENV_VAULT_DEVELOPMENT_VERSION=2
# ci
DOTENV_VAULT_CI="0xoqtgp12KwxYGAXEELvdfPJhjEtQlCCUfNAujsfr60v8BFkrhLY2uD29NyCb0AqSmbT+j4ylx4jgt2gygNMWUkjHbv0wG8M1aJNUqKxmPe7K/zxrWecVxvLLefxVICiGv33sf3U4VfKXo4nVZJEMLjUDP+InmxQMLiuoSnFuW1m5vBfj3bWzO26Ihra7Di0lgOvZf6MBn7My96IRUy/fjoooVuQ9ZR0c7426nldVUYQPMgqG1zER9dton2hw2mCBM3Y4FnE4A52hjgp3j9jBeUyQptKjmFFMOkoPbGTtcZGMxnYe3kfv68rSzVgURb7HqVqNBHsQXGvplkOAzUjoFLNX9xy0/23Jq4bI620mfo2I1rBSanTydL4u8ND5/miCs2TFG6m1PQXr42wm6x6LNee7udOrgVHc/xtuausJ10QOYykgVX5AljqCpdHV6bi0/N9NvK1rptIIip+YsIovWkm5eetZNuMErBLVNXMxPlAzC6lJiKTPvsdiERBUpIooCybRZugopSBsrUl12WpmIim/ZqSt5AH2r6MFuZGzn6jQ85Y2XMllQtfbX4mu0a3rYnpFNKion/oIncCq+Cjb5+ml+u4T+/zh/q1L8k3V8ozvZ2JZbLATvaWdPJXx/UCGVwURhZhD13BaKSKtYYLZZ0WbmeoybfYbPSYZnC0nZG1QjOO3guVkXERSPdj8EXv+bCUyBSJhN6oBWRgRbU7TsAV8scAYwhWZjcjbsQCHFzITjEW3GmRVIiv43m0EDJC8FUvCYGwYe6c4ZKH44ND16L9VIr9s2zL9MV+OBw6wdkqrqUXTMSUMk86PJTDIgIXf5dSzpaa5CYoLyfdl70uWJ7VzqTo0G2rD+2BWCdtFQQ8G+TDJFL9RxXyh9iPEEDJ29mRIOi8bDmhX9DJXaaXa2MQ88oYiw=="
DOTENV_VAULT_CI_VERSION=2
# staging
DOTENV_VAULT_STAGING="GSOelGYItlUhRndkRS534Ml6GACM4pSw8J+Afno3B8MVMg+6Y+/rDzpfYs0r0+f7JMwL9IXFg5xIhJY+R01RWoUsRryBISmRvtOhKyW3FLKwdGkxMnjrJmOFBYRiVrLe/lJ2TSaSJoFzyddMuCjGPRuLXokx+DamzAfgRZmOGLASCX6NcoL6TPZJJFG+EWsP1oT7aYZe/TRa9Ls8U7MECajPOwr4/JYloUacLsI3+OANwZohHk06VO5J1vcFfT3YxcEYiQckhXB2ThQ/lEw6yZ19CZywQvDbEEb8Mx4T1W71FhyrIi8g4HXux9o7PjbBD0tTleetAtwFc3uVWieQP8Mz0TCPKK7SIlGF2Q8B2z7DZzNOPd4oeJmhRi0sCy9B8ln+QfudukqaSLSg0Ep6J9hv7qcjP2IVqM2DxpsyStgn58rNTrl7DQsOSiKmYhkfp4nLQ5OQFXvBuBD2vuYGq8Hn4IgJYiAed8UjqhYDPp8JEQmKA+dncjSUxyhSVc26SpeE0GGe61IeXiW2SPyCS2MU5k+ddkO/vB2xP/NCqXuL0p3DAyeM0d1nE/XCM8ffMgCmVnOsn7FyEnYus+YNQ0plIY9zA5ViM+vLCDMSpMlEasc/7gIo6bIn0LA3G+iwTS51h5Nh6WdGDk+43DnLbwAndcEnz9w8yOhPvsbR0AVXwW4pS8Y6X4c5NRhhviEcEjLgtPHXDF3Qq8px8fVYDAUtchsMmr2nZlsC2YqAzbZyA/kgzzPkyG8cc6LO7JOZYcZaWzaMG//JeDO4nEWEo4tV+uB3tjKSHiBGRzVTFbsAWYfzCrr2KeSA8M4ilF6oUEx98y0HQuC6oGd4zU/tr30/nZzMlwmTOfKRdn1QYlZnOa20eZWAqH2KMB+c6+r8ptHpK0ra8rw+8pQriUEa0QlWDNZrrw=="
DOTENV_VAULT_STAGING_VERSION=2
# production
DOTENV_VAULT_PRODUCTION="svC1qRFQixGHF02zu8WYycTaySFghAlgtJOFI2o2zHQt1DOWBv1Vl/0dEkowI8Ce2uoK9fMEI3prh4RY8dGjk71m3ifqTDGAnlodNzjyOtGLBZP6llA8BX8f4qy/lXJMLZ3PkHU+gPofNfXS05XFGP/NDgvxvGW7ouqGhqQhR3dGNRi6oEP9Gwk/A64QpldTfSWHSFmdV92VcnFkZEHkYfFr78JOKFbCV4OwDZVArMi/8cnjQbQwyjJtE5bxqhyOmDgrqjkoDX7kcz6cpkYB+Lp8Ruv5Os8p+dwJuqWlb46kGl5D08N177u64Pj9/aD0vhNMfKQ1sDDvCq1acCAU/5UeYmUnKXEIHuEnB2+8TcIje5RPF7eyBLrqd+1P+QtatacvTif19IfM9PyhqlzFbDmT+6ykVj1OT7OHczXxXELFJkA0K0Z/CHqjDaAexFbI/9SZsW+yoH757ceQxo6w65TJMeoggX97y2LCMZzHzi78VZOCgHWGrEXoVfU1XYK7rtDILEF8NsXyrr2DZsGPkJSp71rGWm1TSf5KCmJBb+3AIS83vIGLlBtwSxkfWEJW98izfYmBTjHUnnMh7h7QIPBcMFtTLHGKcdH1XQuWsKuYGNb5rgW6C1xgdN6UYGv4x9mOGeqT53xpPNk78aYGGhDtVeHQUGOJENbQX2/ZYLDI0LuCKVbay1KuaadPclQD6DyI6j7fZ8dSEFqwjCtq7LRKnGUXdYOQEaHgaE5NyuP0tOfA/4G9tduNtXjylgiDLrGiPWmlqJccHBoIP+fJophLjzSlVa/xITCKvXkTHTRAjmshou426bh0KVrDLFKXXonH8l3u/STPQQ3CCpVyuk8yvTyABDcnnBBhnfEE22uZJaboo/UtD6UWN7d279FOEBcO3jDVObMwvzWORchVbdNyTPxSPg=="
DOTENV_VAULT_PRODUCTION_VERSION=2
#/----------------settings/metadata-----------------/
DOTENV_VAULT="vlt_ec81c3b4428f6b230fe7295edceef4214cd1b7b5b04982ab652b12393652128a"
DOTENV_API_URL="https://vault.dotenv.org"
DOTENV_CLI="npx dotenv-vault@latest"
+8 -38
View File
@@ -20,44 +20,14 @@ jobs:
node-version: lts/* node-version: lts/*
- name: Install dependencies - name: Install dependencies
run: npm install run: npm install
- name: Build package - name: Build ESM
run: npm run build run: npm run build:esm
env: - name: Build CJS
API_BASE_URL: ${{ vars.API_BASE_URL }} run: npm run build:cjs
SANDBOX_API_KEY: ${{ secrets.SANDBOX_API_KEY }} - name: Build package.json
TEST_APP_ID: ${{ vars.TEST_APP_ID }} run: npm run build:json
TEST_APP_IDS: ${{ vars.TEST_APP_IDS }}
TEST_APP_IDS_NO_ACCESS: ${{ vars.TEST_APP_IDS_NO_ACCESS }}
TEST_APP_ID_NO_ACCESS: ${{ vars.TEST_APP_ID_NO_ACCESS }}
TEST_ATTACHMENT: ${{ vars.TEST_ATTACHMENT }}
TEST_ATTACHMENT_FIELD: ${{ vars.TEST_ATTACHMENT_FIELD }}
TEST_ATTACHMENT_FIELD_NO_ACCESS_APP: ${{ vars.TEST_ATTACHMENT_FIELD_NO_ACCESS_APP }}
TEST_ATTACHMENT_FIELD_NO_ACCESS_FIELD: ${{ vars.TEST_ATTACHMENT_FIELD_NO_ACCESS_FIELD }}
TEST_FIELD_ID: ${{ vars.TEST_FIELD_ID }}
TEST_FIELD_IDS: ${{ vars.TEST_FIELD_IDS }}
TEST_FIELD_IDS_NO_ACCESS: ${{ vars.TEST_FIELD_IDS_NO_ACCESS }}
TEST_FIELD_ID_NO_ACCESS: ${{ vars.TEST_FIELD_ID_NO_ACCESS }}
TEST_IMAGE: ${{ vars.TEST_IMAGE }}
TEST_IMAGE_FIELD: ${{ vars.TEST_IMAGE_FIELD }}
TEST_LIST_FIELD: ${{ vars.TEST_LIST_FIELD }}
TEST_LIST_FIELD_NO_ACCESS: ${{ vars.TEST_LIST_FIELD_NO_ACCESS }}
TEST_LIST_ID: ${{ vars.TEST_LIST_ID }}
TEST_LIST_ID_NO_ACCESS: ${{ vars.TEST_LIST_ID_NO_ACCESS }}
TEST_LIST_ITEM_ID_NO_ACCESS: ${{ vars.TEST_LIST_ITEM_ID_NO_ACCESS }}
TEST_RECORD: ${{ vars.TEST_RECORD }}
TEST_REPORT: ${{ vars.TEST_REPORT }}
TEST_REPORT_NO_ACCESS: ${{ vars.TEST_REPORT_NO_ACCESS }}
TEST_REPORT_WITH_CHART_DATA: ${{ vars.TEST_REPORT_WITH_CHART_DATA }}
TEST_SURVEY_AUTO_NUMBER_FIELD: ${{ vars.TEST_SURVEY_AUTO_NUMBER_FIELD }}
TEST_SURVEY_ID: ${{ vars.TEST_SURVEY_ID }}
TEST_SURVEY_RECORD_ID: ${{ vars.TEST_SURVEY_RECORD_ID }}
TEST_TEXT_FIELD: ${{ vars.TEST_TEXT_FIELD }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Upload build artifact - name: Upload build artifact
uses: actions/upload-artifact@v3.1.2 uses: actions/upload-artifact@v4
with: with:
name: build name: build
path: ./dist path: ./dist
@@ -97,7 +67,7 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: npm install run: npm install
- name: Download build artifact - name: Download build artifact
uses: actions/download-artifact@v3.0.2 uses: actions/download-artifact@v4.1.7
with: with:
name: build name: build
path: ./dist path: ./dist
+5 -4
View File
@@ -17,6 +17,7 @@ jobs:
- name: Check out repository - name: Check out repository
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.ACTIONS_PAT }} token: ${{ secrets.ACTIONS_PAT }}
- name: Setup node - name: Setup node
uses: actions/setup-node@v4 uses: actions/setup-node@v4
@@ -114,9 +115,9 @@ jobs:
TEST_SURVEY_RECORD_ID: ${{ vars.TEST_SURVEY_RECORD_ID }} TEST_SURVEY_RECORD_ID: ${{ vars.TEST_SURVEY_RECORD_ID }}
TEST_TEXT_FIELD: ${{ vars.TEST_TEXT_FIELD }} TEST_TEXT_FIELD: ${{ vars.TEST_TEXT_FIELD }}
- name: Upload test coverage artifact - name: Upload test coverage artifact
uses: actions/upload-artifact@v3.1.2 uses: actions/upload-artifact@v4
with: with:
name: coverage name: coverage-${{ matrix.node-version }}
path: ./coverage path: ./coverage
publish_test_coverage: publish_test_coverage:
needs: test needs: test
@@ -126,9 +127,9 @@ jobs:
- name: Check out repository - name: Check out repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Download test coverage artifact - name: Download test coverage artifact
uses: actions/download-artifact@v3.0.2 uses: actions/download-artifact@v4.1.7
with: with:
name: coverage name: coverage-20.x
path: ./coverage path: ./coverage
- name: Upload coverage reports to Codecov - name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4 uses: codecov/codecov-action@v4
+2 -1
View File
@@ -3,5 +3,6 @@
"tabWidth": 2, "tabWidth": 2,
"semi": true, "semi": true,
"singleQuote": true, "singleQuote": true,
"bracketSpacing": true "bracketSpacing": true,
"endOfLine": "auto"
} }
+53 -39
View File
@@ -49,7 +49,10 @@
--color-scheme: var(--md-sys-color-scheme); */ --color-scheme: var(--md-sys-color-scheme); */
--top-app-bar-height: 4.5rem; --top-app-bar-height: 4.5rem;
--top-app-bar-padding-vertical: .5rem;
--footer-height: 3.5rem; --footer-height: 3.5rem;
--safe-area-inset-top: env(safe-area-inset-top);
} }
body { body {
@@ -64,15 +67,33 @@ img {
max-width: 100%; max-width: 100%;
} }
*::-webkit-scrollbar { @supports not selector(::-webkit-scrollbar) {
width: 8px; * {
height: 8px; scrollbar-width: thin;
scrollbar-color: var(--color-accent) transparent;
}
} }
*::-webkit-scrollbar-track {
background: none; @supports selector(::-webkit-scrollbar) {
} *::-webkit-scrollbar {
*::-webkit-scrollbar-thumb { width: 8px;
border: none; height: 8px;
}
*::-webkit-scrollbar-track {
background: none;
margin: 4px;
}
*::-webkit-scrollbar-thumb {
border: none;
}
*::-webkit-scrollbar-thumb:hover,
*::-webkit-scrollbar-thumb:active {
background-color: var(--md-sys-color-secondary);
}
* {
scrollbar-width: unset;
scrollbar-color: unset;
}
} }
.container-main { .container-main {
@@ -82,12 +103,13 @@ img {
overflow: hidden; overflow: hidden;
box-sizing: border-box; box-sizing: border-box;
padding: 1.75rem; padding: 1.75rem;
margin-bottom: 1.75rem;
border-radius: 28px; border-radius: 28px;
background-color: var(--md-sys-color-surface); background-color: var(--md-sys-color-surface);
} }
.page-menu { .page-menu {
height: fit-content; height: fit-content;
padding: 0.75rem 1.75rem; padding: 1.25rem 1.75rem;
border-radius: 28px; border-radius: 28px;
background-color: var(--md-sys-color-surface); background-color: var(--md-sys-color-surface);
} }
@@ -96,51 +118,40 @@ img {
position: relative; position: relative;
} }
.title { .title {
display: block; display: inline-block;
max-width: calc(100% - 5rem);
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
font-size: 22px; font-size: 22px;
} }
.tsd-page-title {
word-break: break-all;
}
.tsd-page-toolbar { .tsd-page-toolbar {
padding: 8px 0; padding: 1rem 0;
height: calc(var(--top-app-bar-height) - 16px);
background-color: var(--color-background); background-color: var(--color-background);
border-bottom: none; border-bottom: none;
} }
.tsd-page-toolbar .tsd-toolbar-contents {
height: 56px;
}
.tsd-page-toolbar .table-cell {
height: 56px;
margin-left: 1.5rem;
}
.tsd-page-toolbar .tsd-toolbar-icon { .tsd-page-toolbar .tsd-toolbar-icon {
padding: 20px 0; padding: 20px 0;
} }
#tsd-search { #tsd-search {
line-height: 56px; border-radius: 38px;
}
#tsd-search-input {
border-radius: 22px; border-radius: 22px;
} }
#tsd-search .results { #tsd-search-input:focus-visible {
z-index: -1; background-color: var(--color-accent);
top: calc(56px - 22px);
padding-top: 22px;
box-shadow: 0px 4px 2px rgba(0, 0, 0, 0.125);
background-color: var(--color-background-secondary);
border-bottom-left-radius: 22px;
border-bottom-right-radius: 22px;
overflow: hidden;
} }
#tsd-search .results li { #tsd-search-results > li {
background: none; background: none;
} }
#tsd-search .results a { #tsd-toolbar-menu-trigger,
padding: 1rem 0.25rem; #tsd-search-trigger {
border-radius: 50%;
} }
.col-sidebar { html:not(.has-menu) .col-sidebar {
padding-top: 0; padding-top: 0;
margin-right: 1rem; margin-right: 1rem;
} }
@@ -165,6 +176,9 @@ img {
text-decoration: none; text-decoration: none;
background-color: var(--md-sys-color-surface-container-high); background-color: var(--md-sys-color-surface-container-high);
} }
.page-menu .tsd-accordion-summary {
margin-bottom: 0.5rem;
}
.page-menu .tsd-accordion-summary svg { .page-menu .tsd-accordion-summary svg {
position: absolute; position: absolute;
right: 0; right: 0;
@@ -189,10 +203,10 @@ img {
.tsd-navigation .tsd-accordion-summary { .tsd-navigation .tsd-accordion-summary {
width: 100%; width: 100%;
} }
.tsd-accordion .tsd-accordion-summary > svg,
.tsd-index-accordion .tsd-accordion-summary > svg { .tsd-index-accordion .tsd-accordion-summary > svg {
position: absolute; position: absolute;
right: 1.5rem; right: 1.5rem;
margin-top: 1rem;
} }
.tsd-accordion-summary .tsd-kind-icon ~ span { .tsd-accordion-summary .tsd-kind-icon ~ span {
margin-right: 2.5rem; margin-right: 2.5rem;
@@ -217,9 +231,6 @@ img {
} }
@media (max-width: 769px) { @media (max-width: 769px) {
.container {
padding: 1rem;
}
.col-sidebar { .col-sidebar {
margin-right: 0; margin-right: 0;
} }
@@ -238,6 +249,9 @@ img {
max-height: calc(100vh - var(--footer-height) - var(--top-app-bar-height)); max-height: calc(100vh - var(--footer-height) - var(--top-app-bar-height));
top: var(--top-app-bar-height); top: var(--top-app-bar-height);
} }
.site-menu {
margin-top: 0;
}
.page-menu { .page-menu {
margin-left: 1rem; margin-left: 1rem;
} }
+1 -1
View File
@@ -215,7 +215,7 @@
<li>An ApiResponse<FileInfo>.</li> <li>An ApiResponse<FileInfo>.</li>
</ul> </ul>
<div class="tsd-comment tsd-typography"><h4>Method</h4><p>asFileInfoType - Converts the ApiResponse to an ApiResponse<FileInfo>.</p> <div class="tsd-comment tsd-typography"><h4>Method</h4><p>asFileInfoType - Converts the ApiResponse to an ApiResponse<FileInfo>.</p>
</div><aside class="tsd-sources"><ul><li>Defined in models/ApiResponse.ts:245</li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="asFileType" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>as<wbr/>File<wbr/>Type</span><a href="#asFileType" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="asFileType.asFileType-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">as<wbr/>File<wbr/>Type</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">response</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="ApiResponse.html" class="tsd-signature-type tsd-kind-class">ApiResponse</a><span class="tsd-signature-symbol">&lt;</span><a href="File.html" class="tsd-signature-type tsd-kind-class">File</a><span class="tsd-signature-symbol">&gt;</span><a href="#asFileType.asFileType-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">response</span>: <span class="tsd-signature-type">AxiosResponse</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">&gt;</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <a href="ApiResponse.html" class="tsd-signature-type tsd-kind-class">ApiResponse</a><span class="tsd-signature-symbol">&lt;</span><a href="File.html" class="tsd-signature-type tsd-kind-class">File</a><span class="tsd-signature-symbol">&gt;</span></h4><ul> </div><aside class="tsd-sources"><ul><li>Defined in models/ApiResponse.ts:245</li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="asFileType" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>as<wbr/>File<wbr/>Type</span><a href="#asFileType" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="asFileType.asFileType-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">as<wbr/>File<wbr/>Type</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">response</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="ApiResponse.html" class="tsd-signature-type tsd-kind-class">ApiResponse</a><span class="tsd-signature-symbol">&lt;</span><a href="File.html" class="tsd-signature-type tsd-kind-class">File</a><span class="tsd-signature-symbol">&gt;</span><a href="#asFileType.asFileType-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">response</span>: <span class="tsd-signature-type">AxiosResponse</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-symbol">{}</span><span class="tsd-signature-symbol">&gt;</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <a href="ApiResponse.html" class="tsd-signature-type tsd-kind-class">ApiResponse</a><span class="tsd-signature-symbol">&lt;</span><a href="File.html" class="tsd-signature-type tsd-kind-class">File</a><span class="tsd-signature-symbol">&gt;</span></h4><ul>
<li>An ApiResponse<File>.</li> <li>An ApiResponse<File>.</li>
</ul> </ul>
<div class="tsd-comment tsd-typography"><h4>Method</h4><p>asFileType - Converts the ApiResponse to an ApiResponse<File>.</p> <div class="tsd-comment tsd-typography"><h4>Method</h4><p>asFileType - Converts the ApiResponse to an ApiResponse<File>.</p>
+1212 -931
View File
File diff suppressed because it is too large Load Diff
+18 -16
View File
@@ -50,9 +50,11 @@
"format-staged": "pretty-quick --staged", "format-staged": "pretty-quick --staged",
"format": "pretty-quick", "format": "pretty-quick",
"build": "npm run test-coverage:ci && npm run clean && tsc --project tsconfig.cjs.json && tsc --project tsconfig.esm.json && node ./scripts/create_dist_package_json.js", "build": "npm run test-coverage:ci && npm run clean && tsc --project tsconfig.cjs.json && tsc --project tsconfig.esm.json && node ./scripts/create_dist_package_json.js",
"test:unit": "mocha -r ts-node/register", "build:esm": "tsc --project tsconfig.esm.json",
"test:integration": "mocha -r ts-node/register -r integrationTests/mochaRootHooks.ts", "build:cjs": "tsc --project tsconfig.cjs.json",
"build:json": "node ./scripts/create_dist_package_json.js",
"tests:unit": "mocha -R progress -r ts-node/register ./tests/**/*.spec.ts", "tests:unit": "mocha -R progress -r ts-node/register ./tests/**/*.spec.ts",
"tests:unit:watch": "mocha -w --watch-files . -R progress -r ts-node/register ./tests/**/*.spec.ts",
"tests:integration": "mocha -R progress -r ts-node/register -r integrationTests/mochaRootHooks.ts ./integrationTests/**/*.spec.ts", "tests:integration": "mocha -R progress -r ts-node/register -r integrationTests/mochaRootHooks.ts ./integrationTests/**/*.spec.ts",
"tests": "mocha -R progress -r ts-node/register ./tests/**/*.spec.ts && mocha -R progress -r ts-node/register -r integrationTests/mochaRootHooks.ts ./integrationTests/**/*.spec.ts", "tests": "mocha -R progress -r ts-node/register ./tests/**/*.spec.ts && mocha -R progress -r ts-node/register -r integrationTests/mochaRootHooks.ts ./integrationTests/**/*.spec.ts",
"test-coverage": "nyc npm run tests:unit", "test-coverage": "nyc npm run tests:unit",
@@ -63,34 +65,34 @@
"@commitlint/cli": "^17.8.1", "@commitlint/cli": "^17.8.1",
"@commitlint/config-conventional": "^17.8.1", "@commitlint/config-conventional": "^17.8.1",
"@istanbuljs/nyc-config-typescript": "^1.0.2", "@istanbuljs/nyc-config-typescript": "^1.0.2",
"@types/chai": "^4.3.16", "@types/chai": "^4.3.20",
"@types/mocha": "^10.0.7", "@types/mocha": "^10.0.10",
"@types/node": "^18.19.41", "@types/node": "^18.19.129",
"@types/sinon": "^10.0.20", "@types/sinon": "^10.0.20",
"@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0", "@typescript-eslint/parser": "^5.62.0",
"chai": "^4.4.1", "chai": "^4.5.0",
"dotenv": "^16.4.5", "dotenv": "^16.6.1",
"eslint": "^8.57.0", "eslint": "^8.57.1",
"eslint-config-prettier": "^8.10.0", "eslint-config-prettier": "^8.10.2",
"eslint-config-standard-with-typescript": "^34.0.1", "eslint-config-standard-with-typescript": "^34.0.1",
"eslint-plugin-import": "^2.29.1", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-mocha": "^10.4.3", "eslint-plugin-mocha": "^10.5.0",
"eslint-plugin-n": "^15.7.0", "eslint-plugin-n": "^15.7.0",
"eslint-plugin-promise": "^6.4.0", "eslint-plugin-promise": "^6.6.0",
"husky": "^8.0.3", "husky": "^8.0.3",
"mocha": "^10.6.0", "mocha": "^10.8.2",
"nyc": "^15.1.0", "nyc": "^15.1.0",
"prettier": "^2.8.8", "prettier": "^2.8.8",
"pretty-quick": "^3.3.1", "pretty-quick": "^3.3.1",
"sinon": "^15.2.0", "sinon": "^15.2.0",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typedoc": "^0.25.13", "typedoc": "^0.25.13",
"typedoc-material-theme": "^1.1.0", "typedoc-material-theme": "^1.4.0",
"typescript": "^4.9.5" "typescript": "^4.9.5"
}, },
"dependencies": { "dependencies": {
"axios": "^1.7.4", "axios": "^1.13.6",
"form-data": "^4.0.0" "form-data": "^4.0.5"
} }
} }
+1 -1
View File
@@ -323,7 +323,7 @@ export class ApiResponse<T> {
const apiResponse = this as ApiResponse<any>; const apiResponse = this as ApiResponse<any>;
const reports = apiResponse.data.items.map((item: any) => { const reports = apiResponse.data.items.map((item: any) => {
return new Report(item.id, item.appId, item.name, item.description); return new Report(item.appId, item.id, item.name, item.description);
}); });
const getPagedReportsResponse = new GetPagedReportsResponse( const getPagedReportsResponse = new GetPagedReportsResponse(
+27
View File
@@ -111,6 +111,33 @@ export class OnspringClient {
return apiResponse.asGetPagedAppsResponseType(); return apiResponse.asGetPagedAppsResponseType();
} }
/**
* @method getAllApps - Gets an iterable that can be used to page through all.
* @param {PagingRequest} pagingRequest - The paging request that will be used to get the apps.
* @returns
**/
public async *getAllApps(
pagingRequest: PagingRequest = new PagingRequest(1, 50)
): AsyncGenerator<ApiResponse<GetPagedAppsResponse>, void, unknown> {
// TODO: We need to actually honor the page request
// the caller gave us. We will use the page number
// as our starting page number and we will use the
// page size as our page size
for await (const page of this.getAllPagesAsync<GetPagedAppsResponse>(
async (pr) => await this.getApps(pr)
)) {
yield page;
}
}
private async *getAllPagesAsync<T>(
callback: (pagingRequest: PagingRequest) => Promise<ApiResponse<T>>
): AsyncGenerator<ApiResponse<T>, void, unknown> {
const pagingRequest = new PagingRequest(1, 50);
const initialResponse = await callback(pagingRequest);
yield initialResponse;
}
/** /**
* @method getAppById - Gets an app by its id. * @method getAppById - Gets an app by its id.
* @param {number} appId - The id of the app to get. * @param {number} appId - The id of the app to get.
+79
View File
@@ -232,6 +232,85 @@ describe('OnspringClient', function () {
}); });
}); });
describe('getAllApps', function () {
it('should be define', function () {
expect(new OnspringClient(baseUrl, apiKey).getAllApps).to.not.be
.undefined;
});
it('should be a function', function () {
expect(new OnspringClient(baseUrl, apiKey).getAllApps).to.be.a(
'function'
);
});
it('should have 0 parameter', function () {
expect(new OnspringClient(baseUrl, apiKey).getAllApps).to.have.lengthOf(
0
);
});
it('should return a async generator', function () {
const result = new OnspringClient(baseUrl, apiKey).getAllApps();
expect(result).to.have.property(Symbol.asyncIterator);
expect(result[Symbol.asyncIterator]).to.be.a('function');
expect(result).to.have.property('next').that.is.a('function');
expect(result).to.have.property('return').that.is.a('function');
expect(result).to.have.property('throw').that.is.a('function');
});
it('should return a promise that resolves to an async iterable of paged response of apps when request is successful', async function () {
const client = new OnspringClient(baseUrl, apiKey);
const mockAxiosClient = axios.create({
baseURL: baseUrl,
headers: {
'x-apikey': apiKey,
'x-api-version': '2',
},
});
sinon.stub(mockAxiosClient, 'get').returns(
Promise.resolve({
status: 200,
statusText: 'OK',
data: {
pageNumber: 1,
pageSize: 2,
totalPages: 1,
totalRecords: 2,
items: [
{
href: 'https://api.onspring.dev/Apps/id/1',
id: '1',
name: 'Test App 1',
},
{
href: 'https://api.onspring.dev/Apps/id/2',
id: '2',
name: 'Test App 2',
},
],
},
headers: {},
config: {} as InternalAxiosRequestConfig,
} as AxiosResponse)
);
sinon.stub(client, '_client' as any).value(mockAxiosClient);
const collectedPages: Array<ApiResponse<GetPagedAppsResponse>> = [];
for await (const page of client.getAllApps()) {
collectedPages.push(page);
}
expect(collectedPages.length).to.equal(1);
});
});
describe('getApps', function () { describe('getApps', function () {
it('should be defined', function () { it('should be defined', function () {
expect(new OnspringClient(baseUrl, apiKey).getApps).to.not.be.undefined; expect(new OnspringClient(baseUrl, apiKey).getApps).to.not.be.undefined;