@mapcreator/api 0.0.0-co-edit.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 (274) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +86 -0
  3. package/cjs/api/apiCommon.d.ts +7 -0
  4. package/cjs/api/apiCommon.d.ts.map +1 -0
  5. package/cjs/api/apiCommon.js +31 -0
  6. package/cjs/api/apiCommon.js.map +1 -0
  7. package/cjs/api/choropleth.d.ts +138 -0
  8. package/cjs/api/choropleth.d.ts.map +1 -0
  9. package/cjs/api/choropleth.js +41 -0
  10. package/cjs/api/choropleth.js.map +1 -0
  11. package/cjs/api/color.d.ts +16 -0
  12. package/cjs/api/color.d.ts.map +1 -0
  13. package/cjs/api/color.js +8 -0
  14. package/cjs/api/color.js.map +1 -0
  15. package/cjs/api/dimension.d.ts +25 -0
  16. package/cjs/api/dimension.d.ts.map +1 -0
  17. package/cjs/api/dimension.js +14 -0
  18. package/cjs/api/dimension.js.map +1 -0
  19. package/cjs/api/dimensionSet.d.ts +15 -0
  20. package/cjs/api/dimensionSet.d.ts.map +1 -0
  21. package/cjs/api/dimensionSet.js +7 -0
  22. package/cjs/api/dimensionSet.js.map +1 -0
  23. package/cjs/api/feature.d.ts +16 -0
  24. package/cjs/api/feature.d.ts.map +1 -0
  25. package/cjs/api/feature.js +8 -0
  26. package/cjs/api/feature.js.map +1 -0
  27. package/cjs/api/font.d.ts +32 -0
  28. package/cjs/api/font.d.ts.map +1 -0
  29. package/cjs/api/font.js +15 -0
  30. package/cjs/api/font.js.map +1 -0
  31. package/cjs/api/fontFamily.d.ts +17 -0
  32. package/cjs/api/fontFamily.d.ts.map +1 -0
  33. package/cjs/api/fontFamily.js +17 -0
  34. package/cjs/api/fontFamily.js.map +1 -0
  35. package/cjs/api/geocode.d.ts +10 -0
  36. package/cjs/api/geocode.d.ts.map +1 -0
  37. package/cjs/api/geocode.js +9 -0
  38. package/cjs/api/geocode.js.map +1 -0
  39. package/cjs/api/highlight.d.ts +41 -0
  40. package/cjs/api/highlight.d.ts.map +1 -0
  41. package/cjs/api/highlight.js +25 -0
  42. package/cjs/api/highlight.js.map +1 -0
  43. package/cjs/api/insetMap.d.ts +37 -0
  44. package/cjs/api/insetMap.d.ts.map +1 -0
  45. package/cjs/api/insetMap.js +47 -0
  46. package/cjs/api/insetMap.js.map +1 -0
  47. package/cjs/api/job.d.ts +45 -0
  48. package/cjs/api/job.d.ts.map +1 -0
  49. package/cjs/api/job.js +77 -0
  50. package/cjs/api/job.js.map +1 -0
  51. package/cjs/api/jobResult.d.ts +40 -0
  52. package/cjs/api/jobResult.d.ts.map +1 -0
  53. package/cjs/api/jobResult.js +35 -0
  54. package/cjs/api/jobResult.js.map +1 -0
  55. package/cjs/api/jobRevision.d.ts +76 -0
  56. package/cjs/api/jobRevision.d.ts.map +1 -0
  57. package/cjs/api/jobRevision.js +126 -0
  58. package/cjs/api/jobRevision.js.map +1 -0
  59. package/cjs/api/jobShare.d.ts +26 -0
  60. package/cjs/api/jobShare.d.ts.map +1 -0
  61. package/cjs/api/jobShare.js +9 -0
  62. package/cjs/api/jobShare.js.map +1 -0
  63. package/cjs/api/jobType.d.ts +17 -0
  64. package/cjs/api/jobType.d.ts.map +1 -0
  65. package/cjs/api/jobType.js +11 -0
  66. package/cjs/api/jobType.js.map +1 -0
  67. package/cjs/api/language.d.ts +17 -0
  68. package/cjs/api/language.d.ts.map +1 -0
  69. package/cjs/api/language.js +3 -0
  70. package/cjs/api/language.js.map +1 -0
  71. package/cjs/api/layer.d.ts +26 -0
  72. package/cjs/api/layer.d.ts.map +1 -0
  73. package/cjs/api/layer.js +14 -0
  74. package/cjs/api/layer.js.map +1 -0
  75. package/cjs/api/layerFaq.d.ts +27 -0
  76. package/cjs/api/layerFaq.d.ts.map +1 -0
  77. package/cjs/api/layerFaq.js +16 -0
  78. package/cjs/api/layerFaq.js.map +1 -0
  79. package/cjs/api/layerGroup.d.ts +16 -0
  80. package/cjs/api/layerGroup.d.ts.map +1 -0
  81. package/cjs/api/layerGroup.js +36 -0
  82. package/cjs/api/layerGroup.js.map +1 -0
  83. package/cjs/api/mapstyleSet.d.ts +32 -0
  84. package/cjs/api/mapstyleSet.d.ts.map +1 -0
  85. package/cjs/api/mapstyleSet.js +28 -0
  86. package/cjs/api/mapstyleSet.js.map +1 -0
  87. package/cjs/api/message.d.ts +32 -0
  88. package/cjs/api/message.d.ts.map +1 -0
  89. package/cjs/api/message.js +37 -0
  90. package/cjs/api/message.js.map +1 -0
  91. package/cjs/api/organisation.d.ts +41 -0
  92. package/cjs/api/organisation.d.ts.map +1 -0
  93. package/cjs/api/organisation.js +41 -0
  94. package/cjs/api/organisation.js.map +1 -0
  95. package/cjs/api/resources.d.ts +65 -0
  96. package/cjs/api/resources.d.ts.map +1 -0
  97. package/cjs/api/resources.js +61 -0
  98. package/cjs/api/resources.js.map +1 -0
  99. package/cjs/api/svg.d.ts +21 -0
  100. package/cjs/api/svg.d.ts.map +1 -0
  101. package/cjs/api/svg.js +15 -0
  102. package/cjs/api/svg.js.map +1 -0
  103. package/cjs/api/svgSet.d.ts +22 -0
  104. package/cjs/api/svgSet.d.ts.map +1 -0
  105. package/cjs/api/svgSet.js +25 -0
  106. package/cjs/api/svgSet.js.map +1 -0
  107. package/cjs/api/user.d.ts +129 -0
  108. package/cjs/api/user.d.ts.map +1 -0
  109. package/cjs/api/user.js +145 -0
  110. package/cjs/api/user.js.map +1 -0
  111. package/cjs/index.d.ts +28 -0
  112. package/cjs/index.d.ts.map +1 -0
  113. package/cjs/index.js +53 -0
  114. package/cjs/index.js.map +1 -0
  115. package/cjs/oauth.d.ts +31 -0
  116. package/cjs/oauth.d.ts.map +1 -0
  117. package/cjs/oauth.js +76 -0
  118. package/cjs/oauth.js.map +1 -0
  119. package/cjs/utils.d.ts +72 -0
  120. package/cjs/utils.d.ts.map +1 -0
  121. package/cjs/utils.js +220 -0
  122. package/cjs/utils.js.map +1 -0
  123. package/esm/api/apiCommon.d.ts +7 -0
  124. package/esm/api/apiCommon.d.ts.map +1 -0
  125. package/esm/api/apiCommon.js +28 -0
  126. package/esm/api/apiCommon.js.map +1 -0
  127. package/esm/api/choropleth.d.ts +138 -0
  128. package/esm/api/choropleth.d.ts.map +1 -0
  129. package/esm/api/choropleth.js +34 -0
  130. package/esm/api/choropleth.js.map +1 -0
  131. package/esm/api/color.d.ts +16 -0
  132. package/esm/api/color.d.ts.map +1 -0
  133. package/esm/api/color.js +5 -0
  134. package/esm/api/color.js.map +1 -0
  135. package/esm/api/dimension.d.ts +25 -0
  136. package/esm/api/dimension.d.ts.map +1 -0
  137. package/esm/api/dimension.js +11 -0
  138. package/esm/api/dimension.js.map +1 -0
  139. package/esm/api/dimensionSet.d.ts +15 -0
  140. package/esm/api/dimensionSet.d.ts.map +1 -0
  141. package/esm/api/dimensionSet.js +4 -0
  142. package/esm/api/dimensionSet.js.map +1 -0
  143. package/esm/api/feature.d.ts +16 -0
  144. package/esm/api/feature.d.ts.map +1 -0
  145. package/esm/api/feature.js +5 -0
  146. package/esm/api/feature.js.map +1 -0
  147. package/esm/api/font.d.ts +32 -0
  148. package/esm/api/font.d.ts.map +1 -0
  149. package/esm/api/font.js +11 -0
  150. package/esm/api/font.js.map +1 -0
  151. package/esm/api/fontFamily.d.ts +17 -0
  152. package/esm/api/fontFamily.d.ts.map +1 -0
  153. package/esm/api/fontFamily.js +13 -0
  154. package/esm/api/fontFamily.js.map +1 -0
  155. package/esm/api/geocode.d.ts +10 -0
  156. package/esm/api/geocode.d.ts.map +1 -0
  157. package/esm/api/geocode.js +6 -0
  158. package/esm/api/geocode.js.map +1 -0
  159. package/esm/api/highlight.d.ts +41 -0
  160. package/esm/api/highlight.d.ts.map +1 -0
  161. package/esm/api/highlight.js +21 -0
  162. package/esm/api/highlight.js.map +1 -0
  163. package/esm/api/insetMap.d.ts +37 -0
  164. package/esm/api/insetMap.d.ts.map +1 -0
  165. package/esm/api/insetMap.js +42 -0
  166. package/esm/api/insetMap.js.map +1 -0
  167. package/esm/api/job.d.ts +45 -0
  168. package/esm/api/job.d.ts.map +1 -0
  169. package/esm/api/job.js +64 -0
  170. package/esm/api/job.js.map +1 -0
  171. package/esm/api/jobResult.d.ts +40 -0
  172. package/esm/api/jobResult.d.ts.map +1 -0
  173. package/esm/api/jobResult.js +30 -0
  174. package/esm/api/jobResult.js.map +1 -0
  175. package/esm/api/jobRevision.d.ts +76 -0
  176. package/esm/api/jobRevision.d.ts.map +1 -0
  177. package/esm/api/jobRevision.js +114 -0
  178. package/esm/api/jobRevision.js.map +1 -0
  179. package/esm/api/jobShare.d.ts +26 -0
  180. package/esm/api/jobShare.d.ts.map +1 -0
  181. package/esm/api/jobShare.js +6 -0
  182. package/esm/api/jobShare.js.map +1 -0
  183. package/esm/api/jobType.d.ts +17 -0
  184. package/esm/api/jobType.d.ts.map +1 -0
  185. package/esm/api/jobType.js +8 -0
  186. package/esm/api/jobType.js.map +1 -0
  187. package/esm/api/language.d.ts +17 -0
  188. package/esm/api/language.d.ts.map +1 -0
  189. package/esm/api/language.js +2 -0
  190. package/esm/api/language.js.map +1 -0
  191. package/esm/api/layer.d.ts +26 -0
  192. package/esm/api/layer.d.ts.map +1 -0
  193. package/esm/api/layer.js +11 -0
  194. package/esm/api/layer.js.map +1 -0
  195. package/esm/api/layerFaq.d.ts +27 -0
  196. package/esm/api/layerFaq.d.ts.map +1 -0
  197. package/esm/api/layerFaq.js +12 -0
  198. package/esm/api/layerFaq.js.map +1 -0
  199. package/esm/api/layerGroup.d.ts +16 -0
  200. package/esm/api/layerGroup.d.ts.map +1 -0
  201. package/esm/api/layerGroup.js +33 -0
  202. package/esm/api/layerGroup.js.map +1 -0
  203. package/esm/api/mapstyleSet.d.ts +32 -0
  204. package/esm/api/mapstyleSet.d.ts.map +1 -0
  205. package/esm/api/mapstyleSet.js +24 -0
  206. package/esm/api/mapstyleSet.js.map +1 -0
  207. package/esm/api/message.d.ts +32 -0
  208. package/esm/api/message.d.ts.map +1 -0
  209. package/esm/api/message.js +32 -0
  210. package/esm/api/message.js.map +1 -0
  211. package/esm/api/organisation.d.ts +41 -0
  212. package/esm/api/organisation.d.ts.map +1 -0
  213. package/esm/api/organisation.js +35 -0
  214. package/esm/api/organisation.js.map +1 -0
  215. package/esm/api/resources.d.ts +65 -0
  216. package/esm/api/resources.d.ts.map +1 -0
  217. package/esm/api/resources.js +55 -0
  218. package/esm/api/resources.js.map +1 -0
  219. package/esm/api/svg.d.ts +21 -0
  220. package/esm/api/svg.d.ts.map +1 -0
  221. package/esm/api/svg.js +11 -0
  222. package/esm/api/svg.js.map +1 -0
  223. package/esm/api/svgSet.d.ts +22 -0
  224. package/esm/api/svgSet.d.ts.map +1 -0
  225. package/esm/api/svgSet.js +21 -0
  226. package/esm/api/svgSet.js.map +1 -0
  227. package/esm/api/user.d.ts +129 -0
  228. package/esm/api/user.d.ts.map +1 -0
  229. package/esm/api/user.js +126 -0
  230. package/esm/api/user.js.map +1 -0
  231. package/esm/index.d.ts +28 -0
  232. package/esm/index.d.ts.map +1 -0
  233. package/esm/index.js +28 -0
  234. package/esm/index.js.map +1 -0
  235. package/esm/oauth.d.ts +31 -0
  236. package/esm/oauth.d.ts.map +1 -0
  237. package/esm/oauth.js +68 -0
  238. package/esm/oauth.js.map +1 -0
  239. package/esm/utils.d.ts +72 -0
  240. package/esm/utils.d.ts.map +1 -0
  241. package/esm/utils.js +206 -0
  242. package/esm/utils.js.map +1 -0
  243. package/package.json +80 -0
  244. package/src/README.md +126 -0
  245. package/src/api/apiCommon.ts +70 -0
  246. package/src/api/choropleth.ts +228 -0
  247. package/src/api/color.ts +22 -0
  248. package/src/api/dimension.ts +44 -0
  249. package/src/api/dimensionSet.ts +20 -0
  250. package/src/api/feature.ts +22 -0
  251. package/src/api/font.ts +57 -0
  252. package/src/api/fontFamily.ts +43 -0
  253. package/src/api/geocode.ts +17 -0
  254. package/src/api/highlight.ts +87 -0
  255. package/src/api/insetMap.ts +95 -0
  256. package/src/api/job.ts +139 -0
  257. package/src/api/jobResult.ts +95 -0
  258. package/src/api/jobRevision.ts +281 -0
  259. package/src/api/jobShare.ts +35 -0
  260. package/src/api/jobType.ts +26 -0
  261. package/src/api/language.ts +19 -0
  262. package/src/api/layer.ts +38 -0
  263. package/src/api/layerFaq.ts +53 -0
  264. package/src/api/layerGroup.ts +69 -0
  265. package/src/api/mapstyleSet.ts +70 -0
  266. package/src/api/message.ts +80 -0
  267. package/src/api/organisation.ts +96 -0
  268. package/src/api/resources.ts +153 -0
  269. package/src/api/svg.ts +33 -0
  270. package/src/api/svgSet.ts +56 -0
  271. package/src/api/user.ts +327 -0
  272. package/src/index.ts +44 -0
  273. package/src/oauth.ts +90 -0
  274. package/src/utils.ts +342 -0
