aspernaturalias 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (370) hide show
  1. package/.prettierignore +2 -0
  2. package/.travis.yml +31 -0
  3. package/.vscode/launch.json +24 -0
  4. package/.vscode/settings.json +3 -0
  5. package/codecov.yml +3 -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 +164 -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 +94 -0
  22. package/demos/batch-geocoder-node/package.json +38 -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 +85 -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 +202 -0
  52. package/demos/oauth2-browser/logo.svg +4 -0
  53. package/demos/oauth2-browser/package-lock.json +163 -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 +9 -0
  73. package/demos/tree-shaking-webpack/index.html +11 -0
  74. package/demos/tree-shaking-webpack/package-lock.json +4595 -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 +11323 -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 +3851 -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/from-a-cdn.md +38 -0
  144. package/docs/src/guides/index.md +59 -0
  145. package/docs/src/guides/node.md +87 -0
  146. package/docs/src/guides/package-overview.md +111 -0
  147. package/docs/src/guides/server-authentication.md +9 -0
  148. package/docs/src/guides/whats-new-v2-0.md +305 -0
  149. package/docs/src/img/icons.png +0 -0
  150. package/docs/src/img/icons@2x.png +0 -0
  151. package/docs/src/index.html +12 -0
  152. package/docs/src/js/api-search.js +112 -0
  153. package/docs/src/js/nav-toggle.js +41 -0
  154. package/docs/src/sass/_highlight.scss +96 -0
  155. package/docs/src/sass/_icons.scss +157 -0
  156. package/docs/src/sass/style.scss +242 -0
  157. package/docs/src/srihashes.json +12 -0
  158. package/jasmine.json +7 -0
  159. package/karma.conf.js +106 -0
  160. package/lerna.json +8 -0
  161. package/notes/README.md +88 -0
  162. package/package.json +129 -0
  163. package/packages/arcgis-rest-auth/README.md +71 -0
  164. package/packages/arcgis-rest-auth/package-lock.json +11 -0
  165. package/packages/arcgis-rest-auth/package.json +69 -0
  166. package/packages/arcgis-rest-auth/src/ApplicationSession.ts +122 -0
  167. package/packages/arcgis-rest-auth/src/UserSession.ts +997 -0
  168. package/packages/arcgis-rest-auth/src/authenticated-request-options.ts +24 -0
  169. package/packages/arcgis-rest-auth/src/fetch-token.ts +50 -0
  170. package/packages/arcgis-rest-auth/src/generate-token.ts +35 -0
  171. package/packages/arcgis-rest-auth/src/index.ts +9 -0
  172. package/packages/arcgis-rest-auth/test/ApplicationSession.test.ts +124 -0
  173. package/packages/arcgis-rest-auth/test/UserSession.test.ts +1315 -0
  174. package/packages/arcgis-rest-auth/test/fetchToken.test.ts +112 -0
  175. package/packages/arcgis-rest-auth/test/generateToken.test.ts +102 -0
  176. package/packages/arcgis-rest-auth/test/utils.ts +14 -0
  177. package/packages/arcgis-rest-auth/tsconfig.json +6 -0
  178. package/packages/arcgis-rest-feature-layer/README.md +77 -0
  179. package/packages/arcgis-rest-feature-layer/package-lock.json +11 -0
  180. package/packages/arcgis-rest-feature-layer/package.json +64 -0
  181. package/packages/arcgis-rest-feature-layer/src/add.ts +56 -0
  182. package/packages/arcgis-rest-feature-layer/src/addAttachment.ts +53 -0
  183. package/packages/arcgis-rest-feature-layer/src/decodeValues.ts +124 -0
  184. package/packages/arcgis-rest-feature-layer/src/delete.ts +61 -0
  185. package/packages/arcgis-rest-feature-layer/src/deleteAttachments.ts +52 -0
  186. package/packages/arcgis-rest-feature-layer/src/getAttachments.ts +55 -0
  187. package/packages/arcgis-rest-feature-layer/src/getLayer.ts +24 -0
  188. package/packages/arcgis-rest-feature-layer/src/helpers.ts +55 -0
  189. package/packages/arcgis-rest-feature-layer/src/index.ts +28 -0
  190. package/packages/arcgis-rest-feature-layer/src/query.ts +203 -0
  191. package/packages/arcgis-rest-feature-layer/src/queryRelated.ts +89 -0
  192. package/packages/arcgis-rest-feature-layer/src/update.ts +56 -0
  193. package/packages/arcgis-rest-feature-layer/src/updateAttachment.ts +59 -0
  194. package/packages/arcgis-rest-feature-layer/test/attachments.test.ts +202 -0
  195. package/packages/arcgis-rest-feature-layer/test/crud.test.ts +130 -0
  196. package/packages/arcgis-rest-feature-layer/test/decodeValues.test.ts +67 -0
  197. package/packages/arcgis-rest-feature-layer/test/getLayer.test.ts +31 -0
  198. package/packages/arcgis-rest-feature-layer/test/mocks/cvdQueryResponse.ts +225 -0
  199. package/packages/arcgis-rest-feature-layer/test/mocks/feature.ts +281 -0
  200. package/packages/arcgis-rest-feature-layer/test/mocks/fields.ts +779 -0
  201. package/packages/arcgis-rest-feature-layer/test/mocks/foo.txt +1 -0
  202. package/packages/arcgis-rest-feature-layer/test/mocks/service.ts +259 -0
  203. package/packages/arcgis-rest-feature-layer/test/query.test.ts +168 -0
  204. package/packages/arcgis-rest-feature-layer/tsconfig.json +6 -0
  205. package/packages/arcgis-rest-geocoding/README.md +86 -0
  206. package/packages/arcgis-rest-geocoding/package-lock.json +11 -0
  207. package/packages/arcgis-rest-geocoding/package.json +64 -0
  208. package/packages/arcgis-rest-geocoding/src/bulk.ts +105 -0
  209. package/packages/arcgis-rest-geocoding/src/geocode.ts +130 -0
  210. package/packages/arcgis-rest-geocoding/src/helpers.ts +54 -0
  211. package/packages/arcgis-rest-geocoding/src/index.ts +15 -0
  212. package/packages/arcgis-rest-geocoding/src/reverse.ts +84 -0
  213. package/packages/arcgis-rest-geocoding/src/suggest.ts +45 -0
  214. package/packages/arcgis-rest-geocoding/test/bulk.test.ts +151 -0
  215. package/packages/arcgis-rest-geocoding/test/geocode.test.ts +212 -0
  216. package/packages/arcgis-rest-geocoding/test/helpers.test.ts +85 -0
  217. package/packages/arcgis-rest-geocoding/test/mocks/responses.ts +637 -0
  218. package/packages/arcgis-rest-geocoding/test/reverse.test.ts +126 -0
  219. package/packages/arcgis-rest-geocoding/test/suggest.test.ts +53 -0
  220. package/packages/arcgis-rest-geocoding/tsconfig.json +6 -0
  221. package/packages/arcgis-rest-portal/README.md +73 -0
  222. package/packages/arcgis-rest-portal/package-lock.json +11 -0
  223. package/packages/arcgis-rest-portal/package.json +64 -0
  224. package/packages/arcgis-rest-portal/src/groups/create.ts +43 -0
  225. package/packages/arcgis-rest-portal/src/groups/get.ts +99 -0
  226. package/packages/arcgis-rest-portal/src/groups/helpers.ts +14 -0
  227. package/packages/arcgis-rest-portal/src/groups/join.ts +57 -0
  228. package/packages/arcgis-rest-portal/src/groups/notification.ts +77 -0
  229. package/packages/arcgis-rest-portal/src/groups/protect.ts +56 -0
  230. package/packages/arcgis-rest-portal/src/groups/remove.ts +32 -0
  231. package/packages/arcgis-rest-portal/src/groups/search.ts +25 -0
  232. package/packages/arcgis-rest-portal/src/groups/update.ts +39 -0
  233. package/packages/arcgis-rest-portal/src/index.ts +48 -0
  234. package/packages/arcgis-rest-portal/src/items/add.ts +137 -0
  235. package/packages/arcgis-rest-portal/src/items/create.ts +128 -0
  236. package/packages/arcgis-rest-portal/src/items/get.ts +177 -0
  237. package/packages/arcgis-rest-portal/src/items/helpers.ts +193 -0
  238. package/packages/arcgis-rest-portal/src/items/protect.ts +39 -0
  239. package/packages/arcgis-rest-portal/src/items/remove.ts +131 -0
  240. package/packages/arcgis-rest-portal/src/items/search.ts +25 -0
  241. package/packages/arcgis-rest-portal/src/items/update.ts +145 -0
  242. package/packages/arcgis-rest-portal/src/sharing/access.ts +84 -0
  243. package/packages/arcgis-rest-portal/src/sharing/group-sharing.ts +210 -0
  244. package/packages/arcgis-rest-portal/src/sharing/helpers.ts +84 -0
  245. package/packages/arcgis-rest-portal/src/users/get-user-url.ts +18 -0
  246. package/packages/arcgis-rest-portal/src/users/get-user.ts +58 -0
  247. package/packages/arcgis-rest-portal/src/users/invitation.ts +162 -0
  248. package/packages/arcgis-rest-portal/src/users/notification.ts +70 -0
  249. package/packages/arcgis-rest-portal/src/users/update.ts +66 -0
  250. package/packages/arcgis-rest-portal/src/util/SearchQueryBuilder.ts +374 -0
  251. package/packages/arcgis-rest-portal/src/util/generic-search.ts +67 -0
  252. package/packages/arcgis-rest-portal/src/util/get-portal-url.ts +27 -0
  253. package/packages/arcgis-rest-portal/src/util/get-portal.ts +52 -0
  254. package/packages/arcgis-rest-portal/src/util/search.ts +38 -0
  255. package/packages/arcgis-rest-portal/test/groups/crud.test.ts +180 -0
  256. package/packages/arcgis-rest-portal/test/groups/get.test.ts +101 -0
  257. package/packages/arcgis-rest-portal/test/groups/join.test.ts +72 -0
  258. package/packages/arcgis-rest-portal/test/groups/notification.test.ts +112 -0
  259. package/packages/arcgis-rest-portal/test/groups/protect.test.ts +72 -0
  260. package/packages/arcgis-rest-portal/test/groups/search.test.ts +110 -0
  261. package/packages/arcgis-rest-portal/test/items/add.test.ts +321 -0
  262. package/packages/arcgis-rest-portal/test/items/create.test.ts +375 -0
  263. package/packages/arcgis-rest-portal/test/items/get.test.ts +309 -0
  264. package/packages/arcgis-rest-portal/test/items/protect.test.ts +122 -0
  265. package/packages/arcgis-rest-portal/test/items/remove.test.ts +238 -0
  266. package/packages/arcgis-rest-portal/test/items/search.test.ts +272 -0
  267. package/packages/arcgis-rest-portal/test/items/update.test.ts +515 -0
  268. package/packages/arcgis-rest-portal/test/mocks/groups/responses.ts +144 -0
  269. package/packages/arcgis-rest-portal/test/mocks/items/foo.zip +0 -0
  270. package/packages/arcgis-rest-portal/test/mocks/items/item.ts +122 -0
  271. package/packages/arcgis-rest-portal/test/mocks/items/resources.ts +31 -0
  272. package/packages/arcgis-rest-portal/test/mocks/items/search.ts +121 -0
  273. package/packages/arcgis-rest-portal/test/mocks/portal/response.ts +112 -0
  274. package/packages/arcgis-rest-portal/test/mocks/sharing/sharing.ts +18 -0
  275. package/packages/arcgis-rest-portal/test/mocks/users/invitation.ts +70 -0
  276. package/packages/arcgis-rest-portal/test/mocks/users/notification.ts +34 -0
  277. package/packages/arcgis-rest-portal/test/mocks/users/user.ts +173 -0
  278. package/packages/arcgis-rest-portal/test/sharing/access.test.ts +162 -0
  279. package/packages/arcgis-rest-portal/test/sharing/group-sharing.test.ts +650 -0
  280. package/packages/arcgis-rest-portal/test/sharing/helpers.test.ts +55 -0
  281. package/packages/arcgis-rest-portal/test/users/get-user-url.test.ts +40 -0
  282. package/packages/arcgis-rest-portal/test/users/get-user.test.ts +90 -0
  283. package/packages/arcgis-rest-portal/test/users/invitation.test.ts +127 -0
  284. package/packages/arcgis-rest-portal/test/users/notification.test.ts +77 -0
  285. package/packages/arcgis-rest-portal/test/users/update.test.ts +151 -0
  286. package/packages/arcgis-rest-portal/test/util/SearchQueryBuilder.test.ts +340 -0
  287. package/packages/arcgis-rest-portal/test/util/get-portal-url.test.ts +37 -0
  288. package/packages/arcgis-rest-portal/test/util/portal.test.ts +97 -0
  289. package/packages/arcgis-rest-portal/tsconfig.json +6 -0
  290. package/packages/arcgis-rest-request/README.md +72 -0
  291. package/packages/arcgis-rest-request/package-lock.json +11 -0
  292. package/packages/arcgis-rest-request/package.json +60 -0
  293. package/packages/arcgis-rest-request/src/index.ts +24 -0
  294. package/packages/arcgis-rest-request/src/request.ts +389 -0
  295. package/packages/arcgis-rest-request/src/utils/ArcGISRequestError.ts +76 -0
  296. package/packages/arcgis-rest-request/src/utils/ErrorTypes.ts +29 -0
  297. package/packages/arcgis-rest-request/src/utils/GrantTypes.ts +5 -0
  298. package/packages/arcgis-rest-request/src/utils/HTTPMethods.ts +6 -0
  299. package/packages/arcgis-rest-request/src/utils/IAuthenticationManager.ts +21 -0
  300. package/packages/arcgis-rest-request/src/utils/IFetchTokenParams.ts +11 -0
  301. package/packages/arcgis-rest-request/src/utils/IGenerateTokenParams.ts +9 -0
  302. package/packages/arcgis-rest-request/src/utils/IParamBuilder.ts +3 -0
  303. package/packages/arcgis-rest-request/src/utils/IParams.ts +6 -0
  304. package/packages/arcgis-rest-request/src/utils/IParamsBuilder.ts +5 -0
  305. package/packages/arcgis-rest-request/src/utils/IRequestOptions.ts +43 -0
  306. package/packages/arcgis-rest-request/src/utils/ITokenRequestOptions.ts +9 -0
  307. package/packages/arcgis-rest-request/src/utils/ResponseFormats.ts +10 -0
  308. package/packages/arcgis-rest-request/src/utils/append-custom-params.ts +49 -0
  309. package/packages/arcgis-rest-request/src/utils/clean-url.ts +16 -0
  310. package/packages/arcgis-rest-request/src/utils/encode-form-data.ts +38 -0
  311. package/packages/arcgis-rest-request/src/utils/encode-query-string.ts +23 -0
  312. package/packages/arcgis-rest-request/src/utils/process-params.ts +109 -0
  313. package/packages/arcgis-rest-request/src/utils/retryAuthError.ts +10 -0
  314. package/packages/arcgis-rest-request/src/utils/warn.ts +11 -0
  315. package/packages/arcgis-rest-request/src/utils/with-options.ts +48 -0
  316. package/packages/arcgis-rest-request/test/mocks/errors.ts +76 -0
  317. package/packages/arcgis-rest-request/test/mocks/geojson-feature-collection.ts +13 -0
  318. package/packages/arcgis-rest-request/test/mocks/param-builder.ts +7 -0
  319. package/packages/arcgis-rest-request/test/mocks/sharing-rest-info.ts +41 -0
  320. package/packages/arcgis-rest-request/test/mocks/webmap.ts +41 -0
  321. package/packages/arcgis-rest-request/test/request.test.ts +496 -0
  322. package/packages/arcgis-rest-request/test/utils/ArcGISAuthError.test.ts +191 -0
  323. package/packages/arcgis-rest-request/test/utils/ArcGISRequestError.test.ts +51 -0
  324. package/packages/arcgis-rest-request/test/utils/check-for-errors.test.ts +111 -0
  325. package/packages/arcgis-rest-request/test/utils/clean-url.test.ts +47 -0
  326. package/packages/arcgis-rest-request/test/utils/encode-form-data.test.ts +133 -0
  327. package/packages/arcgis-rest-request/test/utils/process-params.test.ts +193 -0
  328. package/packages/arcgis-rest-request/test/utils/with-options.test.ts +133 -0
  329. package/packages/arcgis-rest-request/tsconfig.json +4 -0
  330. package/packages/arcgis-rest-routing/README.md +75 -0
  331. package/packages/arcgis-rest-routing/package-lock.json +11 -0
  332. package/packages/arcgis-rest-routing/package.json +63 -0
  333. package/packages/arcgis-rest-routing/src/helpers.ts +16 -0
  334. package/packages/arcgis-rest-routing/src/index.ts +11 -0
  335. package/packages/arcgis-rest-routing/src/solveRoute.ts +124 -0
  336. package/packages/arcgis-rest-routing/test/mocks/responses.ts +825 -0
  337. package/packages/arcgis-rest-routing/test/solveRoute.test.ts +509 -0
  338. package/packages/arcgis-rest-routing/tsconfig.json +6 -0
  339. package/packages/arcgis-rest-service-admin/README.md +73 -0
  340. package/packages/arcgis-rest-service-admin/package-lock.json +11 -0
  341. package/packages/arcgis-rest-service-admin/package.json +65 -0
  342. package/packages/arcgis-rest-service-admin/src/addTo.ts +70 -0
  343. package/packages/arcgis-rest-service-admin/src/create.ts +213 -0
  344. package/packages/arcgis-rest-service-admin/src/index.ts +9 -0
  345. package/packages/arcgis-rest-service-admin/test/addTo.test.ts +350 -0
  346. package/packages/arcgis-rest-service-admin/test/create.test.ts +377 -0
  347. package/packages/arcgis-rest-service-admin/test/mocks/layerDefinition.ts +79 -0
  348. package/packages/arcgis-rest-service-admin/test/mocks/move.ts +11 -0
  349. package/packages/arcgis-rest-service-admin/test/mocks/service.ts +69 -0
  350. package/packages/arcgis-rest-service-admin/tsconfig.json +6 -0
  351. package/packages/arcgis-rest-types/README.md +66 -0
  352. package/packages/arcgis-rest-types/package.json +54 -0
  353. package/packages/arcgis-rest-types/src/feature.ts +39 -0
  354. package/packages/arcgis-rest-types/src/geometry.ts +272 -0
  355. package/packages/arcgis-rest-types/src/group.ts +72 -0
  356. package/packages/arcgis-rest-types/src/index.ts +7 -0
  357. package/packages/arcgis-rest-types/src/item.ts +65 -0
  358. package/packages/arcgis-rest-types/src/symbol.ts +170 -0
  359. package/packages/arcgis-rest-types/src/user.ts +48 -0
  360. package/packages/arcgis-rest-types/src/webmap.ts +1345 -0
  361. package/packages/arcgis-rest-types/tsconfig.json +9 -0
  362. package/support/changelog.js +393 -0
  363. package/support/deploy-doc-site.js +16 -0
  364. package/support/dev.sh +6 -0
  365. package/support/publish.sh +47 -0
  366. package/support/test-helpers.js +9 -0
  367. package/tsconfig.json +63 -0
  368. package/tslint.json +16 -0
  369. package/umd-base-profile.js +81 -0
  370. package/umd-production-profile.js +13 -0
