@mindline/sync 1.0.63 → 1.0.65

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.
package/index.ts CHANGED
@@ -28,51 +28,52 @@ export class APIResult {
28
28
  array: Array<Object> | null;
29
29
  constructor() { this.result = true; this.status = 200; this.error = ""; this.version = version; this.array = null; }
30
30
  }
31
- export class graphConfig {
31
+ export class mindlineConfig {
32
32
  static environmentTag: string = "dev";
33
33
  // config API endpoints
34
34
  static adminEndpoint(): string {
35
- return `https://${graphConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/admin`
35
+ return `https://${mindlineConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/admin`
36
36
  };
37
37
  static adminIncompleteEndpoint(): string {
38
- return `https://${graphConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/incomplete-admin`;
38
+ return `https://${mindlineConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/incomplete-admin`;
39
39
  };
40
40
  static adminsEndpoint(): string {
41
- return `https://${graphConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/admins`;
42
- };
41
+ return `https://${mindlineConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/admins`;
42
+ };
43
43
  static configEndpoint(): string {
44
- return `https://${graphConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/configuration`;
44
+ return `https://${mindlineConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/configuration`;
45
45
  };
46
46
  static configsEndpoint(): string {
47
- return `https://${graphConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/configurations`;
47
+ return `https://${mindlineConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/configurations`;
48
48
  };
49
49
  static initEndpoint(): string {
50
- return `https://${graphConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/configuration/init`;
50
+ return `https://${mindlineConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/configuration/init`;
51
51
  };
52
52
  static readerStartSyncEndpoint(): string {
53
- return `https://${graphConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/startSync`;
53
+ return `https://${mindlineConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/startSync`;
54
54
  };
55
55
  static tenantEndpoint(): string {
56
- return `https://${graphConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/tenant`;
56
+ return `https://${mindlineConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/tenant`;
57
57
  };
58
58
  static tenantsEndpoint(): string {
59
- return `https://${graphConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/tenants`;
59
+ return `https://${mindlineConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/tenants`;
60
60
  };
61
61
  static workspaceEndpoint(): string {
62
- return `https://${graphConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/workspaces`;
62
+ return `https://${mindlineConfig.environmentTag}-configurationapi-westus.azurewebsites.net/api/v1/workspaces`;
63
63
  };
64
64
  // SignalR endpoint
65
65
  static signalREndpoint(): string {
66
- return `https://${graphConfig.environmentTag}-signalrdispatcher-westus.azurewebsites.net/statsHub`;
66
+ return `https://${mindlineConfig.environmentTag}-signalrdispatcher-westus.azurewebsites.net/statsHub`;
67
67
  };
68
- // graph API endpoints
69
- static graphGroupsEndpoint: string = "https://graph.microsoft.com/v1.0/groups";
70
- static graphMailEndpoint: string = "https://graph.microsoft.com/v1.0/me/messages";
71
- static graphMeEndpoint: string = "https://graph.microsoft.com/v1.0/me";
72
- static graphOauth2PermissionGrants: string = "https://graph.microsoft.com/v1.0/oauth2PermissionGrants";
73
- static graphServicePrincipalsEndpoint: string = "https://graph.microsoft.com/v1.0/servicePrincipals";
74
- static graphUsersEndpoint: string = "https://graph.microsoft.com/v1.0/users";
75
- // sovereign cloud tenant info endpoints
68
+ }
69
+ export class graphConfig {
70
+ // graph API predicates
71
+ static graphGroupsPredicate: string = "v1.0/groups";
72
+ static graphMailPredicate: string = "v1.0/me/messages";
73
+ static graphMePredicate: string = "v1.0/me";
74
+ static graphOauth2PermissionGrantsPredicate: string = "v1.0/oauth2PermissionGrants";
75
+ static graphServicePrincipalsPredicate: string = "v1.0/servicePrincipals";
76
+ static graphUsersPredicate: string = "v1.0/users";
76
77
  static graphTenantByDomainPredicate: string = "beta/tenantRelationships/findTenantInformationByDomainName";
77
78
  static graphTenantByIdPredicate: string = "beta/tenantRelationships/findTenantInformationByTenantId";
78
79
  // authority values are based on the well-known OIDC auth endpoints
@@ -172,6 +173,14 @@ export class Tenant {
172
173
  this.graphSP = "";
173
174
  }
174
175
  }
