sintfacilis 1.0.0

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