etincidunt 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/.prettierignore +2 -0
  2. package/.travis.yml +29 -0
  3. package/.vscode/launch.json +24 -0
  4. package/.vscode/settings.json +3 -0
  5. package/demos/ago-node-cli/README.md +29 -0
  6. package/demos/ago-node-cli/ago.js +32 -0
  7. package/demos/ago-node-cli/index.js +11 -0
  8. package/demos/ago-node-cli/lib/item-export-command.js +48 -0
  9. package/demos/ago-node-cli/lib/item-search-command.js +35 -0
  10. package/demos/ago-node-cli/package-lock.json +172 -0
  11. package/demos/ago-node-cli/package.json +30 -0
  12. package/demos/attachments/README.md +5 -0
  13. package/demos/attachments/index.html +164 -0
  14. package/demos/attachments/package-lock.json +182 -0
  15. package/demos/attachments/package.json +18 -0
  16. package/demos/batch-geocoder-node/NYC_Restaurant_Inspection_Results.csv +100 -0
  17. package/demos/batch-geocoder-node/README.md +14 -0
  18. package/demos/batch-geocoder-node/batch-geocode.js +112 -0
  19. package/demos/batch-geocoder-node/config-template.js +18 -0
  20. package/demos/batch-geocoder-node/package-lock.json +109 -0
  21. package/demos/batch-geocoder-node/package.json +37 -0
  22. package/demos/express/README.md +10 -0
  23. package/demos/express/config.json.template +3 -0
  24. package/demos/express/package-lock.json +388 -0
  25. package/demos/express/package.json +18 -0
  26. package/demos/express/server.js +28 -0
  27. package/demos/feature-service-browser/README.md +6 -0
  28. package/demos/feature-service-browser/index.html +122 -0
  29. package/demos/feature-service-browser/package-lock.json +182 -0
  30. package/demos/feature-service-browser/package.json +18 -0
  31. package/demos/geocoder-browser/README.md +10 -0
  32. package/demos/geocoder-browser/config.js.template +1 -0
  33. package/demos/geocoder-browser/index.html +131 -0
  34. package/demos/geocoder-browser/package-lock.json +163 -0
  35. package/demos/geocoder-browser/package.json +19 -0
  36. package/demos/geocoder-browser/post-sign-in.html +25 -0
  37. package/demos/jsapi-integration/README.md +8 -0
  38. package/demos/jsapi-integration/config.js +6 -0
  39. package/demos/jsapi-integration/index.html +79 -0
  40. package/demos/jsapi-integration/package-lock.json +184 -0
  41. package/demos/jsapi-integration/package.json +19 -0
  42. package/demos/oauth2-browser/README.md +12 -0
  43. package/demos/oauth2-browser/authenticate.html +32 -0
  44. package/demos/oauth2-browser/config.js.template +6 -0
  45. package/demos/oauth2-browser/index.html +202 -0
  46. package/demos/oauth2-browser/logo.svg +4 -0
  47. package/demos/oauth2-browser/package-lock.json +163 -0
  48. package/demos/oauth2-browser/package.json +18 -0
  49. package/demos/oauth2-browser/style.css +36 -0
  50. package/demos/vue/.babelrc +6 -0
  51. package/demos/vue/.env.example +8 -0
  52. package/demos/vue/README.md +17 -0
  53. package/demos/vue/index.html +21 -0
  54. package/demos/vue/package-lock.json +7236 -0
  55. package/demos/vue/package.json +39 -0
  56. package/demos/vue/src/assets/logo.svg +29 -0
  57. package/demos/vue/src/components/App.vue +302 -0
  58. package/demos/vue/src/components/Authenticate.vue +68 -0
  59. package/demos/vue/src/components/Loader.vue +216 -0
  60. package/demos/vue/src/main.js +75 -0
  61. package/demos/vue/webpack.config.js +84 -0
  62. package/docs/FAQ.md +28 -0
  63. package/docs/HISTORY.md +62 -0
  64. package/docs/acetate.config.js +214 -0
  65. package/docs/build-typedoc.js +301 -0
  66. package/docs/src/_layout.html +82 -0
  67. package/docs/src/api/_declaration.html +496 -0
  68. package/docs/src/api/_layout.html +127 -0
  69. package/docs/src/api/_package.html +13 -0
  70. package/docs/src/api/index.html +23 -0
  71. package/docs/src/guides/_layout.html +24 -0
  72. package/docs/src/guides/amd-requirejs-dojo.md +40 -0
  73. package/docs/src/guides/babel-and-rollup.md +30 -0
  74. package/docs/src/guides/babel-and-webpack.md +30 -0
  75. package/docs/src/guides/browser-authentication.md +9 -0
  76. package/docs/src/guides/browserify.md +9 -0
  77. package/docs/src/guides/cli-authentication.md +9 -0
  78. package/docs/src/guides/client-server-authentication.md +9 -0
  79. package/docs/src/guides/from-a-cdn.md +36 -0
  80. package/docs/src/guides/index.md +52 -0
  81. package/docs/src/guides/node.md +30 -0
  82. package/docs/src/guides/package-overview.md +8 -0
  83. package/docs/src/guides/server-authentication.md +9 -0
  84. package/docs/src/guides/typescript-and-webpack.md +9 -0
  85. package/docs/src/img/icons.png +0 -0
  86. package/docs/src/img/icons@2x.png +0 -0
  87. package/docs/src/index.html +12 -0
  88. package/docs/src/js/api-search.js +113 -0
  89. package/docs/src/js/index.js +1 -0
  90. package/docs/src/js/nav-toggle.js +41 -0
  91. package/docs/src/sass/_highlight.scss +96 -0
  92. package/docs/src/sass/_icons.scss +157 -0
  93. package/docs/src/sass/style.scss +169 -0
  94. package/jasmine.json +7 -0
  95. package/karma.conf.js +100 -0
  96. package/lerna.json +8 -0
  97. package/notes/README.md +88 -0
  98. package/package.json +91 -0
  99. package/packages/arcgis-rest-auth/README.md +64 -0
  100. package/packages/arcgis-rest-auth/package-lock.json +11 -0
  101. package/packages/arcgis-rest-auth/package.json +51 -0
  102. package/packages/arcgis-rest-auth/src/ApplicationSession.ts +91 -0
  103. package/packages/arcgis-rest-auth/src/UserSession.ts +829 -0
  104. package/packages/arcgis-rest-auth/src/authenticated-request-options.ts +21 -0
  105. package/packages/arcgis-rest-auth/src/fetch-token.ts +55 -0
  106. package/packages/arcgis-rest-auth/src/generate-token.ts +36 -0
  107. package/packages/arcgis-rest-auth/src/index.ts +5 -0
  108. package/packages/arcgis-rest-auth/test/ApplicationSession.test.ts +121 -0
  109. package/packages/arcgis-rest-auth/test/UserSession.test.ts +883 -0
  110. package/packages/arcgis-rest-auth/test/fetchToken.test.ts +76 -0
  111. package/packages/arcgis-rest-auth/test/generateToken.test.ts +36 -0
  112. package/packages/arcgis-rest-auth/test/utils.ts +11 -0
  113. package/packages/arcgis-rest-auth/tsconfig.json +6 -0
  114. package/packages/arcgis-rest-common-types/README.md +61 -0
  115. package/packages/arcgis-rest-common-types/package.json +38 -0
  116. package/packages/arcgis-rest-common-types/src/group.ts +51 -0
  117. package/packages/arcgis-rest-common-types/src/index.ts +467 -0
  118. package/packages/arcgis-rest-common-types/src/item.ts +45 -0
  119. package/packages/arcgis-rest-common-types/src/webmap.ts +1225 -0
  120. package/packages/arcgis-rest-common-types/tsconfig.json +11 -0
  121. package/packages/arcgis-rest-feature-service/README.md +70 -0
  122. package/packages/arcgis-rest-feature-service/package-lock.json +11 -0
  123. package/packages/arcgis-rest-feature-service/package.json +50 -0
  124. package/packages/arcgis-rest-feature-service/src/add.ts +82 -0
  125. package/packages/arcgis-rest-feature-service/src/addAttachment.ts +65 -0
  126. package/packages/arcgis-rest-feature-service/src/delete.ts +85 -0
  127. package/packages/arcgis-rest-feature-service/src/deleteAttachments.ts +68 -0
  128. package/packages/arcgis-rest-feature-service/src/getAttachments.ts +64 -0
  129. package/packages/arcgis-rest-feature-service/src/helpers.ts +77 -0
  130. package/packages/arcgis-rest-feature-service/src/index.ts +8 -0
  131. package/packages/arcgis-rest-feature-service/src/query.ts +174 -0
  132. package/packages/arcgis-rest-feature-service/src/update.ts +81 -0
  133. package/packages/arcgis-rest-feature-service/src/updateAttachment.ts +74 -0
  134. package/packages/arcgis-rest-feature-service/test/attachments.test.ts +179 -0
  135. package/packages/arcgis-rest-feature-service/test/features.test.ts +172 -0
  136. package/packages/arcgis-rest-feature-service/test/mocks/feature.ts +220 -0
  137. package/packages/arcgis-rest-feature-service/test/mocks/foo.txt +1 -0
  138. package/packages/arcgis-rest-feature-service/tsconfig.json +6 -0
  139. package/packages/arcgis-rest-geocoder/README.md +73 -0
  140. package/packages/arcgis-rest-geocoder/package-lock.json +11 -0
  141. package/packages/arcgis-rest-geocoder/package.json +52 -0
  142. package/packages/arcgis-rest-geocoder/src/bulk.ts +102 -0
  143. package/packages/arcgis-rest-geocoder/src/geocode.ts +117 -0
  144. package/packages/arcgis-rest-geocoder/src/helpers.ts +81 -0
  145. package/packages/arcgis-rest-geocoder/src/index.ts +4 -0
  146. package/packages/arcgis-rest-geocoder/src/reverse.ts +84 -0
  147. package/packages/arcgis-rest-geocoder/src/suggest.ts +72 -0
  148. package/packages/arcgis-rest-geocoder/test/geocoder.test.ts +510 -0
  149. package/packages/arcgis-rest-geocoder/test/mocks/responses.ts +588 -0
  150. package/packages/arcgis-rest-geocoder/tsconfig.json +6 -0
  151. package/packages/arcgis-rest-groups/README.md +64 -0
  152. package/packages/arcgis-rest-groups/package-lock.json +11 -0
  153. package/packages/arcgis-rest-groups/package.json +52 -0
  154. package/packages/arcgis-rest-groups/src/groups.ts +272 -0
  155. package/packages/arcgis-rest-groups/src/index.ts +1 -0
  156. package/packages/arcgis-rest-groups/test/groups.test.ts +280 -0
  157. package/packages/arcgis-rest-groups/test/mocks/responses.ts +137 -0
  158. package/packages/arcgis-rest-groups/tsconfig.json +6 -0
  159. package/packages/arcgis-rest-items/README.md +66 -0
  160. package/packages/arcgis-rest-items/package-lock.json +11 -0
  161. package/packages/arcgis-rest-items/package.json +52 -0
  162. package/packages/arcgis-rest-items/src/index.ts +1 -0
  163. package/packages/arcgis-rest-items/src/items.ts +498 -0
  164. package/packages/arcgis-rest-items/test/items.test.ts +1153 -0
  165. package/packages/arcgis-rest-items/test/mocks/foo.zip +0 -0
  166. package/packages/arcgis-rest-items/test/mocks/item.ts +30 -0
  167. package/packages/arcgis-rest-items/test/mocks/resources.ts +28 -0
  168. package/packages/arcgis-rest-items/test/mocks/search.ts +60 -0
  169. package/packages/arcgis-rest-items/tsconfig.json +6 -0
  170. package/packages/arcgis-rest-request/README.md +65 -0
  171. package/packages/arcgis-rest-request/package-lock.json +11 -0
  172. package/packages/arcgis-rest-request/package.json +42 -0
  173. package/packages/arcgis-rest-request/src/index.ts +10 -0
  174. package/packages/arcgis-rest-request/src/request.ts +259 -0
  175. package/packages/arcgis-rest-request/src/utils/ArcGISAuthError.ts +67 -0
  176. package/packages/arcgis-rest-request/src/utils/ArcGISRequestError.ts +73 -0
  177. package/packages/arcgis-rest-request/src/utils/ErrorTypes.ts +29 -0
  178. package/packages/arcgis-rest-request/src/utils/check-for-errors.ts +65 -0
  179. package/packages/arcgis-rest-request/src/utils/encode-form-data.ts +29 -0
  180. package/packages/arcgis-rest-request/src/utils/encode-query-string.ts +23 -0
  181. package/packages/arcgis-rest-request/src/utils/get-portal-url.ts +25 -0
  182. package/packages/arcgis-rest-request/src/utils/get-portal.ts +45 -0
  183. package/packages/arcgis-rest-request/src/utils/process-params.ts +99 -0
  184. package/packages/arcgis-rest-request/test/mocks/errors.ts +59 -0
  185. package/packages/arcgis-rest-request/test/mocks/geojson-feature-collection.ts +10 -0
  186. package/packages/arcgis-rest-request/test/mocks/portal.ts +109 -0
  187. package/packages/arcgis-rest-request/test/mocks/sharing-rest-info.ts +38 -0
  188. package/packages/arcgis-rest-request/test/mocks/webmap.ts +38 -0
  189. package/packages/arcgis-rest-request/test/request.test.ts +296 -0
  190. package/packages/arcgis-rest-request/test/utils/ArcGISAuthError.test.ts +167 -0
  191. package/packages/arcgis-rest-request/test/utils/ArcGISRequestError.test.ts +40 -0
  192. package/packages/arcgis-rest-request/test/utils/check-for-errors.test.ts +101 -0
  193. package/packages/arcgis-rest-request/test/utils/encode-form-data.test.ts +112 -0
  194. package/packages/arcgis-rest-request/test/utils/get-portal-url.test.ts +34 -0
  195. package/packages/arcgis-rest-request/test/utils/portal.test.ts +94 -0
  196. package/packages/arcgis-rest-request/test/utils/process-params.test.ts +190 -0
  197. package/packages/arcgis-rest-request/tsconfig.json +6 -0
  198. package/packages/arcgis-rest-sharing/README.md +67 -0
  199. package/packages/arcgis-rest-sharing/package-lock.json +11 -0
  200. package/packages/arcgis-rest-sharing/package.json +55 -0
  201. package/packages/arcgis-rest-sharing/src/access.ts +91 -0
  202. package/packages/arcgis-rest-sharing/src/group-sharing.ts +212 -0
  203. package/packages/arcgis-rest-sharing/src/helpers.ts +92 -0
  204. package/packages/arcgis-rest-sharing/src/index.ts +2 -0
  205. package/packages/arcgis-rest-sharing/test/access.test.ts +153 -0
  206. package/packages/arcgis-rest-sharing/test/group-sharing.test.ts +436 -0
  207. package/packages/arcgis-rest-sharing/test/mocks/sharing.ts +15 -0
  208. package/packages/arcgis-rest-sharing/tsconfig.json +6 -0
  209. package/packages/arcgis-rest-users/README.md +71 -0
  210. package/packages/arcgis-rest-users/package-lock.json +11 -0
  211. package/packages/arcgis-rest-users/package.json +51 -0
  212. package/packages/arcgis-rest-users/src/index.ts +1 -0
  213. package/packages/arcgis-rest-users/src/users.ts +70 -0
  214. package/packages/arcgis-rest-users/test/mocks/responses.ts +170 -0
  215. package/packages/arcgis-rest-users/test/users.test.ts +97 -0
  216. package/packages/arcgis-rest-users/tsconfig.json +6 -0
  217. package/support/FormData.d.ts +1 -0
  218. package/support/changelog.js +388 -0
  219. package/support/commit-template.txt +19 -0
  220. package/support/deploy-doc-site.js +16 -0
  221. package/support/publish.sh +40 -0
  222. package/support/test-helpers.js +8 -0
  223. package/tsconfig.json +69 -0
  224. package/tslint.json +14 -0
  225. package/umd-base-profile.js +82 -0
  226. package/umd-production-profile.js +13 -0
