@magda/typescript-common 1.1.0-alpha.2 → 1.1.0-alpha.3

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 (249) hide show
  1. package/dist/AspectBuilder.d.ts +7 -0
  2. package/dist/AspectBuilder.js +3 -0
  3. package/dist/AspectBuilder.js.map +1 -0
  4. package/dist/AspectCreationFailure.d.ts +5 -0
  5. package/dist/AspectCreationFailure.js +10 -0
  6. package/dist/AspectCreationFailure.js.map +1 -0
  7. package/dist/AsyncPage.d.ts +18 -0
  8. package/dist/AsyncPage.js +140 -0
  9. package/dist/AsyncPage.js.map +1 -0
  10. package/dist/ConnectionResult.d.ts +16 -0
  11. package/dist/ConnectionResult.js +77 -0
  12. package/dist/ConnectionResult.js.map +1 -0
  13. package/dist/ConnectorRecordId.d.ts +15 -0
  14. package/dist/ConnectorRecordId.js +46 -0
  15. package/dist/ConnectorRecordId.js.map +1 -0
  16. package/dist/JsonConnector.d.ts +195 -0
  17. package/dist/JsonConnector.js +427 -0
  18. package/dist/JsonConnector.js.map +1 -0
  19. package/dist/JsonTransformer.d.ts +112 -0
  20. package/dist/JsonTransformer.js +225 -0
  21. package/dist/JsonTransformer.js.map +1 -0
  22. package/dist/OpaCompileResponseParser.d.ts +480 -0
  23. package/dist/OpaCompileResponseParser.js +1134 -0
  24. package/dist/OpaCompileResponseParser.js.map +1 -0
  25. package/dist/RecordCreationFailure.d.ts +7 -0
  26. package/dist/RecordCreationFailure.js +11 -0
  27. package/dist/RecordCreationFailure.js.map +1 -0
  28. package/dist/SimpleOpaSQLTranslator.d.ts +14 -0
  29. package/dist/SimpleOpaSQLTranslator.js +79 -0
  30. package/dist/SimpleOpaSQLTranslator.js.map +1 -0
  31. package/dist/addTrailingSlash.d.ts +1 -0
  32. package/dist/addTrailingSlash.js +15 -0
  33. package/dist/addTrailingSlash.js.map +1 -0
  34. package/dist/appendUrlSegments.d.ts +2 -0
  35. package/dist/appendUrlSegments.js +18 -0
  36. package/dist/appendUrlSegments.js.map +1 -0
  37. package/dist/authorization-api/AccessControlError.d.ts +4 -0
  38. package/dist/authorization-api/AccessControlError.js +13 -0
  39. package/dist/authorization-api/AccessControlError.js.map +1 -0
  40. package/dist/authorization-api/ApiClient.d.ts +141 -0
  41. package/dist/authorization-api/ApiClient.js +335 -0
  42. package/dist/authorization-api/ApiClient.js.map +1 -0
  43. package/dist/authorization-api/AuthError.d.ts +4 -0
  44. package/dist/authorization-api/AuthError.js +13 -0
  45. package/dist/authorization-api/AuthError.js.map +1 -0
  46. package/dist/authorization-api/GenericError.d.ts +9 -0
  47. package/dist/authorization-api/GenericError.js +17 -0
  48. package/dist/authorization-api/GenericError.js.map +1 -0
  49. package/dist/authorization-api/authMiddleware.d.ts +7 -0
  50. package/dist/authorization-api/authMiddleware.js +52 -0
  51. package/dist/authorization-api/authMiddleware.js.map +1 -0
  52. package/dist/authorization-api/model.d.ts +99 -0
  53. package/dist/authorization-api/model.js +3 -0
  54. package/dist/authorization-api/model.js.map +1 -0
  55. package/dist/coerceJson.d.ts +2 -0
  56. package/dist/coerceJson.js +13 -0
  57. package/dist/coerceJson.js.map +1 -0
  58. package/dist/createServiceError.d.ts +19 -0
  59. package/dist/createServiceError.js +45 -0
  60. package/dist/createServiceError.js.map +1 -0
  61. package/dist/delay.d.ts +2 -0
  62. package/dist/delay.js +9 -0
  63. package/dist/delay.js.map +1 -0
  64. package/dist/express/status.d.ts +30 -0
  65. package/dist/express/status.js +180 -0
  66. package/dist/express/status.js.map +1 -0
  67. package/dist/formatServiceError.d.ts +1 -0
  68. package/dist/formatServiceError.js +23 -0
  69. package/dist/formatServiceError.js.map +1 -0
  70. package/dist/generated/registry/api.d.ts +596 -0
  71. package/dist/generated/registry/api.js +2060 -0
  72. package/dist/generated/registry/api.js.map +1 -0
  73. package/dist/getAbsoluteUrl.d.ts +12 -0
  74. package/dist/getAbsoluteUrl.js +35 -0
  75. package/dist/getAbsoluteUrl.js.map +1 -0
  76. package/dist/getBasePathFromUrl.d.ts +10 -0
  77. package/dist/getBasePathFromUrl.js +27 -0
  78. package/dist/getBasePathFromUrl.js.map +1 -0
  79. package/dist/markdownToHtml.d.ts +3 -0
  80. package/dist/markdownToHtml.js +38 -0
  81. package/dist/markdownToHtml.js.map +1 -0
  82. package/dist/opa/OpaTypes.d.ts +41 -0
  83. package/dist/opa/OpaTypes.js +3 -0
  84. package/dist/opa/OpaTypes.js.map +1 -0
  85. package/dist/opa/getAuthDecision.d.ts +19 -0
  86. package/dist/opa/getAuthDecision.js +94 -0
  87. package/dist/opa/getAuthDecision.js.map +1 -0
  88. package/dist/opa/queryOpa.d.ts +1 -0
  89. package/dist/opa/queryOpa.js +41 -0
  90. package/dist/opa/queryOpa.js.map +1 -0
  91. package/dist/registry/AuthorizedRegistryClient.d.ts +29 -0
  92. package/dist/registry/AuthorizedRegistryClient.js +115 -0
  93. package/dist/registry/AuthorizedRegistryClient.js.map +1 -0
  94. package/dist/registry/RegistryClient.d.ts +36 -0
  95. package/dist/registry/RegistryClient.js +59 -0
  96. package/dist/registry/RegistryClient.js.map +1 -0
  97. package/dist/registry/TenantConsts.d.ts +31 -0
  98. package/dist/registry/TenantConsts.js +35 -0
  99. package/dist/registry/TenantConsts.js.map +1 -0
  100. package/dist/registry-manual/api.d.ts +9 -0
  101. package/dist/registry-manual/api.js +10 -0
  102. package/dist/registry-manual/api.js.map +1 -0
  103. package/dist/request.d.ts +3 -0
  104. package/dist/request.js +19 -0
  105. package/dist/request.js.map +1 -0
  106. package/dist/retry.d.ts +1 -0
  107. package/dist/retry.js +21 -0
  108. package/dist/retry.js.map +1 -0
  109. package/dist/retryBackoff.d.ts +1 -0
  110. package/dist/retryBackoff.js +21 -0
  111. package/dist/retryBackoff.js.map +1 -0
  112. package/dist/runLater.d.ts +1 -0
  113. package/dist/runLater.js +16 -0
  114. package/dist/runLater.js.map +1 -0
  115. package/dist/session/GetUserId.d.ts +5 -0
  116. package/dist/session/GetUserId.js +41 -0
  117. package/dist/session/GetUserId.js.map +1 -0
  118. package/dist/session/GetUserSession.d.ts +3 -0
  119. package/dist/session/GetUserSession.js +22 -0
  120. package/dist/session/GetUserSession.js.map +1 -0
  121. package/dist/session/addJwtSecretFromEnvVar.d.ts +14 -0
  122. package/dist/session/addJwtSecretFromEnvVar.js +23 -0
  123. package/dist/session/addJwtSecretFromEnvVar.js.map +1 -0
  124. package/dist/session/buildJwt.d.ts +1 -0
  125. package/dist/session/buildJwt.js +8 -0
  126. package/dist/session/buildJwt.js.map +1 -0
  127. package/dist/session/cookieUtils.d.ts +16 -0
  128. package/dist/session/cookieUtils.js +19 -0
  129. package/dist/session/cookieUtils.js.map +1 -0
  130. package/dist/session/destroySession.d.ts +10 -0
  131. package/dist/session/destroySession.js +44 -0
  132. package/dist/session/destroySession.js.map +1 -0
  133. package/dist/session/getSessionId.d.ts +2 -0
  134. package/dist/session/getSessionId.js +28 -0
  135. package/dist/session/getSessionId.js.map +1 -0
  136. package/dist/tenant-api/AuthorizedTenantClient.d.ts +25 -0
  137. package/dist/tenant-api/AuthorizedTenantClient.js +61 -0
  138. package/dist/tenant-api/AuthorizedTenantClient.js.map +1 -0
  139. package/dist/tenant-api/Tenant.d.ts +17 -0
  140. package/dist/tenant-api/Tenant.js +10 -0
  141. package/dist/tenant-api/Tenant.js.map +1 -0
  142. package/dist/test/JsonConnector.spec.d.ts +1 -0
  143. package/dist/test/JsonConnector.spec.js +352 -0
  144. package/dist/test/JsonConnector.spec.js.map +1 -0
  145. package/dist/test/JsonTransformer.spec.d.ts +1 -0
  146. package/dist/test/JsonTransformer.spec.js +98 -0
  147. package/dist/test/JsonTransformer.spec.js.map +1 -0
  148. package/dist/test/arbitraries.d.ts +98 -0
  149. package/dist/test/arbitraries.js +264 -0
  150. package/dist/test/arbitraries.js.map +1 -0
  151. package/dist/test/aspect-templates/organization-details.d.ts +4 -0
  152. package/dist/test/aspect-templates/organization-details.js +11 -0
  153. package/dist/test/aspect-templates/organization-details.js.map +1 -0
  154. package/dist/test/buildApiClient.spec.d.ts +1 -0
  155. package/dist/test/buildApiClient.spec.js +177 -0
  156. package/dist/test/buildApiClient.spec.js.map +1 -0
  157. package/dist/test/buildAuthorizedTenantClient.spec.d.ts +1 -0
  158. package/dist/test/buildAuthorizedTenantClient.spec.js +60 -0
  159. package/dist/test/buildAuthorizedTenantClient.spec.js.map +1 -0
  160. package/dist/test/connectors/MockExpressServer.d.ts +5 -0
  161. package/dist/test/connectors/MockExpressServer.js +28 -0
  162. package/dist/test/connectors/MockExpressServer.js.map +1 -0
  163. package/dist/test/connectors/MockRegistry.d.ts +7 -0
  164. package/dist/test/connectors/MockRegistry.js +93 -0
  165. package/dist/test/connectors/MockRegistry.js.map +1 -0
  166. package/dist/test/connectors/runConnectorTest.d.ts +5 -0
  167. package/dist/test/connectors/runConnectorTest.js +106 -0
  168. package/dist/test/connectors/runConnectorTest.js.map +1 -0
  169. package/dist/test/db/getTestDBConfig.d.ts +7 -0
  170. package/dist/test/db/getTestDBConfig.js +13 -0
  171. package/dist/test/db/getTestDBConfig.js.map +1 -0
  172. package/dist/test/db/runMigrationSql.d.ts +9 -0
  173. package/dist/test/db/runMigrationSql.js +82 -0
  174. package/dist/test/db/runMigrationSql.js.map +1 -0
  175. package/dist/test/express/status.spec.d.ts +1 -0
  176. package/dist/test/express/status.spec.js +160 -0
  177. package/dist/test/express/status.spec.js.map +1 -0
  178. package/dist/test/fakeArgv.d.ts +2 -0
  179. package/dist/test/fakeArgv.js +7 -0
  180. package/dist/test/fakeArgv.js.map +1 -0
  181. package/dist/test/getAuthDecision.spec.d.ts +1 -0
  182. package/dist/test/getAuthDecision.spec.js +22 -0
  183. package/dist/test/getAuthDecision.spec.js.map +1 -0
  184. package/dist/test/getBasePathFromUrl.spec.d.ts +1 -0
  185. package/dist/test/getBasePathFromUrl.spec.js +25 -0
  186. package/dist/test/getBasePathFromUrl.spec.js.map +1 -0
  187. package/dist/test/jsverify.d.ts +2 -0
  188. package/dist/test/jsverify.js +8 -0
  189. package/dist/test/jsverify.js.map +1 -0
  190. package/dist/test/mockAuthApiHost.d.ts +14 -0
  191. package/dist/test/mockAuthApiHost.js +174 -0
  192. package/dist/test/mockAuthApiHost.js.map +1 -0
  193. package/dist/test/mockAuthorization.d.ts +3 -0
  194. package/dist/test/mockAuthorization.js +24 -0
  195. package/dist/test/mockAuthorization.js.map +1 -0
  196. package/dist/test/mockTenantDataStore.d.ts +8 -0
  197. package/dist/test/mockTenantDataStore.js +41 -0
  198. package/dist/test/mockTenantDataStore.js.map +1 -0
  199. package/dist/test/mockUserDataStore.d.ts +11 -0
  200. package/dist/test/mockUserDataStore.js +56 -0
  201. package/dist/test/mockUserDataStore.js.map +1 -0
  202. package/dist/test/registry/buildAuthorizedClient.spec.d.ts +1 -0
  203. package/dist/test/registry/buildAuthorizedClient.spec.js +101 -0
  204. package/dist/test/registry/buildAuthorizedClient.spec.js.map +1 -0
  205. package/dist/test/sampleOpaResponse.json +480 -0
  206. package/dist/test/sampleOpaResponseSimple.json +173 -0
  207. package/dist/test/sampleOpaResponseUnconditionalTrue.json +193 -0
  208. package/dist/test/sampleOpaResponseUnconditionalTrueWithDefaultRule.json +303 -0
  209. package/dist/test/sampleOpaResponseWithDefaultRule.json +303 -0
  210. package/dist/test/session/buildJwt.spec.d.ts +1 -0
  211. package/dist/test/session/buildJwt.spec.js +50 -0
  212. package/dist/test/session/buildJwt.spec.js.map +1 -0
  213. package/dist/test/session/buildJwtForRegistryEsriOpaGroupsAndOwnerTest.spec.d.ts +1 -0
  214. package/dist/test/session/buildJwtForRegistryEsriOpaGroupsAndOwnerTest.spec.js +64 -0
  215. package/dist/test/session/buildJwtForRegistryEsriOpaGroupsAndOwnerTest.spec.js.map +1 -0
  216. package/dist/test/session/buildJwtForRegistryEsriOpaGroupsTest.spec.d.ts +1 -0
  217. package/dist/test/session/buildJwtForRegistryEsriOpaGroupsTest.spec.js +52 -0
  218. package/dist/test/session/buildJwtForRegistryEsriOpaGroupsTest.spec.js.map +1 -0
  219. package/dist/test/session/buildJwtForRegistryEsriOpaOwnerTest.spec.d.ts +1 -0
  220. package/dist/test/session/buildJwtForRegistryEsriOpaOwnerTest.spec.js +36 -0
  221. package/dist/test/session/buildJwtForRegistryEsriOpaOwnerTest.spec.js.map +1 -0
  222. package/dist/test/testAsyncPage.spec.d.ts +1 -0
  223. package/dist/test/testAsyncPage.spec.js +463 -0
  224. package/dist/test/testAsyncPage.spec.js.map +1 -0
  225. package/dist/test/testOpaCompileResponseParser.spec.d.ts +1 -0
  226. package/dist/test/testOpaCompileResponseParser.spec.js +148 -0
  227. package/dist/test/testOpaCompileResponseParser.spec.js.map +1 -0
  228. package/dist/test/util.d.ts +1 -0
  229. package/dist/test/util.js +8 -0
  230. package/dist/test/util.js.map +1 -0
  231. package/dist/util/arrayToMaybe.d.ts +2 -0
  232. package/dist/util/arrayToMaybe.js +8 -0
  233. package/dist/util/arrayToMaybe.js.map +1 -0
  234. package/dist/util/cleanOrgTitle.d.ts +1 -0
  235. package/dist/util/cleanOrgTitle.js +13 -0
  236. package/dist/util/cleanOrgTitle.js.map +1 -0
  237. package/dist/util/getMinikubeIP.d.ts +1 -0
  238. package/dist/util/getMinikubeIP.js +13 -0
  239. package/dist/util/getMinikubeIP.js.map +1 -0
  240. package/dist/util/isUuid.d.ts +2 -0
  241. package/dist/util/isUuid.js +6 -0
  242. package/dist/util/isUuid.js.map +1 -0
  243. package/dist/util/unionToThrowable.d.ts +1 -0
  244. package/dist/util/unionToThrowable.js +12 -0
  245. package/dist/util/unionToThrowable.js.map +1 -0
  246. package/dist/utilityTypes.d.ts +1 -0
  247. package/dist/utilityTypes.js +3 -0
  248. package/dist/utilityTypes.js.map +1 -0
  249. package/package.json +3 -3
