autnam 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (490) hide show
  1. package/.env.example +2 -0
  2. package/.eslintrc.json +37 -0
  3. package/.github/workflows/deploy-docs.yml +27 -0
  4. package/.github/workflows/pre-release-tests.yml +49 -0
  5. package/.github/workflows/pull-request-tests.yml +49 -0
  6. package/.github/workflows/release.yml +75 -0
  7. package/.prettierignore +2 -0
  8. package/.prettierrc +19 -0
  9. package/.vscode/launch.json +25 -0
  10. package/.vscode/settings.json +5 -0
  11. package/codecov.yml +7 -0
  12. package/commitlint.config.cjs +41 -0
  13. package/demos/.eslintrc.js +13 -0
  14. package/demos/ago-node-cli/README.md +30 -0
  15. package/demos/ago-node-cli/ago.js +31 -0
  16. package/demos/ago-node-cli/index.js +11 -0
  17. package/demos/ago-node-cli/lib/item-export-command.js +48 -0
  18. package/demos/ago-node-cli/lib/item-search-command.js +32 -0
  19. package/demos/ago-node-cli/package.json +29 -0
  20. package/demos/attachments-browser/README.md +7 -0
  21. package/demos/attachments-browser/index.html +165 -0
  22. package/demos/attachments-browser/package.json +15 -0
  23. package/demos/attachments-node/README.md +4 -0
  24. package/demos/attachments-node/image.jpg +0 -0
  25. package/demos/attachments-node/index.js +89 -0
  26. package/demos/attachments-node/package.json +19 -0
  27. package/demos/batch-geocoder-node/NYC_Restaurant_Inspection_Results.csv +100 -0
  28. package/demos/batch-geocoder-node/README.md +13 -0
  29. package/demos/batch-geocoder-node/batch-geocode.js +112 -0
  30. package/demos/batch-geocoder-node/config-template.js +18 -0
  31. package/demos/batch-geocoder-node/package.json +34 -0
  32. package/demos/browser-es-modules/README.md +7 -0
  33. package/demos/browser-es-modules/index.html +38 -0
  34. package/demos/browser-es-modules/package.json +15 -0
  35. package/demos/deno/README.md +1 -0
  36. package/demos/deno/import_map.json +8 -0
  37. package/demos/deno/index.js +5 -0
  38. package/demos/express/README.md +16 -0
  39. package/demos/express/config.json.template +3 -0
  40. package/demos/express/package.json +15 -0
  41. package/demos/express/server.js +37 -0
  42. package/demos/feature-service-browser/README.md +8 -0
  43. package/demos/feature-service-browser/index.html +122 -0
  44. package/demos/feature-service-browser/package.json +15 -0
  45. package/demos/geocoder-browser/README.md +12 -0
  46. package/demos/geocoder-browser/authenticate.html +29 -0
  47. package/demos/geocoder-browser/config.js.template +1 -0
  48. package/demos/geocoder-browser/index.html +139 -0
  49. package/demos/geocoder-browser/package.json +15 -0
  50. package/demos/jsapi-integration/README.md +26 -0
  51. package/demos/jsapi-integration/authenticate.html +29 -0
  52. package/demos/jsapi-integration/config.js +6 -0
  53. package/demos/jsapi-integration/index.html +91 -0
  54. package/demos/jsapi-integration/package.json +15 -0
  55. package/demos/node-cli-item-management/README.md +11 -0
  56. package/demos/node-cli-item-management/index.js +229 -0
  57. package/demos/node-cli-item-management/package.json +24 -0
  58. package/demos/node-cli-item-management/screenshot.png +0 -0
  59. package/demos/node-common-js/README.md +4 -0
  60. package/demos/node-common-js/index.js +5 -0
  61. package/demos/node-common-js/package.json +15 -0
  62. package/demos/node-es-modules/README.md +4 -0
  63. package/demos/node-es-modules/index.js +5 -0
  64. package/demos/node-es-modules/package.json +16 -0
  65. package/demos/oauth2-browser/README.md +17 -0
  66. package/demos/oauth2-browser/authenticate.html +29 -0
  67. package/demos/oauth2-browser/config.js.template +6 -0
  68. package/demos/oauth2-browser/index.html +223 -0
  69. package/demos/oauth2-browser/logo.svg +4 -0
  70. package/demos/oauth2-browser/package.json +15 -0
  71. package/demos/oauth2-browser/style.css +36 -0
  72. package/demos/oauth2-browser-retry/README.md +32 -0
  73. package/demos/oauth2-browser-retry/authenticate.html +21 -0
  74. package/demos/oauth2-browser-retry/index.html +114 -0
  75. package/demos/oauth2-browser-retry/logo.svg +4 -0
  76. package/demos/oauth2-browser-retry/package.json +15 -0
  77. package/demos/parcel/README.md +8 -0
  78. package/demos/parcel/index.html +16 -0
  79. package/demos/parcel/index.js +8 -0
  80. package/demos/parcel/package.json +20 -0
  81. package/demos/snowpack/README.md +8 -0
  82. package/demos/snowpack/index.html +16 -0
  83. package/demos/snowpack/index.js +8 -0
  84. package/demos/snowpack/package.json +20 -0
  85. package/demos/snowpack/snowpack.config.js +3 -0
  86. package/demos/stream-response-to-file/README.md +7 -0
  87. package/demos/stream-response-to-file/index.js +36 -0
  88. package/demos/stream-response-to-file/output/.gitkeep +0 -0
  89. package/demos/stream-response-to-file/package.json +31 -0
  90. package/demos/tree-shaking-rollup/.babelrc +3 -0
  91. package/demos/tree-shaking-rollup/README.md +9 -0
  92. package/demos/tree-shaking-rollup/index.html +11 -0
  93. package/demos/tree-shaking-rollup/package.json +22 -0
  94. package/demos/tree-shaking-rollup/rollup.config.js +13 -0
  95. package/demos/tree-shaking-rollup/src/index.js +8 -0
  96. package/demos/tree-shaking-webpack/README.md +9 -0
  97. package/demos/tree-shaking-webpack/index.html +11 -0
  98. package/demos/tree-shaking-webpack/package.json +26 -0
  99. package/demos/tree-shaking-webpack/src/index.js +8 -0
  100. package/demos/tree-shaking-webpack/webpack.config.js +29 -0
  101. package/demos/vite/README.md +6 -0
  102. package/demos/vite/favicon.svg +15 -0
  103. package/demos/vite/index.html +13 -0
  104. package/demos/vite/main.js +8 -0
  105. package/demos/vite/package.json +18 -0
  106. package/demos/vue/.env.example +11 -0
  107. package/demos/vue/.eslintrc.js +17 -0
  108. package/demos/vue/.postcssrc.js +5 -0
  109. package/demos/vue/README.md +17 -0
  110. package/demos/vue/babel.config.js +3 -0
  111. package/demos/vue/package.json +35 -0
  112. package/demos/vue/public/favicon.ico +0 -0
  113. package/demos/vue/public/index.html +24 -0
  114. package/demos/vue/src/assets/logo.svg +29 -0
  115. package/demos/vue/src/components/App.vue +303 -0
  116. package/demos/vue/src/components/Authenticate.vue +65 -0
  117. package/demos/vue/src/components/Loader.vue +230 -0
  118. package/demos/vue/src/main.js +92 -0
  119. package/demos/webmap-checker-sapper/.env.example +5 -0
  120. package/demos/webmap-checker-sapper/README.md +124 -0
  121. package/demos/webmap-checker-sapper/appveyor.yml +18 -0
  122. package/demos/webmap-checker-sapper/cypress/fixtures/example.json +5 -0
  123. package/demos/webmap-checker-sapper/cypress/integration/spec.js +19 -0
  124. package/demos/webmap-checker-sapper/cypress/plugins/index.js +17 -0
  125. package/demos/webmap-checker-sapper/cypress/support/commands.js +25 -0
  126. package/demos/webmap-checker-sapper/cypress/support/index.js +20 -0
  127. package/demos/webmap-checker-sapper/cypress.json +4 -0
  128. package/demos/webmap-checker-sapper/package.json +47 -0
  129. package/demos/webmap-checker-sapper/rollup.config.js +87 -0
  130. package/demos/webmap-checker-sapper/src/client.js +20 -0
  131. package/demos/webmap-checker-sapper/src/components/LayerStatus.html +108 -0
  132. package/demos/webmap-checker-sapper/src/components/Nav.html +21 -0
  133. package/demos/webmap-checker-sapper/src/components/WebMap.html +62 -0
  134. package/demos/webmap-checker-sapper/src/routes/_error.html +41 -0
  135. package/demos/webmap-checker-sapper/src/routes/_layout.html +21 -0
  136. package/demos/webmap-checker-sapper/src/routes/auth/authorize.js +18 -0
  137. package/demos/webmap-checker-sapper/src/routes/auth/exchange-token.js +20 -0
  138. package/demos/webmap-checker-sapper/src/routes/auth/post-sign-in.js +24 -0
  139. package/demos/webmap-checker-sapper/src/routes/auth/sign-out.js +10 -0
  140. package/demos/webmap-checker-sapper/src/routes/index.html +20 -0
  141. package/demos/webmap-checker-sapper/src/routes/webmaps/[webmapId].html +83 -0
  142. package/demos/webmap-checker-sapper/src/routes/webmaps/index.html +59 -0
  143. package/demos/webmap-checker-sapper/src/server.js +102 -0
  144. package/demos/webmap-checker-sapper/src/service-worker.js +82 -0
  145. package/demos/webmap-checker-sapper/src/template.html +33 -0
  146. package/demos/webmap-checker-sapper/src/userInfoMiddleware.js +21 -0
  147. package/demos/webmap-checker-sapper/src/utils.js +33 -0
  148. package/demos/webmap-checker-sapper/static/favicon.png +0 -0
  149. package/demos/webmap-checker-sapper/static/global.css +36 -0
  150. package/demos/webmap-checker-sapper/static/manifest.json +20 -0
  151. package/demos/webmap-checker-sapper/static/svelte-logo-192.png +0 -0
  152. package/demos/webmap-checker-sapper/static/svelte-logo-512.png +0 -0
  153. package/docs/.eslintrc.js +12 -0
  154. package/docs/FAQ.md +48 -0
  155. package/docs/HISTORY.md +62 -0
  156. package/docs/acetate.config.js +262 -0
  157. package/docs/build-typedoc.js +434 -0
  158. package/docs/generate-srihashes.js +61 -0
  159. package/docs/package.json +3 -0
  160. package/docs/src/_layout.html +86 -0
  161. package/docs/src/api/_declaration.html +600 -0
  162. package/docs/src/api/_layout.html +204 -0
  163. package/docs/src/api/_package.html +38 -0
  164. package/docs/src/api/index.html +16 -0
  165. package/docs/src/guides/_layout.html +24 -0
  166. package/docs/src/guides/amd-requirejs-dojo.md +40 -0
  167. package/docs/src/guides/browser-authentication.md +39 -0
  168. package/docs/src/guides/bundlers.md +52 -0
  169. package/docs/src/guides/cli-authentication.md +9 -0
  170. package/docs/src/guides/client-server-authentication.md +9 -0
  171. package/docs/src/guides/embedded-apps.md +106 -0
  172. package/docs/src/guides/from-a-cdn.md +38 -0
  173. package/docs/src/guides/index.md +59 -0
  174. package/docs/src/guides/node.md +84 -0
  175. package/docs/src/guides/package-overview.md +111 -0
  176. package/docs/src/guides/server-authentication.md +9 -0
  177. package/docs/src/guides/whats-new-v2-0.md +305 -0
  178. package/docs/src/img/icons.png +0 -0
  179. package/docs/src/img/icons@2x.png +0 -0
  180. package/docs/src/img/oauth-browser.png +0 -0
  181. package/docs/src/index.html +12 -0
  182. package/docs/src/js/api-search.js +112 -0
  183. package/docs/src/js/nav-toggle.js +41 -0
  184. package/docs/src/sass/_highlight.scss +96 -0
  185. package/docs/src/sass/_icons.scss +157 -0
  186. package/docs/src/sass/style.scss +242 -0
  187. package/jasmine.json +7 -0
  188. package/jasmine.live.json +7 -0
  189. package/karma.conf.cjs +128 -0
  190. package/package.json +87 -0
  191. package/packages/arcgis-rest-auth/CHANGELOG.md +80 -0
  192. package/packages/arcgis-rest-auth/README.md +71 -0
  193. package/packages/arcgis-rest-auth/package.json +66 -0
  194. package/packages/arcgis-rest-auth/src/index.ts +34 -0
  195. package/packages/arcgis-rest-auth/tsconfig.json +6 -0
  196. package/packages/arcgis-rest-demographics/CHANGELOG.md +14 -0
  197. package/packages/arcgis-rest-demographics/README.md +74 -0
  198. package/packages/arcgis-rest-demographics/package.json +69 -0
  199. package/packages/arcgis-rest-demographics/src/getAvailableCountries.ts +113 -0
  200. package/packages/arcgis-rest-demographics/src/getAvailableDataCollections.ts +161 -0
  201. package/packages/arcgis-rest-demographics/src/getAvailableGeographyLevels.ts +86 -0
  202. package/packages/arcgis-rest-demographics/src/getGeography.ts +152 -0
  203. package/packages/arcgis-rest-demographics/src/helpers.ts +27 -0
  204. package/packages/arcgis-rest-demographics/src/index.ts +16 -0
  205. package/packages/arcgis-rest-demographics/src/queryDemographicData.ts +108 -0
  206. package/packages/arcgis-rest-demographics/test/getAvailableCountries.test.ts +89 -0
  207. package/packages/arcgis-rest-demographics/test/getAvailableDataCollections.test.ts +114 -0
  208. package/packages/arcgis-rest-demographics/test/getAvailableGeographyLevels.test.ts +69 -0
  209. package/packages/arcgis-rest-demographics/test/getGeography.test.ts +150 -0
  210. package/packages/arcgis-rest-demographics/test/mocks/responses.ts +4 -0
  211. package/packages/arcgis-rest-demographics/test/queryDemographicData.test.live.ts +50 -0
  212. package/packages/arcgis-rest-demographics/test/queryDemographicData.test.ts +127 -0
  213. package/packages/arcgis-rest-demographics/tsconfig.json +6 -0
  214. package/packages/arcgis-rest-feature-service/CHANGELOG.md +44 -0
  215. package/packages/arcgis-rest-feature-service/README.md +75 -0
  216. package/packages/arcgis-rest-feature-service/package.json +70 -0
  217. package/packages/arcgis-rest-feature-service/src/add.ts +55 -0
  218. package/packages/arcgis-rest-feature-service/src/addAttachment.ts +53 -0
  219. package/packages/arcgis-rest-feature-service/src/addToServiceDefinition.ts +74 -0
  220. package/packages/arcgis-rest-feature-service/src/applyEdits.ts +94 -0
  221. package/packages/arcgis-rest-feature-service/src/createFeatureService.ts +191 -0
  222. package/packages/arcgis-rest-feature-service/src/decodeValues.ts +126 -0
  223. package/packages/arcgis-rest-feature-service/src/delete.ts +62 -0
  224. package/packages/arcgis-rest-feature-service/src/deleteAttachments.ts +52 -0
  225. package/packages/arcgis-rest-feature-service/src/getAllLayersAndTables.ts +30 -0
  226. package/packages/arcgis-rest-feature-service/src/getAttachments.ts +55 -0
  227. package/packages/arcgis-rest-feature-service/src/getLayer.ts +23 -0
  228. package/packages/arcgis-rest-feature-service/src/getService.ts +25 -0
  229. package/packages/arcgis-rest-feature-service/src/getServiceAdminInfo.ts +33 -0
  230. package/packages/arcgis-rest-feature-service/src/getViewSources.ts +19 -0
  231. package/packages/arcgis-rest-feature-service/src/helpers.ts +768 -0
  232. package/packages/arcgis-rest-feature-service/src/index.ts +37 -0
  233. package/packages/arcgis-rest-feature-service/src/query.ts +200 -0
  234. package/packages/arcgis-rest-feature-service/src/queryRelated.ts +86 -0
  235. package/packages/arcgis-rest-feature-service/src/update.ts +65 -0
  236. package/packages/arcgis-rest-feature-service/src/updateAttachment.ts +59 -0
  237. package/packages/arcgis-rest-feature-service/src/updateServiceDefinition.ts +53 -0
  238. package/packages/arcgis-rest-feature-service/test/addToServiceDefinition.test.ts +350 -0
  239. package/packages/arcgis-rest-feature-service/test/attachments.test.ts +188 -0
  240. package/packages/arcgis-rest-feature-service/test/createFeatureService.test.ts +279 -0
  241. package/packages/arcgis-rest-feature-service/test/crud.test.ts +196 -0
  242. package/packages/arcgis-rest-feature-service/test/decodeValues.test.ts +66 -0
  243. package/packages/arcgis-rest-feature-service/test/getAllLayersAndTables.test.ts +27 -0
  244. package/packages/arcgis-rest-feature-service/test/getLayer.test.ts +30 -0
  245. package/packages/arcgis-rest-feature-service/test/getService.test.ts +30 -0
  246. package/packages/arcgis-rest-feature-service/test/getServiceAdminInfo.test.ts +41 -0
  247. package/packages/arcgis-rest-feature-service/test/getViewSources.test.ts +45 -0
  248. package/packages/arcgis-rest-feature-service/test/helpers.test.ts +27 -0
  249. package/packages/arcgis-rest-feature-service/test/mocks/allLayersAndTablesResponse.ts +950 -0
  250. package/packages/arcgis-rest-feature-service/test/mocks/cvdQueryResponse.ts +225 -0
  251. package/packages/arcgis-rest-feature-service/test/mocks/feature.ts +302 -0
  252. package/packages/arcgis-rest-feature-service/test/mocks/fields.ts +779 -0
  253. package/packages/arcgis-rest-feature-service/test/mocks/foo.txt +1 -0
  254. package/packages/arcgis-rest-feature-service/test/mocks/layerDefinition.ts +80 -0
  255. package/packages/arcgis-rest-feature-service/test/mocks/service.ts +476 -0
  256. package/packages/arcgis-rest-feature-service/test/query.test.ts +166 -0
  257. package/packages/arcgis-rest-feature-service/test/updateServiceDefinition.test.ts +103 -0
  258. package/packages/arcgis-rest-feature-service/tsconfig.json +9 -0
  259. package/packages/arcgis-rest-fetch/README.md +17 -0
  260. package/packages/arcgis-rest-fetch/browser-ponyfill.js +8 -0
  261. package/packages/arcgis-rest-fetch/browser-ponyfill.mjs +8 -0
  262. package/packages/arcgis-rest-fetch/index.types.d.ts +8 -0
  263. package/packages/arcgis-rest-fetch/node-ponyfill.js +10 -0
  264. package/packages/arcgis-rest-fetch/node-ponyfill.mjs +10 -0
  265. package/packages/arcgis-rest-fetch/package.json +21 -0
  266. package/packages/arcgis-rest-form-data/README.md +15 -0
  267. package/packages/arcgis-rest-form-data/browser-ponyfill.js +5 -0
  268. package/packages/arcgis-rest-form-data/browser-ponyfill.mjs +3 -0
  269. package/packages/arcgis-rest-form-data/index.types.d.ts +9 -0
  270. package/packages/arcgis-rest-form-data/node-ponyfill.js +7 -0
  271. package/packages/arcgis-rest-form-data/node-ponyfill.mjs +5 -0
  272. package/packages/arcgis-rest-form-data/package.json +21 -0
  273. package/packages/arcgis-rest-geocoding/CHANGELOG.md +26 -0
  274. package/packages/arcgis-rest-geocoding/README.md +85 -0
  275. package/packages/arcgis-rest-geocoding/package.json +69 -0
  276. package/packages/arcgis-rest-geocoding/src/bulk.ts +106 -0
  277. package/packages/arcgis-rest-geocoding/src/geocode.ts +169 -0
  278. package/packages/arcgis-rest-geocoding/src/helpers.ts +56 -0
  279. package/packages/arcgis-rest-geocoding/src/index.ts +17 -0
  280. package/packages/arcgis-rest-geocoding/src/reverse.ts +82 -0
  281. package/packages/arcgis-rest-geocoding/src/suggest.ts +45 -0
  282. package/packages/arcgis-rest-geocoding/test/bulk.test.ts +193 -0
  283. package/packages/arcgis-rest-geocoding/test/geocode.test.ts +254 -0
  284. package/packages/arcgis-rest-geocoding/test/helpers.test.ts +85 -0
  285. package/packages/arcgis-rest-geocoding/test/mocks/responses.ts +1031 -0
  286. package/packages/arcgis-rest-geocoding/test/reverse.test.ts +124 -0
  287. package/packages/arcgis-rest-geocoding/test/suggest.test.ts +53 -0
  288. package/packages/arcgis-rest-geocoding/tsconfig.json +6 -0
  289. package/packages/arcgis-rest-portal/CHANGELOG.md +73 -0
  290. package/packages/arcgis-rest-portal/README.md +72 -0
  291. package/packages/arcgis-rest-portal/package.json +68 -0
  292. package/packages/arcgis-rest-portal/src/groups/add-users.ts +140 -0
  293. package/packages/arcgis-rest-portal/src/groups/create.ts +42 -0
  294. package/packages/arcgis-rest-portal/src/groups/get.ts +187 -0
  295. package/packages/arcgis-rest-portal/src/groups/helpers.ts +14 -0
  296. package/packages/arcgis-rest-portal/src/groups/invite-users.ts +141 -0
  297. package/packages/arcgis-rest-portal/src/groups/join.ts +57 -0
  298. package/packages/arcgis-rest-portal/src/groups/notification.ts +77 -0
  299. package/packages/arcgis-rest-portal/src/groups/protect.ts +56 -0
  300. package/packages/arcgis-rest-portal/src/groups/remove-users.ts +84 -0
  301. package/packages/arcgis-rest-portal/src/groups/remove.ts +32 -0
  302. package/packages/arcgis-rest-portal/src/groups/search.ts +48 -0
  303. package/packages/arcgis-rest-portal/src/groups/update-user-membership.ts +63 -0
  304. package/packages/arcgis-rest-portal/src/groups/update.ts +39 -0
  305. package/packages/arcgis-rest-portal/src/helpers.ts +83 -0
  306. package/packages/arcgis-rest-portal/src/index.ts +68 -0
  307. package/packages/arcgis-rest-portal/src/items/add.ts +145 -0
  308. package/packages/arcgis-rest-portal/src/items/content.ts +70 -0
  309. package/packages/arcgis-rest-portal/src/items/create.ts +149 -0
  310. package/packages/arcgis-rest-portal/src/items/export.ts +92 -0
  311. package/packages/arcgis-rest-portal/src/items/get.ts +444 -0
  312. package/packages/arcgis-rest-portal/src/items/helpers.ts +272 -0
  313. package/packages/arcgis-rest-portal/src/items/protect.ts +41 -0
  314. package/packages/arcgis-rest-portal/src/items/reassign.ts +59 -0
  315. package/packages/arcgis-rest-portal/src/items/remove.ts +139 -0
  316. package/packages/arcgis-rest-portal/src/items/search.ts +25 -0
  317. package/packages/arcgis-rest-portal/src/items/update.ts +188 -0
  318. package/packages/arcgis-rest-portal/src/items/upload.ts +124 -0
  319. package/packages/arcgis-rest-portal/src/orgs/notification.ts +148 -0
  320. package/packages/arcgis-rest-portal/src/services/get-unique-service-name.ts +35 -0
  321. package/packages/arcgis-rest-portal/src/services/is-service-name-available.ts +29 -0
  322. package/packages/arcgis-rest-portal/src/sharing/access.ts +84 -0
  323. package/packages/arcgis-rest-portal/src/sharing/helpers.ts +80 -0
  324. package/packages/arcgis-rest-portal/src/sharing/is-item-shared-with-group.ts +42 -0
  325. package/packages/arcgis-rest-portal/src/sharing/share-item-with-group.ts +335 -0
  326. package/packages/arcgis-rest-portal/src/sharing/unshare-item-with-group.ts +114 -0
  327. package/packages/arcgis-rest-portal/src/users/get-user-tags.ts +52 -0
  328. package/packages/arcgis-rest-portal/src/users/get-user-url.ts +18 -0
  329. package/packages/arcgis-rest-portal/src/users/get-user.ts +60 -0
  330. package/packages/arcgis-rest-portal/src/users/invitation.ts +157 -0
  331. package/packages/arcgis-rest-portal/src/users/notification.ts +67 -0
  332. package/packages/arcgis-rest-portal/src/users/search-users.ts +35 -0
  333. package/packages/arcgis-rest-portal/src/users/update.ts +63 -0
  334. package/packages/arcgis-rest-portal/src/util/SearchQueryBuilder.ts +391 -0
  335. package/packages/arcgis-rest-portal/src/util/array.ts +16 -0
  336. package/packages/arcgis-rest-portal/src/util/generic-search.ts +111 -0
  337. package/packages/arcgis-rest-portal/src/util/get-portal-settings.ts +44 -0
  338. package/packages/arcgis-rest-portal/src/util/get-portal-url.ts +32 -0
  339. package/packages/arcgis-rest-portal/src/util/get-portal.ts +53 -0
  340. package/packages/arcgis-rest-portal/src/util/get-subscription-info.ts +43 -0
  341. package/packages/arcgis-rest-portal/src/util/scrub-control-chars.ts +13 -0
  342. package/packages/arcgis-rest-portal/src/util/search.ts +48 -0
  343. package/packages/arcgis-rest-portal/test/groups/add-users.test.ts +238 -0
  344. package/packages/arcgis-rest-portal/test/groups/crud.test.ts +183 -0
  345. package/packages/arcgis-rest-portal/test/groups/get.test.ts +174 -0
  346. package/packages/arcgis-rest-portal/test/groups/invite-users.test.ts +146 -0
  347. package/packages/arcgis-rest-portal/test/groups/join.test.ts +71 -0
  348. package/packages/arcgis-rest-portal/test/groups/notification.test.ts +111 -0
  349. package/packages/arcgis-rest-portal/test/groups/protect.test.ts +71 -0
  350. package/packages/arcgis-rest-portal/test/groups/remove-users.test.ts +140 -0
  351. package/packages/arcgis-rest-portal/test/groups/search.test.ts +151 -0
  352. package/packages/arcgis-rest-portal/test/groups/update-user-membership.test.ts +64 -0
  353. package/packages/arcgis-rest-portal/test/items/add.test.ts +320 -0
  354. package/packages/arcgis-rest-portal/test/items/content.test.ts +161 -0
  355. package/packages/arcgis-rest-portal/test/items/create.test.ts +404 -0
  356. package/packages/arcgis-rest-portal/test/items/export.test.ts +115 -0
  357. package/packages/arcgis-rest-portal/test/items/get.test.ts +606 -0
  358. package/packages/arcgis-rest-portal/test/items/helpers.test.ts +60 -0
  359. package/packages/arcgis-rest-portal/test/items/protect.test.ts +120 -0
  360. package/packages/arcgis-rest-portal/test/items/reassign.test.ts +130 -0
  361. package/packages/arcgis-rest-portal/test/items/remove.test.ts +259 -0
  362. package/packages/arcgis-rest-portal/test/items/search.test.ts +274 -0
  363. package/packages/arcgis-rest-portal/test/items/update.test.ts +549 -0
  364. package/packages/arcgis-rest-portal/test/items/upload.test.ts +286 -0
  365. package/packages/arcgis-rest-portal/test/mocks/groups/responses.ts +208 -0
  366. package/packages/arcgis-rest-portal/test/mocks/items/foo.zip +0 -0
  367. package/packages/arcgis-rest-portal/test/mocks/items/item.ts +526 -0
  368. package/packages/arcgis-rest-portal/test/mocks/items/resources.ts +38 -0
  369. package/packages/arcgis-rest-portal/test/mocks/items/search.ts +121 -0
  370. package/packages/arcgis-rest-portal/test/mocks/portal/response.ts +126 -0
  371. package/packages/arcgis-rest-portal/test/mocks/portal/settings-response.ts +56 -0
  372. package/packages/arcgis-rest-portal/test/mocks/sharing/sharing.ts +18 -0
  373. package/packages/arcgis-rest-portal/test/mocks/users/invitation.ts +70 -0
  374. package/packages/arcgis-rest-portal/test/mocks/users/notification.ts +34 -0
  375. package/packages/arcgis-rest-portal/test/mocks/users/user-search.ts +388 -0
  376. package/packages/arcgis-rest-portal/test/mocks/users/user-tags.ts +5 -0
  377. package/packages/arcgis-rest-portal/test/mocks/users/user.ts +174 -0
  378. package/packages/arcgis-rest-portal/test/orgs/notification.test.ts +142 -0
  379. package/packages/arcgis-rest-portal/test/services/get-unique-service-name.test.ts +64 -0
  380. package/packages/arcgis-rest-portal/test/services/is-service-name-available.test.ts +41 -0
  381. package/packages/arcgis-rest-portal/test/sharing/access.test.ts +162 -0
  382. package/packages/arcgis-rest-portal/test/sharing/helpers.test.ts +55 -0
  383. package/packages/arcgis-rest-portal/test/sharing/share-item-with-group.test.ts +1328 -0
  384. package/packages/arcgis-rest-portal/test/sharing/unshare-item-with-group.test.ts +288 -0
  385. package/packages/arcgis-rest-portal/test/users/get-user-tags.test.ts +71 -0
  386. package/packages/arcgis-rest-portal/test/users/get-user-url.test.ts +40 -0
  387. package/packages/arcgis-rest-portal/test/users/get-user.test.ts +90 -0
  388. package/packages/arcgis-rest-portal/test/users/invitation.test.ts +126 -0
  389. package/packages/arcgis-rest-portal/test/users/notification.test.ts +76 -0
  390. package/packages/arcgis-rest-portal/test/users/search.test.ts +41 -0
  391. package/packages/arcgis-rest-portal/test/users/update.test.ts +150 -0
  392. package/packages/arcgis-rest-portal/test/util/SearchQueryBuilder.test.ts +295 -0
  393. package/packages/arcgis-rest-portal/test/util/array.test.ts +33 -0
  394. package/packages/arcgis-rest-portal/test/util/get-portal-settings.test.ts +57 -0
  395. package/packages/arcgis-rest-portal/test/util/get-portal-url.test.ts +37 -0
  396. package/packages/arcgis-rest-portal/test/util/portal.test.ts +137 -0
  397. package/packages/arcgis-rest-portal/test/util/scrub-control-chars.test.ts +25 -0
  398. package/packages/arcgis-rest-portal/tsconfig.json +6 -0
  399. package/packages/arcgis-rest-request/README.md +72 -0
  400. package/packages/arcgis-rest-request/package.json +69 -0
  401. package/packages/arcgis-rest-request/post-message-auth-spec.md +70 -0
  402. package/packages/arcgis-rest-request/src/ApiKeyManager.ts +60 -0
  403. package/packages/arcgis-rest-request/src/ApplicationCredentialsManager.ts +141 -0
  404. package/packages/arcgis-rest-request/src/ArcGISIdentityManager.ts +1470 -0
  405. package/packages/arcgis-rest-request/src/app-tokens.ts +132 -0
  406. package/packages/arcgis-rest-request/src/authenticated-request-options.ts +23 -0
  407. package/packages/arcgis-rest-request/src/federation-utils.ts +88 -0
  408. package/packages/arcgis-rest-request/src/fetch-token.ts +48 -0
  409. package/packages/arcgis-rest-request/src/generate-token.ts +32 -0
  410. package/packages/arcgis-rest-request/src/index.ts +46 -0
  411. package/packages/arcgis-rest-request/src/request.ts +446 -0
  412. package/packages/arcgis-rest-request/src/revoke-token.ts +73 -0
  413. package/packages/arcgis-rest-request/src/types/feature.ts +42 -0
  414. package/packages/arcgis-rest-request/src/types/geometry.ts +239 -0
  415. package/packages/arcgis-rest-request/src/types/group.ts +72 -0
  416. package/packages/arcgis-rest-request/src/types/service.ts +87 -0
  417. package/packages/arcgis-rest-request/src/types/symbol.ts +21 -0
  418. package/packages/arcgis-rest-request/src/types/user.ts +49 -0
  419. package/packages/arcgis-rest-request/src/utils/ArcGISRequestError.ts +82 -0
  420. package/packages/arcgis-rest-request/src/utils/ErrorTypes.ts +29 -0
  421. package/packages/arcgis-rest-request/src/utils/GrantTypes.ts +5 -0
  422. package/packages/arcgis-rest-request/src/utils/HTTPMethods.ts +6 -0
  423. package/packages/arcgis-rest-request/src/utils/IAuthenticationManager.ts +22 -0
  424. package/packages/arcgis-rest-request/src/utils/IFetchTokenParams.ts +11 -0
  425. package/packages/arcgis-rest-request/src/utils/IGenerateTokenParams.ts +9 -0
  426. package/packages/arcgis-rest-request/src/utils/IParamBuilder.ts +3 -0
  427. package/packages/arcgis-rest-request/src/utils/IParams.ts +6 -0
  428. package/packages/arcgis-rest-request/src/utils/IParamsBuilder.ts +5 -0
  429. package/packages/arcgis-rest-request/src/utils/IRequestOptions.ts +59 -0
  430. package/packages/arcgis-rest-request/src/utils/ITokenRequestOptions.ts +9 -0
  431. package/packages/arcgis-rest-request/src/utils/ResponseFormats.ts +10 -0
  432. package/packages/arcgis-rest-request/src/utils/append-custom-params.ts +46 -0
  433. package/packages/arcgis-rest-request/src/utils/clean-url.ts +20 -0
  434. package/packages/arcgis-rest-request/src/utils/decode-query-string.ts +27 -0
  435. package/packages/arcgis-rest-request/src/utils/encode-form-data.ts +41 -0
  436. package/packages/arcgis-rest-request/src/utils/encode-query-string.ts +37 -0
  437. package/packages/arcgis-rest-request/src/utils/process-params.ts +109 -0
  438. package/packages/arcgis-rest-request/src/utils/retryAuthError.ts +10 -0
  439. package/packages/arcgis-rest-request/src/utils/warn.ts +11 -0
  440. package/packages/arcgis-rest-request/src/utils/with-options.ts +48 -0
  441. package/packages/arcgis-rest-request/src/validate-app-access.ts +69 -0
  442. package/packages/arcgis-rest-request/test/ApiKey.test.ts +53 -0
  443. package/packages/arcgis-rest-request/test/ApplicationSession.test.ts +148 -0
  444. package/packages/arcgis-rest-request/test/ArcGISIdentityManager.test.ts +2579 -0
  445. package/packages/arcgis-rest-request/test/app-tokens.test.ts +91 -0
  446. package/packages/arcgis-rest-request/test/federation-utils.test.ts +323 -0
  447. package/packages/arcgis-rest-request/test/fetchToken.test.ts +110 -0
  448. package/packages/arcgis-rest-request/test/generateToken.test.ts +40 -0
  449. package/packages/arcgis-rest-request/test/mocks/errors.ts +76 -0
  450. package/packages/arcgis-rest-request/test/mocks/geojson-feature-collection.ts +13 -0
  451. package/packages/arcgis-rest-request/test/mocks/param-builder.ts +7 -0
  452. package/packages/arcgis-rest-request/test/mocks/sharing-rest-info.ts +41 -0
  453. package/packages/arcgis-rest-request/test/mocks/webmap.ts +41 -0
  454. package/packages/arcgis-rest-request/test/request.test.ts +563 -0
  455. package/packages/arcgis-rest-request/test/revoke-token.test.ts +55 -0
  456. package/packages/arcgis-rest-request/test/utils/ArcGISAuthError.test.ts +196 -0
  457. package/packages/arcgis-rest-request/test/utils/ArcGISRequestError.test.ts +51 -0
  458. package/packages/arcgis-rest-request/test/utils/check-for-errors.test.ts +111 -0
  459. package/packages/arcgis-rest-request/test/utils/clean-url.test.ts +50 -0
  460. package/packages/arcgis-rest-request/test/utils/encode-form-data.test.ts +146 -0
  461. package/packages/arcgis-rest-request/test/utils/encode-query-string.test.ts +22 -0
  462. package/packages/arcgis-rest-request/test/utils/process-params.test.ts +205 -0
  463. package/packages/arcgis-rest-request/test/utils/with-options.test.ts +135 -0
  464. package/packages/arcgis-rest-request/test/validate-app-access.test.ts +44 -0
  465. package/packages/arcgis-rest-request/tsconfig.json +4 -0
  466. package/packages/arcgis-rest-routing/README.md +74 -0
  467. package/packages/arcgis-rest-routing/package.json +69 -0
  468. package/packages/arcgis-rest-routing/src/closestFacility.ts +223 -0
  469. package/packages/arcgis-rest-routing/src/helpers.ts +104 -0
  470. package/packages/arcgis-rest-routing/src/index.ts +20 -0
  471. package/packages/arcgis-rest-routing/src/originDestinationMatrix.ts +219 -0
  472. package/packages/arcgis-rest-routing/src/serviceArea.ts +169 -0
  473. package/packages/arcgis-rest-routing/src/solveRoute.ts +179 -0
  474. package/packages/arcgis-rest-routing/test/closestFacility.test.ts +686 -0
  475. package/packages/arcgis-rest-routing/test/mocks/inputs.ts +132 -0
  476. package/packages/arcgis-rest-routing/test/mocks/responses.ts +13316 -0
  477. package/packages/arcgis-rest-routing/test/originDestinationMatrix.test.ts +795 -0
  478. package/packages/arcgis-rest-routing/test/serviceArea.test.ts +601 -0
  479. package/packages/arcgis-rest-routing/test/solveRoute.test.ts +681 -0
  480. package/packages/arcgis-rest-routing/tsconfig.json +6 -0
  481. package/prettier-package-json.config.cjs +81 -0
  482. package/rollup.js +152 -0
  483. package/scripts/create-dist-package-jsons.js +17 -0
  484. package/scripts/deploy-doc-site.js +16 -0
  485. package/scripts/generate-sri-hashes.js +52 -0
  486. package/scripts/get-package-json.js +27 -0
  487. package/scripts/run-demo-server.js +21 -0
  488. package/scripts/test-helpers.ts +20 -0
  489. package/tsconfig.json +62 -0
  490. 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
+ }