@ankhorage/contracts 25.0.1 → 25.1.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.
- package/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/dist/auth.d.ts +989 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +278 -0
- package/dist/auth.js.map +1 -1
- package/dist/structure/generated.d.ts +2 -2
- package/dist/structure/generated.js +2 -2
- package/dist/structure/generated.js.map +1 -1
- package/package.json +4 -4
- package/src/auth-schemas.test.ts +76 -0
- package/src/auth.ts +303 -0
- package/src/structure/generated.ts +2 -2
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { describe, expect, it } from 'bun:test';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
AUTH_ADAPTER_ERROR_SCHEMA,
|
|
5
|
+
AUTH_EMPTY_INPUT_SCHEMA,
|
|
6
|
+
AUTH_IDENTIFIER_SCHEMA,
|
|
7
|
+
AUTH_NULLABLE_SESSION_RESULT_SCHEMA,
|
|
8
|
+
AUTH_OAUTH_AUTHORIZATION_REQUEST_SCHEMA,
|
|
9
|
+
AUTH_OAUTH_AUTHORIZATION_RESPONSE_SCHEMA,
|
|
10
|
+
AUTH_OAUTH_COMPLETION_RESULT_SCHEMA,
|
|
11
|
+
AUTH_OAUTH_ERROR_SCHEMA,
|
|
12
|
+
AUTH_OAUTH_START_RESULT_SCHEMA,
|
|
13
|
+
AUTH_SESSION_RESULT_SCHEMA,
|
|
14
|
+
AUTH_SESSION_SCHEMA,
|
|
15
|
+
AUTH_SUCCESS_SCHEMA,
|
|
16
|
+
AUTH_USER_SCHEMA,
|
|
17
|
+
AUTH_VOID_RESULT_SCHEMA,
|
|
18
|
+
COMPLETE_OAUTH_AUTHORIZATION_INPUT_SCHEMA,
|
|
19
|
+
PASSWORD_RESET_INPUT_SCHEMA,
|
|
20
|
+
SIGN_IN_INPUT_SCHEMA,
|
|
21
|
+
SIGN_IN_RESULT_SCHEMA,
|
|
22
|
+
SIGN_OUT_INPUT_SCHEMA,
|
|
23
|
+
SIGN_UP_INPUT_SCHEMA,
|
|
24
|
+
SIGN_UP_RESULT_SCHEMA,
|
|
25
|
+
START_OAUTH_AUTHORIZATION_INPUT_SCHEMA,
|
|
26
|
+
VERIFY_OTP_INPUT_SCHEMA,
|
|
27
|
+
} from './auth';
|
|
28
|
+
import { isDataSchema } from './data';
|
|
29
|
+
|
|
30
|
+
const AUTH_SCHEMAS = [
|
|
31
|
+
AUTH_IDENTIFIER_SCHEMA,
|
|
32
|
+
AUTH_USER_SCHEMA,
|
|
33
|
+
AUTH_SESSION_SCHEMA,
|
|
34
|
+
AUTH_ADAPTER_ERROR_SCHEMA,
|
|
35
|
+
SIGN_IN_INPUT_SCHEMA,
|
|
36
|
+
SIGN_UP_INPUT_SCHEMA,
|
|
37
|
+
SIGN_OUT_INPUT_SCHEMA,
|
|
38
|
+
PASSWORD_RESET_INPUT_SCHEMA,
|
|
39
|
+
VERIFY_OTP_INPUT_SCHEMA,
|
|
40
|
+
AUTH_SUCCESS_SCHEMA,
|
|
41
|
+
AUTH_VOID_RESULT_SCHEMA,
|
|
42
|
+
SIGN_IN_RESULT_SCHEMA,
|
|
43
|
+
SIGN_UP_RESULT_SCHEMA,
|
|
44
|
+
AUTH_SESSION_RESULT_SCHEMA,
|
|
45
|
+
AUTH_NULLABLE_SESSION_RESULT_SCHEMA,
|
|
46
|
+
AUTH_EMPTY_INPUT_SCHEMA,
|
|
47
|
+
START_OAUTH_AUTHORIZATION_INPUT_SCHEMA,
|
|
48
|
+
AUTH_OAUTH_AUTHORIZATION_REQUEST_SCHEMA,
|
|
49
|
+
AUTH_OAUTH_ERROR_SCHEMA,
|
|
50
|
+
AUTH_OAUTH_START_RESULT_SCHEMA,
|
|
51
|
+
AUTH_OAUTH_AUTHORIZATION_RESPONSE_SCHEMA,
|
|
52
|
+
COMPLETE_OAUTH_AUTHORIZATION_INPUT_SCHEMA,
|
|
53
|
+
AUTH_OAUTH_COMPLETION_RESULT_SCHEMA,
|
|
54
|
+
] as const;
|
|
55
|
+
|
|
56
|
+
describe('auth/session capability schemas', () => {
|
|
57
|
+
it('publishes valid, serializable schema sources for every auth operation and value', () => {
|
|
58
|
+
expect(AUTH_SCHEMAS.every(isDataSchema)).toBe(true);
|
|
59
|
+
expect(JSON.parse(JSON.stringify(AUTH_SCHEMAS))).toEqual(AUTH_SCHEMAS);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('keeps user metadata open for schema-derived nested paths', () => {
|
|
63
|
+
expect(AUTH_USER_SCHEMA.properties.metadata).toEqual({
|
|
64
|
+
type: 'object',
|
|
65
|
+
additionalProperties: {},
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('preserves the real auth input and result distinctions', () => {
|
|
70
|
+
expect(SIGN_IN_INPUT_SCHEMA.required).toEqual(['identifier']);
|
|
71
|
+
expect(VERIFY_OTP_INPUT_SCHEMA.required).toEqual(['identifier', 'token']);
|
|
72
|
+
expect(SIGN_OUT_INPUT_SCHEMA.required).toBeUndefined();
|
|
73
|
+
expect(AUTH_NULLABLE_SESSION_RESULT_SCHEMA.oneOf).toHaveLength(2);
|
|
74
|
+
expect(AUTH_OAUTH_COMPLETION_RESULT_SCHEMA.oneOf).toHaveLength(3);
|
|
75
|
+
});
|
|
76
|
+
});
|
package/src/auth.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ValueMap } from './collections';
|
|
2
|
+
import type { DataSchema } from './data/schemas';
|
|
2
3
|
import type { AppDeployTargetId } from './deploy';
|
|
3
4
|
import type { AppEnvironmentId } from './environments';
|
|
4
5
|
import type { SecretRef } from './secrets';
|
|
@@ -237,6 +238,171 @@ export interface VerifyOtpInput {
|
|
|
237
238
|
metadata?: Record<string, unknown>;
|
|
238
239
|
}
|
|
239
240
|
|
|
241
|
+
/**
|
|
242
|
+
* Portable schema sources for the provider-neutral auth/session values and operation payloads.
|
|
243
|
+
*
|
|
244
|
+
* They describe the existing serializable contracts only. Auth execution, capability catalogs,
|
|
245
|
+
* adapter ports, and provider-specific configuration remain outside Contracts.
|
|
246
|
+
*/
|
|
247
|
+
export const AUTH_IDENTIFIER_SCHEMA = {
|
|
248
|
+
type: 'object',
|
|
249
|
+
required: ['kind', 'value'],
|
|
250
|
+
properties: {
|
|
251
|
+
kind: { type: 'string', enum: AUTH_IDENTIFIER_KINDS },
|
|
252
|
+
value: { type: 'string' },
|
|
253
|
+
},
|
|
254
|
+
} as const satisfies DataSchema;
|
|
255
|
+
|
|
256
|
+
export const AUTH_USER_SCHEMA = {
|
|
257
|
+
type: 'object',
|
|
258
|
+
required: ['id'],
|
|
259
|
+
properties: {
|
|
260
|
+
id: { type: 'string' },
|
|
261
|
+
email: { type: 'string' },
|
|
262
|
+
phone: { type: 'string' },
|
|
263
|
+
username: { type: 'string' },
|
|
264
|
+
displayName: { type: 'string' },
|
|
265
|
+
avatarUrl: { type: 'string' },
|
|
266
|
+
metadata: { type: 'object', additionalProperties: {} },
|
|
267
|
+
},
|
|
268
|
+
} as const satisfies DataSchema;
|
|
269
|
+
|
|
270
|
+
export const AUTH_SESSION_SCHEMA = {
|
|
271
|
+
type: 'object',
|
|
272
|
+
required: ['accessToken', 'user'],
|
|
273
|
+
properties: {
|
|
274
|
+
accessToken: { type: 'string' },
|
|
275
|
+
refreshToken: { type: 'string' },
|
|
276
|
+
expiresAt: { type: 'number' },
|
|
277
|
+
tokenType: { type: 'string' },
|
|
278
|
+
user: AUTH_USER_SCHEMA,
|
|
279
|
+
},
|
|
280
|
+
} as const satisfies DataSchema;
|
|
281
|
+
|
|
282
|
+
export const AUTH_ADAPTER_ERROR_SCHEMA = {
|
|
283
|
+
type: 'object',
|
|
284
|
+
required: ['code', 'message'],
|
|
285
|
+
properties: {
|
|
286
|
+
code: { type: 'string' },
|
|
287
|
+
message: { type: 'string' },
|
|
288
|
+
cause: {},
|
|
289
|
+
},
|
|
290
|
+
} as const satisfies DataSchema;
|
|
291
|
+
|
|
292
|
+
export const SIGN_IN_INPUT_SCHEMA = {
|
|
293
|
+
type: 'object',
|
|
294
|
+
required: ['identifier'],
|
|
295
|
+
properties: {
|
|
296
|
+
identifier: AUTH_IDENTIFIER_SCHEMA,
|
|
297
|
+
password: { type: 'string' },
|
|
298
|
+
otp: { type: 'string' },
|
|
299
|
+
redirectTo: { type: 'string' },
|
|
300
|
+
metadata: { type: 'object', additionalProperties: {} },
|
|
301
|
+
},
|
|
302
|
+
} as const satisfies DataSchema;
|
|
303
|
+
|
|
304
|
+
export const SIGN_UP_INPUT_SCHEMA = {
|
|
305
|
+
type: 'object',
|
|
306
|
+
required: ['identifier'],
|
|
307
|
+
properties: {
|
|
308
|
+
identifier: AUTH_IDENTIFIER_SCHEMA,
|
|
309
|
+
password: { type: 'string' },
|
|
310
|
+
profile: { type: 'object', additionalProperties: {} },
|
|
311
|
+
redirectTo: { type: 'string' },
|
|
312
|
+
metadata: { type: 'object', additionalProperties: {} },
|
|
313
|
+
},
|
|
314
|
+
} as const satisfies DataSchema;
|
|
315
|
+
|
|
316
|
+
export const SIGN_OUT_INPUT_SCHEMA = {
|
|
317
|
+
type: 'object',
|
|
318
|
+
properties: { allDevices: { type: 'boolean' } },
|
|
319
|
+
} as const satisfies DataSchema;
|
|
320
|
+
|
|
321
|
+
export const PASSWORD_RESET_INPUT_SCHEMA = {
|
|
322
|
+
type: 'object',
|
|
323
|
+
required: ['identifier'],
|
|
324
|
+
properties: {
|
|
325
|
+
identifier: AUTH_IDENTIFIER_SCHEMA,
|
|
326
|
+
redirectTo: { type: 'string' },
|
|
327
|
+
},
|
|
328
|
+
} as const satisfies DataSchema;
|
|
329
|
+
|
|
330
|
+
export const VERIFY_OTP_INPUT_SCHEMA = {
|
|
331
|
+
type: 'object',
|
|
332
|
+
required: ['identifier', 'token'],
|
|
333
|
+
properties: {
|
|
334
|
+
identifier: AUTH_IDENTIFIER_SCHEMA,
|
|
335
|
+
token: { type: 'string' },
|
|
336
|
+
redirectTo: { type: 'string' },
|
|
337
|
+
metadata: { type: 'object', additionalProperties: {} },
|
|
338
|
+
},
|
|
339
|
+
} as const satisfies DataSchema;
|
|
340
|
+
|
|
341
|
+
export const AUTH_SUCCESS_SCHEMA = {
|
|
342
|
+
type: 'object',
|
|
343
|
+
required: ['ok'],
|
|
344
|
+
properties: { ok: { const: true } },
|
|
345
|
+
} as const satisfies DataSchema;
|
|
346
|
+
|
|
347
|
+
export const AUTH_ERROR_RESULT_SCHEMA = {
|
|
348
|
+
type: 'object',
|
|
349
|
+
required: ['ok', 'error'],
|
|
350
|
+
properties: {
|
|
351
|
+
ok: { const: false },
|
|
352
|
+
error: AUTH_ADAPTER_ERROR_SCHEMA,
|
|
353
|
+
},
|
|
354
|
+
} as const satisfies DataSchema;
|
|
355
|
+
|
|
356
|
+
export const SIGN_IN_RESULT_SCHEMA = {
|
|
357
|
+
oneOf: [
|
|
358
|
+
{
|
|
359
|
+
...AUTH_SUCCESS_SCHEMA,
|
|
360
|
+
properties: { ...AUTH_SUCCESS_SCHEMA.properties, data: AUTH_SESSION_SCHEMA },
|
|
361
|
+
},
|
|
362
|
+
AUTH_ERROR_RESULT_SCHEMA,
|
|
363
|
+
],
|
|
364
|
+
} as const satisfies DataSchema;
|
|
365
|
+
|
|
366
|
+
export const SIGN_UP_RESULT_SCHEMA = {
|
|
367
|
+
oneOf: [
|
|
368
|
+
{
|
|
369
|
+
...AUTH_SUCCESS_SCHEMA,
|
|
370
|
+
properties: {
|
|
371
|
+
...AUTH_SUCCESS_SCHEMA.properties,
|
|
372
|
+
data: { oneOf: [AUTH_SESSION_SCHEMA, AUTH_USER_SCHEMA] },
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
AUTH_ERROR_RESULT_SCHEMA,
|
|
376
|
+
],
|
|
377
|
+
} as const satisfies DataSchema;
|
|
378
|
+
|
|
379
|
+
export const AUTH_VOID_RESULT_SCHEMA = {
|
|
380
|
+
oneOf: [AUTH_SUCCESS_SCHEMA, AUTH_ERROR_RESULT_SCHEMA],
|
|
381
|
+
} as const satisfies DataSchema;
|
|
382
|
+
|
|
383
|
+
export const AUTH_SESSION_RESULT_SCHEMA = {
|
|
384
|
+
oneOf: [
|
|
385
|
+
{
|
|
386
|
+
...AUTH_SUCCESS_SCHEMA,
|
|
387
|
+
properties: { ...AUTH_SUCCESS_SCHEMA.properties, data: AUTH_SESSION_SCHEMA },
|
|
388
|
+
},
|
|
389
|
+
AUTH_ERROR_RESULT_SCHEMA,
|
|
390
|
+
],
|
|
391
|
+
} as const satisfies DataSchema;
|
|
392
|
+
|
|
393
|
+
export const AUTH_NULLABLE_SESSION_RESULT_SCHEMA = {
|
|
394
|
+
oneOf: [
|
|
395
|
+
{
|
|
396
|
+
...AUTH_SUCCESS_SCHEMA,
|
|
397
|
+
properties: {
|
|
398
|
+
...AUTH_SUCCESS_SCHEMA.properties,
|
|
399
|
+
data: { oneOf: [AUTH_SESSION_SCHEMA, { type: 'null' }] },
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
AUTH_ERROR_RESULT_SCHEMA,
|
|
403
|
+
],
|
|
404
|
+
} as const satisfies DataSchema;
|
|
405
|
+
|
|
240
406
|
export const AUTH_OAUTH_ERROR_STAGES = [
|
|
241
407
|
'start',
|
|
242
408
|
'transport',
|
|
@@ -341,6 +507,143 @@ export interface CompleteOAuthAuthorizationInput {
|
|
|
341
507
|
response: AuthOAuthAuthorizationResponse;
|
|
342
508
|
}
|
|
343
509
|
|
|
510
|
+
export const AUTH_EMPTY_INPUT_SCHEMA = {
|
|
511
|
+
type: 'object',
|
|
512
|
+
} as const satisfies DataSchema;
|
|
513
|
+
|
|
514
|
+
export const START_OAUTH_AUTHORIZATION_INPUT_SCHEMA = {
|
|
515
|
+
type: 'object',
|
|
516
|
+
required: ['provider', 'redirectUri'],
|
|
517
|
+
properties: {
|
|
518
|
+
provider: { type: 'string' },
|
|
519
|
+
redirectUri: { type: 'string' },
|
|
520
|
+
scopes: { type: 'array', items: { type: 'string' } },
|
|
521
|
+
queryParams: { type: 'object', additionalProperties: { type: 'string' } },
|
|
522
|
+
},
|
|
523
|
+
} as const satisfies DataSchema;
|
|
524
|
+
|
|
525
|
+
export const AUTH_OAUTH_AUTHORIZATION_REQUEST_SCHEMA = {
|
|
526
|
+
type: 'object',
|
|
527
|
+
required: ['attemptId', 'provider', 'authorizationUrl', 'redirectUri'],
|
|
528
|
+
properties: {
|
|
529
|
+
attemptId: { type: 'string' },
|
|
530
|
+
provider: { type: 'string' },
|
|
531
|
+
authorizationUrl: { type: 'string' },
|
|
532
|
+
redirectUri: { type: 'string' },
|
|
533
|
+
},
|
|
534
|
+
} as const satisfies DataSchema;
|
|
535
|
+
|
|
536
|
+
export const AUTH_OAUTH_ERROR_SCHEMA = {
|
|
537
|
+
type: 'object',
|
|
538
|
+
required: ['code', 'message', 'stage', 'recoverable'],
|
|
539
|
+
properties: {
|
|
540
|
+
code: { type: 'string', enum: AUTH_OAUTH_ERROR_CODES },
|
|
541
|
+
message: { type: 'string' },
|
|
542
|
+
cause: {},
|
|
543
|
+
stage: { type: 'string', enum: AUTH_OAUTH_ERROR_STAGES },
|
|
544
|
+
provider: { type: 'string' },
|
|
545
|
+
recoverable: { type: 'boolean' },
|
|
546
|
+
},
|
|
547
|
+
} as const satisfies DataSchema;
|
|
548
|
+
|
|
549
|
+
export const AUTH_OAUTH_START_RESULT_SCHEMA = {
|
|
550
|
+
oneOf: [
|
|
551
|
+
{
|
|
552
|
+
type: 'object',
|
|
553
|
+
required: ['ok', 'data'],
|
|
554
|
+
properties: {
|
|
555
|
+
ok: { const: true },
|
|
556
|
+
data: AUTH_OAUTH_AUTHORIZATION_REQUEST_SCHEMA,
|
|
557
|
+
},
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
type: 'object',
|
|
561
|
+
required: ['ok', 'error'],
|
|
562
|
+
properties: {
|
|
563
|
+
ok: { const: false },
|
|
564
|
+
error: AUTH_OAUTH_ERROR_SCHEMA,
|
|
565
|
+
},
|
|
566
|
+
},
|
|
567
|
+
],
|
|
568
|
+
} as const satisfies DataSchema;
|
|
569
|
+
|
|
570
|
+
export const AUTH_OAUTH_AUTHORIZATION_RESPONSE_SCHEMA = {
|
|
571
|
+
oneOf: [
|
|
572
|
+
{
|
|
573
|
+
type: 'object',
|
|
574
|
+
required: ['type', 'url'],
|
|
575
|
+
properties: { type: { const: 'callback' }, url: { type: 'string' } },
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
type: 'object',
|
|
579
|
+
required: ['type', 'reason'],
|
|
580
|
+
properties: {
|
|
581
|
+
type: { const: 'cancelled' },
|
|
582
|
+
reason: { type: 'string', enum: AUTH_OAUTH_TRANSPORT_CANCELLATION_REASONS },
|
|
583
|
+
},
|
|
584
|
+
},
|
|
585
|
+
{
|
|
586
|
+
type: 'object',
|
|
587
|
+
required: ['type', 'error'],
|
|
588
|
+
properties: {
|
|
589
|
+
type: { const: 'error' },
|
|
590
|
+
error: {
|
|
591
|
+
type: 'object',
|
|
592
|
+
required: ['code', 'message'],
|
|
593
|
+
properties: {
|
|
594
|
+
code: { type: 'string', enum: AUTH_OAUTH_TRANSPORT_ERROR_CODES },
|
|
595
|
+
message: { type: 'string' },
|
|
596
|
+
cause: {},
|
|
597
|
+
},
|
|
598
|
+
},
|
|
599
|
+
},
|
|
600
|
+
},
|
|
601
|
+
],
|
|
602
|
+
} as const satisfies DataSchema;
|
|
603
|
+
|
|
604
|
+
export const COMPLETE_OAUTH_AUTHORIZATION_INPUT_SCHEMA = {
|
|
605
|
+
type: 'object',
|
|
606
|
+
required: ['attemptId', 'response'],
|
|
607
|
+
properties: {
|
|
608
|
+
attemptId: { type: 'string' },
|
|
609
|
+
response: AUTH_OAUTH_AUTHORIZATION_RESPONSE_SCHEMA,
|
|
610
|
+
},
|
|
611
|
+
} as const satisfies DataSchema;
|
|
612
|
+
|
|
613
|
+
export const AUTH_OAUTH_COMPLETION_RESULT_SCHEMA = {
|
|
614
|
+
oneOf: [
|
|
615
|
+
{
|
|
616
|
+
type: 'object',
|
|
617
|
+
required: ['ok', 'status', 'provider', 'session'],
|
|
618
|
+
properties: {
|
|
619
|
+
ok: { const: true },
|
|
620
|
+
status: { const: 'authenticated' },
|
|
621
|
+
provider: { type: 'string' },
|
|
622
|
+
session: AUTH_SESSION_SCHEMA,
|
|
623
|
+
},
|
|
624
|
+
},
|
|
625
|
+
{
|
|
626
|
+
type: 'object',
|
|
627
|
+
required: ['ok', 'status', 'provider', 'reason'],
|
|
628
|
+
properties: {
|
|
629
|
+
ok: { const: false },
|
|
630
|
+
status: { const: 'cancelled' },
|
|
631
|
+
provider: { type: 'string' },
|
|
632
|
+
reason: { type: 'string', enum: AUTH_OAUTH_CANCELLATION_REASONS },
|
|
633
|
+
},
|
|
634
|
+
},
|
|
635
|
+
{
|
|
636
|
+
type: 'object',
|
|
637
|
+
required: ['ok', 'status', 'error'],
|
|
638
|
+
properties: {
|
|
639
|
+
ok: { const: false },
|
|
640
|
+
status: { const: 'error' },
|
|
641
|
+
error: AUTH_OAUTH_ERROR_SCHEMA,
|
|
642
|
+
},
|
|
643
|
+
},
|
|
644
|
+
],
|
|
645
|
+
} as const satisfies DataSchema;
|
|
646
|
+
|
|
344
647
|
export type AuthOAuthCompletionResult =
|
|
345
648
|
| {
|
|
346
649
|
ok: true;
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import type { StructureDescriptorDocument } from '@ankhorage/contracts/structure';
|
|
3
3
|
|
|
4
4
|
export const STRUCTURE_DESCRIPTOR_COMPILER_VERSION = '6.0.3';
|
|
5
|
-
export const STRUCTURE_DESCRIPTOR_FINGERPRINT = 'sha256:
|
|
5
|
+
export const STRUCTURE_DESCRIPTOR_FINGERPRINT = 'sha256:05419311d2828869c0ffc554890df986b462de036e7399cf2e9057c4ca381928';
|
|
6
6
|
|
|
7
7
|
export const STRUCTURE_DESCRIPTOR = {
|
|
8
8
|
"protocolVersion": 1,
|
|
9
9
|
"packageName": "@ankhorage/contracts",
|
|
10
|
-
"packageVersion": "25.0
|
|
10
|
+
"packageVersion": "25.1.0",
|
|
11
11
|
"roots": {
|
|
12
12
|
"auth-flow": "AuthFlowConfig",
|
|
13
13
|
"auth-profile": "AuthProfileSpec",
|