@@ -0,0 +1,101 @@
1
+ require('cross-fetch/polyfill');
2
+ import "isomorphic-form-data";
3
+ import sirv from "sirv";
4
+ import express from "express";
5
+ import session from "express-session";
6
+ import compression from "compression";
7
+ import * as sapper from "../__sapper__/server.js";
8
+ import SessionFileStore from "session-file-store";
9
+
10
+ import { UserSession } from "@esri/arcgis-rest-auth";
11
+ import { Store } from "svelte/store.js";
12
+ import { userInfoMiddleware } from "./userInfoMiddleware";
13
+
14
+ // setup file storeage for user sessions
15
+ const FileStore = SessionFileStore(session);
16
+
17
+ // load and setup our config variables from out .env file
18
+ require("dotenv").config();
19
+ const { PORT, NODE_ENV, ENCRYPTION_KEY, SESSION_SECRET } = process.env;
20
+ const dev = NODE_ENV === "development";
21
+
22
+ // start express
23
+ express()
24
+ // configure express middleware
25
+ .use(
26
+ // compress responses
27
+ compression({ threshold: 0 }),
28
+
29
+ // serve static assets like images, css ect...
30
+ sirv("static", { dev }),
31
+
32
+ // setup sessions, express will set a cookie on the client
33
+ // to keep track of a session id and rehydrate the
34
+ // correstponding session on the server.
35
+ session({
36
+ name: "webmap-checker-session",
37
+ secret: SESSION_SECRET,
38
+ resave: false,
39
+ saveUninitialized: false,
40
+ cookie: {
41
+ maxAge: 2592000000 // 30 days in milliseconds
42
+ },
43
+
44
+ // store session data in a secure, encrypted file
45
+ // sessions will be loaded from these files and decrypted
46
+ // at the end of every request the state of `request.session`
47
+ // will be saved back to disk.
48
+ store: new FileStore({
49
+ ttl: 2592000000 / 1000, // 30 days in seconds
50
+ retries: 1,
51
+ secret: ENCRYPTION_KEY,
52
+
53
+ // custom encoding and decoding for sessions means we can
54
+ // initalize a single `UserSession` object for use with rest js
55
+ encoder: sessionObj => {
56
+ sessionObj.userSession = sessionObj.userSession.serialize();
57
+ return JSON.stringify(sessionObj);
58
+ },
59
+ decoder: sessionContents => {
60
+ const sessionObj = JSON.parse(sessionContents);
61
+ sessionObj.userSession = UserSession.deserialize(
62
+ sessionObj.userSession
63
+ );
64
+ return sessionObj;
65
+ }
66
+ })
67
+ }),
68
+
69
+ // next check for a session and if we have one fetch additional information
70
+ // the rest api for use in our app.
71
+ userInfoMiddleware,
72
+
73
+ // finally we can setup sapper by creating a Store that will syncronize
74
+ // server side data with the client
75
+ sapper.middleware({
76
+ store: request => {
77
+ let userSession;
78
+
79
+ // since the store is shared between the client and server
80
+ // we dont want to put refresh tokens in it. The store also needs to be
81
+ // in a serializable format so sapper and send it to the client.
82
+ if (request.session && request.session.userSession) {
83
+ userSession = request.session.userSession.toJSON();
84
+ delete userSession.refreshToken;
85
+ delete userSession.refreshTokenExpires;
86
+ }
87
+
88
+ // now we can initalize the store with our session (from the encrypted
89
+ // file) and the org and user info which userInfoMiddleware attached to
90
+ // the request object.
91
+ return new Store({
92
+ session: userSession,
93
+ user: request.session ? request.session.userInfo : undefined,
94
+ org: request.session ? request.session.orgInfo : undefined
95
+ });
96
+ }
97
+ })
98
+ )
99
+ .listen(PORT, err => {
100
+ if (err) console.log("error", err);
101
+ });
@@ -0,0 +1,82 @@
1
+ import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js';
2
+
3
+ const ASSETS = `cache${timestamp}`;
4
+
5
+ // `shell` is an array of all the files generated by the bundler,
6
+ // `files` is an array of everything in the `static` directory
7
+ const to_cache = shell.concat(files);
8
+ const cached = new Set(to_cache);
9
+
10
+ self.addEventListener('install', event => {
11
+ event.waitUntil(
12
+ caches
13
+ .open(ASSETS)
14
+ .then(cache => cache.addAll(to_cache))
15
+ .then(() => {
16
+ self.skipWaiting();
17
+ })
18
+ );
19
+ });
20
+
21
+ self.addEventListener('activate', event => {
22
+ event.waitUntil(
23
+ caches.keys().then(async keys => {
24
+ // delete old caches
25
+ for (const key of keys) {
26
+ if (key !== ASSETS) await caches.delete(key);
27
+ }
28
+
29
+ self.clients.claim();
30
+ })
31
+ );
32
+ });
33
+
34
+ self.addEventListener('fetch', event => {
35
+ if (event.request.method !== 'GET' || event.request.headers.has('range')) return;
36
+
37
+ const url = new URL(event.request.url);
38
+
39
+ // don't try to handle e.g. data: URIs
40
+ if (!url.protocol.startsWith('http')) return;
41
+
42
+ // ignore dev server requests
43
+ if (url.hostname === self.location.hostname && url.port !== self.location.port) return;
44
+
45
+ // always serve static files and bundler-generated assets from cache
46
+ if (url.host === self.location.host && cached.has(url.pathname)) {
47
+ event.respondWith(caches.match(event.request));
48
+ return;
49
+ }
50
+
51
+ // for pages, you might want to serve a shell `index.html` file,
52
+ // which Sapper has generated for you. It's not right for every
53
+ // app, but if it's right for yours then uncomment this section
54
+ /*
55
+ if (url.origin === self.origin && routes.find(route => route.pattern.test(url.pathname))) {
56
+ event.respondWith(caches.match('/index.html'));
57
+ return;
58
+ }
59
+ */
60
+
61
+ if (event.request.cache === 'only-if-cached') return;
62
+
63
+ // for everything else, try the network first, falling back to
64
+ // cache if the user is offline. (If the pages never change, you
65
+ // might prefer a cache-first approach to a network-first one.)
66
+ event.respondWith(
67
+ caches
68
+ .open(`offline${timestamp}`)
69
+ .then(async cache => {
70
+ try {
71
+ const response = await fetch(event.request);
72
+ cache.put(event.request, response.clone());
73
+ return response;
74
+ } catch(err) {
75
+ const response = await cache.match(event.request);
76
+ if (response) return response;
77
+
78
+ throw err;
79
+ }
80
+ })
81
+ );
82
+ });
@@ -0,0 +1,33 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset='utf-8'>
5
+ <meta name='viewport' content='width=device-width'>
6
+ <meta name='theme-color' content='#aa1e1e'>
7
+
8
+ %sapper.base%
9
+
10
+ <link rel='stylesheet' href='global.css'>
11
+ <link rel='manifest' href='manifest.json'>
12
+ <link rel='icon' type='image/png' href='favicon.png'>
13
+
14
+ <!-- Sapper generates a <style> tag containing critical CSS
15
+ for the current page. CSS for the rest of the app is
16
+ lazily loaded when it precaches secondary pages -->
17
+ %sapper.styles%
18
+
19
+ <!-- This contains the contents of the <svelte:head> component, if
20
+ the current page has one -->
21
+ %sapper.head%
22
+ </head>
23
+ <body>
24
+ <!-- The application will be rendered inside this element,
25
+ because `app/client.js` references it -->
26
+ <div id='app'>%sapper.html%</div>
27
+
28
+ <!-- Sapper creates a <script> tag containing `app/client.js`
29
+ and anything else it needs to hydrate the app and
30
+ initialise the router -->
31
+ %sapper.scripts%
32
+ </body>
33
+ </html>
@@ -0,0 +1,21 @@
1
+ // we could use UserSession.getUser() instead
2
+ import { getSelf, getUser } from "@esri/arcgis-rest-portal";
3
+
4
+ // this middleware checks for a session and if we find a session add
5
+ // additional info to that session from the getUser and getSelf calls
6
+ // request here is the incoming request in express.
7
+ export function userInfoMiddleware(incomingRequest, outgoingResponse, next) {
8
+ if (incomingRequest.session && incomingRequest.session.userSession) {
9
+ Promise.all([
10
+ getUser({ authentication: incomingRequest.session.userSession }),
11
+ getSelf({ authentication: incomingRequest.session.userSession })
12
+ ]).then(([userInfo, orgInfo]) => {
13
+ // add information to the request so the next middleware can access it
14
+ incomingRequest.session.userInfo = userInfo;
15
+ incomingRequest.session.orgInfo = orgInfo;
16
+ next(); // run the next middleware
17
+ });
18
+ } else {
19
+ next(); // run the next middleware
20
+ }
21
+ }
@@ -0,0 +1,33 @@
1
+ import { UserSession } from "@esri/arcgis-rest-auth";
2
+ import { loadModules } from "esri-loader";
3
+
4
+ export function retryWithNewSession(error, fetch) {
5
+ if (error.name === "ArcGISAuthError") {
6
+ return fetch("/auth/exchange-token")
7
+ .then(exchangeTokenResponse => {
8
+ return exchangeTokenResponse.json();
9
+ })
10
+ .then(sessionInfo => {
11
+ console.log(sessionInfo);
12
+ const newSession = new UserSession(session);
13
+
14
+ // if we are in a browser (client side) we are working with an instance
15
+ // of `UserSession` otherwise (server side) we are working with a JSON
16
+ // representation of a session.
17
+ if (process.browser) {
18
+ this.store.set({ session: newSession });
19
+
20
+ // if we are in a browser we should also update IdentityManager
21
+ loadModules(["esri/identity/IdentityManager"]).then(([esriId]) => {
22
+ esriId.registerToken(session.toCredential());
23
+ });
24
+ } else {
25
+ this.store.set({ session: sessionInfo });
26
+ }
27
+
28
+ return error.retry(newSession, 1);
29
+ });
30
+ }
31
+
32
+ throw error;
33
+ }
@@ -0,0 +1,36 @@
1
+ body {
2
+ margin: 0;
3
+ font-family: Roboto, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
4
+ font-size: 14px;
5
+ line-height: 1.5;
6
+ color: #333;
7
+ }
8
+
9
+ h1, h2, h3, h4, h5, h6 {
10
+ margin: 0 0 0.5em 0;
11
+ font-weight: 400;
12
+ line-height: 1.2;
13
+ }
14
+
15
+ h1 {
16
+ font-size: 2em;
17
+ }
18
+
19
+ a {
20
+ color: inherit;
21
+ }
22
+
23
+ code {
24
+ font-family: menlo, inconsolata, monospace;
25
+ font-size: calc(1em - 2px);
26
+ color: #555;
27
+ background-color: #f0f0f0;
28
+ padding: 0.2em 0.4em;
29
+ border-radius: 2px;
30
+ }
31
+
32
+ @media (min-width: 400px) {
33
+ body {
34
+ font-size: 16px;
35
+ }
36
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "background_color": "#ffffff",
3
+ "theme_color": "#aa1e1e",
4
+ "name": "TODO",
5
+ "short_name": "TODO",
6
+ "display": "minimal-ui",
7
+ "start_url": "/",
8
+ "icons": [
9
+ {
10
+ "src": "svelte-logo-192.png",
11
+ "sizes": "192x192",
12
+ "type": "image/png"
13
+ },
14
+ {
15
+ "src": "svelte-logo-512.png",
16
+ "sizes": "512x512",
17
+ "type": "image/png"
18
+ }
19
+ ]
20
+ }
package/docs/FAQ.md ADDED
@@ -0,0 +1,48 @@
1
+ ## Is this a _supported_ Esri product?
2
+
3
+ It is not. We offer no guarantees, SLAs, nor a product lifecycle to support planning.
4
+
5
+ This project is an open source collaboration between developers from a variety of teams at Esri that was initially developed to scratch an itch of our own. That said, we are actively recruiting outside contributors and fully expect that the tools here will be useful to a subset of our customers.
6
+
7
+ ## Comparison with the ArcGIS API for JavaScript
8
+
9
+ The ArcGIS API for JavaScript is Esri's flagship product for building web applications to visualize, edit, map and analyze geospatial data. It is a feature complete client side API for working with the REST services based ArcGIS platform.
10
+ The ArcGIS API for JavaScript includes significant client side functionality including smart mapping, 3D rendering, geometric analysis and feature editing as well as full support for working with web maps and web scenes.
11
+
12
+ The goal of this project on the other hand is to provide a convenient binding to the underlying REST API for those who need to work directly with it from JavaScript. This project includes functional equivalents of the low-level request methods and identity management in the ArcGIS API for JavaScript, along with additional thin wrappers to assist developers in scripting against the ArcGIS REST API directly in Node.js and browser applications that do _not_ incorporate a map.
13
+
14
+ We aim to make interacting with the platform as intuitive as possible, but the surface area of the project currently does not nearly encompass the entire ArcGIS REST API.
15
+
16
+ ## Comparison with the ArcGIS API for Python
17
+
18
+ This project is similar to the ArcGIS API for Python in many ways. Like the ArcGIS API for Python, this library aims to be a scripting tool that simplifies interacting with the ArcGIS REST API, but where the ArcGIS API for Python highlights integration with dataframes and Jupyter Notebooks for visualization and sharing this project provides only generic tools for JavaScript applications running on a server, CLI, in a browser or as a script.
19
+
20
+ ## Who is using these packages?
21
+
22
+ REST JS is trusted in ArcGIS applications serving **many** thousands of users.
23
+
24
+ * ArcGIS [Hub](https://hub.arcgis.com)
25
+ * ArcGIS for [Developers](https://developers.arcgis.com)
26
+ * ArcGIS [Storymaps](https://storymaps.arcgis.com/en/)
27
+ * ArcGIS [Solutions](https://solutions.arcgis.com/)
28
+ * ArcGIS Enterprise
29
+ * ArcGIS [Urban](https://www.esri.com/en-us/landing-page/product/2018/arcgis-urban)
30
+ * ArcGIS [Analytics for IoT](https://www.esri.com/en-us/landing-page/product/2018/arcgis-analytics-for-iot)
31
+
32
+ And since its on GitHub, Esri developers are _far_ from the only ones using ArcGIS REST JS. Besides the usual culprits, we've seen the library running in:
33
+
34
+ * [Chrome Extensions](https://chrome.google.com/webstore/detail/echo-for-arcgis/mkeckgendkgcofhhenfkknonnkoboobm?hl=en-US)
35
+ * [Lambda Functions](https://medium.com/@adamjpfister/know-your-apis-6dc6ea3d084c)
36
+ * [Web Components](https://github.com/esridc/hub-components)
37
+ * [React Components](https://twitter.com/oppoudel/status/1022209378378805249)
38
+ * [Observable](https://observablehq.com/@jgravois/introduction-to-esri-arcgis-rest-js)
39
+
40
+ ## Why TypeScript
41
+
42
+ Using TypeScript allows us to add type information to request params and response structures. This vastly simplifies development. TypeScript also has excellent support for newer `async`/`await` patterns and for generating API documentation with [TypeDoc](http://typedoc.org/).
43
+
44
+ TypeScript compiles to JavaScript so you can use @esri/arcgis-rest-js in any JavaScript project. However if you use TypeScript you will get the benefits of type checking for free.
45
+
46
+ We also _really_ like TypeScript because it supports exporting to both [ES 2015 modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) (use `import`/`export`) and [UMD](http://davidbcalhoun.com/2014/what-is-amd-commonjs-and-umd/) modules. This allows us to support a wide variety of module loaders and bundlers, including Browserify, Webpack, RequireJS, and Dojo 1 and 2.
47
+
48
+ We include [`tslib`](https://www.npmjs.com/package/tslib) as a dependency of individual npm packages to make usage of `_extends` and `_assign` in our compiled code more concise.
@@ -0,0 +1,62 @@
1
+ ## Origins
2
+
3
+ The idea for this library originated in a slack conversation between @patrickarlt and @ajturner when he was looking for a library to automate the creation of Feature Layers in ArcGIS Online for the Hub project.
4
+
5
+ ## Key Collaborators
6
+
7
+ This list includes people who contributed to the original conversation and those who have contributed to similar projects.
8
+
9
+ * @ajturner - ArcGIS Hub
10
+ * @dbouwman - ArcGIS Hub
11
+ * @tomwayson - ArcGIS Hub
12
+ * @patricakrlt - ArcGIS for Developers
13
+ * @noahmulfinger - ArcGIS for Developers
14
+ * @araedavis - ArcGIS for Developers
15
+ * @nixta - Developer Outreach
16
+ * @jgravois - Developer Outreach
17
+
18
+ ## Use Cases and Target Audience
19
+
20
+ This API intends to simplify interactions with the ArcGIS REST API, enabling the creation of powerful scripting tools in both Node.js and the browser that currently require deep knowledge of the REST API, and coordinating chained calls with a variety of complex parameters. This library also enables downstream projects like the ArcGIS for Developers website and ArcGIS Hub to achieve identity management.
21
+
22
+ The tools proposed here are intended to be useful in internal projects such as ArcGIS for Developers and ArcGIS Hub, but they also strongly target outside developers who need to script and automate the platform but do not know or are not willing to integrate the ArcGIS API for Python into their projects. Hopefully, this project will also have appeal to enterprise developers who have existing Node.js systems and want to integrate with ArcGIS.
23
+
24
+ ## Functionality Roadmap
25
+
26
+ * Manage feature layers
27
+ * Create new feature layers
28
+ * Add/Remove/Update fields in feature layers
29
+ * Query and edit features
30
+ * Get statistics
31
+ * Make interacting with premium ArcGIS Online services intuitive
32
+ * Geocoding
33
+ * Routing
34
+ * Geoenrichment
35
+ * Spatial Analysis
36
+ * Elevation Analysis
37
+ * Managing groups and users
38
+ * Create/invite new users
39
+ * Create/edit/delete/share with groups
40
+ * Manage content
41
+ * Create, edit and delete items, maps and scenes
42
+ * Handle authentication and identity
43
+ * Compatible with Node 6+ and the 2 latest releases of every browser and IE 11.
44
+
45
+ ## Prior Projects
46
+
47
+ * [node-arcgis](https://github.com/Esri/node-arcgis) - Originally started by Nik Wise and currently maintained by John Gravois this library wraps a large amount of functionality for ArcGIS Online into a single API. However this library lacks much key functionality and does not handle authentication at all leaving it to the user to obtain and manage tokens. This library also lacks a significant test suite.
48
+ * [geoservices.js](https://github.com/Esri/geoservices-js) - Originally created by Jerry Seivert to wrap the [Geoservices](https://geoservices.github.io/) specification it is currently maintained by John Gravois. However this library does not fully implement the specification, handle authentication with ArcGIS or work in browsers.
49
+ * ArcGIS for Developers - The developers website has a large amount of internal tooling for working with Portal APIs and publishing feature services, we have plans to add additional features that would require either creating our own implementations or writing a common implementation in this project.
50
+ * Koop
51
+ * ArcGIS Hub
52
+
53
+ ## Project Architecture
54
+
55
+ As with any new JavaScript project there are numerous decisions to make regarding which technologies to use. We decided to go with the options below, but all these choices are up for debate.
56
+
57
+ * Implemented as a [monorepo managed with Lerna](https://lernajs.io/). The monorepo approach allows us to manage distinct packages like `arcgis-rest-geocoding` and separate functionality while sharing build, test and documentation tooling.
58
+ * Author the library in [TypeScript](https://www.typescriptlang.org/). Using TypeScript will allow us to add type information to request params and response structures which vastly simplifies development. TypeScript also has excellent support for newer `async`/`await` patterns with miminal code overhead and can publish to any module format we might need to support. Additionally TypeScript has excellent support for generating API documentation with [TypeDoc](http://typedoc.org/). TypeScript also has better internal adoption since Dojo 2 is using it as well as the JSAPI, Insights and the ArcGIS for Developers site.
59
+ * ~Would recommend using a Node/browser HTTP library like [Axios](https://github.com/mzabriskie/axios) which also has support for mocking in tests via [axios-mock-adapter](https://github.com/ctimmerm/axios-mock-adapter).~ We have decided to use the new [fetch](https://fetch.spec.whatwg.org/) standard.
60
+ * Testing is a concern. I initially thought that we could simply use Karma to test all the code. However Karma can only be used to test browser based code. We could however use the `jasmine` command line tool it would just mean we would have to compile the TypeScript source first and then run the Jasmine CLI tools. Karma would use the `karma-typescript` plugin and run the browser tests. ~An alternative to this might be to use [The Intern](https://theintern.github.io/) setup according to this [blog post about testing with TypeScript](https://www.sitepen.com/blog/2015/03/24/testing-typescript-with-intern/). However the Intern doesn't have super great support for TypeScript currently though these issues should be solved in this Falls Intern 4 release.~ We have decided to use Jasmine and the Jasmine CLI for Node tests and Karma with Jasmine for browser tests.
61
+
62
+ It is worth noting that a TypeScript/Intern approach aligns perfectly with the direction of the JavaScript API team.