culparepellendus 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (470) hide show
  1. package/.env.example +2 -0
  2. package/.eslintrc.js +20 -0
  3. package/.github/workflows/deploy-docs.yml +27 -0
  4. package/.github/workflows/pre-release-tests.yml +45 -0
  5. package/.github/workflows/pull-request-tests.yml +45 -0
  6. package/.prettierignore +2 -0
  7. package/.prettierrc +19 -0
  8. package/.vscode/launch.json +24 -0
  9. package/.vscode/settings.json +3 -0
  10. package/codecov.yml +7 -0
  11. package/demos/.eslintrc.js +13 -0
  12. package/demos/ago-node-cli/README.md +29 -0
  13. package/demos/ago-node-cli/ago.js +33 -0
  14. package/demos/ago-node-cli/index.js +11 -0
  15. package/demos/ago-node-cli/lib/item-export-command.js +48 -0
  16. package/demos/ago-node-cli/lib/item-search-command.js +35 -0
  17. package/demos/ago-node-cli/package-lock.json +430 -0
  18. package/demos/ago-node-cli/package.json +30 -0
  19. package/demos/attachments/README.md +5 -0
  20. package/demos/attachments/index.html +165 -0
  21. package/demos/attachments/package-lock.json +543 -0
  22. package/demos/attachments/package.json +18 -0
  23. package/demos/batch-geocoder-node/NYC_Restaurant_Inspection_Results.csv +100 -0
  24. package/demos/batch-geocoder-node/README.md +15 -0
  25. package/demos/batch-geocoder-node/batch-geocode.js +115 -0
  26. package/demos/batch-geocoder-node/config-template.js +18 -0
  27. package/demos/batch-geocoder-node/package-lock.json +336 -0
  28. package/demos/batch-geocoder-node/package.json +37 -0
  29. package/demos/express/README.md +15 -0
  30. package/demos/express/config.json.template +3 -0
  31. package/demos/express/package-lock.json +1008 -0
  32. package/demos/express/package.json +18 -0
  33. package/demos/express/server.js +33 -0
  34. package/demos/feature-service-browser/README.md +6 -0
  35. package/demos/feature-service-browser/index.html +122 -0
  36. package/demos/feature-service-browser/package-lock.json +543 -0
  37. package/demos/feature-service-browser/package.json +18 -0
  38. package/demos/geocoder-browser/README.md +10 -0
  39. package/demos/geocoder-browser/config.js.template +1 -0
  40. package/demos/geocoder-browser/index.html +131 -0
  41. package/demos/geocoder-browser/package-lock.json +610 -0
  42. package/demos/geocoder-browser/package.json +19 -0
  43. package/demos/geocoder-browser/post-sign-in.html +25 -0
  44. package/demos/jsapi-integration/README.md +25 -0
  45. package/demos/jsapi-integration/config.js +6 -0
  46. package/demos/jsapi-integration/index.html +93 -0
  47. package/demos/jsapi-integration/package-lock.json +247 -0
  48. package/demos/jsapi-integration/package.json +19 -0
  49. package/demos/node-cli-item-management/README.md +10 -0
  50. package/demos/node-cli-item-management/index.js +238 -0
  51. package/demos/node-cli-item-management/package-lock.json +432 -0
  52. package/demos/node-cli-item-management/package.json +27 -0
  53. package/demos/node-cli-item-management/screenshot.png +0 -0
  54. package/demos/oauth2-browser/README.md +14 -0
  55. package/demos/oauth2-browser/authenticate.html +30 -0
  56. package/demos/oauth2-browser/config.js.template +6 -0
  57. package/demos/oauth2-browser/index.html +211 -0
  58. package/demos/oauth2-browser/logo.svg +4 -0
  59. package/demos/oauth2-browser/package-lock.json +474 -0
  60. package/demos/oauth2-browser/package.json +18 -0
  61. package/demos/oauth2-browser/style.css +36 -0
  62. package/demos/oauth2-browser-retry/README.md +25 -0
  63. package/demos/oauth2-browser-retry/authenticate.html +22 -0
  64. package/demos/oauth2-browser-retry/index.html +116 -0
  65. package/demos/oauth2-browser-retry/logo.svg +4 -0
  66. package/demos/stream-response-to-file/README.md +7 -0
  67. package/demos/stream-response-to-file/index.js +36 -0
  68. package/demos/stream-response-to-file/output/.gitkeep +0 -0
  69. package/demos/stream-response-to-file/package-lock.json +227 -0
  70. package/demos/stream-response-to-file/package.json +33 -0
  71. package/demos/tree-shaking-rollup/.babelrc +3 -0
  72. package/demos/tree-shaking-rollup/README.md +9 -0
  73. package/demos/tree-shaking-rollup/index.html +11 -0
  74. package/demos/tree-shaking-rollup/package-lock.json +5646 -0
  75. package/demos/tree-shaking-rollup/package.json +25 -0
  76. package/demos/tree-shaking-rollup/rollup.config.js +17 -0
  77. package/demos/tree-shaking-rollup/src/index.js +8 -0
  78. package/demos/tree-shaking-webpack/README.md +8 -0
  79. package/demos/tree-shaking-webpack/index.html +11 -0
  80. package/demos/tree-shaking-webpack/package-lock.json +11455 -0
  81. package/demos/tree-shaking-webpack/package.json +24 -0
  82. package/demos/tree-shaking-webpack/src/index.js +10 -0
  83. package/demos/tree-shaking-webpack/webpack.config.js +27 -0
  84. package/demos/vue/.env.example +11 -0
  85. package/demos/vue/.eslintrc.js +17 -0
  86. package/demos/vue/.postcssrc.js +5 -0
  87. package/demos/vue/README.md +17 -0
  88. package/demos/vue/babel.config.js +3 -0
  89. package/demos/vue/package-lock.json +28044 -0
  90. package/demos/vue/package.json +33 -0
  91. package/demos/vue/public/favicon.ico +0 -0
  92. package/demos/vue/public/index.html +24 -0
  93. package/demos/vue/src/assets/logo.svg +29 -0
  94. package/demos/vue/src/components/App.vue +305 -0
  95. package/demos/vue/src/components/Authenticate.vue +65 -0
  96. package/demos/vue/src/components/Loader.vue +230 -0
  97. package/demos/vue/src/main.js +92 -0
  98. package/demos/webmap-checker-sapper/.env.example +5 -0
  99. package/demos/webmap-checker-sapper/README.md +123 -0
  100. package/demos/webmap-checker-sapper/appveyor.yml +18 -0
  101. package/demos/webmap-checker-sapper/cypress/fixtures/example.json +5 -0
  102. package/demos/webmap-checker-sapper/cypress/integration/spec.js +19 -0
  103. package/demos/webmap-checker-sapper/cypress/plugins/index.js +17 -0
  104. package/demos/webmap-checker-sapper/cypress/support/commands.js +25 -0
  105. package/demos/webmap-checker-sapper/cypress/support/index.js +20 -0
  106. package/demos/webmap-checker-sapper/cypress.json +4 -0
  107. package/demos/webmap-checker-sapper/package-lock.json +9622 -0
  108. package/demos/webmap-checker-sapper/package.json +50 -0
  109. package/demos/webmap-checker-sapper/rollup.config.js +87 -0
  110. package/demos/webmap-checker-sapper/src/client.js +20 -0
  111. package/demos/webmap-checker-sapper/src/components/LayerStatus.html +108 -0
  112. package/demos/webmap-checker-sapper/src/components/Nav.html +21 -0
  113. package/demos/webmap-checker-sapper/src/components/WebMap.html +62 -0
  114. package/demos/webmap-checker-sapper/src/routes/_error.html +41 -0
  115. package/demos/webmap-checker-sapper/src/routes/_layout.html +21 -0
  116. package/demos/webmap-checker-sapper/src/routes/auth/authorize.js +18 -0
  117. package/demos/webmap-checker-sapper/src/routes/auth/exchange-token.js +20 -0
  118. package/demos/webmap-checker-sapper/src/routes/auth/post-sign-in.js +24 -0
  119. package/demos/webmap-checker-sapper/src/routes/auth/sign-out.js +10 -0
  120. package/demos/webmap-checker-sapper/src/routes/index.html +20 -0
  121. package/demos/webmap-checker-sapper/src/routes/webmaps/[webmapId].html +83 -0
  122. package/demos/webmap-checker-sapper/src/routes/webmaps/index.html +59 -0
  123. package/demos/webmap-checker-sapper/src/server.js +101 -0
  124. package/demos/webmap-checker-sapper/src/service-worker.js +82 -0
  125. package/demos/webmap-checker-sapper/src/template.html +33 -0
  126. package/demos/webmap-checker-sapper/src/userInfoMiddleware.js +21 -0
  127. package/demos/webmap-checker-sapper/src/utils.js +33 -0
  128. package/demos/webmap-checker-sapper/static/favicon.png +0 -0
  129. package/demos/webmap-checker-sapper/static/global.css +36 -0
  130. package/demos/webmap-checker-sapper/static/manifest.json +20 -0
  131. package/demos/webmap-checker-sapper/static/svelte-logo-192.png +0 -0
  132. package/demos/webmap-checker-sapper/static/svelte-logo-512.png +0 -0
  133. package/docs/.eslintrc.js +12 -0
  134. package/docs/FAQ.md +48 -0
  135. package/docs/HISTORY.md +62 -0
  136. package/docs/acetate.config.js +262 -0
  137. package/docs/build-typedoc.js +434 -0
  138. package/docs/generate-srihashes.js +53 -0
  139. package/docs/src/_layout.html +86 -0
  140. package/docs/src/api/_declaration.html +600 -0
  141. package/docs/src/api/_layout.html +204 -0
  142. package/docs/src/api/_package.html +38 -0
  143. package/docs/src/api/index.html +16 -0
  144. package/docs/src/guides/_layout.html +24 -0
  145. package/docs/src/guides/amd-requirejs-dojo.md +40 -0
  146. package/docs/src/guides/browser-authentication.md +39 -0
  147. package/docs/src/guides/bundlers.md +52 -0
  148. package/docs/src/guides/cli-authentication.md +9 -0
  149. package/docs/src/guides/client-server-authentication.md +9 -0
  150. package/docs/src/guides/embedded-apps.md +106 -0
  151. package/docs/src/guides/from-a-cdn.md +38 -0
  152. package/docs/src/guides/index.md +59 -0
  153. package/docs/src/guides/node.md +104 -0
  154. package/docs/src/guides/package-overview.md +111 -0
  155. package/docs/src/guides/server-authentication.md +9 -0
  156. package/docs/src/guides/whats-new-v2-0.md +305 -0
  157. package/docs/src/img/icons.png +0 -0
  158. package/docs/src/img/icons@2x.png +0 -0
  159. package/docs/src/img/oauth-browser.png +0 -0
  160. package/docs/src/index.html +12 -0
  161. package/docs/src/js/api-search.js +112 -0
  162. package/docs/src/js/nav-toggle.js +41 -0
  163. package/docs/src/sass/_highlight.scss +96 -0
  164. package/docs/src/sass/_icons.scss +157 -0
  165. package/docs/src/sass/style.scss +242 -0
  166. package/docs/src/srihashes.json +12 -0
  167. package/jasmine.json +7 -0
  168. package/jasmine.live.json +7 -0
  169. package/karma.conf.js +107 -0
  170. package/lerna.json +8 -0
  171. package/notes/README.md +68 -0
  172. package/package.json +87 -0
  173. package/packages/arcgis-rest-auth/README.md +71 -0
  174. package/packages/arcgis-rest-auth/package-lock.json +27 -0
  175. package/packages/arcgis-rest-auth/package.json +69 -0
  176. package/packages/arcgis-rest-auth/post-message-auth-spec.md +70 -0
  177. package/packages/arcgis-rest-auth/src/ApiKey.ts +41 -0
  178. package/packages/arcgis-rest-auth/src/ApplicationSession.ts +122 -0
  179. package/packages/arcgis-rest-auth/src/UserSession.ts +1376 -0
  180. package/packages/arcgis-rest-auth/src/app-tokens.ts +131 -0
  181. package/packages/arcgis-rest-auth/src/authenticated-request-options.ts +24 -0
  182. package/packages/arcgis-rest-auth/src/federation-utils.ts +85 -0
  183. package/packages/arcgis-rest-auth/src/fetch-token.ts +50 -0
  184. package/packages/arcgis-rest-auth/src/generate-token.ts +35 -0
  185. package/packages/arcgis-rest-auth/src/index.ts +13 -0
  186. package/packages/arcgis-rest-auth/src/validate-app-access.ts +68 -0
  187. package/packages/arcgis-rest-auth/test/ApiKey.test.ts +35 -0
  188. package/packages/arcgis-rest-auth/test/ApplicationSession.test.ts +124 -0
  189. package/packages/arcgis-rest-auth/test/UserSession.test.ts +2430 -0
  190. package/packages/arcgis-rest-auth/test/app-tokens.test.ts +95 -0
  191. package/packages/arcgis-rest-auth/test/federation-utils.test.ts +323 -0
  192. package/packages/arcgis-rest-auth/test/fetchToken.test.ts +112 -0
  193. package/packages/arcgis-rest-auth/test/generateToken.test.ts +102 -0
  194. package/packages/arcgis-rest-auth/test/utils.ts +14 -0
  195. package/packages/arcgis-rest-auth/test/validate-app-access.test.ts +46 -0
  196. package/packages/arcgis-rest-auth/tsconfig.json +6 -0
  197. package/packages/arcgis-rest-demographics/README.md +75 -0
  198. package/packages/arcgis-rest-demographics/package-lock.json +11 -0
  199. package/packages/arcgis-rest-demographics/package.json +69 -0
  200. package/packages/arcgis-rest-demographics/src/getAvailableCountries.ts +113 -0
  201. package/packages/arcgis-rest-demographics/src/getAvailableDataCollections.ts +166 -0
  202. package/packages/arcgis-rest-demographics/src/getAvailableGeographyLevels.ts +88 -0
  203. package/packages/arcgis-rest-demographics/src/getGeography.ts +152 -0
  204. package/packages/arcgis-rest-demographics/src/helpers.ts +28 -0
  205. package/packages/arcgis-rest-demographics/src/index.ts +8 -0
  206. package/packages/arcgis-rest-demographics/src/queryDemographicData.ts +106 -0
  207. package/packages/arcgis-rest-demographics/test/getAvailableCountries.test.ts +92 -0
  208. package/packages/arcgis-rest-demographics/test/getAvailableDataCollections.test.ts +115 -0
  209. package/packages/arcgis-rest-demographics/test/getAvailableGeographyLevels.test.ts +72 -0
  210. package/packages/arcgis-rest-demographics/test/getGeography.test.ts +141 -0
  211. package/packages/arcgis-rest-demographics/test/mocks/responses.ts +4 -0
  212. package/packages/arcgis-rest-demographics/test/queryDemographicData.test.live.ts +42 -0
  213. package/packages/arcgis-rest-demographics/test/queryDemographicData.test.ts +113 -0
  214. package/packages/arcgis-rest-demographics/tsconfig.json +6 -0
  215. package/packages/arcgis-rest-feature-layer/README.md +77 -0
  216. package/packages/arcgis-rest-feature-layer/package-lock.json +11 -0
  217. package/packages/arcgis-rest-feature-layer/package.json +64 -0
  218. package/packages/arcgis-rest-feature-layer/src/add.ts +56 -0
  219. package/packages/arcgis-rest-feature-layer/src/addAttachment.ts +53 -0
  220. package/packages/arcgis-rest-feature-layer/src/applyEdits.ts +95 -0
  221. package/packages/arcgis-rest-feature-layer/src/decodeValues.ts +122 -0
  222. package/packages/arcgis-rest-feature-layer/src/delete.ts +61 -0
  223. package/packages/arcgis-rest-feature-layer/src/deleteAttachments.ts +52 -0
  224. package/packages/arcgis-rest-feature-layer/src/getAllLayersAndTables.ts +30 -0
  225. package/packages/arcgis-rest-feature-layer/src/getAttachments.ts +55 -0
  226. package/packages/arcgis-rest-feature-layer/src/getLayer.ts +24 -0
  227. package/packages/arcgis-rest-feature-layer/src/getService.ts +26 -0
  228. package/packages/arcgis-rest-feature-layer/src/helpers.ts +97 -0
  229. package/packages/arcgis-rest-feature-layer/src/index.ts +32 -0
  230. package/packages/arcgis-rest-feature-layer/src/query.ts +204 -0
  231. package/packages/arcgis-rest-feature-layer/src/queryRelated.ts +89 -0
  232. package/packages/arcgis-rest-feature-layer/src/update.ts +60 -0
  233. package/packages/arcgis-rest-feature-layer/src/updateAttachment.ts +59 -0
  234. package/packages/arcgis-rest-feature-layer/test/attachments.test.ts +200 -0
  235. package/packages/arcgis-rest-feature-layer/test/crud.test.ts +197 -0
  236. package/packages/arcgis-rest-feature-layer/test/decodeValues.test.ts +67 -0
  237. package/packages/arcgis-rest-feature-layer/test/getAllLayersAndTables.test.ts +28 -0
  238. package/packages/arcgis-rest-feature-layer/test/getLayer.test.ts +31 -0
  239. package/packages/arcgis-rest-feature-layer/test/getService.test.ts +31 -0
  240. package/packages/arcgis-rest-feature-layer/test/helpers.test.ts +25 -0
  241. package/packages/arcgis-rest-feature-layer/test/mocks/allLayersAndTablesResponse.ts +906 -0
  242. package/packages/arcgis-rest-feature-layer/test/mocks/cvdQueryResponse.ts +225 -0
  243. package/packages/arcgis-rest-feature-layer/test/mocks/feature.ts +302 -0
  244. package/packages/arcgis-rest-feature-layer/test/mocks/fields.ts +779 -0
  245. package/packages/arcgis-rest-feature-layer/test/mocks/foo.txt +1 -0
  246. package/packages/arcgis-rest-feature-layer/test/mocks/service.ts +398 -0
  247. package/packages/arcgis-rest-feature-layer/test/query.test.ts +167 -0
  248. package/packages/arcgis-rest-feature-layer/tsconfig.json +6 -0
  249. package/packages/arcgis-rest-geocoding/README.md +86 -0
  250. package/packages/arcgis-rest-geocoding/package-lock.json +43 -0
  251. package/packages/arcgis-rest-geocoding/package.json +66 -0
  252. package/packages/arcgis-rest-geocoding/src/bulk.ts +104 -0
  253. package/packages/arcgis-rest-geocoding/src/geocode.ts +166 -0
  254. package/packages/arcgis-rest-geocoding/src/helpers.ts +56 -0
  255. package/packages/arcgis-rest-geocoding/src/index.ts +15 -0
  256. package/packages/arcgis-rest-geocoding/src/reverse.ts +84 -0
  257. package/packages/arcgis-rest-geocoding/src/suggest.ts +45 -0
  258. package/packages/arcgis-rest-geocoding/test/bulk.test.ts +194 -0
  259. package/packages/arcgis-rest-geocoding/test/geocode.test.ts +253 -0
  260. package/packages/arcgis-rest-geocoding/test/helpers.test.ts +85 -0
  261. package/packages/arcgis-rest-geocoding/test/mocks/responses.ts +591 -0
  262. package/packages/arcgis-rest-geocoding/test/reverse.test.ts +126 -0
  263. package/packages/arcgis-rest-geocoding/test/suggest.test.ts +53 -0
  264. package/packages/arcgis-rest-geocoding/tsconfig.json +6 -0
  265. package/packages/arcgis-rest-portal/README.md +73 -0
  266. package/packages/arcgis-rest-portal/package-lock.json +37 -0
  267. package/packages/arcgis-rest-portal/package.json +64 -0
  268. package/packages/arcgis-rest-portal/src/groups/add-users.ts +140 -0
  269. package/packages/arcgis-rest-portal/src/groups/create.ts +43 -0
  270. package/packages/arcgis-rest-portal/src/groups/get.ts +184 -0
  271. package/packages/arcgis-rest-portal/src/groups/helpers.ts +14 -0
  272. package/packages/arcgis-rest-portal/src/groups/invite-users.ts +127 -0
  273. package/packages/arcgis-rest-portal/src/groups/join.ts +57 -0
  274. package/packages/arcgis-rest-portal/src/groups/notification.ts +77 -0
  275. package/packages/arcgis-rest-portal/src/groups/protect.ts +56 -0
  276. package/packages/arcgis-rest-portal/src/groups/remove-users.ts +76 -0
  277. package/packages/arcgis-rest-portal/src/groups/remove.ts +32 -0
  278. package/packages/arcgis-rest-portal/src/groups/search.ts +47 -0
  279. package/packages/arcgis-rest-portal/src/groups/update-user-membership.ts +63 -0
  280. package/packages/arcgis-rest-portal/src/groups/update.ts +39 -0
  281. package/packages/arcgis-rest-portal/src/index.ts +70 -0
  282. package/packages/arcgis-rest-portal/src/items/add.ts +138 -0
  283. package/packages/arcgis-rest-portal/src/items/content.ts +67 -0
  284. package/packages/arcgis-rest-portal/src/items/create.ts +150 -0
  285. package/packages/arcgis-rest-portal/src/items/export.ts +80 -0
  286. package/packages/arcgis-rest-portal/src/items/get.ts +437 -0
  287. package/packages/arcgis-rest-portal/src/items/helpers.ts +292 -0
  288. package/packages/arcgis-rest-portal/src/items/protect.ts +41 -0
  289. package/packages/arcgis-rest-portal/src/items/reassign.ts +61 -0
  290. package/packages/arcgis-rest-portal/src/items/remove.ts +141 -0
  291. package/packages/arcgis-rest-portal/src/items/search.ts +25 -0
  292. package/packages/arcgis-rest-portal/src/items/update.ts +185 -0
  293. package/packages/arcgis-rest-portal/src/items/upload.ts +125 -0
  294. package/packages/arcgis-rest-portal/src/orgs/notification.ts +131 -0
  295. package/packages/arcgis-rest-portal/src/services/get-unique-service-name.ts +35 -0
  296. package/packages/arcgis-rest-portal/src/services/is-service-name-available.ts +30 -0
  297. package/packages/arcgis-rest-portal/src/sharing/access.ts +84 -0
  298. package/packages/arcgis-rest-portal/src/sharing/helpers.ts +81 -0
  299. package/packages/arcgis-rest-portal/src/sharing/is-item-shared-with-group.ts +42 -0
  300. package/packages/arcgis-rest-portal/src/sharing/share-item-with-group.ts +340 -0
  301. package/packages/arcgis-rest-portal/src/sharing/unshare-item-with-group.ts +105 -0
  302. package/packages/arcgis-rest-portal/src/users/get-user-tags.ts +52 -0
  303. package/packages/arcgis-rest-portal/src/users/get-user-url.ts +18 -0
  304. package/packages/arcgis-rest-portal/src/users/get-user.ts +58 -0
  305. package/packages/arcgis-rest-portal/src/users/invitation.ts +156 -0
  306. package/packages/arcgis-rest-portal/src/users/notification.ts +68 -0
  307. package/packages/arcgis-rest-portal/src/users/search-users.ts +37 -0
  308. package/packages/arcgis-rest-portal/src/users/update.ts +66 -0
  309. package/packages/arcgis-rest-portal/src/util/SearchQueryBuilder.ts +391 -0
  310. package/packages/arcgis-rest-portal/src/util/array.ts +16 -0
  311. package/packages/arcgis-rest-portal/src/util/generic-search.ts +114 -0
  312. package/packages/arcgis-rest-portal/src/util/get-portal-settings.ts +45 -0
  313. package/packages/arcgis-rest-portal/src/util/get-portal-url.ts +28 -0
  314. package/packages/arcgis-rest-portal/src/util/get-portal.ts +53 -0
  315. package/packages/arcgis-rest-portal/src/util/get-subscription-info.ts +43 -0
  316. package/packages/arcgis-rest-portal/src/util/scrub-control-chars.ts +13 -0
  317. package/packages/arcgis-rest-portal/src/util/search.ts +47 -0
  318. package/packages/arcgis-rest-portal/test/groups/add-users.test.ts +239 -0
  319. package/packages/arcgis-rest-portal/test/groups/crud.test.ts +180 -0
  320. package/packages/arcgis-rest-portal/test/groups/get.test.ts +176 -0
  321. package/packages/arcgis-rest-portal/test/groups/invite-users.test.ts +146 -0
  322. package/packages/arcgis-rest-portal/test/groups/join.test.ts +72 -0
  323. package/packages/arcgis-rest-portal/test/groups/notification.test.ts +112 -0
  324. package/packages/arcgis-rest-portal/test/groups/protect.test.ts +72 -0
  325. package/packages/arcgis-rest-portal/test/groups/remove-users.test.ts +140 -0
  326. package/packages/arcgis-rest-portal/test/groups/search.test.ts +151 -0
  327. package/packages/arcgis-rest-portal/test/groups/update-user-membership.test.ts +62 -0
  328. package/packages/arcgis-rest-portal/test/items/add.test.ts +323 -0
  329. package/packages/arcgis-rest-portal/test/items/content.test.ts +156 -0
  330. package/packages/arcgis-rest-portal/test/items/create.test.ts +400 -0
  331. package/packages/arcgis-rest-portal/test/items/export.test.ts +122 -0
  332. package/packages/arcgis-rest-portal/test/items/get.test.ts +583 -0
  333. package/packages/arcgis-rest-portal/test/items/helpers.test.ts +60 -0
  334. package/packages/arcgis-rest-portal/test/items/protect.test.ts +122 -0
  335. package/packages/arcgis-rest-portal/test/items/reassign.test.ts +131 -0
  336. package/packages/arcgis-rest-portal/test/items/remove.test.ts +261 -0
  337. package/packages/arcgis-rest-portal/test/items/search.test.ts +322 -0
  338. package/packages/arcgis-rest-portal/test/items/update.test.ts +556 -0
  339. package/packages/arcgis-rest-portal/test/items/upload.test.ts +282 -0
  340. package/packages/arcgis-rest-portal/test/mocks/groups/responses.ts +208 -0
  341. package/packages/arcgis-rest-portal/test/mocks/items/foo.zip +0 -0
  342. package/packages/arcgis-rest-portal/test/mocks/items/item.ts +526 -0
  343. package/packages/arcgis-rest-portal/test/mocks/items/resources.ts +38 -0
  344. package/packages/arcgis-rest-portal/test/mocks/items/search.ts +121 -0
  345. package/packages/arcgis-rest-portal/test/mocks/portal/response.ts +126 -0
  346. package/packages/arcgis-rest-portal/test/mocks/portal/settings-response.ts +56 -0
  347. package/packages/arcgis-rest-portal/test/mocks/sharing/sharing.ts +18 -0
  348. package/packages/arcgis-rest-portal/test/mocks/users/invitation.ts +70 -0
  349. package/packages/arcgis-rest-portal/test/mocks/users/notification.ts +34 -0
  350. package/packages/arcgis-rest-portal/test/mocks/users/user-search.ts +388 -0
  351. package/packages/arcgis-rest-portal/test/mocks/users/user-tags.ts +5 -0
  352. package/packages/arcgis-rest-portal/test/mocks/users/user.ts +174 -0
  353. package/packages/arcgis-rest-portal/test/orgs/notification.test.ts +144 -0
  354. package/packages/arcgis-rest-portal/test/services/get-unique-service-name.test.ts +59 -0
  355. package/packages/arcgis-rest-portal/test/services/is-service-name-available.test.ts +46 -0
  356. package/packages/arcgis-rest-portal/test/sharing/access.test.ts +162 -0
  357. package/packages/arcgis-rest-portal/test/sharing/helpers.test.ts +55 -0
  358. package/packages/arcgis-rest-portal/test/sharing/share-item-with-group.test.ts +1382 -0
  359. package/packages/arcgis-rest-portal/test/sharing/unshare-item-with-group.test.ts +288 -0
  360. package/packages/arcgis-rest-portal/test/users/get-user-tags.test.ts +71 -0
  361. package/packages/arcgis-rest-portal/test/users/get-user-url.test.ts +40 -0
  362. package/packages/arcgis-rest-portal/test/users/get-user.test.ts +90 -0
  363. package/packages/arcgis-rest-portal/test/users/invitation.test.ts +127 -0
  364. package/packages/arcgis-rest-portal/test/users/notification.test.ts +77 -0
  365. package/packages/arcgis-rest-portal/test/users/search.test.ts +42 -0
  366. package/packages/arcgis-rest-portal/test/users/update.test.ts +151 -0
  367. package/packages/arcgis-rest-portal/test/util/SearchQueryBuilder.test.ts +345 -0
  368. package/packages/arcgis-rest-portal/test/util/array.test.ts +30 -0
  369. package/packages/arcgis-rest-portal/test/util/get-portal-settings.test.ts +68 -0
  370. package/packages/arcgis-rest-portal/test/util/get-portal-url.test.ts +37 -0
  371. package/packages/arcgis-rest-portal/test/util/portal.test.ts +148 -0
  372. package/packages/arcgis-rest-portal/test/util/scrub-control-chars.test.ts +22 -0
  373. package/packages/arcgis-rest-portal/tsconfig.json +6 -0
  374. package/packages/arcgis-rest-request/README.md +72 -0
  375. package/packages/arcgis-rest-request/package-lock.json +13 -0
  376. package/packages/arcgis-rest-request/package.json +60 -0
  377. package/packages/arcgis-rest-request/src/index.ts +25 -0
  378. package/packages/arcgis-rest-request/src/request.ts +433 -0
  379. package/packages/arcgis-rest-request/src/utils/ArcGISRequestError.ts +76 -0
  380. package/packages/arcgis-rest-request/src/utils/ErrorTypes.ts +29 -0
  381. package/packages/arcgis-rest-request/src/utils/GrantTypes.ts +5 -0
  382. package/packages/arcgis-rest-request/src/utils/HTTPMethods.ts +6 -0
  383. package/packages/arcgis-rest-request/src/utils/IAuthenticationManager.ts +22 -0
  384. package/packages/arcgis-rest-request/src/utils/IFetchTokenParams.ts +11 -0
  385. package/packages/arcgis-rest-request/src/utils/IGenerateTokenParams.ts +9 -0
  386. package/packages/arcgis-rest-request/src/utils/IParamBuilder.ts +3 -0
  387. package/packages/arcgis-rest-request/src/utils/IParams.ts +6 -0
  388. package/packages/arcgis-rest-request/src/utils/IParamsBuilder.ts +5 -0
  389. package/packages/arcgis-rest-request/src/utils/IRequestOptions.ts +54 -0
  390. package/packages/arcgis-rest-request/src/utils/ITokenRequestOptions.ts +9 -0
  391. package/packages/arcgis-rest-request/src/utils/ResponseFormats.ts +10 -0
  392. package/packages/arcgis-rest-request/src/utils/append-custom-params.ts +49 -0
  393. package/packages/arcgis-rest-request/src/utils/clean-url.ts +20 -0
  394. package/packages/arcgis-rest-request/src/utils/decode-query-string.ts +27 -0
  395. package/packages/arcgis-rest-request/src/utils/encode-form-data.ts +38 -0
  396. package/packages/arcgis-rest-request/src/utils/encode-query-string.ts +35 -0
  397. package/packages/arcgis-rest-request/src/utils/process-params.ts +109 -0
  398. package/packages/arcgis-rest-request/src/utils/retryAuthError.ts +10 -0
  399. package/packages/arcgis-rest-request/src/utils/warn.ts +11 -0
  400. package/packages/arcgis-rest-request/src/utils/with-options.ts +48 -0
  401. package/packages/arcgis-rest-request/test/mocks/errors.ts +76 -0
  402. package/packages/arcgis-rest-request/test/mocks/geojson-feature-collection.ts +13 -0
  403. package/packages/arcgis-rest-request/test/mocks/param-builder.ts +7 -0
  404. package/packages/arcgis-rest-request/test/mocks/sharing-rest-info.ts +41 -0
  405. package/packages/arcgis-rest-request/test/mocks/webmap.ts +41 -0
  406. package/packages/arcgis-rest-request/test/request.test.ts +621 -0
  407. package/packages/arcgis-rest-request/test/utils/ArcGISAuthError.test.ts +191 -0
  408. package/packages/arcgis-rest-request/test/utils/ArcGISRequestError.test.ts +51 -0
  409. package/packages/arcgis-rest-request/test/utils/check-for-errors.test.ts +111 -0
  410. package/packages/arcgis-rest-request/test/utils/clean-url.test.ts +50 -0
  411. package/packages/arcgis-rest-request/test/utils/encode-form-data.test.ts +133 -0
  412. package/packages/arcgis-rest-request/test/utils/encode-query-string.test.ts +18 -0
  413. package/packages/arcgis-rest-request/test/utils/process-params.test.ts +205 -0
  414. package/packages/arcgis-rest-request/test/utils/with-options.test.ts +133 -0
  415. package/packages/arcgis-rest-request/tsconfig.json +4 -0
  416. package/packages/arcgis-rest-routing/README.md +75 -0
  417. package/packages/arcgis-rest-routing/package-lock.json +43 -0
  418. package/packages/arcgis-rest-routing/package.json +65 -0
  419. package/packages/arcgis-rest-routing/src/closestFacility.ts +225 -0
  420. package/packages/arcgis-rest-routing/src/helpers.ts +104 -0
  421. package/packages/arcgis-rest-routing/src/index.ts +14 -0
  422. package/packages/arcgis-rest-routing/src/originDestinationMatrix.ts +223 -0
  423. package/packages/arcgis-rest-routing/src/serviceArea.ts +173 -0
  424. package/packages/arcgis-rest-routing/src/solveRoute.ts +180 -0
  425. package/packages/arcgis-rest-routing/test/closestFacility.test.ts +683 -0
  426. package/packages/arcgis-rest-routing/test/mocks/inputs.ts +132 -0
  427. package/packages/arcgis-rest-routing/test/mocks/responses.ts +13322 -0
  428. package/packages/arcgis-rest-routing/test/originDestinationMatrix.test.ts +797 -0
  429. package/packages/arcgis-rest-routing/test/serviceArea.test.ts +601 -0
  430. package/packages/arcgis-rest-routing/test/solveRoute.test.ts +677 -0
  431. package/packages/arcgis-rest-routing/tsconfig.json +6 -0
  432. package/packages/arcgis-rest-service-admin/README.md +73 -0
  433. package/packages/arcgis-rest-service-admin/package-lock.json +11 -0
  434. package/packages/arcgis-rest-service-admin/package.json +65 -0
  435. package/packages/arcgis-rest-service-admin/src/addTo.ts +70 -0
  436. package/packages/arcgis-rest-service-admin/src/create.ts +189 -0
  437. package/packages/arcgis-rest-service-admin/src/get-service-admin-info.ts +34 -0
  438. package/packages/arcgis-rest-service-admin/src/get-view-sources.ts +20 -0
  439. package/packages/arcgis-rest-service-admin/src/index.ts +14 -0
  440. package/packages/arcgis-rest-service-admin/src/update.ts +50 -0
  441. package/packages/arcgis-rest-service-admin/test/addTo.test.ts +350 -0
  442. package/packages/arcgis-rest-service-admin/test/create.test.ts +294 -0
  443. package/packages/arcgis-rest-service-admin/test/get-service-admin-info.test.ts +37 -0
  444. package/packages/arcgis-rest-service-admin/test/get-view-sources.test.ts +40 -0
  445. package/packages/arcgis-rest-service-admin/test/mocks/layerDefinition.ts +79 -0
  446. package/packages/arcgis-rest-service-admin/test/mocks/service.ts +81 -0
  447. package/packages/arcgis-rest-service-admin/test/update.test.ts +115 -0
  448. package/packages/arcgis-rest-service-admin/tsconfig.json +5 -0
  449. package/packages/arcgis-rest-types/README.md +66 -0
  450. package/packages/arcgis-rest-types/package-lock.json +5 -0
  451. package/packages/arcgis-rest-types/package.json +54 -0
  452. package/packages/arcgis-rest-types/src/feature.ts +42 -0
  453. package/packages/arcgis-rest-types/src/geometry.ts +272 -0
  454. package/packages/arcgis-rest-types/src/group.ts +72 -0
  455. package/packages/arcgis-rest-types/src/index.ts +9 -0
  456. package/packages/arcgis-rest-types/src/item.ts +81 -0
  457. package/packages/arcgis-rest-types/src/service.ts +156 -0
  458. package/packages/arcgis-rest-types/src/statisticDefinition.ts +33 -0
  459. package/packages/arcgis-rest-types/src/symbol.ts +170 -0
  460. package/packages/arcgis-rest-types/src/user.ts +49 -0
  461. package/packages/arcgis-rest-types/src/webmap.ts +1405 -0
  462. package/packages/arcgis-rest-types/tsconfig.json +10 -0
  463. package/support/changelog.js +393 -0
  464. package/support/deploy-doc-site.js +16 -0
  465. package/support/dev.sh +6 -0
  466. package/support/publish.sh +47 -0
  467. package/support/test-helpers.js +9 -0
  468. package/tsconfig.json +63 -0
  469. package/umd-base-profile.js +81 -0
  470. package/umd-production-profile.js +13 -0