@@ -0,0 +1,174 @@
1
+ /* Copyright (c) 2017 Environmental Systems Research Institute, Inc.
2
+ * Apache-2.0 */
3
+
4
+ import {
5
+ ISpatialReference,
6
+ IFeatureSet,
7
+ IFeature,
8
+ esriUnits,
9
+ IExtent
10
+ } from "@esri/arcgis-rest-common-types";
11
+ import { request, IRequestOptions } from "@esri/arcgis-rest-request";
12
+
13
+ import { ISharedQueryParams, appendCustomParams } from "./helpers";
14
+ /**
15
+ * Request options to fetch a feature by id.
16
+ */
17
+ export interface IFeatureRequestOptions extends IRequestOptions {
18
+ /**
19
+ * Layer service url.
20
+ */
21
+ url: string;
22
+ /**
23
+ * Unique identifier of the feature.
24
+ */
25
+ id: number;
26
+ }
27
+
28
+ export interface IStatisticDefinition {
29
+ /**
30
+ * Statistical operation to perform (count, sum, min, max, avg, stddev, var).
31
+ */
32
+ statisticType: "count" | "sum" | "min" | "max" | "avg" | "stddev" | "var";
33
+ /**
34
+ * Field on which to perform the statistical operation.
35
+ */
36
+ onStatisticField: string;
37
+ /**
38
+ * Field name for the returned statistic field. If outStatisticFieldName is empty or missing, the server will assign one. A valid field name can only contain alphanumeric characters and an underscore. If the outStatisticFieldName is a reserved keyword of the underlying DBMS, the operation can fail. Try specifying an alternative outStatisticFieldName.
39
+ */
40
+ outStatisticFieldName: string;
41
+ }
42
+
43
+ /**
44
+ * feature query request options. See [REST Documentation](https://developers.arcgis.com/rest/services-reference/query-feature-service-layer-.htm) for more information.
45
+ */
46
+ export interface IQueryFeaturesRequestOptions
47
+ extends ISharedQueryParams,
48
+ IRequestOptions {
49
+ /**
50
+ * Layer service url.
51
+ */
52
+ url: string;
53
+ objectIds?: number[];
54
+ relationParam?: string;
55
+ // NOTE: either time=1199145600000 or time=1199145600000, 1230768000000
56
+ time?: number | number[];
57
+ distance?: number;
58
+ units?: esriUnits;
59
+ outFields?: "*" | string[];
60
+ returnGeometry?: boolean;
61
+ maxAllowableOffset?: number;
62
+ geometryPrecision?: number;
63
+ // NOTE: either WKID or ISpatialReference
64
+ outSR?: string | ISpatialReference;
65
+ gdbVersion?: string;
66
+ returnDistinctValues?: boolean;
67
+ returnIdsOnly?: boolean;
68
+ returnCountOnly?: boolean;
69
+ returnExtentOnly?: boolean;
70
+ orderByFields?: string;
71
+ groupByFieldsForStatistics?: string;
72
+ outStatistics?: IStatisticDefinition[];
73
+ returnZ?: boolean;
74
+ returnM?: boolean;
75
+ multipatchOption?: "xyFootprint";
76
+ resultOffset?: number;
77
+ resultRecordCount?: number;
78
+ // TODO: IQuantizationParameters?
79
+ quantizationParameters?: any;
80
+ returnCentroid?: boolean;
81
+ resultType?: "none" | "standard" | "tile";
82
+ // to do: convert from Date() to epoch time internally
83
+ historicMoment?: number;
84
+ returnTrueCurves?: false;
85
+ sqlFormat?: "none" | "standard" | "native";
86
+ returnExceededLimitFeatures?: boolean;
87
+ }
88
+
89
+ export interface IQueryFeaturesResponse extends IFeatureSet {
90
+ exceededTransferLimit?: boolean;
91
+ }
92
+
93
+ export interface IQueryResponse {
94
+ count?: number;
95
+ extent?: IExtent;
96
+ objectIdFieldName?: string;
97
+ objectIds?: number[];
98
+ }
99
+
100
+ /**
101
+ * Get a feature by id.
102
+ *
103
+ * ```js
104
+ * import { getFeature } from '@esri/arcgis-rest-feature-service';
105
+ *
106
+ * const url = "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Landscape_Trees/FeatureServer/0";
107
+ *
108
+ * getFeature({
109
+ * url,
110
+ * id: 42
111
+ * };)
112
+ * .then(feature => {
113
+ * console.log(feature.attributes.FID); // 42
114
+ * });
115
+ * ```
116
+ *
117
+ * @param requestOptions - Options for the request
118
+ * @returns A Promise that will resolve with the feature.
119
+ */
120
+ export function getFeature(
121
+ requestOptions: IFeatureRequestOptions
122
+ ): Promise<IFeature> {
123
+ const url = `${requestOptions.url}/${requestOptions.id}`;
124
+
125
+ // default to a GET request
126
+ const options: IFeatureRequestOptions = {
127
+ ...{ httpMethod: "GET" },
128
+ ...requestOptions
129
+ };
130
+ return request(url, options).then((response: any) => response.feature);
131
+ }
132
+
133
+ /**
134
+ * Query a feature service. See [REST Documentation](https://developers.arcgis.com/rest/services-reference/query-feature-service-layer-.htm) for more information.
135
+ *
136
+ * ```js
137
+ * import { queryFeatures } from '@esri/arcgis-rest-feature-service';
138
+ *
139
+ * const url = "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3";
140
+ *
141
+ * queryFeatures({
142
+ * url,
143
+ * where: "STATE_NAME = 'Alaska"
144
+ * };)
145
+ * .then(feature => {
146
+ * console.log(feature.attributes.FID); // 42
147
+ * });
148
+ * ```
149
+ *
150
+ * @param requestOptions - Options for the request
151
+ * @returns A Promise that will resolve with the query response.
152
+ */
153
+ export function queryFeatures(
154
+ requestOptions: IQueryFeaturesRequestOptions
155
+ ): Promise<IQueryFeaturesResponse | IQueryResponse> {
156
+ // default to a GET request
157
+ const options: IQueryFeaturesRequestOptions = {
158
+ params: {},
159
+ httpMethod: "GET",
160
+ url: requestOptions.url,
161
+ ...requestOptions
162
+ };
163
+
164
+ appendCustomParams(requestOptions, options);
165
+
166
+ // set default query parameters
167
+ if (!options.params.where) {
168
+ options.params.where = "1=1";
169
+ }
170
+ if (!options.params.outFields) {
171
+ options.params.outFields = "*";
172
+ }
173
+ return request(`${options.url}/query`, options);
174
+ }
@@ -0,0 +1,81 @@
1
+ /* Copyright (c) 2017 Environmental Systems Research Institute, Inc.
2
+ * Apache-2.0 */
3
+
4
+ import { IFeature } from "@esri/arcgis-rest-common-types";
5
+ import { request, IRequestOptions } from "@esri/arcgis-rest-request";
6
+
7
+ import {
8
+ IEditFeaturesParams,
9
+ IEditFeatureResult,
10
+ appendCustomParams
11
+ } from "./helpers";
12
+
13
+ /**
14
+ * Update features request options. See the [REST Documentation](https://developers.arcgis.com/rest/services-reference/update-features.htm) for more information.
15
+ *
16
+ * @param url - Feature service url.
17
+ * @param updates - Array of JSON features to update.
18
+ * @param params - Query parameters to be sent to the feature service via the request.
19
+ */
20
+ export interface IUpdateFeaturesRequestOptions
21
+ extends IEditFeaturesParams,
22
+ IRequestOptions {
23
+ /**
24
+ * Feature service url.
25
+ */
26
+ url: string;
27
+ /**
28
+ * Array of JSON features to update.
29
+ */
30
+ updates: IFeature[];
31
+ }
32
+
33
+ /**
34
+ * Update features results.
35
+ */
36
+ export interface IUpdateFeaturesResult {
37
+ /**
38
+ * Array of JSON response Object(s) for each feature updated.
39
+ */
40
+ updateResults?: IEditFeatureResult[];
41
+ }
42
+
43
+ /**
44
+ * Update features request. See the [REST Documentation](https://developers.arcgis.com/rest/services-reference/update-features.htm) for more information.
45
+ *
46
+ * ```js
47
+ * import { updateFeatures } from '@esri/arcgis-rest-feature-service';
48
+ *
49
+ * const url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/ServiceRequest/FeatureServer/0";
50
+ *
51
+ * updateFeatures({
52
+ * url,
53
+ * updates: [{
54
+ * geometry: { x: -120, y: 45, spatialReference: { wkid: 4326 } },
55
+ * attributes: { status: "alive" }
56
+ * }]
57
+ * });
58
+ * ```
59
+ *
60
+ * @param requestOptions - Options for the request.
61
+ * @returns A Promise that will resolve with the updateFeatures response.
62
+ */
63
+ export function updateFeatures(
64
+ requestOptions: IUpdateFeaturesRequestOptions
65
+ ): Promise<IUpdateFeaturesResult> {
66
+ const url = `${requestOptions.url}/updateFeatures`;
67
+
68
+ // edit operations are POST only
69
+ const options: IUpdateFeaturesRequestOptions = {
70
+ params: {},
71
+ ...requestOptions
72
+ };
73
+
74
+ appendCustomParams(requestOptions, options);
75
+
76
+ // mixin, don't overwrite
77
+ options.params.features = requestOptions.updates;
78
+ delete options.params.updates;
79
+
80
+ return request(url, options);
81
+ }
@@ -0,0 +1,74 @@
1
+ /* Copyright (c) 2018 Environmental Systems Research Institute, Inc.
2
+ * Apache-2.0 */
3
+
4
+ import { request, IRequestOptions } from "@esri/arcgis-rest-request";
5
+
6
+ import { IEditFeatureResult, appendCustomParams } from "./helpers";
7
+
8
+ /**
9
+ * Request options to for updating a related attachment to a feature by id. See [Update Attachment](https://developers.arcgis.com/rest/services-reference/update-attachment.htm) for more information.
10
+ *
11
+ */
12
+ export interface IUpdateAttachmentOptions extends IRequestOptions {
13
+ /**
14
+ * Feature service url.
15
+ */
16
+ url: string;
17
+ /**
18
+ * Unique identifier of feature to update related attachment.
19
+ */
20
+ featureId: number;
21
+ /**
22
+ * File to be updated.
23
+ */
24
+ attachment: File;
25
+ /**
26
+ * Unique identifier of the attachment.
27
+ */
28
+ attachmentId: number;
29
+ }
30
+
31
+ /**
32
+ * `updateAttachment()` request response.
33
+ */
34
+ export interface IUpdateAttachmentResponse {
35
+ /**
36
+ * Standard AGS add/update/edit result Object for the attachment.
37
+ */
38
+ updateAttachmentResult: IEditFeatureResult;
39
+ }
40
+
41
+ /**
42
+ * Update a related attachment to a feature by id. See [Update Attachment](https://developers.arcgis.com/rest/services-reference/update-attachment.htm) for more information.
43
+ *
44
+ * ```js
45
+ * import { updateAttachment } from '@esri/arcgis-rest-feature-service';
46
+ *
47
+ * updateAttachment({
48
+ * url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/ServiceRequest/FeatureServer/0",
49
+ * featureId: 8484,
50
+ * attachment: myFileInput.files[0],
51
+ * attachmentId: 306
52
+ * });
53
+ * ```
54
+ *
55
+ * @param requestOptions - Options for the request.
56
+ * @returns A Promise that will resolve with the `updateAttachment()` response.
57
+ */
58
+ export function updateAttachment(
59
+ requestOptions: IUpdateAttachmentOptions
60
+ ): Promise<IUpdateAttachmentResponse> {
61
+ const options: IUpdateAttachmentOptions = {
62
+ params: {},
63
+ ...requestOptions
64
+ };
65
+
66
+ // `attachment` and `attachmentId` --> params: {}
67
+ options.params.attachment = requestOptions.attachment;
68
+ options.params.attachmentId = requestOptions.attachmentId;
69
+
70
+ return request(
71
+ `${options.url}/${options.featureId}/updateAttachment`,
72
+ options
73
+ );
74
+ }
@@ -0,0 +1,179 @@
1
+ import * as fetchMock from "fetch-mock";
2
+
3
+ import {
4
+ getAttachments,
5
+ IGetAttachmentsOptions,
6
+ addAttachment,
7
+ IAddAttachmentOptions,
8
+ updateAttachment,
9
+ IUpdateAttachmentOptions,
10
+ deleteAttachments,
11
+ IDeleteAttachmentsOptions
12
+ } from "../src/index";
13
+
14
+ import {
15
+ getAttachmentsResponse,
16
+ addAttachmentResponse,
17
+ updateAttachmentResponse,
18
+ deleteAttachmentsResponse,
19
+ genericInvalidResponse
20
+ } from "./mocks/feature";
21
+
22
+ export function attachmentFile() {
23
+ if (typeof File !== "undefined" && File) {
24
+ return new File(["foo"], "foo.txt", { type: "text/plain" });
25
+ } else {
26
+ const fs = require("fs");
27
+ return fs.createReadStream(
28
+ "./packages/arcgis-rest-feature-service/test/mocks/foo.txt"
29
+ );
30
+ }
31
+ }
32
+
33
+ const serviceUrl =
34
+ "https://services.arcgis.com/f8b/arcgis/rest/services/Custom/FeatureServer/0";
35
+
36
+ describe("attachment methods", () => {
37
+ afterEach(fetchMock.restore);
38
+
39
+ it("should return an array of attachmentInfos for a feature by id", done => {
40
+ const requestOptions = {
41
+ url: serviceUrl,
42
+ featureId: 42,
43
+ params: {
44
+ gdbVersion: "SDE.DEFAULT"
45
+ },
46
+ httpMethod: "GET"
47
+ } as IGetAttachmentsOptions;
48
+ fetchMock.once("*", getAttachmentsResponse);
49
+ getAttachments(requestOptions).then(response => {
50
+ expect(fetchMock.called()).toBeTruthy();
51
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
52
+ expect(url).toEqual(
53
+ `${requestOptions.url}/${
54
+ requestOptions.featureId
55
+ }/attachments?f=json&gdbVersion=SDE.DEFAULT`
56
+ );
57
+ expect(options.method).toBe("GET");
58
+ expect(getAttachmentsResponse.attachmentInfos.length).toEqual(2);
59
+ expect(getAttachmentsResponse.attachmentInfos[0].id).toEqual(409);
60
+ done();
61
+ });
62
+ });
63
+
64
+ it("should return objectId of the added attachment and a truthy success", done => {
65
+ const requestOptions = {
66
+ url: serviceUrl,
67
+ featureId: 42,
68
+ attachment: attachmentFile(),
69
+ params: {
70
+ returnEditMoment: true
71
+ }
72
+ } as IAddAttachmentOptions;
73
+ fetchMock.once("*", addAttachmentResponse);
74
+ addAttachment(requestOptions).then(response => {
75
+ expect(fetchMock.called()).toBeTruthy();
76
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
77
+ expect(url).toEqual(
78
+ `${requestOptions.url}/${requestOptions.featureId}/addAttachment`
79
+ );
80
+ expect(options.method).toBe("POST");
81
+ expect(options.body instanceof FormData).toBeTruthy();
82
+ const params = options.body as FormData;
83
+ // we could introspect FormData in Chrome this way, but not Node.js
84
+ // more info: https://github.com/form-data/form-data/issues/124
85
+ // expect(params.get("returnEditMoment")).toEqual("true");
86
+ expect(addAttachmentResponse.addAttachmentResult.objectId).toEqual(1001);
87
+ expect(addAttachmentResponse.addAttachmentResult.success).toEqual(true);
88
+ done();
89
+ });
90
+ });
91
+
92
+ it("should return an error for a service/feature which does not have attachments", done => {
93
+ const requestOptions = {
94
+ url:
95
+ "https://services.arcgis.com/f8b/arcgis/rest/services/NoAttachments/FeatureServer/0",
96
+ featureId: 654,
97
+ attachment: attachmentFile(),
98
+ params: {
99
+ returnEditMoment: true
100
+ }
101
+ } as IAddAttachmentOptions;
102
+ fetchMock.once("*", genericInvalidResponse);
103
+ addAttachment(requestOptions)
104
+ .then(response => {
105
+ // nothing to test here forcing error
106
+ fail();
107
+ })
108
+ .catch(error => {
109
+ expect(fetchMock.called()).toBeTruthy();
110
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
111
+ expect(url).toEqual(
112
+ `${requestOptions.url}/${requestOptions.featureId}/addAttachment`
113
+ );
114
+ expect(options.method).toBe("POST");
115
+ expect(error.response.error.code).toEqual(400);
116
+ expect(error.response.error.message).toEqual(
117
+ "Invalid or missing input parameters."
118
+ );
119
+ done();
120
+ });
121
+ });
122
+
123
+ it("should return objectId of the updated attachment and a truthy success", done => {
124
+ const requestOptions = {
125
+ url: serviceUrl,
126
+ featureId: 42,
127
+ attachmentId: 1001,
128
+ attachment: attachmentFile(),
129
+ params: {
130
+ returnEditMoment: true
131
+ }
132
+ } as IUpdateAttachmentOptions;
133
+ fetchMock.once("*", updateAttachmentResponse);
134
+ updateAttachment(requestOptions).then(response => {
135
+ expect(fetchMock.called()).toBeTruthy();
136
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
137
+ expect(url).toEqual(
138
+ `${requestOptions.url}/${requestOptions.featureId}/updateAttachment`
139
+ );
140
+ expect(options.method).toBe("POST");
141
+ expect(updateAttachmentResponse.updateAttachmentResult.objectId).toEqual(
142
+ 1001
143
+ );
144
+ expect(updateAttachmentResponse.updateAttachmentResult.success).toEqual(
145
+ true
146
+ );
147
+ done();
148
+ });
149
+ });
150
+
151
+ it("should return objectId of the deleted attachment and a truthy success", done => {
152
+ const requestOptions = {
153
+ url: serviceUrl,
154
+ featureId: 42,
155
+ attachmentIds: [1001],
156
+ params: {
157
+ returnEditMoment: true
158
+ }
159
+ } as IDeleteAttachmentsOptions;
160
+ fetchMock.once("*", deleteAttachmentsResponse);
161
+ deleteAttachments(requestOptions).then(response => {
162
+ expect(fetchMock.called()).toBeTruthy();
163
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
164
+ expect(url).toEqual(
165
+ `${requestOptions.url}/${requestOptions.featureId}/deleteAttachments`
166
+ );
167
+ expect(options.body).toContain("attachmentIds=1001");
168
+ expect(options.body).toContain("returnEditMoment=true");
169
+ expect(options.method).toBe("POST");
170
+ expect(
171
+ deleteAttachmentsResponse.deleteAttachmentResults[0].objectId
172
+ ).toEqual(1001);
173
+ expect(
174
+ deleteAttachmentsResponse.deleteAttachmentResults[0].success
175
+ ).toEqual(true);
176
+ done();
177
+ });
178
+ });
179
+ });
@@ -0,0 +1,172 @@
1
+ import {
2
+ getFeature,
3
+ queryFeatures,
4
+ addFeatures,
5
+ updateFeatures,
6
+ deleteFeatures,
7
+ IDeleteFeaturesRequestOptions,
8
+ IUpdateFeaturesRequestOptions
9
+ } from "../src/index";
10
+
11
+ import * as fetchMock from "fetch-mock";
12
+
13
+ import {
14
+ featureResponse,
15
+ queryResponse,
16
+ addFeaturesResponse,
17
+ updateFeaturesResponse,
18
+ deleteFeaturesResponse
19
+ } from "./mocks/feature";
20
+
21
+ const serviceUrl =
22
+ "https://services.arcgis.com/f8b/arcgis/rest/services/Custom/FeatureServer/0";
23
+
24
+ describe("feature", () => {
25
+ afterEach(fetchMock.restore);
26
+
27
+ it("should return a feature by id", done => {
28
+ const requestOptions = {
29
+ url: serviceUrl,
30
+ id: 42
31
+ };
32
+ fetchMock.once("*", featureResponse);
33
+ getFeature(requestOptions).then(response => {
34
+ expect(fetchMock.called()).toBeTruthy();
35
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
36
+ expect(url).toEqual(`${requestOptions.url}/42?f=json`);
37
+ expect(options.method).toBe("GET");
38
+ expect(response.attributes.FID).toEqual(42);
39
+ done();
40
+ });
41
+ });
42
+
43
+ it("should supply default query parameters", done => {
44
+ const requestOptions = {
45
+ url: serviceUrl
46
+ };
47
+ fetchMock.once("*", queryResponse);
48
+ queryFeatures(requestOptions).then(response => {
49
+ expect(fetchMock.called()).toBeTruthy();
50
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
51
+ expect(url).toEqual(
52
+ `${requestOptions.url}/query?f=json&where=1%3D1&outFields=*`
53
+ );
54
+ expect(options.method).toBe("GET");
55
+ done();
56
+ });
57
+ });
58
+
59
+ it("should use passed in query parameters", done => {
60
+ const requestOptions = {
61
+ url: serviceUrl,
62
+ where: "Condition='Poor'",
63
+ outFields: ["FID", "Tree_ID", "Cmn_Name", "Condition"]
64
+ };
65
+ fetchMock.once("*", queryResponse);
66
+ queryFeatures(requestOptions).then(response => {
67
+ expect(fetchMock.called()).toBeTruthy();
68
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
69
+ expect(url).toEqual(
70
+ `${
71
+ requestOptions.url
72
+ }/query?f=json&where=Condition%3D'Poor'&outFields=FID%2CTree_ID%2CCmn_Name%2CCondition`
73
+ );
74
+ expect(options.method).toBe("GET");
75
+ // expect(response.attributes.FID).toEqual(42);
76
+ done();
77
+ });
78
+ });
79
+
80
+ it("should return objectId of the added feature and a truthy success", done => {
81
+ const requestOptions = {
82
+ url: serviceUrl,
83
+ adds: [
84
+ {
85
+ geometry: {
86
+ x: -9177311.62541634,
87
+ y: 4247151.205222242,
88
+ spatialReference: {
89
+ wkid: 102100,
90
+ latestWkid: 3857
91
+ }
92
+ },
93
+ attributes: {
94
+ Tree_ID: 102,
95
+ Collected: 1349395200000,
96
+ Crew: "Linden+ Forrest+ Johnny"
97
+ }
98
+ }
99
+ ]
100
+ };
101
+ fetchMock.once("*", addFeaturesResponse);
102
+ addFeatures(requestOptions).then(response => {
103
+ expect(fetchMock.called()).toBeTruthy();
104
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
105
+ expect(url).toEqual(`${requestOptions.url}/addFeatures`);
106
+ expect(options.body).toContain(
107
+ "features=" +
108
+ encodeURIComponent(
109
+ '[{"geometry":{"x":-9177311.62541634,"y":4247151.205222242,"spatialReference":{"wkid":102100,"latestWkid":3857}},"attributes":{"Tree_ID":102,"Collected":1349395200000,"Crew":"Linden+ Forrest+ Johnny"}}]'
110
+ )
111
+ );
112
+ expect(options.method).toBe("POST");
113
+ expect(response.addResults[0].objectId).toEqual(1001);
114
+ expect(response.addResults[0].success).toEqual(true);
115
+ done();
116
+ });
117
+ });
118
+
119
+ it("should return objectId of the updated feature and a truthy success", done => {
120
+ const requestOptions = {
121
+ url: serviceUrl,
122
+ updates: [
123
+ {
124
+ attributes: {
125
+ OBJECTID: 1001,
126
+ Street: "NO",
127
+ Native: "YES"
128
+ }
129
+ }
130
+ ],
131
+ rollbackOnFailure: false
132
+ } as IUpdateFeaturesRequestOptions;
133
+ fetchMock.once("*", updateFeaturesResponse);
134
+ updateFeatures(requestOptions).then(response => {
135
+ expect(fetchMock.called()).toBeTruthy();
136
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
137
+ expect(url).toEqual(`${requestOptions.url}/updateFeatures`);
138
+ expect(options.method).toBe("POST");
139
+ expect(options.body).toContain(
140
+ "features=" +
141
+ encodeURIComponent(
142
+ '[{"attributes":{"OBJECTID":1001,"Street":"NO","Native":"YES"}}]'
143
+ )
144
+ );
145
+ expect(options.body).toContain("rollbackOnFailure=false");
146
+ expect(response.updateResults[0].success).toEqual(true);
147
+ done();
148
+ });
149
+ });
150
+
151
+ it("should return objectId of the deleted feature and a truthy success", done => {
152
+ const requestOptions = {
153
+ url: serviceUrl,
154
+ deletes: [1001],
155
+ where: "1=1"
156
+ } as IDeleteFeaturesRequestOptions;
157
+ fetchMock.once("*", deleteFeaturesResponse);
158
+ deleteFeatures(requestOptions).then(response => {
159
+ expect(fetchMock.called()).toBeTruthy();
160
+ const [url, options]: [string, RequestInit] = fetchMock.lastCall("*");
161
+ expect(url).toEqual(`${requestOptions.url}/deleteFeatures`);
162
+ expect(options.body).toContain("objectIds=1001");
163
+ expect(options.body).toContain("where=1%3D1");
164
+ expect(options.method).toBe("POST");
165
+ expect(response.deleteResults[0].objectId).toEqual(
166
+ requestOptions.deletes[0]
167
+ );
168
+ expect(response.deleteResults[0].success).toEqual(true);
169
+ done();
170
+ });
171
+ });
172
+ });