autnam 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/.env.example +2 -0
- package/.eslintrc.json +37 -0
- package/.github/workflows/deploy-docs.yml +27 -0
- package/.github/workflows/pre-release-tests.yml +49 -0
- package/.github/workflows/pull-request-tests.yml +49 -0
- package/.github/workflows/release.yml +75 -0
- package/.prettierignore +2 -0
- package/.prettierrc +19 -0
- package/.vscode/launch.json +25 -0
- package/.vscode/settings.json +5 -0
- package/codecov.yml +7 -0
- package/commitlint.config.cjs +41 -0
- package/demos/.eslintrc.js +13 -0
- package/demos/ago-node-cli/README.md +30 -0
- package/demos/ago-node-cli/ago.js +31 -0
- package/demos/ago-node-cli/index.js +11 -0
- package/demos/ago-node-cli/lib/item-export-command.js +48 -0
- package/demos/ago-node-cli/lib/item-search-command.js +32 -0
- package/demos/ago-node-cli/package.json +29 -0
- package/demos/attachments-browser/README.md +7 -0
- package/demos/attachments-browser/index.html +165 -0
- package/demos/attachments-browser/package.json +15 -0
- package/demos/attachments-node/README.md +4 -0
- package/demos/attachments-node/image.jpg +0 -0
- package/demos/attachments-node/index.js +89 -0
- package/demos/attachments-node/package.json +19 -0
- package/demos/batch-geocoder-node/NYC_Restaurant_Inspection_Results.csv +100 -0
- package/demos/batch-geocoder-node/README.md +13 -0
- package/demos/batch-geocoder-node/batch-geocode.js +112 -0
- package/demos/batch-geocoder-node/config-template.js +18 -0
- package/demos/batch-geocoder-node/package.json +34 -0
- package/demos/browser-es-modules/README.md +7 -0
- package/demos/browser-es-modules/index.html +38 -0
- package/demos/browser-es-modules/package.json +15 -0
- package/demos/deno/README.md +1 -0
- package/demos/deno/import_map.json +8 -0
- package/demos/deno/index.js +5 -0
- package/demos/express/README.md +16 -0
- package/demos/express/config.json.template +3 -0
- package/demos/express/package.json +15 -0
- package/demos/express/server.js +37 -0
- package/demos/feature-service-browser/README.md +8 -0
- package/demos/feature-service-browser/index.html +122 -0
- package/demos/feature-service-browser/package.json +15 -0
- package/demos/geocoder-browser/README.md +12 -0
- package/demos/geocoder-browser/authenticate.html +29 -0
- package/demos/geocoder-browser/config.js.template +1 -0
- package/demos/geocoder-browser/index.html +139 -0
- package/demos/geocoder-browser/package.json +15 -0
- package/demos/jsapi-integration/README.md +26 -0
- package/demos/jsapi-integration/authenticate.html +29 -0
- package/demos/jsapi-integration/config.js +6 -0
- package/demos/jsapi-integration/index.html +91 -0
- package/demos/jsapi-integration/package.json +15 -0
- package/demos/node-cli-item-management/README.md +11 -0
- package/demos/node-cli-item-management/index.js +229 -0
- package/demos/node-cli-item-management/package.json +24 -0
- package/demos/node-cli-item-management/screenshot.png +0 -0
- package/demos/node-common-js/README.md +4 -0
- package/demos/node-common-js/index.js +5 -0
- package/demos/node-common-js/package.json +15 -0
- package/demos/node-es-modules/README.md +4 -0
- package/demos/node-es-modules/index.js +5 -0
- package/demos/node-es-modules/package.json +16 -0
- package/demos/oauth2-browser/README.md +17 -0
- package/demos/oauth2-browser/authenticate.html +29 -0
- package/demos/oauth2-browser/config.js.template +6 -0
- package/demos/oauth2-browser/index.html +223 -0
- package/demos/oauth2-browser/logo.svg +4 -0
- package/demos/oauth2-browser/package.json +15 -0
- package/demos/oauth2-browser/style.css +36 -0
- package/demos/oauth2-browser-retry/README.md +32 -0
- package/demos/oauth2-browser-retry/authenticate.html +21 -0
- package/demos/oauth2-browser-retry/index.html +114 -0
- package/demos/oauth2-browser-retry/logo.svg +4 -0
- package/demos/oauth2-browser-retry/package.json +15 -0
- package/demos/parcel/README.md +8 -0
- package/demos/parcel/index.html +16 -0
- package/demos/parcel/index.js +8 -0
- package/demos/parcel/package.json +20 -0
- package/demos/snowpack/README.md +8 -0
- package/demos/snowpack/index.html +16 -0
- package/demos/snowpack/index.js +8 -0
- package/demos/snowpack/package.json +20 -0
- package/demos/snowpack/snowpack.config.js +3 -0
- package/demos/stream-response-to-file/README.md +7 -0
- package/demos/stream-response-to-file/index.js +36 -0
- package/demos/stream-response-to-file/output/.gitkeep +0 -0
- package/demos/stream-response-to-file/package.json +31 -0
- package/demos/tree-shaking-rollup/.babelrc +3 -0
- package/demos/tree-shaking-rollup/README.md +9 -0
- package/demos/tree-shaking-rollup/index.html +11 -0
- package/demos/tree-shaking-rollup/package.json +22 -0
- package/demos/tree-shaking-rollup/rollup.config.js +13 -0
- package/demos/tree-shaking-rollup/src/index.js +8 -0
- package/demos/tree-shaking-webpack/README.md +9 -0
- package/demos/tree-shaking-webpack/index.html +11 -0
- package/demos/tree-shaking-webpack/package.json +26 -0
- package/demos/tree-shaking-webpack/src/index.js +8 -0
- package/demos/tree-shaking-webpack/webpack.config.js +29 -0
- package/demos/vite/README.md +6 -0
- package/demos/vite/favicon.svg +15 -0
- package/demos/vite/index.html +13 -0
- package/demos/vite/main.js +8 -0
- package/demos/vite/package.json +18 -0
- package/demos/vue/.env.example +11 -0
- package/demos/vue/.eslintrc.js +17 -0
- package/demos/vue/.postcssrc.js +5 -0
- package/demos/vue/README.md +17 -0
- package/demos/vue/babel.config.js +3 -0
- package/demos/vue/package.json +35 -0
- package/demos/vue/public/favicon.ico +0 -0
- package/demos/vue/public/index.html +24 -0
- package/demos/vue/src/assets/logo.svg +29 -0
- package/demos/vue/src/components/App.vue +303 -0
- package/demos/vue/src/components/Authenticate.vue +65 -0
- package/demos/vue/src/components/Loader.vue +230 -0
- package/demos/vue/src/main.js +92 -0
- package/demos/webmap-checker-sapper/.env.example +5 -0
- package/demos/webmap-checker-sapper/README.md +124 -0
- package/demos/webmap-checker-sapper/appveyor.yml +18 -0
- package/demos/webmap-checker-sapper/cypress/fixtures/example.json +5 -0
- package/demos/webmap-checker-sapper/cypress/integration/spec.js +19 -0
- package/demos/webmap-checker-sapper/cypress/plugins/index.js +17 -0
- package/demos/webmap-checker-sapper/cypress/support/commands.js +25 -0
- package/demos/webmap-checker-sapper/cypress/support/index.js +20 -0
- package/demos/webmap-checker-sapper/cypress.json +4 -0
- package/demos/webmap-checker-sapper/package.json +47 -0
- package/demos/webmap-checker-sapper/rollup.config.js +87 -0
- package/demos/webmap-checker-sapper/src/client.js +20 -0
- package/demos/webmap-checker-sapper/src/components/LayerStatus.html +108 -0
- package/demos/webmap-checker-sapper/src/components/Nav.html +21 -0
- package/demos/webmap-checker-sapper/src/components/WebMap.html +62 -0
- package/demos/webmap-checker-sapper/src/routes/_error.html +41 -0
- package/demos/webmap-checker-sapper/src/routes/_layout.html +21 -0
- package/demos/webmap-checker-sapper/src/routes/auth/authorize.js +18 -0
- package/demos/webmap-checker-sapper/src/routes/auth/exchange-token.js +20 -0
- package/demos/webmap-checker-sapper/src/routes/auth/post-sign-in.js +24 -0
- package/demos/webmap-checker-sapper/src/routes/auth/sign-out.js +10 -0
- package/demos/webmap-checker-sapper/src/routes/index.html +20 -0
- package/demos/webmap-checker-sapper/src/routes/webmaps/[webmapId].html +83 -0
- package/demos/webmap-checker-sapper/src/routes/webmaps/index.html +59 -0
- package/demos/webmap-checker-sapper/src/server.js +102 -0
- package/demos/webmap-checker-sapper/src/service-worker.js +82 -0
- package/demos/webmap-checker-sapper/src/template.html +33 -0
- package/demos/webmap-checker-sapper/src/userInfoMiddleware.js +21 -0
- package/demos/webmap-checker-sapper/src/utils.js +33 -0
- package/demos/webmap-checker-sapper/static/favicon.png +0 -0
- package/demos/webmap-checker-sapper/static/global.css +36 -0
- package/demos/webmap-checker-sapper/static/manifest.json +20 -0
- package/demos/webmap-checker-sapper/static/svelte-logo-192.png +0 -0
- package/demos/webmap-checker-sapper/static/svelte-logo-512.png +0 -0
- package/docs/.eslintrc.js +12 -0
- package/docs/FAQ.md +48 -0
- package/docs/HISTORY.md +62 -0
- package/docs/acetate.config.js +262 -0
- package/docs/build-typedoc.js +434 -0
- package/docs/generate-srihashes.js +61 -0
- package/docs/package.json +3 -0
- package/docs/src/_layout.html +86 -0
- package/docs/src/api/_declaration.html +600 -0
- package/docs/src/api/_layout.html +204 -0
- package/docs/src/api/_package.html +38 -0
- package/docs/src/api/index.html +16 -0
- package/docs/src/guides/_layout.html +24 -0
- package/docs/src/guides/amd-requirejs-dojo.md +40 -0
- package/docs/src/guides/browser-authentication.md +39 -0
- package/docs/src/guides/bundlers.md +52 -0
- package/docs/src/guides/cli-authentication.md +9 -0
- package/docs/src/guides/client-server-authentication.md +9 -0
- package/docs/src/guides/embedded-apps.md +106 -0
- package/docs/src/guides/from-a-cdn.md +38 -0
- package/docs/src/guides/index.md +59 -0
- package/docs/src/guides/node.md +84 -0
- package/docs/src/guides/package-overview.md +111 -0
- package/docs/src/guides/server-authentication.md +9 -0
- package/docs/src/guides/whats-new-v2-0.md +305 -0
- package/docs/src/img/icons.png +0 -0
- package/docs/src/img/icons@2x.png +0 -0
- package/docs/src/img/oauth-browser.png +0 -0
- package/docs/src/index.html +12 -0
- package/docs/src/js/api-search.js +112 -0
- package/docs/src/js/nav-toggle.js +41 -0
- package/docs/src/sass/_highlight.scss +96 -0
- package/docs/src/sass/_icons.scss +157 -0
- package/docs/src/sass/style.scss +242 -0
- package/jasmine.json +7 -0
- package/jasmine.live.json +7 -0
- package/karma.conf.cjs +128 -0
- package/package.json +87 -0
- package/packages/arcgis-rest-auth/CHANGELOG.md +80 -0
- package/packages/arcgis-rest-auth/README.md +71 -0
- package/packages/arcgis-rest-auth/package.json +66 -0
- package/packages/arcgis-rest-auth/src/index.ts +34 -0
- package/packages/arcgis-rest-auth/tsconfig.json +6 -0
- package/packages/arcgis-rest-demographics/CHANGELOG.md +14 -0
- package/packages/arcgis-rest-demographics/README.md +74 -0
- package/packages/arcgis-rest-demographics/package.json +69 -0
- package/packages/arcgis-rest-demographics/src/getAvailableCountries.ts +113 -0
- package/packages/arcgis-rest-demographics/src/getAvailableDataCollections.ts +161 -0
- package/packages/arcgis-rest-demographics/src/getAvailableGeographyLevels.ts +86 -0
- package/packages/arcgis-rest-demographics/src/getGeography.ts +152 -0
- package/packages/arcgis-rest-demographics/src/helpers.ts +27 -0
- package/packages/arcgis-rest-demographics/src/index.ts +16 -0
- package/packages/arcgis-rest-demographics/src/queryDemographicData.ts +108 -0
- package/packages/arcgis-rest-demographics/test/getAvailableCountries.test.ts +89 -0
- package/packages/arcgis-rest-demographics/test/getAvailableDataCollections.test.ts +114 -0
- package/packages/arcgis-rest-demographics/test/getAvailableGeographyLevels.test.ts +69 -0
- package/packages/arcgis-rest-demographics/test/getGeography.test.ts +150 -0
- package/packages/arcgis-rest-demographics/test/mocks/responses.ts +4 -0
- package/packages/arcgis-rest-demographics/test/queryDemographicData.test.live.ts +50 -0
- package/packages/arcgis-rest-demographics/test/queryDemographicData.test.ts +127 -0
- package/packages/arcgis-rest-demographics/tsconfig.json +6 -0
- package/packages/arcgis-rest-feature-service/CHANGELOG.md +44 -0
- package/packages/arcgis-rest-feature-service/README.md +75 -0
- package/packages/arcgis-rest-feature-service/package.json +70 -0
- package/packages/arcgis-rest-feature-service/src/add.ts +55 -0
- package/packages/arcgis-rest-feature-service/src/addAttachment.ts +53 -0
- package/packages/arcgis-rest-feature-service/src/addToServiceDefinition.ts +74 -0
- package/packages/arcgis-rest-feature-service/src/applyEdits.ts +94 -0
- package/packages/arcgis-rest-feature-service/src/createFeatureService.ts +191 -0
- package/packages/arcgis-rest-feature-service/src/decodeValues.ts +126 -0
- package/packages/arcgis-rest-feature-service/src/delete.ts +62 -0
- package/packages/arcgis-rest-feature-service/src/deleteAttachments.ts +52 -0
- package/packages/arcgis-rest-feature-service/src/getAllLayersAndTables.ts +30 -0
- package/packages/arcgis-rest-feature-service/src/getAttachments.ts +55 -0
- package/packages/arcgis-rest-feature-service/src/getLayer.ts +23 -0
- package/packages/arcgis-rest-feature-service/src/getService.ts +25 -0
- package/packages/arcgis-rest-feature-service/src/getServiceAdminInfo.ts +33 -0
- package/packages/arcgis-rest-feature-service/src/getViewSources.ts +19 -0
- package/packages/arcgis-rest-feature-service/src/helpers.ts +768 -0
- package/packages/arcgis-rest-feature-service/src/index.ts +37 -0
- package/packages/arcgis-rest-feature-service/src/query.ts +200 -0
- package/packages/arcgis-rest-feature-service/src/queryRelated.ts +86 -0
- package/packages/arcgis-rest-feature-service/src/update.ts +65 -0
- package/packages/arcgis-rest-feature-service/src/updateAttachment.ts +59 -0
- package/packages/arcgis-rest-feature-service/src/updateServiceDefinition.ts +53 -0
- package/packages/arcgis-rest-feature-service/test/addToServiceDefinition.test.ts +350 -0
- package/packages/arcgis-rest-feature-service/test/attachments.test.ts +188 -0
- package/packages/arcgis-rest-feature-service/test/createFeatureService.test.ts +279 -0
- package/packages/arcgis-rest-feature-service/test/crud.test.ts +196 -0
- package/packages/arcgis-rest-feature-service/test/decodeValues.test.ts +66 -0
- package/packages/arcgis-rest-feature-service/test/getAllLayersAndTables.test.ts +27 -0
- package/packages/arcgis-rest-feature-service/test/getLayer.test.ts +30 -0
- package/packages/arcgis-rest-feature-service/test/getService.test.ts +30 -0
- package/packages/arcgis-rest-feature-service/test/getServiceAdminInfo.test.ts +41 -0
- package/packages/arcgis-rest-feature-service/test/getViewSources.test.ts +45 -0
- package/packages/arcgis-rest-feature-service/test/helpers.test.ts +27 -0
- package/packages/arcgis-rest-feature-service/test/mocks/allLayersAndTablesResponse.ts +950 -0
- package/packages/arcgis-rest-feature-service/test/mocks/cvdQueryResponse.ts +225 -0
- package/packages/arcgis-rest-feature-service/test/mocks/feature.ts +302 -0
- package/packages/arcgis-rest-feature-service/test/mocks/fields.ts +779 -0
- package/packages/arcgis-rest-feature-service/test/mocks/foo.txt +1 -0
- package/packages/arcgis-rest-feature-service/test/mocks/layerDefinition.ts +80 -0
- package/packages/arcgis-rest-feature-service/test/mocks/service.ts +476 -0
- package/packages/arcgis-rest-feature-service/test/query.test.ts +166 -0
- package/packages/arcgis-rest-feature-service/test/updateServiceDefinition.test.ts +103 -0
- package/packages/arcgis-rest-feature-service/tsconfig.json +9 -0
- package/packages/arcgis-rest-fetch/README.md +17 -0
- package/packages/arcgis-rest-fetch/browser-ponyfill.js +8 -0
- package/packages/arcgis-rest-fetch/browser-ponyfill.mjs +8 -0
- package/packages/arcgis-rest-fetch/index.types.d.ts +8 -0
- package/packages/arcgis-rest-fetch/node-ponyfill.js +10 -0
- package/packages/arcgis-rest-fetch/node-ponyfill.mjs +10 -0
- package/packages/arcgis-rest-fetch/package.json +21 -0
- package/packages/arcgis-rest-form-data/README.md +15 -0
- package/packages/arcgis-rest-form-data/browser-ponyfill.js +5 -0
- package/packages/arcgis-rest-form-data/browser-ponyfill.mjs +3 -0
- package/packages/arcgis-rest-form-data/index.types.d.ts +9 -0
- package/packages/arcgis-rest-form-data/node-ponyfill.js +7 -0
- package/packages/arcgis-rest-form-data/node-ponyfill.mjs +5 -0
- package/packages/arcgis-rest-form-data/package.json +21 -0
- package/packages/arcgis-rest-geocoding/CHANGELOG.md +26 -0
- package/packages/arcgis-rest-geocoding/README.md +85 -0
- package/packages/arcgis-rest-geocoding/package.json +69 -0
- package/packages/arcgis-rest-geocoding/src/bulk.ts +106 -0
- package/packages/arcgis-rest-geocoding/src/geocode.ts +169 -0
- package/packages/arcgis-rest-geocoding/src/helpers.ts +56 -0
- package/packages/arcgis-rest-geocoding/src/index.ts +17 -0
- package/packages/arcgis-rest-geocoding/src/reverse.ts +82 -0
- package/packages/arcgis-rest-geocoding/src/suggest.ts +45 -0
- package/packages/arcgis-rest-geocoding/test/bulk.test.ts +193 -0
- package/packages/arcgis-rest-geocoding/test/geocode.test.ts +254 -0
- package/packages/arcgis-rest-geocoding/test/helpers.test.ts +85 -0
- package/packages/arcgis-rest-geocoding/test/mocks/responses.ts +1031 -0
- package/packages/arcgis-rest-geocoding/test/reverse.test.ts +124 -0
- package/packages/arcgis-rest-geocoding/test/suggest.test.ts +53 -0
- package/packages/arcgis-rest-geocoding/tsconfig.json +6 -0
- package/packages/arcgis-rest-portal/CHANGELOG.md +73 -0
- package/packages/arcgis-rest-portal/README.md +72 -0
- package/packages/arcgis-rest-portal/package.json +68 -0
- package/packages/arcgis-rest-portal/src/groups/add-users.ts +140 -0
- package/packages/arcgis-rest-portal/src/groups/create.ts +42 -0
- package/packages/arcgis-rest-portal/src/groups/get.ts +187 -0
- package/packages/arcgis-rest-portal/src/groups/helpers.ts +14 -0
- package/packages/arcgis-rest-portal/src/groups/invite-users.ts +141 -0
- package/packages/arcgis-rest-portal/src/groups/join.ts +57 -0
- package/packages/arcgis-rest-portal/src/groups/notification.ts +77 -0
- package/packages/arcgis-rest-portal/src/groups/protect.ts +56 -0
- package/packages/arcgis-rest-portal/src/groups/remove-users.ts +84 -0
- package/packages/arcgis-rest-portal/src/groups/remove.ts +32 -0
- package/packages/arcgis-rest-portal/src/groups/search.ts +48 -0
- package/packages/arcgis-rest-portal/src/groups/update-user-membership.ts +63 -0
- package/packages/arcgis-rest-portal/src/groups/update.ts +39 -0
- package/packages/arcgis-rest-portal/src/helpers.ts +83 -0
- package/packages/arcgis-rest-portal/src/index.ts +68 -0
- package/packages/arcgis-rest-portal/src/items/add.ts +145 -0
- package/packages/arcgis-rest-portal/src/items/content.ts +70 -0
- package/packages/arcgis-rest-portal/src/items/create.ts +149 -0
- package/packages/arcgis-rest-portal/src/items/export.ts +92 -0
- package/packages/arcgis-rest-portal/src/items/get.ts +444 -0
- package/packages/arcgis-rest-portal/src/items/helpers.ts +272 -0
- package/packages/arcgis-rest-portal/src/items/protect.ts +41 -0
- package/packages/arcgis-rest-portal/src/items/reassign.ts +59 -0
- package/packages/arcgis-rest-portal/src/items/remove.ts +139 -0
- package/packages/arcgis-rest-portal/src/items/search.ts +25 -0
- package/packages/arcgis-rest-portal/src/items/update.ts +188 -0
- package/packages/arcgis-rest-portal/src/items/upload.ts +124 -0
- package/packages/arcgis-rest-portal/src/orgs/notification.ts +148 -0
- package/packages/arcgis-rest-portal/src/services/get-unique-service-name.ts +35 -0
- package/packages/arcgis-rest-portal/src/services/is-service-name-available.ts +29 -0
- package/packages/arcgis-rest-portal/src/sharing/access.ts +84 -0
- package/packages/arcgis-rest-portal/src/sharing/helpers.ts +80 -0
- package/packages/arcgis-rest-portal/src/sharing/is-item-shared-with-group.ts +42 -0
- package/packages/arcgis-rest-portal/src/sharing/share-item-with-group.ts +335 -0
- package/packages/arcgis-rest-portal/src/sharing/unshare-item-with-group.ts +114 -0
- package/packages/arcgis-rest-portal/src/users/get-user-tags.ts +52 -0
- package/packages/arcgis-rest-portal/src/users/get-user-url.ts +18 -0
- package/packages/arcgis-rest-portal/src/users/get-user.ts +60 -0
- package/packages/arcgis-rest-portal/src/users/invitation.ts +157 -0
- package/packages/arcgis-rest-portal/src/users/notification.ts +67 -0
- package/packages/arcgis-rest-portal/src/users/search-users.ts +35 -0
- package/packages/arcgis-rest-portal/src/users/update.ts +63 -0
- package/packages/arcgis-rest-portal/src/util/SearchQueryBuilder.ts +391 -0
- package/packages/arcgis-rest-portal/src/util/array.ts +16 -0
- package/packages/arcgis-rest-portal/src/util/generic-search.ts +111 -0
- package/packages/arcgis-rest-portal/src/util/get-portal-settings.ts +44 -0
- package/packages/arcgis-rest-portal/src/util/get-portal-url.ts +32 -0
- package/packages/arcgis-rest-portal/src/util/get-portal.ts +53 -0
- package/packages/arcgis-rest-portal/src/util/get-subscription-info.ts +43 -0
- package/packages/arcgis-rest-portal/src/util/scrub-control-chars.ts +13 -0
- package/packages/arcgis-rest-portal/src/util/search.ts +48 -0
- package/packages/arcgis-rest-portal/test/groups/add-users.test.ts +238 -0
- package/packages/arcgis-rest-portal/test/groups/crud.test.ts +183 -0
- package/packages/arcgis-rest-portal/test/groups/get.test.ts +174 -0
- package/packages/arcgis-rest-portal/test/groups/invite-users.test.ts +146 -0
- package/packages/arcgis-rest-portal/test/groups/join.test.ts +71 -0
- package/packages/arcgis-rest-portal/test/groups/notification.test.ts +111 -0
- package/packages/arcgis-rest-portal/test/groups/protect.test.ts +71 -0
- package/packages/arcgis-rest-portal/test/groups/remove-users.test.ts +140 -0
- package/packages/arcgis-rest-portal/test/groups/search.test.ts +151 -0
- package/packages/arcgis-rest-portal/test/groups/update-user-membership.test.ts +64 -0
- package/packages/arcgis-rest-portal/test/items/add.test.ts +320 -0
- package/packages/arcgis-rest-portal/test/items/content.test.ts +161 -0
- package/packages/arcgis-rest-portal/test/items/create.test.ts +404 -0
- package/packages/arcgis-rest-portal/test/items/export.test.ts +115 -0
- package/packages/arcgis-rest-portal/test/items/get.test.ts +606 -0
- package/packages/arcgis-rest-portal/test/items/helpers.test.ts +60 -0
- package/packages/arcgis-rest-portal/test/items/protect.test.ts +120 -0
- package/packages/arcgis-rest-portal/test/items/reassign.test.ts +130 -0
- package/packages/arcgis-rest-portal/test/items/remove.test.ts +259 -0
- package/packages/arcgis-rest-portal/test/items/search.test.ts +274 -0
- package/packages/arcgis-rest-portal/test/items/update.test.ts +549 -0
- package/packages/arcgis-rest-portal/test/items/upload.test.ts +286 -0
- package/packages/arcgis-rest-portal/test/mocks/groups/responses.ts +208 -0
- package/packages/arcgis-rest-portal/test/mocks/items/foo.zip +0 -0
- package/packages/arcgis-rest-portal/test/mocks/items/item.ts +526 -0
- package/packages/arcgis-rest-portal/test/mocks/items/resources.ts +38 -0
- package/packages/arcgis-rest-portal/test/mocks/items/search.ts +121 -0
- package/packages/arcgis-rest-portal/test/mocks/portal/response.ts +126 -0
- package/packages/arcgis-rest-portal/test/mocks/portal/settings-response.ts +56 -0
- package/packages/arcgis-rest-portal/test/mocks/sharing/sharing.ts +18 -0
- package/packages/arcgis-rest-portal/test/mocks/users/invitation.ts +70 -0
- package/packages/arcgis-rest-portal/test/mocks/users/notification.ts +34 -0
- package/packages/arcgis-rest-portal/test/mocks/users/user-search.ts +388 -0
- package/packages/arcgis-rest-portal/test/mocks/users/user-tags.ts +5 -0
- package/packages/arcgis-rest-portal/test/mocks/users/user.ts +174 -0
- package/packages/arcgis-rest-portal/test/orgs/notification.test.ts +142 -0
- package/packages/arcgis-rest-portal/test/services/get-unique-service-name.test.ts +64 -0
- package/packages/arcgis-rest-portal/test/services/is-service-name-available.test.ts +41 -0
- package/packages/arcgis-rest-portal/test/sharing/access.test.ts +162 -0
- package/packages/arcgis-rest-portal/test/sharing/helpers.test.ts +55 -0
- package/packages/arcgis-rest-portal/test/sharing/share-item-with-group.test.ts +1328 -0
- package/packages/arcgis-rest-portal/test/sharing/unshare-item-with-group.test.ts +288 -0
- package/packages/arcgis-rest-portal/test/users/get-user-tags.test.ts +71 -0
- package/packages/arcgis-rest-portal/test/users/get-user-url.test.ts +40 -0
- package/packages/arcgis-rest-portal/test/users/get-user.test.ts +90 -0
- package/packages/arcgis-rest-portal/test/users/invitation.test.ts +126 -0
- package/packages/arcgis-rest-portal/test/users/notification.test.ts +76 -0
- package/packages/arcgis-rest-portal/test/users/search.test.ts +41 -0
- package/packages/arcgis-rest-portal/test/users/update.test.ts +150 -0
- package/packages/arcgis-rest-portal/test/util/SearchQueryBuilder.test.ts +295 -0
- package/packages/arcgis-rest-portal/test/util/array.test.ts +33 -0
- package/packages/arcgis-rest-portal/test/util/get-portal-settings.test.ts +57 -0
- package/packages/arcgis-rest-portal/test/util/get-portal-url.test.ts +37 -0
- package/packages/arcgis-rest-portal/test/util/portal.test.ts +137 -0
- package/packages/arcgis-rest-portal/test/util/scrub-control-chars.test.ts +25 -0
- package/packages/arcgis-rest-portal/tsconfig.json +6 -0
- package/packages/arcgis-rest-request/README.md +72 -0
- package/packages/arcgis-rest-request/package.json +69 -0
- package/packages/arcgis-rest-request/post-message-auth-spec.md +70 -0
- package/packages/arcgis-rest-request/src/ApiKeyManager.ts +60 -0
- package/packages/arcgis-rest-request/src/ApplicationCredentialsManager.ts +141 -0
- package/packages/arcgis-rest-request/src/ArcGISIdentityManager.ts +1470 -0
- package/packages/arcgis-rest-request/src/app-tokens.ts +132 -0
- package/packages/arcgis-rest-request/src/authenticated-request-options.ts +23 -0
- package/packages/arcgis-rest-request/src/federation-utils.ts +88 -0
- package/packages/arcgis-rest-request/src/fetch-token.ts +48 -0
- package/packages/arcgis-rest-request/src/generate-token.ts +32 -0
- package/packages/arcgis-rest-request/src/index.ts +46 -0
- package/packages/arcgis-rest-request/src/request.ts +446 -0
- package/packages/arcgis-rest-request/src/revoke-token.ts +73 -0
- package/packages/arcgis-rest-request/src/types/feature.ts +42 -0
- package/packages/arcgis-rest-request/src/types/geometry.ts +239 -0
- package/packages/arcgis-rest-request/src/types/group.ts +72 -0
- package/packages/arcgis-rest-request/src/types/service.ts +87 -0
- package/packages/arcgis-rest-request/src/types/symbol.ts +21 -0
- package/packages/arcgis-rest-request/src/types/user.ts +49 -0
- package/packages/arcgis-rest-request/src/utils/ArcGISRequestError.ts +82 -0
- package/packages/arcgis-rest-request/src/utils/ErrorTypes.ts +29 -0
- package/packages/arcgis-rest-request/src/utils/GrantTypes.ts +5 -0
- package/packages/arcgis-rest-request/src/utils/HTTPMethods.ts +6 -0
- package/packages/arcgis-rest-request/src/utils/IAuthenticationManager.ts +22 -0
- package/packages/arcgis-rest-request/src/utils/IFetchTokenParams.ts +11 -0
- package/packages/arcgis-rest-request/src/utils/IGenerateTokenParams.ts +9 -0
- package/packages/arcgis-rest-request/src/utils/IParamBuilder.ts +3 -0
- package/packages/arcgis-rest-request/src/utils/IParams.ts +6 -0
- package/packages/arcgis-rest-request/src/utils/IParamsBuilder.ts +5 -0
- package/packages/arcgis-rest-request/src/utils/IRequestOptions.ts +59 -0
- package/packages/arcgis-rest-request/src/utils/ITokenRequestOptions.ts +9 -0
- package/packages/arcgis-rest-request/src/utils/ResponseFormats.ts +10 -0
- package/packages/arcgis-rest-request/src/utils/append-custom-params.ts +46 -0
- package/packages/arcgis-rest-request/src/utils/clean-url.ts +20 -0
- package/packages/arcgis-rest-request/src/utils/decode-query-string.ts +27 -0
- package/packages/arcgis-rest-request/src/utils/encode-form-data.ts +41 -0
- package/packages/arcgis-rest-request/src/utils/encode-query-string.ts +37 -0
- package/packages/arcgis-rest-request/src/utils/process-params.ts +109 -0
- package/packages/arcgis-rest-request/src/utils/retryAuthError.ts +10 -0
- package/packages/arcgis-rest-request/src/utils/warn.ts +11 -0
- package/packages/arcgis-rest-request/src/utils/with-options.ts +48 -0
- package/packages/arcgis-rest-request/src/validate-app-access.ts +69 -0
- package/packages/arcgis-rest-request/test/ApiKey.test.ts +53 -0
- package/packages/arcgis-rest-request/test/ApplicationSession.test.ts +148 -0
- package/packages/arcgis-rest-request/test/ArcGISIdentityManager.test.ts +2579 -0
- package/packages/arcgis-rest-request/test/app-tokens.test.ts +91 -0
- package/packages/arcgis-rest-request/test/federation-utils.test.ts +323 -0
- package/packages/arcgis-rest-request/test/fetchToken.test.ts +110 -0
- package/packages/arcgis-rest-request/test/generateToken.test.ts +40 -0
- package/packages/arcgis-rest-request/test/mocks/errors.ts +76 -0
- package/packages/arcgis-rest-request/test/mocks/geojson-feature-collection.ts +13 -0
- package/packages/arcgis-rest-request/test/mocks/param-builder.ts +7 -0
- package/packages/arcgis-rest-request/test/mocks/sharing-rest-info.ts +41 -0
- package/packages/arcgis-rest-request/test/mocks/webmap.ts +41 -0
- package/packages/arcgis-rest-request/test/request.test.ts +563 -0
- package/packages/arcgis-rest-request/test/revoke-token.test.ts +55 -0
- package/packages/arcgis-rest-request/test/utils/ArcGISAuthError.test.ts +196 -0
- package/packages/arcgis-rest-request/test/utils/ArcGISRequestError.test.ts +51 -0
- package/packages/arcgis-rest-request/test/utils/check-for-errors.test.ts +111 -0
- package/packages/arcgis-rest-request/test/utils/clean-url.test.ts +50 -0
- package/packages/arcgis-rest-request/test/utils/encode-form-data.test.ts +146 -0
- package/packages/arcgis-rest-request/test/utils/encode-query-string.test.ts +22 -0
- package/packages/arcgis-rest-request/test/utils/process-params.test.ts +205 -0
- package/packages/arcgis-rest-request/test/utils/with-options.test.ts +135 -0
- package/packages/arcgis-rest-request/test/validate-app-access.test.ts +44 -0
- package/packages/arcgis-rest-request/tsconfig.json +4 -0
- package/packages/arcgis-rest-routing/README.md +74 -0
- package/packages/arcgis-rest-routing/package.json +69 -0
- package/packages/arcgis-rest-routing/src/closestFacility.ts +223 -0
- package/packages/arcgis-rest-routing/src/helpers.ts +104 -0
- package/packages/arcgis-rest-routing/src/index.ts +20 -0
- package/packages/arcgis-rest-routing/src/originDestinationMatrix.ts +219 -0
- package/packages/arcgis-rest-routing/src/serviceArea.ts +169 -0
- package/packages/arcgis-rest-routing/src/solveRoute.ts +179 -0
- package/packages/arcgis-rest-routing/test/closestFacility.test.ts +686 -0
- package/packages/arcgis-rest-routing/test/mocks/inputs.ts +132 -0
- package/packages/arcgis-rest-routing/test/mocks/responses.ts +13316 -0
- package/packages/arcgis-rest-routing/test/originDestinationMatrix.test.ts +795 -0
- package/packages/arcgis-rest-routing/test/serviceArea.test.ts +601 -0
- package/packages/arcgis-rest-routing/test/solveRoute.test.ts +681 -0
- package/packages/arcgis-rest-routing/tsconfig.json +6 -0
- package/prettier-package-json.config.cjs +81 -0
- package/rollup.js +152 -0
- package/scripts/create-dist-package-jsons.js +17 -0
- package/scripts/deploy-doc-site.js +16 -0
- package/scripts/generate-sri-hashes.js +52 -0
- package/scripts/get-package-json.js +27 -0
- package/scripts/run-demo-server.js +21 -0
- package/scripts/test-helpers.ts +20 -0
- package/tsconfig.json +62 -0
- package/typedoc.json +14 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
import { IGroupSharingOptions } from "./helpers.js";
|
2
|
+
import { searchItems } from "../items/search.js";
|
3
|
+
import { ISearchOptions } from "../util/search.js";
|
4
|
+
|
5
|
+
/**
|
6
|
+
* ```js
|
7
|
+
* import { isItemSharedWithGroup } from "@esri/arcgis-rest-portal";
|
8
|
+
* //
|
9
|
+
* isItemSharedWithGroup({
|
10
|
+
* groupId: 'bc3,
|
11
|
+
* itemId: 'f56,
|
12
|
+
* authentication
|
13
|
+
* })
|
14
|
+
* .then(isShared => {})
|
15
|
+
* ```
|
16
|
+
* Find out whether or not an item is already shared with a group.
|
17
|
+
*
|
18
|
+
* @param requestOptions - Options for the request. NOTE: `rawResponse` is not supported by this operation.
|
19
|
+
* @returns Promise that will resolve with true/false
|
20
|
+
*/
|
21
|
+
export function isItemSharedWithGroup(
|
22
|
+
requestOptions: IGroupSharingOptions
|
23
|
+
): Promise<boolean> {
|
24
|
+
const searchOpts = {
|
25
|
+
q: `id: ${requestOptions.id} AND group: ${requestOptions.groupId}`,
|
26
|
+
start: 1,
|
27
|
+
num: 10,
|
28
|
+
sortField: "title",
|
29
|
+
authentication: requestOptions.authentication,
|
30
|
+
httpMethod: "POST"
|
31
|
+
} as ISearchOptions;
|
32
|
+
|
33
|
+
return searchItems(searchOpts).then((searchResponse) => {
|
34
|
+
let result = false;
|
35
|
+
if (searchResponse.total > 0) {
|
36
|
+
result = searchResponse.results.some((itm: any) => {
|
37
|
+
return itm.id === requestOptions.id;
|
38
|
+
});
|
39
|
+
return result;
|
40
|
+
}
|
41
|
+
});
|
42
|
+
}
|
@@ -0,0 +1,335 @@
|
|
1
|
+
import { request, IUser } from "@esri/arcgis-rest-request";
|
2
|
+
import { getPortalUrl } from "../util/get-portal-url.js";
|
3
|
+
import {
|
4
|
+
IGroupSharingOptions,
|
5
|
+
ISharingResponse,
|
6
|
+
getUserMembership
|
7
|
+
} from "./helpers.js";
|
8
|
+
import { getUser } from "../users/get-user.js";
|
9
|
+
import { addGroupUsers, IAddGroupUsersResult } from "../groups/add-users.js";
|
10
|
+
import { removeGroupUsers } from "../groups/remove-users.js";
|
11
|
+
import {
|
12
|
+
updateUserMemberships,
|
13
|
+
IUpdateGroupUsersResult
|
14
|
+
} from "../groups/update-user-membership.js";
|
15
|
+
import { isItemSharedWithGroup } from "../sharing/is-item-shared-with-group.js";
|
16
|
+
|
17
|
+
interface IEnsureMembershipResult {
|
18
|
+
promise: Promise<IAddGroupUsersResult>;
|
19
|
+
revert: (sharingResults: ISharingResponse) => Promise<ISharingResponse>;
|
20
|
+
}
|
21
|
+
|
22
|
+
/**
|
23
|
+
* ```js
|
24
|
+
* import { shareItemWithGroup } from '@esri/arcgis-rest-portal';
|
25
|
+
* //
|
26
|
+
* shareItemWithGroup({
|
27
|
+
* id: "abc123",
|
28
|
+
* groupId: "xyz987",
|
29
|
+
* owner: "some-owner",
|
30
|
+
* authentication
|
31
|
+
* })
|
32
|
+
* ```
|
33
|
+
* Share an item with a group, either as an
|
34
|
+
* [item owner](https://developers.arcgis.com/rest/users-groups-and-items/share-item-as-item-owner-.htm),
|
35
|
+
* [group admin](https://developers.arcgis.com/rest/users-groups-and-items/share-item-as-group-admin-.htm) or
|
36
|
+
* organization admin.
|
37
|
+
*
|
38
|
+
* Note: Sharing the item as an Admin will use the `/content/users/:ownername/items/:itemid/share` end-point
|
39
|
+
*
|
40
|
+
* @param requestOptions - Options for the request.
|
41
|
+
* @returns A Promise that will resolve with the data from the response.
|
42
|
+
*/
|
43
|
+
export function shareItemWithGroup(
|
44
|
+
requestOptions: IGroupSharingOptions
|
45
|
+
): Promise<ISharingResponse> {
|
46
|
+
return isItemSharedWithGroup(requestOptions)
|
47
|
+
.then((isShared) => {
|
48
|
+
if (isShared) {
|
49
|
+
// already shared, exit early with success response
|
50
|
+
return {
|
51
|
+
itemId: requestOptions.id,
|
52
|
+
shortcut: true,
|
53
|
+
notSharedWith: []
|
54
|
+
} as ISharingResponse;
|
55
|
+
}
|
56
|
+
|
57
|
+
const {
|
58
|
+
authentication: { username },
|
59
|
+
owner,
|
60
|
+
confirmItemControl
|
61
|
+
} = requestOptions;
|
62
|
+
const itemOwner = owner || username;
|
63
|
+
|
64
|
+
// non-item owner
|
65
|
+
if (itemOwner !== username) {
|
66
|
+
// need to track if the user is an admin
|
67
|
+
let isAdmin = false;
|
68
|
+
// next perform any necessary membership adjustments for
|
69
|
+
// current user and/or item owner
|
70
|
+
return Promise.all([
|
71
|
+
getUser({
|
72
|
+
username,
|
73
|
+
authentication: requestOptions.authentication
|
74
|
+
}),
|
75
|
+
getUser({
|
76
|
+
username: itemOwner,
|
77
|
+
authentication: requestOptions.authentication
|
78
|
+
}),
|
79
|
+
getUserMembership(requestOptions)
|
80
|
+
])
|
81
|
+
.then(([currentUser, ownerUser, membership]) => {
|
82
|
+
const isSharedEditingGroup = !!confirmItemControl;
|
83
|
+
isAdmin = currentUser.role === "org_admin" && !currentUser.roleId;
|
84
|
+
return getMembershipAdjustments(
|
85
|
+
currentUser,
|
86
|
+
isSharedEditingGroup,
|
87
|
+
membership,
|
88
|
+
isAdmin,
|
89
|
+
ownerUser,
|
90
|
+
requestOptions
|
91
|
+
);
|
92
|
+
})
|
93
|
+
.then((membershipAdjustments) => {
|
94
|
+
const [
|
95
|
+
{ revert } = {
|
96
|
+
promise: Promise.resolve({ notAdded: [] }),
|
97
|
+
revert: (sharingResults: ISharingResponse) => {
|
98
|
+
return Promise.resolve(sharingResults);
|
99
|
+
}
|
100
|
+
} as IEnsureMembershipResult
|
101
|
+
] = membershipAdjustments;
|
102
|
+
// perform all membership adjustments
|
103
|
+
return Promise.all(
|
104
|
+
membershipAdjustments.map(({ promise }) => promise)
|
105
|
+
)
|
106
|
+
.then(() => {
|
107
|
+
// then attempt the share
|
108
|
+
return shareToGroup(requestOptions, isAdmin);
|
109
|
+
})
|
110
|
+
.then((sharingResults) => {
|
111
|
+
// lastly, if the admin user was added to the group,
|
112
|
+
// remove them from the group. this is a no-op that
|
113
|
+
// immediately resolves the sharingResults when no
|
114
|
+
// membership adjustment was needed
|
115
|
+
return revert(sharingResults);
|
116
|
+
});
|
117
|
+
});
|
118
|
+
}
|
119
|
+
|
120
|
+
// item owner, let it call through
|
121
|
+
return shareToGroup(requestOptions);
|
122
|
+
})
|
123
|
+
.then((sharingResponse) => {
|
124
|
+
if (sharingResponse.notSharedWith.length) {
|
125
|
+
throw Error(
|
126
|
+
`Item ${requestOptions.id} could not be shared to group ${requestOptions.groupId}.`
|
127
|
+
);
|
128
|
+
} else {
|
129
|
+
// all is well
|
130
|
+
return sharingResponse;
|
131
|
+
}
|
132
|
+
});
|
133
|
+
}
|
134
|
+
|
135
|
+
function getMembershipAdjustments(
|
136
|
+
currentUser: IUser,
|
137
|
+
isSharedEditingGroup: boolean,
|
138
|
+
membership: string,
|
139
|
+
isAdmin: boolean,
|
140
|
+
ownerUser: IUser,
|
141
|
+
requestOptions: IGroupSharingOptions
|
142
|
+
) {
|
143
|
+
const membershipGuarantees = [];
|
144
|
+
if (requestOptions.groupId !== currentUser.favGroupId) {
|
145
|
+
if (isSharedEditingGroup) {
|
146
|
+
if (!isAdmin) {
|
147
|
+
// abort and reject promise
|
148
|
+
throw Error(
|
149
|
+
`This item can not be shared to shared editing group ${requestOptions.groupId} by ${currentUser.username} as they not the item owner or org admin.`
|
150
|
+
);
|
151
|
+
}
|
152
|
+
|
153
|
+
membershipGuarantees.push(
|
154
|
+
// admin user must be a group member to share, should be reverted afterwards
|
155
|
+
ensureMembership(
|
156
|
+
currentUser,
|
157
|
+
currentUser,
|
158
|
+
false,
|
159
|
+
`Error adding ${currentUser.username} as member to edit group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`,
|
160
|
+
requestOptions
|
161
|
+
),
|
162
|
+
// item owner must be a group admin
|
163
|
+
ensureMembership(
|
164
|
+
currentUser,
|
165
|
+
ownerUser,
|
166
|
+
true,
|
167
|
+
membership === "none"
|
168
|
+
? `Error adding user ${ownerUser.username} to edit group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`
|
169
|
+
: `Error promoting user ${ownerUser.username} to admin in edit group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`,
|
170
|
+
requestOptions
|
171
|
+
)
|
172
|
+
);
|
173
|
+
} else if (isAdmin) {
|
174
|
+
// admin user must be a group member to share, should be reverted afterwards
|
175
|
+
membershipGuarantees.push(
|
176
|
+
ensureMembership(
|
177
|
+
currentUser,
|
178
|
+
currentUser,
|
179
|
+
false,
|
180
|
+
`Error adding ${currentUser.username} as member to view group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`,
|
181
|
+
requestOptions
|
182
|
+
)
|
183
|
+
);
|
184
|
+
} else if (membership === "none") {
|
185
|
+
// all other non-item owners must be a group member
|
186
|
+
throw new Error(
|
187
|
+
`This item can not be shared by ${currentUser.username} as they are not a member of the specified group ${requestOptions.groupId}.`
|
188
|
+
);
|
189
|
+
}
|
190
|
+
}
|
191
|
+
|
192
|
+
return membershipGuarantees;
|
193
|
+
}
|
194
|
+
|
195
|
+
function shareToGroup(
|
196
|
+
requestOptions: IGroupSharingOptions,
|
197
|
+
isAdmin = false
|
198
|
+
): Promise<ISharingResponse> {
|
199
|
+
const username = requestOptions.authentication.username;
|
200
|
+
const itemOwner = requestOptions.owner || username;
|
201
|
+
// decide what url to use
|
202
|
+
// default to the non-owner url...
|
203
|
+
let url = `${getPortalUrl(requestOptions)}/content/items/${
|
204
|
+
requestOptions.id
|
205
|
+
}/share`;
|
206
|
+
|
207
|
+
// but if they are the owner, or org_admin, use this route
|
208
|
+
// Note: When using this end-point as an admin, apparently the admin does not need to be a member of the group (the itemOwner does)
|
209
|
+
// Have not validated this but came up in conversations w/ Sharing API team
|
210
|
+
if (itemOwner === username || isAdmin) {
|
211
|
+
url = `${getPortalUrl(requestOptions)}/content/users/${itemOwner}/items/${
|
212
|
+
requestOptions.id
|
213
|
+
}/share`;
|
214
|
+
}
|
215
|
+
|
216
|
+
// now its finally time to do the sharing
|
217
|
+
requestOptions.params = {
|
218
|
+
groups: requestOptions.groupId,
|
219
|
+
confirmItemControl: requestOptions.confirmItemControl
|
220
|
+
};
|
221
|
+
|
222
|
+
return request(url, requestOptions);
|
223
|
+
}
|
224
|
+
|
225
|
+
export function ensureMembership(
|
226
|
+
currentUser: IUser,
|
227
|
+
ownerUser: IUser,
|
228
|
+
shouldPromote: boolean,
|
229
|
+
errorMessage: string,
|
230
|
+
requestOptions: IGroupSharingOptions
|
231
|
+
): IEnsureMembershipResult {
|
232
|
+
const ownerGroups = ownerUser.groups || [];
|
233
|
+
const group = ownerGroups.find((g) => {
|
234
|
+
return g.id === requestOptions.groupId;
|
235
|
+
});
|
236
|
+
|
237
|
+
// if they are in different orgs, eject
|
238
|
+
if (currentUser.orgId !== ownerUser.orgId) {
|
239
|
+
throw Error(
|
240
|
+
`User ${ownerUser.username} is not a member of the same org as ${currentUser.username}. Consequently they can not be added added to group ${requestOptions.groupId} nor can item ${requestOptions.id} be shared to the group.`
|
241
|
+
);
|
242
|
+
}
|
243
|
+
|
244
|
+
// if owner is not a member, and has 512 groups
|
245
|
+
if (!group && ownerGroups.length > 511) {
|
246
|
+
throw Error(
|
247
|
+
`User ${ownerUser.username} already has 512 groups, and can not be added to group ${requestOptions.groupId}. Consequently item ${requestOptions.id} can not be shared to the group.`
|
248
|
+
);
|
249
|
+
}
|
250
|
+
|
251
|
+
let promise: Promise<IAddGroupUsersResult>;
|
252
|
+
let revert: (sharingResults: ISharingResponse) => Promise<ISharingResponse>;
|
253
|
+
|
254
|
+
// decide if we need to add them or upgrade them
|
255
|
+
if (group) {
|
256
|
+
// they are in the group...
|
257
|
+
// check member type
|
258
|
+
if (shouldPromote && group.userMembership.memberType === "member") {
|
259
|
+
// promote them
|
260
|
+
promise = updateUserMemberships({
|
261
|
+
id: requestOptions.groupId,
|
262
|
+
users: [ownerUser.username],
|
263
|
+
newMemberType: "admin",
|
264
|
+
authentication: requestOptions.authentication
|
265
|
+
})
|
266
|
+
.then((results: IUpdateGroupUsersResult) => {
|
267
|
+
// convert the result into the right type
|
268
|
+
const notAdded = results.results.reduce((acc: any[], entry: any) => {
|
269
|
+
if (!entry.success) {
|
270
|
+
acc.push(entry.username);
|
271
|
+
}
|
272
|
+
return acc;
|
273
|
+
}, []);
|
274
|
+
// and return it
|
275
|
+
return Promise.resolve({ notAdded });
|
276
|
+
})
|
277
|
+
.catch(() => ({ notAdded: [ownerUser.username] }));
|
278
|
+
revert = (sharingResults) =>
|
279
|
+
updateUserMemberships({
|
280
|
+
id: requestOptions.groupId,
|
281
|
+
users: [ownerUser.username],
|
282
|
+
newMemberType: "member",
|
283
|
+
authentication: requestOptions.authentication
|
284
|
+
})
|
285
|
+
.then(() => sharingResults)
|
286
|
+
.catch(() => sharingResults);
|
287
|
+
} else {
|
288
|
+
// they are already an admin in the group
|
289
|
+
// return the same response the API would if we added them
|
290
|
+
promise = Promise.resolve({ notAdded: [] });
|
291
|
+
revert = (sharingResults) => Promise.resolve(sharingResults);
|
292
|
+
}
|
293
|
+
} else {
|
294
|
+
// attempt to add user to group
|
295
|
+
const userType = shouldPromote ? "admins" : "users";
|
296
|
+
// can't currently determine if the group is within the admin's
|
297
|
+
// org without performing a search, so attempt to add and handle
|
298
|
+
// the api error
|
299
|
+
promise = addGroupUsers({
|
300
|
+
id: requestOptions.groupId,
|
301
|
+
[userType]: [ownerUser.username],
|
302
|
+
authentication: requestOptions.authentication
|
303
|
+
})
|
304
|
+
.then((results) => {
|
305
|
+
// results.errors includes an ArcGISAuthError when the group
|
306
|
+
// is in a different org, but notAdded is empty, throw here
|
307
|
+
// to normalize the results in below catch
|
308
|
+
if (results.errors && results.errors.length) {
|
309
|
+
throw results.errors[0];
|
310
|
+
}
|
311
|
+
return results;
|
312
|
+
})
|
313
|
+
.catch(() => ({ notAdded: [ownerUser.username] }));
|
314
|
+
revert = (sharingResults) => {
|
315
|
+
return removeGroupUsers({
|
316
|
+
id: requestOptions.groupId,
|
317
|
+
users: [ownerUser.username],
|
318
|
+
authentication: requestOptions.authentication
|
319
|
+
}).then(() => {
|
320
|
+
// always resolves, suppress any resolved errors
|
321
|
+
return sharingResults;
|
322
|
+
});
|
323
|
+
};
|
324
|
+
}
|
325
|
+
|
326
|
+
return {
|
327
|
+
promise: promise.then((membershipResponse) => {
|
328
|
+
if (membershipResponse.notAdded.length) {
|
329
|
+
throw new Error(errorMessage);
|
330
|
+
}
|
331
|
+
return membershipResponse;
|
332
|
+
}),
|
333
|
+
revert
|
334
|
+
};
|
335
|
+
}
|
@@ -0,0 +1,114 @@
|
|
1
|
+
import { request } from "@esri/arcgis-rest-request";
|
2
|
+
import { getPortalUrl } from "../util/get-portal-url.js";
|
3
|
+
import {
|
4
|
+
IGroupSharingOptions,
|
5
|
+
ISharingResponse,
|
6
|
+
getUserMembership
|
7
|
+
} from "./helpers.js";
|
8
|
+
import { isItemSharedWithGroup } from "./is-item-shared-with-group.js";
|
9
|
+
import { getUser } from "../users/get-user.js";
|
10
|
+
|
11
|
+
/**
|
12
|
+
* Stop sharing an item with a group, either as an
|
13
|
+
* [item owner](https://developers.arcgis.com/rest/users-groups-and-items/unshare-item-as-item-owner-.htm),
|
14
|
+
* [group admin](https://developers.arcgis.com/rest/users-groups-and-items/unshare-item-as-group-admin-.htm) or
|
15
|
+
* organization admin.
|
16
|
+
*
|
17
|
+
* ```js
|
18
|
+
* import { unshareItemWithGroup } from '@esri/arcgis-rest-portal';
|
19
|
+
*
|
20
|
+
* unshareItemWithGroup({
|
21
|
+
* id: "abc123",
|
22
|
+
* groupId: "xyz987",
|
23
|
+
* owner: "some-owner",
|
24
|
+
* authentication: session
|
25
|
+
* })
|
26
|
+
* ```
|
27
|
+
*
|
28
|
+
* @param requestOptions - Options for the request.
|
29
|
+
* @returns A Promise that will resolve with the data from the response.
|
30
|
+
*/
|
31
|
+
export function unshareItemWithGroup(
|
32
|
+
requestOptions: IGroupSharingOptions
|
33
|
+
): Promise<ISharingResponse> {
|
34
|
+
return isItemSharedWithGroup(requestOptions).then((isShared) => {
|
35
|
+
// not shared
|
36
|
+
if (!isShared) {
|
37
|
+
// exit early with success response
|
38
|
+
return Promise.resolve({
|
39
|
+
itemId: requestOptions.id,
|
40
|
+
shortcut: true,
|
41
|
+
notUnsharedFrom: []
|
42
|
+
} as ISharingResponse);
|
43
|
+
}
|
44
|
+
|
45
|
+
const {
|
46
|
+
authentication: { username },
|
47
|
+
owner
|
48
|
+
} = requestOptions;
|
49
|
+
|
50
|
+
// next check if the user is a member of the group
|
51
|
+
return Promise.all([
|
52
|
+
getUserMembership(requestOptions),
|
53
|
+
getUser({
|
54
|
+
username,
|
55
|
+
authentication: requestOptions.authentication
|
56
|
+
})
|
57
|
+
])
|
58
|
+
.then(([membership, currentUser]) => {
|
59
|
+
const itemOwner = owner || username;
|
60
|
+
const isItemOwner = itemOwner === username;
|
61
|
+
const isAdmin = currentUser.role === "org_admin" && !currentUser.roleId;
|
62
|
+
|
63
|
+
if (
|
64
|
+
!isItemOwner &&
|
65
|
+
!isAdmin &&
|
66
|
+
["admin", "owner"].indexOf(membership) < 0
|
67
|
+
) {
|
68
|
+
// abort and reject promise
|
69
|
+
throw Error(
|
70
|
+
`This item can not be unshared from group ${requestOptions.groupId} by ${username} as they not the item owner, an org admin, group admin or group owner.`
|
71
|
+
);
|
72
|
+
}
|
73
|
+
|
74
|
+
// let the sharing call go
|
75
|
+
return unshareFromGroup(requestOptions);
|
76
|
+
})
|
77
|
+
.then((sharingResponse) => {
|
78
|
+
if (sharingResponse.notUnsharedFrom.length) {
|
79
|
+
throw Error(
|
80
|
+
`Item ${requestOptions.id} could not be unshared to group ${requestOptions.groupId}`
|
81
|
+
);
|
82
|
+
} else {
|
83
|
+
// all is well
|
84
|
+
return sharingResponse;
|
85
|
+
}
|
86
|
+
});
|
87
|
+
});
|
88
|
+
}
|
89
|
+
|
90
|
+
function unshareFromGroup(
|
91
|
+
requestOptions: IGroupSharingOptions
|
92
|
+
): Promise<ISharingResponse> {
|
93
|
+
const username = requestOptions.authentication.username;
|
94
|
+
const itemOwner = requestOptions.owner || username;
|
95
|
+
// decide what url to use
|
96
|
+
// default to the non-owner url...
|
97
|
+
let url = `${getPortalUrl(requestOptions)}/content/items/${
|
98
|
+
requestOptions.id
|
99
|
+
}/unshare`;
|
100
|
+
|
101
|
+
// but if they are the owner, we use a different path...
|
102
|
+
if (itemOwner === username) {
|
103
|
+
url = `${getPortalUrl(requestOptions)}/content/users/${itemOwner}/items/${
|
104
|
+
requestOptions.id
|
105
|
+
}/unshare`;
|
106
|
+
}
|
107
|
+
|
108
|
+
// now its finally time to do the sharing
|
109
|
+
requestOptions.params = {
|
110
|
+
groups: requestOptions.groupId
|
111
|
+
};
|
112
|
+
|
113
|
+
return request(url, requestOptions);
|
114
|
+
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
/* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
|
2
|
+
* Apache-2.0 */
|
3
|
+
|
4
|
+
import { request } from "@esri/arcgis-rest-request";
|
5
|
+
import { getPortalUrl } from "../util/get-portal-url.js";
|
6
|
+
import { IGetUserOptions } from "./get-user.js";
|
7
|
+
|
8
|
+
export interface ITagCount {
|
9
|
+
/**
|
10
|
+
* the name of a tag
|
11
|
+
*/
|
12
|
+
tag: string;
|
13
|
+
/**
|
14
|
+
* a count that reports the number of times the tag was used
|
15
|
+
*/
|
16
|
+
count: number;
|
17
|
+
}
|
18
|
+
|
19
|
+
export interface IGetUserTagsResponse {
|
20
|
+
/**
|
21
|
+
* Array of user item tag objects
|
22
|
+
*/
|
23
|
+
tags: ITagCount[];
|
24
|
+
}
|
25
|
+
|
26
|
+
/**
|
27
|
+
* ```js
|
28
|
+
* import { getUserTags } from '@esri/arcgis-rest-portal';
|
29
|
+
* //
|
30
|
+
* getUserTags({
|
31
|
+
* username: "jsmith",
|
32
|
+
* authentication
|
33
|
+
* })
|
34
|
+
* .then(response)
|
35
|
+
* ```
|
36
|
+
* Users tag the content they publish in their portal via the add and update item calls. This resource lists all the tags used by the user along with the number of times the tags have been used. See the [REST Documentation](https://developers.arcgis.com/rest/users-groups-and-items/user-tags.htm) for more information.
|
37
|
+
*
|
38
|
+
* @param IGetUserOptions - options to pass through in the request
|
39
|
+
* @returns A Promise that will resolve with the user tag array
|
40
|
+
*/
|
41
|
+
export function getUserTags(
|
42
|
+
requestOptions: IGetUserOptions
|
43
|
+
): Promise<IGetUserTagsResponse> {
|
44
|
+
const username =
|
45
|
+
requestOptions.username || requestOptions.authentication.username;
|
46
|
+
const url = `${getPortalUrl(
|
47
|
+
requestOptions
|
48
|
+
)}/community/users/${encodeURIComponent(username)}/tags`;
|
49
|
+
|
50
|
+
// send the request
|
51
|
+
return request(url, requestOptions);
|
52
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
/* Copyright (c) 2019 Environmental Systems Research Institute, Inc.
|
2
|
+
* Apache-2.0 */
|
3
|
+
|
4
|
+
import { ArcGISIdentityManager } from "@esri/arcgis-rest-request";
|
5
|
+
|
6
|
+
import { getPortalUrl } from "../util/get-portal-url.js";
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Helper that returns the [user](https://developers.arcgis.com/rest/users-groups-and-items/user.htm) for a given portal.
|
10
|
+
*
|
11
|
+
* @param session
|
12
|
+
* @returns User url to be used in API requests.
|
13
|
+
*/
|
14
|
+
export function getUserUrl(session: ArcGISIdentityManager): string {
|
15
|
+
return `${getPortalUrl(session)}/community/users/${encodeURIComponent(
|
16
|
+
session.username
|
17
|
+
)}`;
|
18
|
+
}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
/* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
|
2
|
+
* Apache-2.0 */
|
3
|
+
|
4
|
+
import {
|
5
|
+
request,
|
6
|
+
IRequestOptions,
|
7
|
+
ArcGISIdentityManager,
|
8
|
+
IUser
|
9
|
+
} from "@esri/arcgis-rest-request";
|
10
|
+
|
11
|
+
import { getPortalUrl } from "../util/get-portal-url.js";
|
12
|
+
|
13
|
+
export interface IGetUserOptions extends IRequestOptions {
|
14
|
+
/**
|
15
|
+
* A session representing a logged in user.
|
16
|
+
*/
|
17
|
+
authentication?: ArcGISIdentityManager;
|
18
|
+
/**
|
19
|
+
* Supply a username if you'd like to fetch information about a different user than is being used to authenticate the request.
|
20
|
+
*/
|
21
|
+
username?: string;
|
22
|
+
}
|
23
|
+
|
24
|
+
/**
|
25
|
+
* ```js
|
26
|
+
* import { getUser } from '@esri/arcgis-rest-portal';
|
27
|
+
* //
|
28
|
+
* getUser("jsmith")
|
29
|
+
* .then(response)
|
30
|
+
* // => { firstName: "John", lastName: "Smith",tags: ["GIS Analyst", "City of Redlands"] }
|
31
|
+
* ```
|
32
|
+
* Get information about a user. This method has proven so generically useful that you can also call [`ArcGISIdentityManager.getUser()`](/arcgis-rest-js/api/auth/ArcGISIdentityManager#getUser-summary).
|
33
|
+
*
|
34
|
+
* @param requestOptions - options to pass through in the request
|
35
|
+
* @returns A Promise that will resolve with metadata about the user
|
36
|
+
*/
|
37
|
+
export function getUser(
|
38
|
+
requestOptions?: string | IGetUserOptions
|
39
|
+
): Promise<IUser> {
|
40
|
+
let url;
|
41
|
+
let options = { httpMethod: "GET" } as IGetUserOptions;
|
42
|
+
|
43
|
+
// if a username is passed, assume ArcGIS Online
|
44
|
+
if (typeof requestOptions === "string") {
|
45
|
+
url = `https://www.arcgis.com/sharing/rest/community/users/${requestOptions}`;
|
46
|
+
} else {
|
47
|
+
// if an authenticated session is passed, default to that user/portal unless another username is provided manually
|
48
|
+
const username =
|
49
|
+
requestOptions.username || requestOptions.authentication.username;
|
50
|
+
url = `${getPortalUrl(requestOptions)}/community/users/${encodeURIComponent(
|
51
|
+
username
|
52
|
+
)}`;
|
53
|
+
options = {
|
54
|
+
...requestOptions,
|
55
|
+
...options
|
56
|
+
};
|
57
|
+
}
|
58
|
+
// send the request
|
59
|
+
return request(url, options);
|
60
|
+
}
|