@@ -0,0 +1,42 @@
1
+ import { IGroupSharingOptions } from "./helpers";
2
+ import { searchItems } from "../items/search";
3
+ import { ISearchOptions } from "../util/search";
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,340 @@
1
+ import { request } from "@esri/arcgis-rest-request";
2
+ import { IUser } from "@esri/arcgis-rest-types";
3
+ import { getPortalUrl } from "../util/get-portal-url";
4
+ import {
5
+ IGroupSharingOptions,
6
+ ISharingResponse,
7
+ getUserMembership,
8
+ } from "./helpers";
9
+ import { getUser } from "../users/get-user";
10
+ import { addGroupUsers, IAddGroupUsersResult } from "../groups/add-users";
11
+ import { removeGroupUsers } from "../groups/remove-users";
12
+ import {
13
+ updateUserMemberships,
14
+ IUpdateGroupUsersResult,
15
+ } from "../groups/update-user-membership";
16
+ import { isItemSharedWithGroup } from "../sharing/is-item-shared-with-group";
17
+
18
+ interface IEnsureMembershipResult {
19
+ promise: Promise<IAddGroupUsersResult>;
20
+ revert: (sharingResults: ISharingResponse) => Promise<ISharingResponse>;
21
+ }
22
+
23
+ /**
24
+ * ```js
25
+ * import { shareItemWithGroup } from '@esri/arcgis-rest-portal';
26
+ * //
27
+ * shareItemWithGroup({
28
+ * id: "abc123",
29
+ * groupId: "xyz987",
30
+ * owner: "some-owner",
31
+ * authentication
32
+ * })
33
+ * ```
34
+ * Share an item with a group, either as an
35
+ * [item owner](https://developers.arcgis.com/rest/users-groups-and-items/share-item-as-item-owner-.htm),
36
+ * [group admin](https://developers.arcgis.com/rest/users-groups-and-items/share-item-as-group-admin-.htm) or
37
+ * organization admin.
38
+ *
39
+ * Note: Sharing the item as an Admin will use the `/content/users/:ownername/items/:itemid/share` end-point
40
+ *
41
+ * @param requestOptions - Options for the request.
42
+ * @returns A Promise that will resolve with the data from the response.
43
+ */
44
+ export function shareItemWithGroup(
45
+ requestOptions: IGroupSharingOptions
46
+ ): Promise<ISharingResponse> {
47
+ return isItemSharedWithGroup(requestOptions)
48
+ .then((isShared) => {
49
+ if (isShared) {
50
+ // already shared, exit early with success response
51
+ return {
52
+ itemId: requestOptions.id,
53
+ shortcut: true,
54
+ notSharedWith: [],
55
+ } as ISharingResponse;
56
+ }
57
+
58
+ const {
59
+ authentication: { username },
60
+ owner,
61
+ confirmItemControl,
62
+ } = requestOptions;
63
+ const itemOwner = owner || username;
64
+
65
+ // non-item owner
66
+ if (itemOwner !== username) {
67
+ // need to track if the user is an admin
68
+ let isAdmin = false;
69
+ // track if the admin & owner are in the same org
70
+ let isCrossOrgSharing = false;
71
+ // next perform any necessary membership adjustments for
72
+ // current user and/or item owner
73
+ return Promise.all([
74
+ getUser({
75
+ username,
76
+ authentication: requestOptions.authentication,
77
+ }),
78
+ getUser({
79
+ username: itemOwner,
80
+ authentication: requestOptions.authentication,
81
+ }),
82
+ getUserMembership(requestOptions),
83
+ ])
84
+ .then(([currentUser, ownerUser, membership]) => {
85
+ const isSharedEditingGroup = !!confirmItemControl;
86
+ isAdmin = currentUser.role === "org_admin" && !currentUser.roleId;
87
+ isCrossOrgSharing = currentUser.orgId !== ownerUser.orgId;
88
+ return getMembershipAdjustments(
89
+ currentUser,
90
+ isSharedEditingGroup,
91
+ membership,
92
+ isAdmin,
93
+ ownerUser,
94
+ requestOptions
95
+ );
96
+ })
97
+ .then((membershipAdjustments) => {
98
+ const [
99
+ { revert } = {
100
+ promise: Promise.resolve({ notAdded: [] }),
101
+ revert: (sharingResults: ISharingResponse) => {
102
+ return Promise.resolve(sharingResults);
103
+ },
104
+ } as IEnsureMembershipResult,
105
+ ] = membershipAdjustments;
106
+ // perform all membership adjustments
107
+ return Promise.all(
108
+ membershipAdjustments.map(({ promise }) => promise)
109
+ )
110
+ .then(() => {
111
+ // then attempt the share
112
+ return shareToGroup(requestOptions, isAdmin, isCrossOrgSharing);
113
+ })
114
+ .then((sharingResults) => {
115
+ // lastly, if the admin user was added to the group,
116
+ // remove them from the group. this is a no-op that
117
+ // immediately resolves the sharingResults when no
118
+ // membership adjustment was needed
119
+ return revert(sharingResults);
120
+ });
121
+ });
122
+ }
123
+
124
+ // item owner, let it call through
125
+ return shareToGroup(requestOptions);
126
+ })
127
+ .then((sharingResponse) => {
128
+ if (sharingResponse.notSharedWith.length) {
129
+ throw Error(
130
+ `Item ${requestOptions.id} could not be shared to group ${requestOptions.groupId}.`
131
+ );
132
+ } else {
133
+ // all is well
134
+ return sharingResponse;
135
+ }
136
+ });
137
+ }
138
+
139
+ function getMembershipAdjustments(
140
+ currentUser: IUser,
141
+ isSharedEditingGroup: boolean,
142
+ membership: string,
143
+ isAdmin: boolean,
144
+ ownerUser: IUser,
145
+ requestOptions: IGroupSharingOptions
146
+ ) {
147
+ const membershipGuarantees = [];
148
+ if (requestOptions.groupId !== currentUser.favGroupId) {
149
+ if (isSharedEditingGroup) {
150
+ if (!isAdmin) {
151
+ // abort and reject promise
152
+ throw Error(
153
+ `This item can not be shared to shared editing group ${requestOptions.groupId} by ${currentUser.username} as they not the item owner or org admin.`
154
+ );
155
+ }
156
+
157
+ membershipGuarantees.push(
158
+ // admin user must be a group member to share, should be reverted afterwards
159
+ ensureMembership(
160
+ currentUser,
161
+ currentUser,
162
+ false,
163
+ `Error adding ${currentUser.username} as member to edit group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`,
164
+ requestOptions
165
+ ),
166
+ // item owner must be a group admin
167
+ ensureMembership(
168
+ currentUser,
169
+ ownerUser,
170
+ true,
171
+ membership === "none"
172
+ ? `Error adding user ${ownerUser.username} to edit group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`
173
+ : `Error promoting user ${ownerUser.username} to admin in edit group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`,
174
+ requestOptions
175
+ )
176
+ );
177
+ } else if (isAdmin) {
178
+ // admin user must be a group member to share, should be reverted afterwards
179
+ membershipGuarantees.push(
180
+ ensureMembership(
181
+ currentUser,
182
+ currentUser,
183
+ false,
184
+ `Error adding ${currentUser.username} as member to view group ${requestOptions.groupId}. Consequently item ${requestOptions.id} was not shared to the group.`,
185
+ requestOptions
186
+ )
187
+ );
188
+ } else if (membership === "none") {
189
+ // all other non-item owners must be a group member
190
+ throw new Error(
191
+ `This item can not be shared by ${currentUser.username} as they are not a member of the specified group ${requestOptions.groupId}.`
192
+ );
193
+ }
194
+ }
195
+
196
+ return membershipGuarantees;
197
+ }
198
+
199
+ function shareToGroup(
200
+ requestOptions: IGroupSharingOptions,
201
+ isAdmin = false,
202
+ isCrossOrgSharing = false
203
+ ): Promise<ISharingResponse> {
204
+ const username = requestOptions.authentication.username;
205
+ const itemOwner = requestOptions.owner || username;
206
+ // decide what url to use
207
+ // default to the non-owner url...
208
+ let url = `${getPortalUrl(requestOptions)}/content/items/${
209
+ requestOptions.id
210
+ }/share`;
211
+
212
+ // but if they are the owner, or org_admin, use this route
213
+ // 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)
214
+ // Note: Admin's can only use this route when the item is in the same org they are admin for
215
+ if (itemOwner === username || (isAdmin && !isCrossOrgSharing)) {
216
+ url = `${getPortalUrl(requestOptions)}/content/users/${itemOwner}/items/${
217
+ requestOptions.id
218
+ }/share`;
219
+ }
220
+
221
+ // now its finally time to do the sharing
222
+ requestOptions.params = {
223
+ groups: requestOptions.groupId,
224
+ confirmItemControl: requestOptions.confirmItemControl,
225
+ };
226
+
227
+ return request(url, requestOptions);
228
+ }
229
+
230
+ export function ensureMembership(
231
+ currentUser: IUser,
232
+ ownerUser: IUser,
233
+ shouldPromote: boolean,
234
+ errorMessage: string,
235
+ requestOptions: IGroupSharingOptions
236
+ ): IEnsureMembershipResult {
237
+ const ownerGroups = ownerUser.groups || [];
238
+ const group = ownerGroups.find((g) => {
239
+ return g.id === requestOptions.groupId;
240
+ });
241
+
242
+ // if they are in different orgs, eject
243
+ if (currentUser.orgId !== ownerUser.orgId) {
244
+ throw Error(
245
+ `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.`
246
+ );
247
+ }
248
+
249
+ // if owner is not a member, and has 512 groups
250
+ if (!group && ownerGroups.length > 511) {
251
+ throw Error(
252
+ `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.`
253
+ );
254
+ }
255
+
256
+ let promise: Promise<IAddGroupUsersResult>;
257
+ let revert: (sharingResults: ISharingResponse) => Promise<ISharingResponse>;
258
+
259
+ // decide if we need to add them or upgrade them
260
+ if (group) {
261
+ // they are in the group...
262
+ // check member type
263
+ if (shouldPromote && group.userMembership.memberType === "member") {
264
+ // promote them
265
+ promise = updateUserMemberships({
266
+ id: requestOptions.groupId,
267
+ users: [ownerUser.username],
268
+ newMemberType: "admin",
269
+ authentication: requestOptions.authentication,
270
+ })
271
+ .then((results: IUpdateGroupUsersResult) => {
272
+ // convert the result into the right type
273
+ const notAdded = results.results.reduce((acc: any[], entry: any) => {
274
+ if (!entry.success) {
275
+ acc.push(entry.username);
276
+ }
277
+ return acc;
278
+ }, []);
279
+ // and return it
280
+ return Promise.resolve({ notAdded });
281
+ })
282
+ .catch(() => ({ notAdded: [ownerUser.username] }));
283
+ revert = (sharingResults) =>
284
+ updateUserMemberships({
285
+ id: requestOptions.groupId,
286
+ users: [ownerUser.username],
287
+ newMemberType: "member",
288
+ authentication: requestOptions.authentication,
289
+ })
290
+ .then(() => sharingResults)
291
+ .catch(() => sharingResults);
292
+ } else {
293
+ // they are already an admin in the group
294
+ // return the same response the API would if we added them
295
+ promise = Promise.resolve({ notAdded: [] });
296
+ revert = (sharingResults) => Promise.resolve(sharingResults);
297
+ }
298
+ } else {
299
+ // attempt to add user to group
300
+ const userType = shouldPromote ? "admins" : "users";
301
+ // can't currently determine if the group is within the admin's
302
+ // org without performing a search, so attempt to add and handle
303
+ // the api error
304
+ promise = addGroupUsers({
305
+ id: requestOptions.groupId,
306
+ [userType]: [ownerUser.username],
307
+ authentication: requestOptions.authentication,
308
+ })
309
+ .then((results) => {
310
+ // results.errors includes an ArcGISAuthError when the group
311
+ // is in a different org, but notAdded is empty, throw here
312
+ // to normalize the results in below catch
313
+ if (results.errors && results.errors.length) {
314
+ throw results.errors[0];
315
+ }
316
+ return results;
317
+ })
318
+ .catch(() => ({ notAdded: [ownerUser.username] }));
319
+ revert = (sharingResults) => {
320
+ return removeGroupUsers({
321
+ id: requestOptions.groupId,
322
+ users: [ownerUser.username],
323
+ authentication: requestOptions.authentication,
324
+ }).then(() => {
325
+ // always resolves, suppress any resolved errors
326
+ return sharingResults;
327
+ });
328
+ };
329
+ }
330
+
331
+ return {
332
+ promise: promise.then((membershipResponse) => {
333
+ if (membershipResponse.notAdded.length) {
334
+ throw new Error(errorMessage);
335
+ }
336
+ return membershipResponse;
337
+ }),
338
+ revert,
339
+ };
340
+ }
@@ -0,0 +1,105 @@
1
+ import { request } from "@esri/arcgis-rest-request";
2
+ import { getPortalUrl } from "../util/get-portal-url";
3
+ import {
4
+ IGroupSharingOptions,
5
+ ISharingResponse,
6
+ getUserMembership
7
+ } from "./helpers";
8
+ import { isItemSharedWithGroup } from "./is-item-shared-with-group";
9
+ import { getUser } from "../users/get-user";
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)
35
+ .then(isShared => {
36
+ // not shared
37
+ if (!isShared) {
38
+ // exit early with success response
39
+ return Promise.resolve({
40
+ itemId: requestOptions.id,
41
+ shortcut: true,
42
+ notUnsharedFrom: []
43
+ } as ISharingResponse);
44
+ }
45
+
46
+ const {
47
+ authentication: { username },
48
+ owner
49
+ } = requestOptions;
50
+
51
+ // next check if the user is a member of the group
52
+ return Promise.all([
53
+ getUserMembership(requestOptions),
54
+ getUser({
55
+ username,
56
+ authentication: requestOptions.authentication
57
+ })
58
+ ])
59
+ .then(([membership, currentUser]) => {
60
+ const itemOwner = owner || username;
61
+ const isItemOwner = itemOwner === username;
62
+ const isAdmin = currentUser.role === 'org_admin' && !currentUser.roleId;
63
+
64
+ if (!isItemOwner && !isAdmin && ['admin', 'owner'].indexOf(membership) < 0) {
65
+ // abort and reject promise
66
+ throw Error(`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.`);
67
+ }
68
+
69
+ // let the sharing call go
70
+ return unshareFromGroup(requestOptions);
71
+ })
72
+ .then(sharingResponse => {
73
+ if (sharingResponse.notUnsharedFrom.length) {
74
+ throw Error(
75
+ `Item ${requestOptions.id} could not be unshared to group ${requestOptions.groupId}`
76
+ );
77
+ } else {
78
+ // all is well
79
+ return sharingResponse;
80
+ }
81
+ });
82
+ });
83
+ }
84
+
85
+ function unshareFromGroup (
86
+ requestOptions: IGroupSharingOptions
87
+ ): Promise<ISharingResponse> {
88
+ const username = requestOptions.authentication.username;
89
+ const itemOwner = requestOptions.owner || username;
90
+ // decide what url to use
91
+ // default to the non-owner url...
92
+ let url = `${getPortalUrl(requestOptions)}/content/items/${requestOptions.id}/unshare`;
93
+
94
+ // but if they are the owner, we use a different path...
95
+ if (itemOwner === username) {
96
+ url = `${getPortalUrl(requestOptions)}/content/users/${itemOwner}/items/${requestOptions.id}/unshare`;
97
+ }
98
+
99
+ // now its finally time to do the sharing
100
+ requestOptions.params = {
101
+ groups: requestOptions.groupId
102
+ };
103
+
104
+ return request(url, requestOptions);
105
+ }
@@ -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";
6
+ import { IGetUserOptions } from "./get-user";
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 { UserSession } from "@esri/arcgis-rest-auth";
5
+
6
+ import { getPortalUrl } from "../util/get-portal-url";
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: UserSession): string {
15
+ return `${getPortalUrl(session)}/community/users/${encodeURIComponent(
16
+ session.username
17
+ )}`;
18
+ }
@@ -0,0 +1,58 @@
1
+ /* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
2
+ * Apache-2.0 */
3
+
4
+ import { request, IRequestOptions } from "@esri/arcgis-rest-request";
5
+ import { IUser } from "@esri/arcgis-rest-types";
6
+
7
+ import { UserSession } from "@esri/arcgis-rest-auth";
8
+
9
+ import { getPortalUrl } from "../util/get-portal-url";
10
+
11
+ export interface IGetUserOptions extends IRequestOptions {
12
+ /**
13
+ * A session representing a logged in user.
14
+ */
15
+ authentication?: UserSession;
16
+ /**
17
+ * Supply a username if you'd like to fetch information about a different user than is being used to authenticate the request.
18
+ */
19
+ username?: string;
20
+ }
21
+
22
+ /**
23
+ * ```js
24
+ * import { getUser } from '@esri/arcgis-rest-portal';
25
+ * //
26
+ * getUser("jsmith")
27
+ * .then(response)
28
+ * // => { firstName: "John", lastName: "Smith",tags: ["GIS Analyst", "City of Redlands"] }
29
+ * ```
30
+ * Get information about a user. This method has proven so generically useful that you can also call [`UserSession.getUser()`](/arcgis-rest-js/api/auth/UserSession#getUser-summary).
31
+ *
32
+ * @param requestOptions - options to pass through in the request
33
+ * @returns A Promise that will resolve with metadata about the user
34
+ */
35
+ export function getUser(
36
+ requestOptions?: string | IGetUserOptions
37
+ ): Promise<IUser> {
38
+ let url;
39
+ let options = { httpMethod: "GET" } as IGetUserOptions;
40
+
41
+ // if a username is passed, assume ArcGIS Online
42
+ if (typeof requestOptions === "string") {
43
+ url = `https://www.arcgis.com/sharing/rest/community/users/${requestOptions}`;
44
+ } else {
45
+ // if an authenticated session is passed, default to that user/portal unless another username is provided manually
46
+ const username =
47
+ requestOptions.username || requestOptions.authentication.username;
48
+ url = `${getPortalUrl(requestOptions)}/community/users/${encodeURIComponent(
49
+ username
50
+ )}`;
51
+ options = {
52
+ ...requestOptions,
53
+ ...options
54
+ };
55
+ }
56
+ // send the request
57
+ return request(url, options);
58
+ }