@@ -0,0 +1,303 @@
1
+ {
2
+ "result": {
3
+ "queries": [
4
+ [
5
+ {
6
+ "index": 0,
7
+ "terms": {
8
+ "type": "ref",
9
+ "value": [
10
+ {
11
+ "type": "var",
12
+ "value": "data"
13
+ },
14
+ {
15
+ "type": "string",
16
+ "value": "partial"
17
+ },
18
+ {
19
+ "type": "string",
20
+ "value": "object"
21
+ },
22
+ {
23
+ "type": "string",
24
+ "value": "registry"
25
+ },
26
+ {
27
+ "type": "string",
28
+ "value": "record"
29
+ },
30
+ {
31
+ "type": "string",
32
+ "value": "esri_owner_groups"
33
+ },
34
+ {
35
+ "type": "string",
36
+ "value": "read"
37
+ }
38
+ ]
39
+ }
40
+ }
41
+ ]
42
+ ],
43
+ "support": [
44
+ {
45
+ "package": {
46
+ "path": [
47
+ {
48
+ "type": "var",
49
+ "value": "data"
50
+ },
51
+ {
52
+ "type": "string",
53
+ "value": "partial"
54
+ },
55
+ {
56
+ "type": "string",
57
+ "value": "object"
58
+ },
59
+ {
60
+ "type": "string",
61
+ "value": "registry"
62
+ },
63
+ {
64
+ "type": "string",
65
+ "value": "record"
66
+ },
67
+ {
68
+ "type": "string",
69
+ "value": "esri_owner_groups"
70
+ }
71
+ ]
72
+ },
73
+ "rules": [
74
+ {
75
+ "head": {
76
+ "name": "read",
77
+ "value": {
78
+ "type": "boolean",
79
+ "value": true
80
+ }
81
+ },
82
+ "body": [
83
+ {
84
+ "index": 0,
85
+ "terms": {
86
+ "type": "boolean",
87
+ "value": true
88
+ }
89
+ }
90
+ ]
91
+ },
92
+ {
93
+ "head": {
94
+ "name": "read",
95
+ "value": {
96
+ "type": "boolean",
97
+ "value": true
98
+ }
99
+ },
100
+ "body": [
101
+ {
102
+ "index": 0,
103
+ "terms": [
104
+ {
105
+ "type": "ref",
106
+ "value": [
107
+ {
108
+ "type": "var",
109
+ "value": "eq"
110
+ }
111
+ ]
112
+ },
113
+ {
114
+ "type": "ref",
115
+ "value": [
116
+ {
117
+ "type": "var",
118
+ "value": "input"
119
+ },
120
+ {
121
+ "type": "string",
122
+ "value": "object"
123
+ },
124
+ {
125
+ "type": "string",
126
+ "value": "registry"
127
+ },
128
+ {
129
+ "type": "string",
130
+ "value": "record"
131
+ },
132
+ {
133
+ "type": "string",
134
+ "value": "esri-access-control"
135
+ },
136
+ {
137
+ "type": "string",
138
+ "value": "access"
139
+ }
140
+ ]
141
+ },
142
+ {
143
+ "type": "string",
144
+ "value": "public"
145
+ }
146
+ ]
147
+ },
148
+ {
149
+ "index": 1,
150
+ "terms": [
151
+ {
152
+ "type": "ref",
153
+ "value": [
154
+ {
155
+ "type": "var",
156
+ "value": "gt"
157
+ }
158
+ ]
159
+ },
160
+ {
161
+ "type": "ref",
162
+ "value": [
163
+ {
164
+ "type": "var",
165
+ "value": "input"
166
+ },
167
+ {
168
+ "type": "string",
169
+ "value": "object"
170
+ },
171
+ {
172
+ "type": "string",
173
+ "value": "registry"
174
+ },
175
+ {
176
+ "type": "string",
177
+ "value": "record"
178
+ },
179
+ {
180
+ "type": "string",
181
+ "value": "esri-access-control"
182
+ },
183
+ {
184
+ "type": "string",
185
+ "value": "expiration"
186
+ }
187
+ ]
188
+ },
189
+ {
190
+ "type": "number",
191
+ "value": 1599191720666
192
+ }
193
+ ]
194
+ }
195
+ ]
196
+ },
197
+ {
198
+ "default": true,
199
+ "head": {
200
+ "name": "read",
201
+ "value": {
202
+ "type": "boolean",
203
+ "value": false
204
+ }
205
+ },
206
+ "body": [
207
+ {
208
+ "index": 0,
209
+ "terms": {
210
+ "type": "boolean",
211
+ "value": true
212
+ }
213
+ }
214
+ ]
215
+ }
216
+ ]
217
+ }
218
+ ]
219
+ },
220
+ "explanation": [
221
+ "Enter data.object.registry.record.esri_owner_groups.read",
222
+ "| Eval data.object.registry.record.esri_owner_groups.read",
223
+ "| Index data.object.registry.record.esri_owner_groups.read matched 4 rules)",
224
+ "| Enter data.object.registry.record.esri_owner_groups.read",
225
+ "| | Eval data.object.registry.record.admin_role",
226
+ "| | Index data.object.registry.record.admin_role (matched 1 rule)",
227
+ "| | Enter data.object.registry.record.admin_role",
228
+ "| | | Eval input.user.roles[_] = \"00000000-0000-0003-0000-000000000000\"",
229
+ "| | | Exit data.object.registry.record.admin_role",
230
+ "| | Exit data.object.registry.record.esri_owner_groups.read",
231
+ "| Redo data.object.registry.record.esri_owner_groups.read",
232
+ "| | Redo data.object.registry.record.admin_role",
233
+ "| | Redo data.object.registry.record.admin_role",
234
+ "| | | Redo input.user.roles[_] = \"00000000-0000-0003-0000-000000000000\"",
235
+ "| Enter data.object.registry.record.esri_owner_groups.read",
236
+ "| | Eval data.object.registry.record.has_permission.read",
237
+ "| | Index data.object.registry.record.has_permission.read (matched 1 rule)",
238
+ "| | Enter data.object.registry.record.has_permission.read",
239
+ "| | | Eval data.object.registry.record.has_permission.has_permission(\"object/registry/record/read\")",
240
+ "| | | Index data.object.registry.record.has_permission.has_permission(\"object/registry/record/read\") (matched 1 rule)",
241
+ "| | | Enter data.object.registry.record.has_permission.has_permission",
242
+ "| | | | Eval input.user.permissions[_].operations[_].uri = permission",
243
+ "| | | | Exit data.object.registry.record.has_permission.has_permission",
244
+ "| | | Exit data.object.registry.record.has_permission.read",
245
+ "| | Eval data.object.registry.record.esri_groups",
246
+ "| | Index data.object.registry.record.esri_groups (matched 1 rule)",
247
+ "| | Enter data.object.registry.record.esri_groups",
248
+ "| | | Eval input.object.registry.record[\"esri-access-control\"].groups[_] = input.user.session.esriGroups[_]",
249
+ "| | | Fail input.object.registry.record[\"esri-access-control\"].groups[_] = input.user.session.esriGroups[_]",
250
+ "| | Fail data.object.registry.record.esri_groups",
251
+ "| | Redo data.object.registry.record.has_permission.read",
252
+ "| | Redo data.object.registry.record.has_permission.read",
253
+ "| | | Redo data.object.registry.record.has_permission.has_permission(\"object/registry/record/read\")",
254
+ "| | | Redo data.object.registry.record.has_permission.has_permission",
255
+ "| | | | Redo input.user.permissions[_].operations[_].uri = permission",
256
+ "| Enter data.object.registry.record.esri_owner_groups.read",
257
+ "| | Eval data.object.registry.record.has_permission.read",
258
+ "| | Index data.object.registry.record.has_permission.read (matched 1 rule)",
259
+ "| | Eval data.object.registry.record.esri_owner",
260
+ "| | Index data.object.registry.record.esri_owner (matched 1 rule)",
261
+ "| | Enter data.object.registry.record.esri_owner",
262
+ "| | | Eval input.object.registry.record[\"esri-access-control\"].owner = input.user.session.esriUser",
263
+ "| | | Fail input.object.registry.record[\"esri-access-control\"].owner = input.user.session.esriUser",
264
+ "| | Fail data.object.registry.record.esri_owner",
265
+ "| | Redo data.object.registry.record.has_permission.read",
266
+ "| Enter data.object.registry.record.esri_owner_groups.read",
267
+ "| | Eval data.object.registry.record.esri_public",
268
+ "| | Index data.object.registry.record.esri_public (matched 1 rule)",
269
+ "| | Enter data.object.registry.record.esri_public",
270
+ "| | | Eval input.object.registry.record[\"esri-access-control\"].access = \"public\"",
271
+ "| | | Save input.object.registry.record[\"esri-access-control\"].access = \"public\"",
272
+ "| | | Exit data.object.registry.record.esri_public",
273
+ "| | Eval data.object.registry.record.esri_expiration",
274
+ "| | Index data.object.registry.record.esri_expiration (matched 1 rule)",
275
+ "| | Enter data.object.registry.record.esri_expiration",
276
+ "| | | Eval __local145__ = input.object.registry.record[\"esri-access-control\"].expiration",
277
+ "| | | Save __local145__ = input.object.registry.record[\"esri-access-control\"].expiration",
278
+ "| | | Eval __local146__ = input.timestamp",
279
+ "| | | Eval gt(__local145__, __local146__)",
280
+ "| | | Save gt(__local145__, __local146__)",
281
+ "| | | Exit data.object.registry.record.esri_expiration",
282
+ "| | Exit data.object.registry.record.esri_owner_groups.read",
283
+ "| Redo data.object.registry.record.esri_owner_groups.read",
284
+ "| | Redo data.object.registry.record.esri_expiration",
285
+ "| | Redo data.object.registry.record.esri_expiration",
286
+ "| | | Redo gt(__local145__, __local146__)",
287
+ "| | | Redo __local146__ = input.timestamp",
288
+ "| | | Redo __local145__ = input.object.registry.record[\"esri-access-control\"].expiration",
289
+ "| | Redo data.object.registry.record.esri_public",
290
+ "| | Redo data.object.registry.record.esri_public",
291
+ "| | | Redo input.object.registry.record[\"esri-access-control\"].access = \"public\"",
292
+ "| Enter data.object.registry.record.esri_owner_groups.read",
293
+ "| | Eval true",
294
+ "| | Exit data.object.registry.record.esri_owner_groups.read",
295
+ "| Redo data.object.registry.record.esri_owner_groups.read",
296
+ "| | Redo true",
297
+ "| Save data.partial.object.registry.record.esri_owner_groups.read = _",
298
+ "| Save _",
299
+ "| Exit data.object.registry.record.esri_owner_groups.read",
300
+ "Redo data.object.registry.record.esri_owner_groups.read",
301
+ "| Fail data.object.registry.record.esri_owner_groups.read"
302
+ ]
303
+ }
@@ -0,0 +1 @@
1
+ import "mocha";
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const chai_1 = require("chai");
7
+ require("mocha");
8
+ const yargs_1 = __importDefault(require("yargs"));
9
+ const addJwtSecretFromEnvVar_1 = __importDefault(require("../../session/addJwtSecretFromEnvVar"));
10
+ const GetUserId_1 = require("../../session/GetUserId");
11
+ const GetUserSession_1 = require("../../session/GetUserSession");
12
+ const buildJwt_1 = __importDefault(require("../../session/buildJwt"));
13
+ const { mockRequest } = require("mock-req-res");
14
+ describe("Get authz claim from jwt token", () => {
15
+ const argv = addJwtSecretFromEnvVar_1.default(yargs_1.default.config().help().option("jwtSecret", {
16
+ describe: "The secret to use to sign JSON Web Token (JWT) for authenticated requests.",
17
+ type: "string"
18
+ }).argv);
19
+ it("should get userId", function () {
20
+ const aUserId = "aTestUserId";
21
+ const jwtToken = buildJwt_1.default(argv.jwtSecret, aUserId);
22
+ const req = mockRequest({
23
+ header(name) {
24
+ if (name === "X-Magda-Session")
25
+ return jwtToken;
26
+ else
27
+ return null;
28
+ }
29
+ });
30
+ const actual = GetUserId_1.getUserId(req, argv.jwtSecret).valueOr("wrong answer");
31
+ chai_1.expect(actual).to.be.equal(aUserId);
32
+ });
33
+ it("should get user session", function () {
34
+ const aUserId = "aTestUserId";
35
+ const groups = ["G1", "G2"];
36
+ const session = { session: { esriGroups: groups } };
37
+ const jwtToken = buildJwt_1.default(argv.jwtSecret, aUserId, session);
38
+ const req = mockRequest({
39
+ header(name) {
40
+ if (name === "X-Magda-Session")
41
+ return jwtToken;
42
+ else
43
+ return null;
44
+ }
45
+ });
46
+ const actual = GetUserSession_1.getUserSession(req, argv.jwtSecret).valueOr({});
47
+ chai_1.expect(actual.session.esriGroups).to.be.deep.equal(groups);
48
+ });
49
+ });
50
+ //# sourceMappingURL=buildJwt.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildJwt.spec.js","sourceRoot":"","sources":["../../../src/test/session/buildJwt.spec.ts"],"names":[],"mappings":";;;;;AAAA,+BAA8B;AAC9B,iBAAe;AACf,kDAA0B;AAC1B,kGAA0E;AAC1E,uDAAoD;AACpD,iEAA8D;AAC9D,sEAA8C;AAC9C,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AAEhD,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC5C,MAAM,IAAI,GAAG,gCAAsB,CAC/B,eAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;QACtC,QAAQ,EACJ,4EAA4E;QAChF,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,IAAI,CACV,CAAC;IAEF,EAAE,CAAC,mBAAmB,EAAE;QACpB,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,QAAQ,GAAG,kBAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEnD,MAAM,GAAG,GAAG,WAAW,CAAC;YACpB,MAAM,CAAC,IAAY;gBACf,IAAI,IAAI,KAAK,iBAAiB;oBAAE,OAAO,QAAQ,CAAC;;oBAC3C,OAAO,IAAI,CAAC;YACrB,CAAC;SACJ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,qBAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACtE,aAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE;QAC1B,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,kBAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE5D,MAAM,GAAG,GAAG,WAAW,CAAC;YACpB,MAAM,CAAC,IAAY;gBACf,IAAI,IAAI,KAAK,iBAAiB;oBAAE,OAAO,QAAQ,CAAC;;oBAC3C,OAAO,IAAI,CAAC;YACrB,CAAC;SACJ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,+BAAc,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/D,aAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ require("mocha");
7
+ const yargs_1 = __importDefault(require("yargs"));
8
+ const addJwtSecretFromEnvVar_1 = __importDefault(require("../../session/addJwtSecretFromEnvVar"));
9
+ const buildJwt_1 = __importDefault(require("../../session/buildJwt"));
10
+ describe("Get authz claim from jwt token", () => {
11
+ const argv = addJwtSecretFromEnvVar_1.default(yargs_1.default.config().help().option("jwtSecret", {
12
+ describe: "The secret to use to sign JSON Web Token (JWT) for authenticated requests.",
13
+ type: "string"
14
+ }).argv);
15
+ it("should create jwt token with userId and session claims", function () {
16
+ const sessions = [
17
+ {
18
+ session: {
19
+ esriGroups: [
20
+ "Dep. A",
21
+ "Branch A, Dep. A",
22
+ "Branch B, Dep. A",
23
+ "Section C, Branch B, Dep. A"
24
+ ],
25
+ esriUser: "user0"
26
+ }
27
+ },
28
+ {
29
+ session: {
30
+ esriGroups: ["Branch A, Dep. A"],
31
+ esriUser: "user1"
32
+ }
33
+ },
34
+ {
35
+ session: {
36
+ esriGroups: [
37
+ "Branch B, Dep. A",
38
+ "Section C, Branch B, Dep. A"
39
+ ],
40
+ esriUser: "user2"
41
+ }
42
+ },
43
+ {
44
+ session: {
45
+ esriGroups: ["Section C, Branch B, Dep. A"],
46
+ esriUser: "user3"
47
+ }
48
+ }
49
+ ];
50
+ const userIds = [
51
+ "00000000-0000-1000-0000-000000000000",
52
+ "00000000-0000-1000-0001-000000000000",
53
+ "00000000-0000-1000-0002-000000000000",
54
+ "00000000-0000-1000-0003-000000000000"
55
+ ];
56
+ for (var i = 0; i < userIds.length; i++) {
57
+ let userId = userIds[i];
58
+ let session = sessions[i];
59
+ let jwtToken = buildJwt_1.default(argv.jwtSecret, userId, session);
60
+ console.log(`userId ${userIds[i]}: \njwt: ${jwtToken}\n`);
61
+ }
62
+ });
63
+ });
64
+ //# sourceMappingURL=buildJwtForRegistryEsriOpaGroupsAndOwnerTest.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildJwtForRegistryEsriOpaGroupsAndOwnerTest.spec.js","sourceRoot":"","sources":["../../../src/test/session/buildJwtForRegistryEsriOpaGroupsAndOwnerTest.spec.ts"],"names":[],"mappings":";;;;;AAAA,iBAAe;AACf,kDAA0B;AAC1B,kGAA0E;AAC1E,sEAA8C;AAE9C,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC5C,MAAM,IAAI,GAAG,gCAAsB,CAC/B,eAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;QACtC,QAAQ,EACJ,4EAA4E;QAChF,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,IAAI,CACV,CAAC;IAEF,EAAE,CAAC,wDAAwD,EAAE;QACzD,MAAM,QAAQ,GAAG;YACb;gBACI,OAAO,EAAE;oBACL,UAAU,EAAE;wBACR,QAAQ;wBACR,kBAAkB;wBAClB,kBAAkB;wBAClB,6BAA6B;qBAChC;oBACD,QAAQ,EAAE,OAAO;iBACpB;aACJ;YACD;gBACI,OAAO,EAAE;oBACL,UAAU,EAAE,CAAC,kBAAkB,CAAC;oBAChC,QAAQ,EAAE,OAAO;iBACpB;aACJ;YACD;gBACI,OAAO,EAAE;oBACL,UAAU,EAAE;wBACR,kBAAkB;wBAClB,6BAA6B;qBAChC;oBACD,QAAQ,EAAE,OAAO;iBACpB;aACJ;YACD;gBACI,OAAO,EAAE;oBACL,UAAU,EAAE,CAAC,6BAA6B,CAAC;oBAC3C,QAAQ,EAAE,OAAO;iBACpB;aACJ;SACJ,CAAC;QAEF,MAAM,OAAO,GAAG;YACZ,sCAAsC;YACtC,sCAAsC;YACtC,sCAAsC;YACtC,sCAAsC;SACzC,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,QAAQ,GAAG,kBAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,CAAC,CAAC,YAAY,QAAQ,IAAI,CAAC,CAAC;SAC7D;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ require("mocha");
7
+ const yargs_1 = __importDefault(require("yargs"));
8
+ const addJwtSecretFromEnvVar_1 = __importDefault(require("../../session/addJwtSecretFromEnvVar"));
9
+ const buildJwt_1 = __importDefault(require("../../session/buildJwt"));
10
+ describe("Get authz claim from jwt token", () => {
11
+ const argv = addJwtSecretFromEnvVar_1.default(yargs_1.default.config().help().option("jwtSecret", {
12
+ describe: "The secret to use to sign JSON Web Token (JWT) for authenticated requests.",
13
+ type: "string"
14
+ }).argv);
15
+ it("should create jwt token with userId and session claims", function () {
16
+ const sessions = [
17
+ {
18
+ session: {
19
+ esriGroups: [
20
+ "Dep. A",
21
+ "Branch A, Dep. A",
22
+ "Branch B, Dep. A",
23
+ "Section C, Branch B, Dep. A"
24
+ ]
25
+ }
26
+ },
27
+ { session: { esriGroups: ["Branch A, Dep. A"] } },
28
+ {
29
+ session: {
30
+ esriGroups: [
31
+ "Branch B, Dep. A",
32
+ "Section C, Branch B, Dep. A"
33
+ ]
34
+ }
35
+ },
36
+ { session: { esriGroups: ["Section C, Branch B, Dep. A"] } }
37
+ ];
38
+ const userIds = [
39
+ "00000000-0000-1000-0000-000000000000",
40
+ "00000000-0000-1000-0001-000000000000",
41
+ "00000000-0000-1000-0002-000000000000",
42
+ "00000000-0000-1000-0003-000000000000"
43
+ ];
44
+ for (var i = 0; i < userIds.length; i++) {
45
+ let userId = userIds[i];
46
+ let session = sessions[i];
47
+ let jwtToken = buildJwt_1.default(argv.jwtSecret, userId, session);
48
+ console.log(`userId ${userIds[i]}: \njwt: ${jwtToken}\n`);
49
+ }
50
+ });
51
+ });
52
+ //# sourceMappingURL=buildJwtForRegistryEsriOpaGroupsTest.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildJwtForRegistryEsriOpaGroupsTest.spec.js","sourceRoot":"","sources":["../../../src/test/session/buildJwtForRegistryEsriOpaGroupsTest.spec.ts"],"names":[],"mappings":";;;;;AAAA,iBAAe;AACf,kDAA0B;AAC1B,kGAA0E;AAC1E,sEAA8C;AAE9C,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC5C,MAAM,IAAI,GAAG,gCAAsB,CAC/B,eAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;QACtC,QAAQ,EACJ,4EAA4E;QAChF,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,IAAI,CACV,CAAC;IAEF,EAAE,CAAC,wDAAwD,EAAE;QACzD,MAAM,QAAQ,GAAG;YACb;gBACI,OAAO,EAAE;oBACL,UAAU,EAAE;wBACR,QAAQ;wBACR,kBAAkB;wBAClB,kBAAkB;wBAClB,6BAA6B;qBAChC;iBACJ;aACJ;YACD,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE;YACjD;gBACI,OAAO,EAAE;oBACL,UAAU,EAAE;wBACR,kBAAkB;wBAClB,6BAA6B;qBAChC;iBACJ;aACJ;YACD,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,6BAA6B,CAAC,EAAE,EAAE;SAC/D,CAAC;QAEF,MAAM,OAAO,GAAG;YACZ,sCAAsC;YACtC,sCAAsC;YACtC,sCAAsC;YACtC,sCAAsC;SACzC,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,QAAQ,GAAG,kBAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,CAAC,CAAC,YAAY,QAAQ,IAAI,CAAC,CAAC;SAC7D;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ require("mocha");
7
+ const yargs_1 = __importDefault(require("yargs"));
8
+ const addJwtSecretFromEnvVar_1 = __importDefault(require("../../session/addJwtSecretFromEnvVar"));
9
+ const buildJwt_1 = __importDefault(require("../../session/buildJwt"));
10
+ describe("Get authz claim from jwt token", () => {
11
+ const argv = addJwtSecretFromEnvVar_1.default(yargs_1.default.config().help().option("jwtSecret", {
12
+ describe: "The secret to use to sign JSON Web Token (JWT) for authenticated requests.",
13
+ type: "string"
14
+ }).argv);
15
+ it("should create jwt token with userId and session claims", function () {
16
+ const sessions = [
17
+ { session: { esriUser: "user0" } },
18
+ { session: { esriUser: "user1" } },
19
+ { session: { esriUser: "user2" } },
20
+ { session: { esriUser: "user3" } }
21
+ ];
22
+ const userIds = [
23
+ "00000000-0000-1000-0000-000000000000",
24
+ "00000000-0000-1000-0001-000000000000",
25
+ "00000000-0000-1000-0002-000000000000",
26
+ "00000000-0000-1000-0003-000000000000"
27
+ ];
28
+ for (var i = 0; i < userIds.length; i++) {
29
+ let userId = userIds[i];
30
+ let session = sessions[i];
31
+ let jwtToken = buildJwt_1.default(argv.jwtSecret, userId, session);
32
+ console.log(`userId ${userIds[i]}: \njwt: ${jwtToken}\n`);
33
+ }
34
+ });
35
+ });
36
+ //# sourceMappingURL=buildJwtForRegistryEsriOpaOwnerTest.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildJwtForRegistryEsriOpaOwnerTest.spec.js","sourceRoot":"","sources":["../../../src/test/session/buildJwtForRegistryEsriOpaOwnerTest.spec.ts"],"names":[],"mappings":";;;;;AAAA,iBAAe;AACf,kDAA0B;AAC1B,kGAA0E;AAC1E,sEAA8C;AAE9C,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC5C,MAAM,IAAI,GAAG,gCAAsB,CAC/B,eAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;QACtC,QAAQ,EACJ,4EAA4E;QAChF,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,IAAI,CACV,CAAC;IAEF,EAAE,CAAC,wDAAwD,EAAE;QACzD,MAAM,QAAQ,GAAG;YACb,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YAClC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YAClC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YAClC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;SACrC,CAAC;QAEF,MAAM,OAAO,GAAG;YACZ,sCAAsC;YACtC,sCAAsC;YACtC,sCAAsC;YACtC,sCAAsC;SACzC,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,QAAQ,GAAG,kBAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,CAAC,CAAC,YAAY,QAAQ,IAAI,CAAC,CAAC;SAC7D;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ import "mocha";