176
+ function getAppId(authority: string): string {
177
+ switch (authority) {
178
+ case graphConfig.authorityWW: return "63100afe-506e-4bb2-8ff7-d8d5ab373129";
179
+ case graphConfig.authorityUS: return "762d313c-dcfd-4582-8cc5-53cc9844f62e";
180
+ case graphConfig.authorityCN: return "814e0ebd-ada6-42b4-b8ae-e26f3861a0aa";
181
+ default: debugger; return "";
182
+ }
183
+ }
175
184
  function getGraphEndpoint(authority: string): string {
176
185
  switch (authority) {
177
186
  case graphConfig.authorityWW: return "https://graph.microsoft.com/";
@@ -180,6 +189,14 @@ function getGraphEndpoint(authority: string): string {
180
189
  default: debugger; return "";
181
190
  }
182
191
  }
192
+ function getLoginEndpoint(authority: string): string {
193
+ switch (authority) {
194
+ case graphConfig.authorityWW: return "https://login.microsoft.com/";
195
+ case graphConfig.authorityUS: return "https://login.microsoft.us/";
196
+ case graphConfig.authorityCN: return "https://login.partner.microsoftonline.cn/";
197
+ default: debugger; return "";
198
+ }
199
+ }
183
200
  export enum TenantConfigType {
184
201
  source = 1,
185
202
  target = 2,
@@ -1112,7 +1129,7 @@ export class BatchArray {
1112
1129
  }
1113
1130
  // start SignalR connection based on each batchId
1114
1131
  batchIdArray.map((batchPair: Object) => {
1115
- const endpoint: string = graphConfig.signalREndpoint();
1132
+ const endpoint: string = mindlineConfig.signalREndpoint();
1116
1133
  let endpointUrl: URL = new URL(endpoint);
1117
1134
  endpointUrl.searchParams.append("statsId", batchPair.BatchId);
1118
1135
  console.log(`Creating SignalR Hub for TID: ${batchPair.SourceId} ${endpointUrl.href}`);
@@ -1195,9 +1212,7 @@ export class TenantNode {
1195
1212
  }
1196
1213
  }
1197
1214
  }
1198
- //
1199
- // Azure AD Graph API
1200
- //
1215
+ // ======================= Azure AD Graph API ===============================
1201
1216
  export async function groupsGet(instance: IPublicClientApplication, user: User | undefined, groupSearchString: string): Promise<{ groups: Group[], error: string }> {
1202
1217
  // need a logged in user to get graph users
1203
1218
  if (user == null || user.spacode == "") {
@@ -1208,7 +1223,8 @@ export async function groupsGet(instance: IPublicClientApplication, user: User |
1208
1223
  let options = { method: "GET", headers: headers };
1209
1224
  // make /groups endpoint call
1210
1225
  try {
1211
- let groupsEndpoint = `${graphConfig.graphGroupsEndpoint}/?$filter=startsWith(displayName, '${groupSearchString}')`;
1226
+ let groupsEndpoint: string = getGraphEndpoint(user.authority) + graphConfig.graphGroupsPredicate;
1227
+ groupsEndpoint += `/?$filter=startsWith(displayName, '${groupSearchString}')`;
1212
1228
  let response = await fetch(groupsEndpoint, options);
1213
1229
  let data = await response.json();
1214
1230
  if (typeof data.error !== "undefined") {
@@ -1221,10 +1237,10 @@ export async function groupsGet(instance: IPublicClientApplication, user: User |
1221
1237
  return { groups: [], error: `Exception: ${error}` };
1222
1238
  }
1223
1239
  }
1224
- export async function oauth2PermissionGrantsGet(options: RequestInit, spid: string, oid: string): Promise<{ grants: string, id: string, error: string }> {
1240
+ export async function oauth2PermissionGrantsGet(options: RequestInit, user: User, spid: string, oid: string): Promise<{ grants: string, id: string, error: string }> {
1225
1241
  try {
1226
1242
  // make /oauth2PermissionGrants endpoint call
1227
- let spurl: string = graphConfig.graphOauth2PermissionGrants;
1243
+ let spurl: string = getGraphEndpoint(user.authority) + graphConfig.graphOauth2PermissionGrantsPredicate;
1228
1244
  let url: URL = new URL(spurl);
1229
1245
  url.searchParams.append("$filter", `resourceId eq '${spid}' and consentType eq 'Principal' and principalId eq '${oid}'`);
1230
1246
  let response = await fetch(url.href, options);
@@ -1251,7 +1267,8 @@ export async function oauth2PermissionGrantsSet(instance: IPublicClientApplicati
1251
1267
  }
1252
1268
  // make /oauth2PermissionGrants endpoint call
1253
1269
  try {
1254
- let grantsurl: string = graphConfig.graphOauth2PermissionGrants + `/${id}`;
1270
+ let grantsurl: string = getGraphEndpoint(loggedInUser.authority);
1271
+ grantsurl += graphConfig.graphOauth2PermissionGrantsPredicate + `/${id}`;
1255
1272
  let scopesBody: string = `{ "scope": "${scopes}" }`;
1256
1273
  const headers = await defineHeaders(instance, loggedInUser);
1257
1274
  let options: RequestInit = { method: "PATCH", headers: headers, body: scopesBody };
@@ -1288,19 +1305,21 @@ export function requestAdminConsent(user: User, scope: string): void {
1288
1305
  // https://learn.microsoft.com/EN-US/azure/active-directory/develop/scopes-oidc#client-credentials-grant-flow-and-default
1289
1306
  // https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow#request-the-permissions-from-a-directory-admin
1290
1307
  //
1291
- let adminConsentURL: string = "https://login.microsoftonline.com/";
1308
+ let adminConsentURL: string = getLoginEndpoint(user.authority);
1292
1309
  adminConsentURL += user.tid;
1293
1310
  adminConsentURL += "/adminconsent";
1294
1311
  let url: URL = new URL(adminConsentURL);
1295
- url.searchParams.append("client_id", "63100afe-506e-4bb2-8ff7-d8d5ab373129");
1312
+ let clientId: string = getAppId(user.authority);
1313
+ url.searchParams.append("client_id", clientId);
1296
1314
  url.searchParams.append("redirect_uri", window.location.origin);
1297
1315
  url.searchParams.append("domain_hint", user.companyDomain);
1298
1316
  window.location.assign(url.href);
1299
1317
  }
1300
- export async function servicePrincipalGet(options: RequestInit, appid: string): Promise<{ spid: string, error: string }> {
1318
+ export async function servicePrincipalGet(options: RequestInit, user: User, appid: string): Promise<{ spid: string, error: string }> {
1301
1319
  try {
1302
1320
  // make /servicePrincipals endpoint call to get the Service Principal ID
1303
- let spurl: string = graphConfig.graphServicePrincipalsEndpoint;
1321
+ let spurl: string = getGraphEndpoint(user.authority);
1322
+ spurl += graphConfig.graphServicePrincipalsPredicate;
1304
1323
  spurl += `(appId='${appid}')`;
1305
1324
  let url: URL = new URL(spurl);
1306
1325
  url.searchParams.append("$select", "id,appId,displayName");
@@ -1335,52 +1354,52 @@ export async function signIn(user: User, tasks: TaskArray): Promise<boolean> {
1335
1354
  return false;
1336
1355
  }
1337
1356
  }
1357
+ // SignIn by an admin consents the app, Challenge adds incremental permissions dynamically, but requires a consented app - TEST THIS
1358
+ let signinURL: string = window.location.href;
1338
1359
  switch (user.authority) {
1339
1360
  case graphConfig.authorityWW:
1340
- // SignIn by an admin consents the app, Challenge adds incremental permissions dynamically, but requires a consented app
1341
- let tenantURL: string = window.location.href;
1342
- tenantURL += "MicrosoftIdentity/Account/SignIn";
1343
- let url: URL = new URL(tenantURL);
1344
- url.searchParams.append("redirectUri", window.location.origin);
1345
- url.searchParams.append("domainHint", "organizations");
1346
- if (user.oid !== "1") { // "1" means no mail has been set by admin initially in the app, oid and mail should be same if user has set and not yet signed in
1347
- url.searchParams.append("loginHint", user.mail);
1348
- }
1349
- tasks.setTaskStart("initialization", new Date());
1350
- tasks.setTaskStart("authenticate user", new Date());
1351
- window.location.assign(url.href);
1352
- return true;
1361
+ signinURL += "MicrosoftIdentity/Account/SignIn";
1362
+ break;
1353
1363
  case graphConfig.authorityUS:
1354
- // retrieve controller protected by USGov authorization
1355
- let usURL: string = window.location.href;
1356
- usURL += "USGov";
1357
- let urlUS: URL = new URL(usURL);
1358
- urlUS.searchParams.append("redirectUri", window.location.origin);
1359
- urlUS.searchParams.append("domainHint", user.companyDomain);
1360
- if (user.oid !== "1") {
1361
- urlUS.searchParams.append("loginHint", user.mail);
1362
- }
1363
- tasks.setTaskStart("initialization", new Date());
1364
- tasks.setTaskStart("authenticate user", new Date());
1365
- window.location.assign(urlUS.href);
1366
- return true;
1364
+ signinURL += "USGov/SignIn";
1365
+ break;
1367
1366
  case graphConfig.authorityCN:
1368
- // unsupported
1367
+ signinURL += "China/SignIn";
1369
1368
  break;
1370
1369
  default:
1371
1370
  // unknown authority
1372
- debugger;
1371
+ return false;
1373
1372
  }
1374
- return false;
1373
+ let url: URL = new URL(signinURL);
1374
+ url.searchParams.append("redirectUri", window.location.origin);
1375
+ url.searchParams.append("domainHint", "organizations");
1376
+ if (user.oid !== "1") { // "1" means no mail has been set by admin initially in the app, oid and mail should be same if user has set and not yet signed in
1377
+ url.searchParams.append("loginHint", user.mail);
1378
+ }
1379
+ tasks.setTaskStart("initialization", new Date());
1380
+ tasks.setTaskStart("authenticate user", new Date());
1381
+ window.location.assign(url.href);
1382
+ return true;
1375
1383
  }
1376
1384
  export function signInIncrementally(user: User, scope: string): void {
1377
1385
  if (user.oid == "1") return;
1378
- //
1379
- // for delegated permissions, we can use the Microsoft Identity Web Account Controller Challenge method
1380
- //
1381
- let tenantURL: string = window.location.href;
1382
- tenantURL += "MicrosoftIdentity/Account/Challenge";
1383
- let url: URL = new URL(tenantURL);
1386
+ // for dynamic delegated permissions, we can use the Microsoft Identity Web Account Controller Challenge method
1387
+ let challengeURL: string = window.location.href;
1388
+ switch (user.authority) {
1389
+ case graphConfig.authorityWW:
1390
+ challengeURL += "MicrosoftIdentity/Account/Challenge";
1391
+ break;
1392
+ case graphConfig.authorityUS:
1393
+ challengeURL += "USGov/Challenge";
1394
+ break;
1395
+ case graphConfig.authorityCN:
1396
+ challengeURL += "China/Challenge";
1397
+ break;
1398
+ default:
1399
+ // unknown authority
1400
+ return;
1401
+ }
1402
+ let url: URL = new URL(challengeURL);
1384
1403
  url.searchParams.append("redirectUri", window.location.origin);
1385
1404
  url.searchParams.append("scope", scope);
1386
1405
  url.searchParams.append("domainHint", "organizations");
@@ -1410,8 +1429,23 @@ export async function signOut(user: User): Promise<boolean>{
1410
1429
  // OnRedirectToIdentityProviderForSignOut - this is where we set the logout_hint for user we are trying to logout
1411
1430
  // OnSignedOutCallbackRedirect - called when the call sucessfully completes
1412
1431
  let signoutURL: string = window.location.href;
1413
- signoutURL += "MicrosoftIdentity/Account/SignOut";
1414
- window.location.assign(signoutURL);
1432
+ switch (user.authority) {
1433
+ case graphConfig.authorityWW:
1434
+ signoutURL += "MicrosoftIdentity/Account/SignOut";
1435
+ break;
1436
+ case graphConfig.authorityUS:
1437
+ signoutURL += "USGov/SignOut";
1438
+ break;
1439
+ case graphConfig.authorityCN:
1440
+ signoutURL += "China/SignOut";
1441
+ break;
1442
+ default:
1443
+ // unknown authority
1444
+ return false;
1445
+ }
1446
+ url = new URL(signoutURL);
1447
+ url.searchParams.append("redirectUri", window.location.origin);
1448
+ window.location.assign(url.href);
1415
1449
  return true;
1416
1450
  }
1417
1451
  //tenantRelationshipsGetByDomain - query AAD for associated company name and id
@@ -1564,11 +1598,16 @@ export async function tenantUnauthenticatedLookup(tenant: Tenant, debug: boolean
1564
1598
  if (data) {
1565
1599
  // store tenant ID and authority
1566
1600
  var tenantAuthEndpoint = data.authorization_endpoint;
1567
- var authMatches = tenantAuthEndpoint.match(regexes[j]);
1568
- tenant.tid = authMatches[2];
1569
- tenant.authority = authMatches[1]; // USGov tenants are registered in WW with USGov authority values!
1570
- console.log(`Successful GET from openid well-known endpoint: tid: ${tenant.tid} authority: ${tenant.authority}`);
1571
- return true; // success, need UX to re-render
1601
+ // USGov/China tenants are registered in WW with USGov/China authority values!
1602
+ for (let k = 0; k < 3; k++) {
1603
+ var authMatches = tenantAuthEndpoint.match(regexes[k]);
1604
+ if (authMatches != null) {
1605
+ tenant.tid = authMatches[2];
1606
+ tenant.authority = authMatches[1];
1607
+ console.log(`Successful GET from openid well-known endpoint: tid: ${tenant.tid} authority: ${tenant.authority}`);
1608
+ return true; // success, need UX to re-render
1609
+ }
1610
+ }
1572
1611
  }
1573
1612
  else {
1574
1613
  console.log(`Failed JSON parse of openid well-known endpoint response ${openidEndpoint}.`);
@@ -1599,7 +1638,7 @@ export async function userDelegatedScopesGet(instance: IPublicClientApplication,
1599
1638
  try {
1600
1639
  // first, cache Graph resource ID (service principal) for this tenant if we don't have it already
1601
1640
  if (tenant.graphSP == "") {
1602
- let { spid, error } = await servicePrincipalGet(options, "00000003-0000-0000-c000-000000000000");
1641
+ let { spid, error } = await servicePrincipalGet(options, loggedInUser, "00000003-0000-0000-c000-000000000000");
1603
1642
  if (error != "") {
1604
1643
  debugger;
1605
1644
  return { scopes: null, id: null, error: `${error}` };
@@ -1607,7 +1646,7 @@ export async function userDelegatedScopesGet(instance: IPublicClientApplication,
1607
1646
  tenant.graphSP = spid;
1608
1647
  }
1609
1648
  // then, retrieve the delegated Graph permissions assigned to this user
1610
- let { grants, id, error } = await oauth2PermissionGrantsGet(options, tenant.graphSP, loggedInUser.oid);
1649
+ let { grants, id, error } = await oauth2PermissionGrantsGet(options, loggedInUser, tenant.graphSP, loggedInUser.oid);
1611
1650
  if (error != "") {
1612
1651
  debugger;
1613
1652
  return { scopes: null, id: null, error: `${error}` };
@@ -1657,7 +1696,9 @@ export async function usersGet(instance: IPublicClientApplication, user: User |
1657
1696
  // create headers
1658
1697
  const headers = await defineHeaders(instance, user);
1659
1698
  let options = { method: "GET", headers: headers };
1660
- let response = await fetch(graphConfig.graphUsersEndpoint, options);
1699
+ let usersEndpoint = getGraphEndpoint(user.authority);
1700
+ usersEndpoint += graphConfig.graphUsersPredicate;
1701
+ let response = await fetch(usersEndpoint, options);
1661
1702
  let data = await response.json();
1662
1703
  if (typeof data.error !== "undefined") {
1663
1704
  return { users: [], error: `${data.error.code}: ${data.error.message}` };
@@ -1796,9 +1837,7 @@ export async function userAdd(instance: IPublicClientApplication, authorizedUser
1796
1837
  export async function userRemove(instance: IPublicClientApplication, authorizedUser: User, user: User, workspaceId: string): Promise<APIResult> {
1797
1838
  return adminDelete(instance, authorizedUser, user, workspaceId);
1798
1839
  }
1799
- //
1800
1840
  // Mindline Config API internal helper functions
1801
- //
1802
1841
  function processReturnedAdmins(workspace: Workspace, ii: InitInfo, returnedAdmins: Array<Object>) {
1803
1842
  returnedAdmins.map((item) => {
1804
1843
  // are we already tracking this user?
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mindline/sync",
3
3
  "type": "module",
4
- "version": "1.0.63",
4
+ "version": "1.0.65",
5
5
  "types": "index.d.ts",
6
6
  "exports": "./index.ts",
7
7
  "description": "sync is a node.js package encapsulating javscript classes required for configuring Mindline sync service.",
package/tsconfig.json CHANGED
@@ -1,27 +1,27 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ESNext",
4
- "lib": [ "DOM", "DOM.Iterable", "ESNext" ],
5
- "types": [ "vite/client", "vite-plugin-svgr/client", "node", "jest" ],
6
- "allowJs": false,
7
- "skipLibCheck": false,
8
- "esModuleInterop": false,
9
- "allowSyntheticDefaultImports": true,
10
- "forceConsistentCasingInFileNames": true,
11
- "module": "esnext",
12
- "moduleResolution": "node",
13
- "resolveJsonModule": true,
14
- "isolatedModules": true,
15
- "noEmit": true,
16
- "jsx": "react-jsx",
17
- "composite": false,
18
-
19
- /* Linting */
20
- "strict": true,
21
- "noUnusedLocals": true,
22
- "noUnusedParameters": true,
23
- "noFallthroughCasesInSwitch": true
24
- },
25
- "include": ["src"],
26
- "references": [{ "path": "./tsconfig.node.json" }]
27
- }
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ESNext",
4
+ "lib": [ "DOM", "DOM.Iterable", "ESNext" ],
5
+ "types": [ "vite/client", "vite-plugin-svgr/client", "node", "jest" ],
6
+ "allowJs": false,
7
+ "skipLibCheck": false,
8
+ "esModuleInterop": false,
9
+ "allowSyntheticDefaultImports": true,
10
+ "forceConsistentCasingInFileNames": true,
11
+ "module": "esnext",
12
+ "moduleResolution": "node",
13
+ "resolveJsonModule": true,
14
+ "isolatedModules": true,
15
+ "noEmit": true,
16
+ "jsx": "react-jsx",
17
+ "composite": false,
18
+
19
+ /* Linting */
20
+ "strict": true,
21
+ "noUnusedLocals": true,
22
+ "noUnusedParameters": true,
23
+ "noFallthroughCasesInSwitch": true
24
+ },
25
+ "include": ["src"],
26
+ "references": [{ "path": "./tsconfig.node.json" }]
27
+ }
@@ -1,9 +1,9 @@
1
- {
2
- "compilerOptions": {
3
- "composite": true,
4
- "skipLibCheck": true,
5
- "module": "ESNext",
6
- "moduleResolution": "node",
7
- "allowSyntheticDefaultImports": true
8
- }
9
- }
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "skipLibCheck": true,
5
+ "module": "ESNext",
6
+ "moduleResolution": "node",
7
+ "allowSyntheticDefaultImports": true
8
+ }
9
+ }