impeditmaiores 1.0.0

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