@@ -0,0 +1,35 @@
1
+ import { type ApiCommon, type ApiCommonData, type ApiError, type ApiSuccess, type Flatten, request } from '../utils.js';
2
+
3
+ export type JobShareVisibility = 'private' | 'organisation' | 'public';
4
+
5
+ export type JobShare = {
6
+ id: number;
7
+ jobId: number;
8
+ visibility: JobShareVisibility;
9
+ hashKey: string;
10
+ apiUrl: string;
11
+ webUrl: string;
12
+ };
13
+
14
+ export type ApiJobShare = {
15
+ data: {
16
+ id: number; // The id of the job share (sortable)
17
+ job_id: number; // The id of the job related to this share
18
+ visibility: string; // The visibility of the job share (searchable, sortable)
19
+ hash_key: string; // The hash key of the job share
20
+ apiUrl: string; // TODO: not present in API specification!
21
+ webUrl: string; // TODO: not present in API specification!
22
+ } & ApiCommonData;
23
+ } & Omit<ApiSuccess, 'data'> | ApiError;
24
+
25
+ export type ApiJobShareData = Flatten<Exclude<ApiJobShare, ApiError>['data']>;
26
+
27
+ export type ApiJobShareArray = {
28
+ data: ApiJobShareData[];
29
+ } & Omit<ApiSuccess, 'data'> | ApiError;
30
+
31
+ export async function deleteJobShare(jobShareId: number): Promise<Record<string, never>> {
32
+ const path = `/v1/jobs/shares/${jobShareId}`;
33
+
34
+ return request<ApiCommon, Record<string, never>>(path, null, null, { method: 'DELETE' });
35
+ }
@@ -0,0 +1,26 @@
1
+ import type { ApiCommonData, ApiError, ApiSuccess, Flatten, Revivers } from '../utils.js';
2
+
3
+ export type JobType = {
4
+ id: number;
5
+ };
6
+
7
+ export type ApiJobType = {
8
+ data: {
9
+ id: number; // The id of the job type (sortable)
10
+ name: string; // The name of the job type (searchable, sortable)
11
+ preview: string | null; // The preview file name of the job type
12
+ description: string | null; // The description of the job type (searchable, sortable)
13
+ components: string | null; // The components of the job type
14
+ order?: number; // TODO: not present in API specification!
15
+ } & ApiCommonData;
16
+ } & Omit<ApiSuccess, 'data'> | ApiError;
17
+
18
+ export type ApiJobTypeData = Flatten<Exclude<ApiJobType, ApiError>['data']>;
19
+
20
+ export const jobTypeRevivers: Revivers<ApiJobType, JobType> = {
21
+ name: undefined,
22
+ preview: undefined,
23
+ description: undefined,
24
+ components: undefined,
25
+ order: undefined,
26
+ };
@@ -0,0 +1,19 @@
1
+ import type { ApiCommonData, ApiError, ApiSuccess, Flatten } from '../utils.js';
2
+
3
+ export type Language = {
4
+ code: string;
5
+ name: string;
6
+ locale: string;
7
+ interface: boolean;
8
+ };
9
+
10
+ export type ApiLanguage = {
11
+ data: {
12
+ code: string; // The language code
13
+ name: string; // The name of the language (searchable, sortable)
14
+ locale: string; // The locale string for the language (searchable, sortable)
15
+ interface: boolean; // If this language can be used for user interfaces
16
+ } & ApiCommonData;
17
+ } & Omit<ApiSuccess, 'data'> | ApiError;
18
+
19
+ export type ApiLanguageData = Flatten<Exclude<ApiLanguage, ApiError>['data']>;
@@ -0,0 +1,38 @@
1
+ import type { ApiCommonData, ApiError, ApiSuccess, Flatten, Revivers } from '../utils.js';
2
+
3
+ export type Layer = {
4
+ id: number;
5
+ name: string;
6
+ description: string;
7
+ svg: string | null;
8
+ };
9
+
10
+ export type ApiLayer = {
11
+ data: {
12
+ id: number; // The id of the layer (sortable)
13
+ name: string; // The name of the layer (searchable, sortable)
14
+ path: string; // The path to the layer
15
+ description: string; // The description of the layer (searchable, sortable)
16
+ image: string | null; // The image related to a layer
17
+ svg: string | null; // The svg related to a layer
18
+ scale_min: number; // The minimum scale for the layer (searchable, sortable)
19
+ scale_max: number; // The maximum scale for the layer (searchable, sortable)
20
+ pangaea_ready: boolean; // Whether a layer is prepared for Pangaea (searchable, sortable)
21
+ svg_set_id: number | null; // TODO: not present in API specification!
22
+ pivot: unknown; // TODO: not present in API specification!
23
+ order?: number; // TODO: not present in API specification!
24
+ } & ApiCommonData;
25
+ } & Omit<ApiSuccess, 'data'> | ApiError;
26
+
27
+ export type ApiLayerData = Flatten<Exclude<ApiLayer, ApiError>['data']>;
28
+
29
+ export const layerRevivers: Revivers<ApiLayer, Layer> = {
30
+ path: undefined,
31
+ image: undefined,
32
+ scale_min: undefined,
33
+ scale_max: undefined,
34
+ pangaea_ready: undefined,
35
+ svg_set_id: undefined,
36
+ pivot: undefined,
37
+ order: undefined,
38
+ };
@@ -0,0 +1,53 @@
1
+ import {
2
+ type ApiCommonData,
3
+ type ApiError,
4
+ type ApiSuccess,
5
+ type Flatten,
6
+ type Revivers,
7
+ defaultListHeader,
8
+ getSearchParams,
9
+ request,
10
+ } from '../utils.js';
11
+
12
+ export type LayerFaq = {
13
+ id: number;
14
+ name: string;
15
+ description: string;
16
+ mediaUrl: string;
17
+ readMoreUrl: string;
18
+ tags: string[];
19
+ layerId: number;
20
+ order?: number;
21
+ };
22
+
23
+ export type ApiLayerFaq = {
24
+ data: {
25
+ id: number; // The id of the layer faq (sortable)
26
+ name: string; // The name of this layer faq (searchable, sortable)
27
+ description: string; // The description of the layer faq (searchable)
28
+ media_url: string; // The image for the faq (searchable)
29
+ read_more_url: string; // A link to a page with more information (searchable)
30
+ tags: string[]; // A list of tags to search in (searchable)
31
+ layer_id: number; // TODO: not present in API specification!
32
+ order?: number; // TODO: not present in API specification!
33
+ } & ApiCommonData;
34
+ } & Omit<ApiSuccess, 'data'> | ApiError;
35
+
36
+ export type ApiLayerFaqData = Flatten<Exclude<ApiLayerFaq, ApiError>['data']>;
37
+
38
+ export const layerFaqRevivers: Revivers<ApiLayerFaq, LayerFaq> = {
39
+ order: undefined,
40
+ };
41
+
42
+ export async function listLayerFaqs(): Promise<LayerFaq[]> {
43
+ const pathname = `/v1/layer-faqs`;
44
+ const query = getSearchParams({ sort: 'order,name' });
45
+ const path = `${pathname}?${query}`;
46
+ const options = { revivers: layerFaqRevivers };
47
+
48
+ type ApiLayerFaqArray = {
49
+ data: ApiLayerFaqData[];
50
+ } & Omit<ApiSuccess, 'data'> | ApiError;
51
+
52
+ return request<ApiLayerFaqArray, LayerFaq>(path, null, defaultListHeader, options);
53
+ }
@@ -0,0 +1,69 @@
1
+ import type { Layer } from './layer.js';
2
+ import {
3
+ type ApiCommonData,
4
+ type ApiError,
5
+ type ApiSuccess,
6
+ type Flatten,
7
+ getSearchParams,
8
+ request,
9
+ } from '../utils.js';
10
+
11
+ export type LayerGroup = {
12
+ id: number;
13
+ name: string;
14
+ layers: Layer[];
15
+ };
16
+
17
+ export type ApiLayerGroup = {
18
+ data: {
19
+ id: number; // The id of the layer group (sortable)
20
+ name: string; // The name of the layer group (searchable, sortable)
21
+ } & ApiCommonData;
22
+ } & Omit<ApiSuccess, 'data'> | ApiError;
23
+
24
+ export type ApiLayerGroupData = Flatten<Exclude<ApiLayerGroup, ApiError>['data']>;
25
+
26
+ export async function listLayerGroups(layers: Layer[]): Promise<LayerGroup[]> {
27
+ const pathname = `/v1/layer-groups/for-layer-ids`;
28
+ const query = getSearchParams({ layer_ids: layers.map(layer => layer.id) });
29
+ const path = `${pathname}?${query}`;
30
+
31
+ type ApiLayerGroupArray = {
32
+ data: Array<ApiLayerGroupData & { layers: Array<{ id: number }> }>;
33
+ } & Omit<ApiSuccess, 'data'> | ApiError;
34
+
35
+ const layerGroups = await request<ApiLayerGroupArray, LayerGroup>(path);
36
+
37
+ // Arrange layers in an object by id for fast lookups
38
+ const layerMap = new Map(layers.map(layer => [layer.id, layer]));
39
+
40
+ // Create a set of all layer ids that belong to a group
41
+ const groupedLayerIds = new Set<number>();
42
+
43
+ for (const layerGroup of layerGroups) {
44
+ // Replace layers from the API response with their full representation
45
+ layerGroup.layers = layerGroup.layers
46
+ .map(groupLayer => layerMap.get(groupLayer.id))
47
+ .filter((layer): layer is Layer => layer !== undefined);
48
+
49
+ // Remember that these layers belong to a group
50
+ for (const layer of layerGroup.layers) {
51
+ groupedLayerIds.add(layer.id);
52
+ }
53
+ }
54
+
55
+ // Get a list of layers that don’t belong to any group
56
+ const miscLayers = layers.filter(layer => !groupedLayerIds.has(layer.id));
57
+
58
+ // Sort it alphabetically
59
+ miscLayers.sort((a, b) => a.name.localeCompare(b.name));
60
+
61
+ // Put them all in a separate group
62
+ const miscLayerGroup: LayerGroup = {
63
+ id: 999,
64
+ layers: miscLayers,
65
+ name: 'Other layers',
66
+ };
67
+
68
+ return [...layerGroups, miscLayerGroup];
69
+ }
@@ -0,0 +1,70 @@
1
+ import {
2
+ type ApiCommonData,
3
+ type ApiError,
4
+ type ApiSuccess,
5
+ type Flatten,
6
+ type Revivers,
7
+ defaultListHeader,
8
+ getSearchParams,
9
+ request,
10
+ } from '../utils.js';
11
+
12
+ export type MapstyleSet = {
13
+ id: number;
14
+ name: string;
15
+ supportsSvg: boolean;
16
+ disableInteractive: boolean;
17
+ };
18
+
19
+ export type ApiMapstyleSet = {
20
+ data: {
21
+ id: number; // The id of the mapstyle set (sortable)
22
+ name: string; // The name of the mapstyle set (searchable, sortable)
23
+ description: string; // The description of the set (searchable, sortable)
24
+ supports_svg: boolean; // If the set supports svg (searchable, sortable)
25
+ disable_interactive: boolean; // If interactive export is disabled
26
+ job_type_id: number; // The id of the job type (searchable)
27
+ preview_lat: number; // The latitude for the preview image
28
+ preview_lon: number; // The longitude for the preview image
29
+ preview_language_code: string; // The language code of the preview
30
+ world_cache: string | null; // The name of the world cache (sortable)
31
+ world_cache_max_zoom: number | null; // The max zoom level of the world cache (sortable)
32
+ css: string | null; // Custom CSS for the MapstyleSet (sortable)
33
+ locator_ready: boolean; // If the set can be used as locator (searchable, sortable)
34
+ show_underlying_elements: boolean; // Shows elements even if behind annotations
35
+ ace_on_osm: boolean; // Use OSM source as data for ACE maps (searchable, sortable)
36
+ order?: number; // TODO: not present in API specification!
37
+ custom_settings?: string | null; // TODO: not present in API specification!
38
+ } & ApiCommonData;
39
+ } & Omit<ApiSuccess, 'data'> | ApiError;
40
+
41
+ export type ApiMapstyleSetData = Flatten<Exclude<ApiMapstyleSet, ApiError>['data']>;
42
+
43
+ export const mapstyleSetRevivers: Revivers<ApiMapstyleSet, MapstyleSet> = {
44
+ description: undefined,
45
+ job_type_id: undefined,
46
+ preview_lat: undefined,
47
+ preview_lon: undefined,
48
+ preview_language_code: undefined,
49
+ world_cache: undefined,
50
+ world_cache_max_zoom: undefined,
51
+ css: undefined,
52
+ locator_ready: undefined,
53
+ show_underlying_elements: undefined,
54
+ ace_on_osm: undefined,
55
+ order: undefined,
56
+ custom_settings: undefined,
57
+ };
58
+
59
+ export async function listMapstyleSets(jobTypeId?: number): Promise<MapstyleSet[]> {
60
+ const pathname = `/v1/mapstyles/sets`;
61
+ const query = jobTypeId !== undefined ? getSearchParams({ search: { job_type_id: jobTypeId } }) : null;
62
+ const path = query ? `${pathname}?${query}` : pathname;
63
+ const options = { revivers: mapstyleSetRevivers };
64
+
65
+ type ApiMapstyleSetArray = {
66
+ data: ApiMapstyleSetData[];
67
+ } & Omit<ApiSuccess, 'data'> | ApiError;
68
+
69
+ return request<ApiMapstyleSetArray, MapstyleSet>(path, null, defaultListHeader, options);
70
+ }
@@ -0,0 +1,80 @@
1
+ import {
2
+ type ApiCommon,
3
+ type ApiCommonData,
4
+ type ApiError,
5
+ type ApiSuccess,
6
+ type Flatten,
7
+ type Revivers,
8
+ request,
9
+ } from '../utils.js';
10
+
11
+ export type Message = {
12
+ index: number;
13
+ image: string;
14
+ date: string;
15
+ read: boolean;
16
+ type: 'New feature' | 'Announcement';
17
+ video: boolean;
18
+ title: string;
19
+ text: string;
20
+ };
21
+
22
+ type ApiMessageVariant = {
23
+ language_code: string;
24
+ content: string;
25
+ title: string;
26
+ } & ApiCommonData;
27
+
28
+ export type ApiMessage = {
29
+ data: {
30
+ id: number; // The message id (sortable)
31
+ media_url: string; // The media url for this message (searchable, sortable)
32
+ style: string; // TODO: not present in API specification!
33
+ publish_at: string | null; // TODO: not present in API specification!
34
+ ends_at: string | null; // TODO: not present in API specification!
35
+ variants: ApiMessageVariant[];
36
+ } & ApiCommonData;
37
+ } & Omit<ApiSuccess, 'data'> | ApiError;
38
+
39
+ export type ApiMessageData = Flatten<Exclude<ApiMessage, ApiError>['data']>;
40
+
41
+ const parseVideo = (url: string, id = getYoutubeVideoId(url)): string =>
42
+ (id ? `https://www.youtube.com/embed/${id}` : url);
43
+
44
+ export const messageRevivers: Revivers<ApiMessage, Message> = {
45
+ id: undefined,
46
+ media_url: undefined,
47
+ style: undefined,
48
+ publish_at: undefined,
49
+ ends_at: undefined,
50
+ variants: undefined,
51
+
52
+ index: (data: ApiMessageData) => data.id,
53
+ image: (data: ApiMessageData) => parseVideo(data.media_url),
54
+ date: (data: ApiMessageData) => data.created_at as string,
55
+ read: () => false,
56
+ type: (data: ApiMessageData) => (data.style === 'regular' ? 'New feature' : 'Announcement'),
57
+ video: (data: ApiMessageData) => data.media_url.includes('www.youtube.com'),
58
+ title: (data: ApiMessageData) => data.variants[0].title,
59
+ text: (data: ApiMessageData) => data.variants[0].content,
60
+ };
61
+
62
+ export async function markMessageAsRead(messageId: number): Promise<Record<string, never>> {
63
+ const path = `/v1/messages/${messageId}/read`;
64
+
65
+ return request<ApiCommon, Record<string, never>>(path, null, null, { method: 'PUT' });
66
+ }
67
+
68
+ export function getYoutubeVideoId(url: string): string | undefined {
69
+ url = url.trim();
70
+
71
+ // Reference prefixed with a $ or video id
72
+ if (/^\$?[\w\-_]+$/.test(url)) {
73
+ return url;
74
+ }
75
+
76
+ const regex =
77
+ /(?:https?:\/\/)?(?:www\.)?youtu\.?be(?:\.com)?\/?.*(?:watch|embed)?(?:.*v=|v\/|\/)([\w\-_]+)&?/;
78
+
79
+ return (regex.exec(url) || [])[1];
80
+ }
@@ -0,0 +1,96 @@
1
+ import type { ApiJobShareArray, JobShare } from './jobShare.js';
2
+ import { type JobSearchResult, listJobs } from './apiCommon.js';
3
+ import {
4
+ type ApiCommonData,
5
+ type ApiError,
6
+ type ApiSuccess,
7
+ type Flatten,
8
+ type Revivers,
9
+ defaultListHeader,
10
+ getSearchParams,
11
+ myOrganisations,
12
+ request,
13
+ } from '../utils.js';
14
+
15
+ export type Organisation = {
16
+ id: number;
17
+ name: string;
18
+ credits: number;
19
+ settings: string | null;
20
+ vectorToken: string;
21
+ trialExpiresAt: string | undefined;
22
+ exportTemplates: string;
23
+ contractType: string;
24
+ subscriptionType: string;
25
+ };
26
+
27
+ export type ApiOrganisation = {
28
+ data: {
29
+ id: number; // The id of the organisation (sortable)
30
+ name: string; // The name of the organisation (searchable, sortable)
31
+ manager_id: number; // The id of the manager of the organisation (searchable)
32
+ sales_representative_id: number | null; // The id of the sales representative (searchable)
33
+ credits: number; // The credits of the organisation (searchable, sortable)
34
+ country: string | null; // The country where the organisation is from (searchable, sortable)
35
+ address: string | null; // The address of the organisation (searchable, sortable)
36
+ city: string | null; // The city of the organisation (searchable, sortable)
37
+ settings: string | null; // An object with settings for the organisations
38
+ vector_token: string; // The vector API token of the organisation
39
+ tiles_on_domain: boolean; // TODO: not present in API specification!
40
+ trial_expires_at: string | null; // The datetime when the user's trial expires
41
+ parent_id: number | null; // TODO: not present in API specification!
42
+ hatching_pattern_svg_set_id: number | null; // A svg set that overrides the default h-pattern
43
+ template_settings: string | null; // TODO: not present in API specification!
44
+ contractType: string | null; // The name of signed contract
45
+ subscriptionType: string | null; // The name of subscription type
46
+ } & ApiCommonData;
47
+ } & Omit<ApiSuccess, 'data'> | ApiError;
48
+
49
+ export type ApiOrganisationData = Flatten<Exclude<ApiOrganisation, ApiError>['data']>;
50
+
51
+ export const organisationRevivers: Revivers<ApiOrganisation, Organisation> = {
52
+ manager_id: undefined,
53
+ sales_representative_id: undefined,
54
+ country: undefined,
55
+ address: undefined,
56
+ city: undefined,
57
+ tiles_on_domain: undefined,
58
+ parent_id: undefined,
59
+ hatching_pattern_svg_set_id: undefined,
60
+ template_settings: undefined,
61
+
62
+ trialExpiresAt: (data: ApiOrganisationData) => data.trial_expires_at ?? undefined,
63
+ exportTemplates: (data: ApiOrganisationData) => data.template_settings ?? '{}',
64
+ };
65
+
66
+ export async function getOrganisation(
67
+ organisationId: number | typeof myOrganisations = myOrganisations,
68
+ ): Promise<Organisation> {
69
+ const path = `/v1/organisations/${organisationId}`;
70
+ const options = { revivers: organisationRevivers };
71
+
72
+ return request<ApiOrganisation, Organisation>(path, null, null, options);
73
+ }
74
+
75
+ export async function listOrganisationJobs(
76
+ organisationId: number | typeof myOrganisations,
77
+ title: string,
78
+ page: number,
79
+ options?: Record<string, unknown>,
80
+ ): Promise<JobSearchResult> {
81
+ const search = { ...options };
82
+
83
+ return listJobs(`/v1/organisations/${organisationId}/jobs`, title, page, search);
84
+ }
85
+
86
+ export async function listOrganisationShares(jobId: number): Promise<JobShare[]> {
87
+ const pathname = `/v1/organisations/${myOrganisations}/shares`;
88
+ const query = getSearchParams({
89
+ search: {
90
+ job_id: `=:${jobId}`,
91
+ },
92
+ });
93
+ const path = `${pathname}?${query}`;
94
+
95
+ return request<ApiJobShareArray, JobShare>(path, null, defaultListHeader);
96
+ }
@@ -0,0 +1,153 @@
1
+ import { type ApiOrganisationData, type Organisation, organisationRevivers } from './organisation.js';
2
+ import { type ApiDimensionSetData, type DimensionSet, dimensionSetRevivers } from './dimensionSet.js';
3
+ import { type ApiMapstyleSetData, type MapstyleSet, mapstyleSetRevivers } from './mapstyleSet.js';
4
+ import { type ApiFontFamilyData, type FontFamily, fontFamilyRevivers } from './fontFamily.js';
5
+ import { type ApiDimensionData, type Dimension, dimensionRevivers } from './dimension.js';
6
+ import { type ApiFeatureData, type Feature, featureRevivers } from './feature.js';
7
+ import { type ApiJobTypeData, type JobType, jobTypeRevivers } from './jobType.js';
8
+ import { type ApiMessageData, type Message, messageRevivers } from './message.js';
9
+ import { type ApiSvg, type ApiSvgData, type Svg, svgRevivers } from './svg.js';
10
+ import { type ApiSvgSetData, type SvgSet, svgSetRevivers } from './svgSet.js';
11
+ import { type ApiLayerData, type Layer, layerRevivers } from './layer.js';
12
+ import { type ApiColorData, type Color, colorRevivers } from './color.js';
13
+ import { type ApiUserData, type User, userRevivers } from './user.js';
14
+ import { type ApiFontData, type Font, fontRevivers } from './font.js';
15
+ import type { CamelCasedProperties } from 'type-fest';
16
+ import {
17
+ type ApiCommon,
18
+ type ApiCommonData,
19
+ type ApiError,
20
+ type ApiSuccess,
21
+ type Revivers,
22
+ getContext,
23
+ myUser,
24
+ processData,
25
+ request,
26
+ } from '../utils.js';
27
+
28
+ export type CustomFeature =
29
+ | 'custom_dpi'
30
+ | 'disable_company_maps'
31
+ | 'eps_plus_log'
32
+ | 'filename_is_job_title'
33
+ | 'iframe_sandbox_attributes'
34
+ | 'keep_layer_visibility'
35
+ | 'no_copyright'
36
+ | 'only_shared_company_maps'
37
+ | 'pdf_output'
38
+ | 'show_frelex_links'
39
+ | 'svg_output'
40
+ | 'svg-georef'
41
+ | 'tiff_output'
42
+ | 'video_export'
43
+ | 'v5_video'
44
+ | 'web_output'
45
+ | 'web_download'
46
+ | 'new_single_and_grouped_areas_menu'
47
+ | 'export_templates'
48
+ | 'export_video_tracking_data'
49
+ | 'hosted_svg_output'
50
+ | 'hosted_png_output'
51
+ | 'hosted_jpg_output'
52
+ | 'developer_menu';
53
+
54
+ export interface Resources {
55
+ organisation: Organisation;
56
+ user: User;
57
+ features: CustomFeature[];
58
+ colors: Color[];
59
+ svgs: Svg[];
60
+ dimensions: Dimension[];
61
+ dimensionSets: DimensionSet[];
62
+ mapstyleSets: MapstyleSet[];
63
+ jobTypes: JobType[];
64
+ messages: Message[];
65
+ svgSets: SvgSet[];
66
+ layers: Layer[];
67
+ fonts: Font[];
68
+ fontFamilies: FontFamily[];
69
+ }
70
+
71
+ type ApiResources = {
72
+ data: {
73
+ user: ApiUserData;
74
+ organisation: ApiOrganisationData;
75
+ features: ApiFeatureData[];
76
+ colors: ApiColorData[];
77
+ svgs: ApiSvgData[];
78
+ messages: {
79
+ read: ApiMessageData[];
80
+ unread: ApiMessageData[];
81
+ };
82
+ dimensions: ApiDimensionData[];
83
+ dimension_sets: ApiDimensionSetData[];
84
+ mapstyle_sets: ApiMapstyleSetData[];
85
+ hatching_svgs?: ApiSvgData[];
86
+ job_types: ApiJobTypeData[];
87
+ svg_sets: ApiSvgSetData[];
88
+ layers: ApiLayerData[];
89
+ fonts: ApiFontData[];
90
+ font_families: ApiFontFamilyData[];
91
+ } & ApiCommonData;
92
+ } & Omit<ApiSuccess, 'data'> | ApiError;
93
+
94
+ export type ApiResourcesData = Exclude<ApiResources, ApiError>['data'];
95
+
96
+ export type FillPattern = {
97
+ name: string;
98
+ string: string;
99
+ };
100
+
101
+ export async function loadResources(): Promise<Resources> {
102
+ const path = `/v1/users/${myUser}/resources`;
103
+ const raw = await request<ApiResources, CamelCasedProperties<ApiResourcesData>>(path);
104
+
105
+ const { user, organisation, messages: { read, unread } } = raw;
106
+ const readMessages = read.map(processData, getContext(messageRevivers)) as Message[];
107
+ const unreadMessages = unread.map(processData, getContext(messageRevivers)) as Message[];
108
+
109
+ readMessages.forEach(message => (message.read = true));
110
+
111
+ const allMessages = [...readMessages, ...unreadMessages];
112
+
113
+ allMessages.sort((m1, m2) => m2.date.localeCompare(m1.date));
114
+
115
+ const mcSvgRevivers: Revivers<ApiSvg, Svg> = {
116
+ ...svgRevivers,
117
+ name: (data: ApiSvgData) => `mc-image-${data.name}`,
118
+ };
119
+
120
+ return {
121
+ // @ts-expect-error TS2345
122
+ user: processData.call(getContext(userRevivers), user) as User,
123
+ // @ts-expect-error TS2345
124
+ organisation: processData.call(getContext(organisationRevivers), organisation) as Organisation,
125
+
126
+ features: (raw.features.map(processData, getContext(featureRevivers)) as Feature[]).map(
127
+ feature => feature.name,
128
+ ) as CustomFeature[],
129
+ colors: raw.colors.map(processData, getContext(colorRevivers)) as Color[],
130
+ svgs: raw.svgs.map(processData, getContext(mcSvgRevivers)) as Svg[],
131
+ dimensions: raw.dimensions.map(processData, getContext(dimensionRevivers)) as Dimension[],
132
+ dimensionSets: raw.dimensionSets.map(processData, getContext(dimensionSetRevivers)) as DimensionSet[],
133
+ mapstyleSets: raw.mapstyleSets.map(processData, getContext(mapstyleSetRevivers)) as MapstyleSet[],
134
+ jobTypes: raw.jobTypes.map(processData, getContext(jobTypeRevivers)) as JobType[],
135
+ messages: allMessages,
136
+ layers: (raw.layers?.map(processData, getContext(layerRevivers)) ?? []) as Layer[],
137
+ svgSets: (raw.svgSets?.map(processData, getContext(svgSetRevivers)) ?? []) as SvgSet[],
138
+ fonts: (raw.fonts?.map(processData, getContext(fontRevivers)) ?? []) as Font[],
139
+ fontFamilies: (raw.fontFamilies?.map(processData, getContext(fontFamilyRevivers)) ?? []) as FontFamily[],
140
+ };
141
+ }
142
+
143
+ export async function getCountries(): Promise<string[]> {
144
+ return request<ApiCommon, string, true>(`/v1/resources/countries`);
145
+ }
146
+
147
+ export async function getFunctions(): Promise<string[]> {
148
+ return request<ApiCommon, string, true>(`/v1/resources/functions`);
149
+ }
150
+
151
+ export async function getIndustries(): Promise<string[]> {
152
+ return request<ApiCommon, string, true>(`/v1/resources/industries`);
153
+ }
package/src/api/svg.ts ADDED
@@ -0,0 +1,33 @@
1
+ import { type ApiCommonData, type ApiError, type ApiSuccess, type Flatten, type Revivers, request } from '../utils.js';
2
+
3
+ export type Svg = {
4
+ id: number;
5
+ svgSetId: number;
6
+ name: string;
7
+ string: string;
8
+ };
9
+
10
+ export type ApiSvg = {
11
+ data: {
12
+ id: number; // The id of the svg (sortable)
13
+ svg_set_id: number; // The id of the svg_set related to this svg
14
+ name: string; // The name of the svg (searchable, sortable)
15
+ string: string; // The XML of the svg
16
+ resize_factor: number; // The number of the resize for svg (searchable, sortable)
17
+ order: number; // The order in which this svg appears in the set (sortable)
18
+ } & ApiCommonData;
19
+ } & Omit<ApiSuccess, 'data'> | ApiError;
20
+
21
+ export type ApiSvgData = Flatten<Exclude<ApiSvg, ApiError>['data']>;
22
+
23
+ export const svgRevivers: Revivers<ApiSvg, Svg> = {
24
+ resize_factor: undefined,
25
+ order: undefined,
26
+ };
27
+
28
+ export async function getSvg(svgId: number): Promise<Svg> {
29
+ const path = `/v1/svgs/${svgId}`;
30
+ const options = { revivers: svgRevivers };
31
+
32
+ return request<ApiSvg, Svg>(path, null, null, options);
33
+ }