@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,56 @@
1
+ import { type ApiSvgData, type Svg, svgRevivers } from './svg.js';
2
+ import {
3
+ type ApiCommonData,
4
+ type ApiError,
5
+ type ApiSuccess,
6
+ type Flatten,
7
+ type Revivers,
8
+ defaultListHeader,
9
+ getSearchParams,
10
+ request,
11
+ } from '../utils.js';
12
+
13
+ export type SvgSet = {
14
+ id: number;
15
+ name: string;
16
+ type: string;
17
+ };
18
+
19
+ export type ApiSvgSet = {
20
+ data: {
21
+ id: number; // The id of the set (searchable, sortable)
22
+ name: string; // The name of the set (searchable, sortable)
23
+ type: string; // The type of the svg set (searchable, sortable)
24
+ supports_interactive: boolean; // If the set is interactive (searchable, sortable)
25
+ supports_mapcreator: boolean; // If this set can be used on Mapcreator (searchable, sortable)
26
+ supports_v3: boolean; // If this set can be used on v3 (searchable, sortable)
27
+ order?: number; // TODO: not present in API specification!
28
+ } & ApiCommonData;
29
+ } & Omit<ApiSuccess, 'data'> | ApiError;
30
+
31
+ export type ApiSvgSetData = Flatten<Exclude<ApiSvgSet, ApiError>['data']>;
32
+
33
+ export const svgSetRevivers: Revivers<ApiSvgSet, SvgSet> = {
34
+ supports_interactive: undefined,
35
+ supports_mapcreator: undefined,
36
+ supports_v3: undefined,
37
+ order: undefined,
38
+ };
39
+
40
+ export async function listSvgSetSvgs(svgSetId: number): Promise<Svg[]> {
41
+ const pathname = `/v1/svgs/sets/${svgSetId}/items`;
42
+ const query = getSearchParams({
43
+ search: {
44
+ supports_mapcreator: '1',
45
+ },
46
+ sort: 'order,id',
47
+ });
48
+ const path = `${pathname}?${query}`;
49
+ const options = { revivers: svgRevivers };
50
+
51
+ type ApiSvgArray = {
52
+ data: ApiSvgData[];
53
+ } & Omit<ApiSuccess, 'data'> | ApiError;
54
+
55
+ return request<ApiSvgArray, Svg>(path, null, defaultListHeader, options);
56
+ }
@@ -0,0 +1,327 @@
1
+ import { type ApiFontFamilyData, type FontFamily, fontFamilyRevivers } from './fontFamily.js';
2
+ import { type ApiSvgSetData, type SvgSet, svgSetRevivers } from './svgSet.js';
3
+ import { type ApiLayerData, type Layer, layerRevivers } from './layer.js';
4
+ import { type ApiSvgData, type Svg, svgRevivers } from './svg.js';
5
+ import { type JobSearchResult, listJobs } from './apiCommon.js';
6
+ import type { ApiJobShareArray, JobShare } from './jobShare.js';
7
+ import type { RequireAtLeastOne } from 'type-fest';
8
+ import {
9
+ type ApiCommon,
10
+ type ApiCommonData,
11
+ type ApiError,
12
+ type ApiSuccess,
13
+ type Flatten,
14
+ type Revivers,
15
+ defaultListHeader,
16
+ deletedNoneParam,
17
+ getSearchParams,
18
+ myUser,
19
+ request,
20
+ toApiType,
21
+ } from '../utils.js';
22
+
23
+ type ApiPermission = {
24
+ id: number; // The id of the permission
25
+ name: string; // The name of the permission (searchable, sortable)
26
+ } & ApiCommonData;
27
+
28
+ type ApiRole = {
29
+ id: number;
30
+ name: string;
31
+ description: string;
32
+ pivot: {
33
+ model_type: string;
34
+ model_id: number;
35
+ role_id: number;
36
+ };
37
+ } & ApiCommonData;
38
+
39
+ type UnitType = 'metric' | 'imperial' | null;
40
+
41
+ export type User = {
42
+ id: number;
43
+ organisationId: number;
44
+ languageCode: string;
45
+ interfaceLanguage: string;
46
+ videoNotifications: boolean;
47
+ name: string;
48
+ email: string;
49
+ company: string;
50
+ confirmed: boolean;
51
+ propagated: boolean;
52
+ whatsNewBadge: boolean;
53
+ autosave: boolean;
54
+ unit: UnitType;
55
+ trialExpiresAt: string | undefined;
56
+ stripeId: string | undefined;
57
+ intercomIdentityToken?: string;
58
+ hasPassword?: boolean;
59
+ };
60
+ /* eslint-disable @typescript-eslint/no-redundant-type-constituents */
61
+ export type ApiUser = {
62
+ data: {
63
+ id: number; // The id of the user (searchable, sortable)
64
+ organisation_id: number; // The id of the organisation related to a user (searchable)
65
+ language_code: string; // The default map language
66
+ interface_language: string; // The default interface language
67
+ hide_messages: boolean; // If the what's new notifications should be shown
68
+ video_notifications: boolean; // TODO: not present in API specification!
69
+ name: string; // The name of the user (searchable, sortable)
70
+ email: string; // The email of the user (searchable, sortable)
71
+ phone: string | null; // The phone of the user (searchable, sortable)
72
+ profession: string | null; // The user's profession (searchable, sortable)
73
+ company: string | null; // The user's company (sortable)
74
+ country: string | null; // The user's country (sortable)
75
+ city: string | null; // The user's city (sortable)
76
+ address: string | null; // The user's address (sortable)
77
+ tips: boolean; // If the user wishes to see tips
78
+ tags: string[] | null; // The tags related to a user (searchable, sortable)
79
+ confirmed: boolean; // Whether the user email is verified
80
+ propagated: boolean; // Set to 'true' on the first user login (hubspot)
81
+ newsletter_consent: boolean; // TODO: not present in API specification!
82
+ whats_new_badge: boolean; // If the what's new notifications should be shown
83
+ autosave: boolean; // If the tool should autosave projects
84
+ unit: UnitType; // Default measurement unit type
85
+ registration_complete: boolean; // Whether the user has completed their registration
86
+ notifications_checked_at: string | null; // The datetime when the user checked the notifications
87
+ referral: string | null; // The referral code that the user used during their registration
88
+ trial_expires_at: string | null; // The datetime when the user's trial expires
89
+ delete_requested: boolean | null; // TODO: not present in API specification!
90
+ delete_request_notified: number; // TODO: not present in API specification!
91
+ stripe_id: string | null; // TODO: not present in API specification!
92
+ stripe_ref: unknown | null; // TODO: not present in API specification!
93
+ pm_type: unknown | null; // TODO: not present in API specification!
94
+ pm_last_four: unknown | null; // TODO: not present in API specification!
95
+ trial_ends_at: string | null; // TODO: not present in API specification!
96
+ settings: string | null; // TODO: not present in API specification!
97
+ intercom_identity_token?: string; // [resources endpoint only] Helpdesk token
98
+ has_password?: boolean; // [resources endpoint only] SSO or not (enables an ability to change the email)
99
+ permissions: ApiPermission[]; // TODO: not present in API specification!
100
+ roles: ApiRole[]; // TODO: not present in API specification!
101
+ } & ApiCommonData;
102
+ } & Omit<ApiSuccess, 'data'> | ApiError;
103
+ /* eslint-enable @typescript-eslint/no-redundant-type-constituents */
104
+ export type ApiUserData = Flatten<Exclude<ApiUser, ApiError>['data']>;
105
+
106
+ export type JobFolder = {
107
+ id: number;
108
+ jobsCount: number;
109
+ name: string;
110
+ userId: number;
111
+ };
112
+
113
+ export type ApiJobFolder = {
114
+ data: {
115
+ id: number;
116
+ jobsCount: number;
117
+ name: string;
118
+ userId: number;
119
+ } & ApiCommonData;
120
+ } & Omit<ApiSuccess, 'data'> | ApiError;
121
+
122
+ export type ApiJobFolderData = Flatten<Exclude<ApiJobFolder, ApiError>['data']>;
123
+
124
+ export const userRevivers: Revivers<ApiUser, User> = {
125
+ hide_messages: undefined,
126
+ phone: undefined,
127
+ profession: undefined,
128
+ country: undefined,
129
+ city: undefined,
130
+ address: undefined,
131
+ tips: undefined,
132
+ tags: undefined,
133
+ newsletter_consent: undefined,
134
+ registration_complete: undefined,
135
+ notifications_checked_at: undefined,
136
+ referral: undefined,
137
+ delete_requested: undefined,
138
+ delete_request_notified: undefined,
139
+ stripe_ref: undefined,
140
+ pm_type: undefined,
141
+ pm_last_four: undefined,
142
+ trial_ends_at: undefined,
143
+ settings: undefined,
144
+ permissions: undefined,
145
+ roles: undefined,
146
+
147
+ trialExpiresAt: (data: ApiUserData) => data.trial_expires_at ?? undefined,
148
+ stripeId: (data: ApiUserData) => data.stripe_id ?? undefined,
149
+ };
150
+
151
+ type UpdateUserParams = {
152
+ whatsNewBadge?: boolean;
153
+ videoNotifications?: boolean;
154
+ autosave?: boolean;
155
+ interfaceLanguage?: string;
156
+ languageCode?: string;
157
+ unit?: UnitType;
158
+ password?: string;
159
+ email?: string;
160
+ };
161
+
162
+ export async function getUser(userId: number | typeof myUser = myUser): Promise<User> {
163
+ const path = `/v1/users/${userId}`;
164
+ const options = { revivers: userRevivers };
165
+
166
+ return request<ApiUser, User>(path, null, null, options);
167
+ }
168
+
169
+ export async function updateUser(
170
+ userId: number | typeof myUser,
171
+ fields: RequireAtLeastOne<UpdateUserParams>,
172
+ ): Promise<Record<string, never>> {
173
+ const path = `/v1/users/${userId}`;
174
+ const body = toApiType(fields);
175
+
176
+ return request<ApiCommon, Record<string, never>>(path, body, null, { method: 'PATCH' });
177
+ }
178
+
179
+ export async function deleteUser(userId: number | typeof myUser): Promise<Record<string, never>> {
180
+ const path = `/v1/users/${userId}`;
181
+
182
+ return request<ApiCommon, Record<string, never>>(path, null, null, { method: 'DELETE' });
183
+ }
184
+
185
+ export async function listUserFontFamilies(): Promise<FontFamily[]> {
186
+ const pathname = `/v1/users/${myUser}/font-families`;
187
+ const query = getSearchParams({ sort: 'order' });
188
+ const path = `${pathname}?${query}`;
189
+ const options = { revivers: fontFamilyRevivers };
190
+
191
+ type ApiFontFamilyArray = {
192
+ data: ApiFontFamilyData[];
193
+ } & Omit<ApiSuccess, 'data'> | ApiError;
194
+
195
+ return request<ApiFontFamilyArray, FontFamily>(path, null, defaultListHeader, options);
196
+ }
197
+
198
+ export async function listUserHatchingSvgs(): Promise<Svg[]> {
199
+ const pathname = `/v1/users/${myUser}/hatching-svgs`;
200
+ const query = getSearchParams({ sort: 'order' });
201
+ const path = `${pathname}?${query}`;
202
+ const options = { revivers: svgRevivers };
203
+
204
+ type ApiSvgArray = {
205
+ data: ApiSvgData[];
206
+ } & Omit<ApiSuccess, 'data'> | ApiError;
207
+
208
+ return request<ApiSvgArray, Svg>(path, null, defaultListHeader, options);
209
+ }
210
+
211
+ export async function listUserJobs(
212
+ userId: number | typeof myUser,
213
+ title: string,
214
+ page: number,
215
+ options?: Record<string, unknown>
216
+ ): Promise<JobSearchResult> {
217
+ return listJobs(`/v1/users/${userId}/jobs`, title, page, options);
218
+ }
219
+
220
+ export async function listUserFolders(): Promise<JobFolder[]> {
221
+ const path = `/v1/users/${myUser}/folders`;
222
+
223
+ type ApiJobFolderArray = {
224
+ data: ApiJobFolderData[];
225
+ } & Omit<ApiSuccess, 'data'> | ApiError;
226
+
227
+ return request<ApiJobFolderArray, JobFolder>(path);
228
+ }
229
+
230
+ export async function createUserFolder(name: string): Promise<JobFolder> {
231
+ const path = `/v1/users/${myUser}/folders`;
232
+ const body = { name };
233
+
234
+ return request<ApiCommon, JobFolder>(path, body);
235
+ }
236
+
237
+ export async function deleteUserFolder(folderId: number): Promise<Record<string, never>> {
238
+ const path = `/v1/users/${myUser}/folders/${folderId}`;
239
+
240
+ return request<ApiCommon, Record<string, never>>(path, null, null, { method: 'DELETE' });
241
+ }
242
+
243
+ export async function renameUserFolder(folderId: number, name: string): Promise<Record<string, never>> {
244
+ const path = `/v1/users/${myUser}/folders/${folderId}`;
245
+ const body = { name };
246
+
247
+ return request<ApiCommon, Record<string, never>>(path, body, null, { method: 'PATCH' });
248
+ }
249
+
250
+ export async function listUserLayers(): Promise<Layer[]> {
251
+ const pathname = `/v1/users/${myUser}/layers`;
252
+ const query = getSearchParams({
253
+ search: {
254
+ pangaea_ready: '1',
255
+ },
256
+ sort: 'order',
257
+ });
258
+ const path = `${pathname}?${query}`;
259
+ const options = { revivers: layerRevivers };
260
+
261
+ type ApiLayerArray = {
262
+ data: ApiLayerData[];
263
+ } & Omit<ApiSuccess, 'data'> | ApiError;
264
+
265
+ return request<ApiLayerArray, Layer>(path, null, defaultListHeader, options);
266
+ }
267
+
268
+ export async function listUserSvgSets(): Promise<SvgSet[]> {
269
+ const pathname = `/v1/users/${myUser}/svg-sets`;
270
+ const query = getSearchParams({
271
+ search: {
272
+ supports_mapcreator: '1',
273
+ type: '!:sprite',
274
+ },
275
+ sort: 'order',
276
+ });
277
+ const path = `${pathname}?${query}`;
278
+ const options = { revivers: svgSetRevivers };
279
+
280
+ type ApiSvgSetArray = {
281
+ data: ApiSvgSetData[];
282
+ } & Omit<ApiSuccess, 'data'> | ApiError;
283
+
284
+ return request<ApiSvgSetArray, SvgSet>(path, null, defaultListHeader, options);
285
+ }
286
+
287
+ export async function findJobShares(jobId: number): Promise<JobShare[]> {
288
+ const pathname = `/v1/users/${myUser}/job-shares`;
289
+ const query = getSearchParams({ search: { job_id: jobId } });
290
+ const path = `${pathname}?${query}`;
291
+
292
+ return request<ApiJobShareArray, JobShare>(path);
293
+ }
294
+
295
+ export async function createUserTrial(
296
+ userId: number | typeof myUser,
297
+ data: Record<string, unknown>,
298
+ ): Promise<Record<string, never>> {
299
+ const pathname = `/v1/users/${userId}/trial`;
300
+ const path = `${pathname}?${deletedNoneParam}`;
301
+ const body = toApiType(data);
302
+
303
+ return request<ApiCommon, Record<string, never>>(path, body);
304
+ }
305
+
306
+ export async function sendUserConfirmationEmail(userId: number | typeof myUser): Promise<Record<string, never>> {
307
+ const path = `/v1/users/${userId}/confirm`;
308
+
309
+ return request<ApiCommon, Record<string, never>>(path, null, null, { method: 'POST' });
310
+ }
311
+
312
+ type BillingPortal = {
313
+ billingPortalUrl: string;
314
+ };
315
+ type ApiBillingPortal = {
316
+ data: {
317
+ billing_portal_url: string;
318
+ };
319
+ } & Omit<ApiSuccess, 'data'> | ApiError;
320
+
321
+ export async function getUserBillingPortalUrl(userId: number | typeof myUser): Promise<string> {
322
+ const path = `/v1/users/${userId}/billing-portal-url`;
323
+
324
+ return request<ApiBillingPortal, BillingPortal>(path).then(
325
+ ({ billingPortalUrl }) => billingPortalUrl,
326
+ );
327
+ }
package/src/index.ts ADDED
@@ -0,0 +1,44 @@
1
+ export * from './api/choropleth.js';
2
+ export * from './api/color.js';
3
+ export * from './api/dimension.js';
4
+ export * from './api/dimensionSet.js';
5
+ export * from './api/feature.js';
6
+ export * from './api/font.js';
7
+ export * from './api/fontFamily.js';
8
+ export * from './api/geocode.js';
9
+ export * from './api/highlight.js';
10
+ export * from './api/insetMap.js';
11
+ export * from './api/job.js';
12
+ export * from './api/jobResult.js';
13
+ export * from './api/jobRevision.js';
14
+ export * from './api/jobShare.js';
15
+ export * from './api/jobType.js';
16
+ export * from './api/language.js';
17
+ export * from './api/layer.js';
18
+ export * from './api/layerFaq.js';
19
+ export * from './api/layerGroup.js';
20
+ export * from './api/mapstyleSet.js';
21
+ export * from './api/message.js';
22
+ export * from './api/organisation.js';
23
+ export * from './api/resources.js';
24
+ export * from './api/svg.js';
25
+ export * from './api/svgSet.js';
26
+ export * from './api/user.js';
27
+
28
+ export {
29
+ type ApiCommon,
30
+ type ApiCommonData,
31
+ type ApiError,
32
+ type ApiSuccess,
33
+ type ExtraOptions,
34
+ type Flatten,
35
+ type Revivers,
36
+ lastJobRevision,
37
+ myOrganisations,
38
+ myUser,
39
+ APIError,
40
+ HTTPError,
41
+ NetworkError,
42
+ getSearchParams,
43
+ request,
44
+ } from './utils.js';
package/src/oauth.ts ADDED
@@ -0,0 +1,90 @@
1
+ export let apiHost = '';
2
+
3
+ export let token: {
4
+ type: string;
5
+ token: string;
6
+ expires: Date;
7
+
8
+ toString: () => string;
9
+ } | null = null;
10
+
11
+ let callbackUrl = '';
12
+
13
+ /**
14
+ * Cleanup of previously used data. The code part can be removed in a while.
15
+ */
16
+ for (let i = 0; i < window.localStorage.length; ++i) {
17
+ const key = window.localStorage.key(i);
18
+
19
+ if (key?.startsWith('_m4n_')) {
20
+ window.localStorage.removeItem(key);
21
+ }
22
+ }
23
+
24
+ /**
25
+ * Setup internal structures to use dummy authentication flow
26
+ *
27
+ * @param {string} apiUrl - Full API URL
28
+ * @param {string} oauthToken - OAuth Token
29
+ */
30
+ export function initDummyFlow(apiUrl: string, oauthToken: string): void {
31
+ const parts = oauthToken.includes(' ') ? oauthToken.split(' ', 2) : ['Bearer', oauthToken];
32
+
33
+ apiHost = apiUrl.replace(/\/+$/, '');
34
+ token = {
35
+ type: parts[0].toLowerCase().replace(/\b\w/g, c => c.toUpperCase()),
36
+ token: parts[1],
37
+ expires: new Date('2100-01-01T01:00:00'),
38
+
39
+ toString(): string {
40
+ return `${this.type} ${this.token}`;
41
+ },
42
+ };
43
+ }
44
+
45
+ /**
46
+ * Setup internal structures to use implicit authentication flow
47
+ *
48
+ * @param {string} apiUrl - Full API URL
49
+ * @param {string} [redirectUrl] - Callback URL
50
+ */
51
+ export function initImplicitFlow(apiUrl: string, redirectUrl = ''): void {
52
+ apiHost = apiUrl.replace(/\/+$/, '');
53
+
54
+ callbackUrl = String(redirectUrl || window.location.href.split('#')[0]);
55
+
56
+ const href = sessionStorage.getItem('redirect-url');
57
+
58
+ if (href) {
59
+ sessionStorage.removeItem('redirect-url');
60
+ window.history.replaceState(null, document.title, href);
61
+ }
62
+ }
63
+
64
+ export async function authenticate(): Promise<never> {
65
+ return new Promise(() => {
66
+ sessionStorage.setItem('redirect-url', window.location.href);
67
+ window.location.assign(`${apiHost}/login?${new URLSearchParams({ redirect_uri: callbackUrl })}`);
68
+ });
69
+ }
70
+
71
+ // eslint-disable-next-line @typescript-eslint/naming-convention
72
+ type AuthHeaders = { Authorization: string } | { 'X-XSRF-Token': string } | undefined;
73
+
74
+ export function getAuthorizationHeaders(method: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'): AuthHeaders {
75
+ const cookie = !token && method !== 'GET' && method !== 'HEAD'
76
+ ? document.cookie.split(/ *; */).find(pair => pair.startsWith('XSRF-TOKEN'))?.split('=')[1]
77
+ : undefined;
78
+
79
+ return token
80
+ ? { Authorization: token.toString() }
81
+ : cookie
82
+ ? { 'X-XSRF-Token': decodeURIComponent(cookie) }
83
+ : undefined;
84
+ }
85
+
86
+ export async function logout(): Promise<never> {
87
+ return new Promise(() => {
88
+ window.location.assign(`${apiHost}/logout?${new URLSearchParams({ redirect_uri: callbackUrl })}`);
89
+ });
90
+ }