@phis/contracts 0.5.0 → 0.7.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/README.md +23 -5
- package/dist/addon-index.d.ts +1 -0
- package/dist/addon-index.js +1 -0
- package/dist/addon.d.ts +50 -1
- package/dist/capabilities.d.ts +81 -13
- package/dist/cms.d.ts +23 -1
- package/dist/cms.js +32 -1
- package/dist/controls.d.ts +8 -0
- package/dist/controls.js +1 -0
- package/dist/core.d.ts +19 -1
- package/dist/core.js +19 -0
- package/dist/payments.d.ts +385 -0
- package/dist/payments.js +12 -0
- package/dist/references.d.ts +13 -4
- package/dist/references.js +33 -0
- package/dist/resource-links.d.ts +13 -7
- package/dist/schema.d.ts +9 -0
- package/dist/support.d.ts +184 -0
- package/dist/support.js +11 -0
- package/dist/threads.d.ts +29 -0
- package/dist/timeline.d.ts +39 -0
- package/dist/timeline.js +53 -0
- package/package.json +11 -1
package/dist/support.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { PhisSecretsCapabilityV1, PhisSettingsCapabilityV1 } from "./capabilities.js";
|
|
1
2
|
/**
|
|
2
3
|
* The Support vocabulary Core and the Support Module must spell the same way.
|
|
3
4
|
*
|
|
@@ -44,6 +45,17 @@ export declare const PhisSupportTicketTypeFlag: {
|
|
|
44
45
|
*/
|
|
45
46
|
readonly Requestable: number;
|
|
46
47
|
};
|
|
48
|
+
/**
|
|
49
|
+
* What is true of one ticket, as bit flags (`support_tickets.flags`).
|
|
50
|
+
*
|
|
51
|
+
* `AwaitingDelivery`: the work is resolved and the fix is not in the requester's hands yet. An integration
|
|
52
|
+
* that tracks releases sets it when the merge resolves the ticket, and the requester window does not start
|
|
53
|
+
* until the release says the fix is out (`delivered_at`): a window that ran out before anybody could have
|
|
54
|
+
* the fix would close a ticket nobody had a chance to object to.
|
|
55
|
+
*/
|
|
56
|
+
export declare const PhisSupportTicketFlag: {
|
|
57
|
+
readonly AwaitingDelivery: number;
|
|
58
|
+
};
|
|
47
59
|
/**
|
|
48
60
|
* What is true of a Support queue, as bit flags.
|
|
49
61
|
*
|
|
@@ -327,6 +339,13 @@ export type PhisSupportCapabilityV1 = {
|
|
|
327
339
|
}): Promise<PhisSupportTicket>;
|
|
328
340
|
/** The work on one ticket, in the order the Site keeps it. */
|
|
329
341
|
listTasks(ticketId: number): Promise<PhisSupportTicketTask[]>;
|
|
342
|
+
/**
|
|
343
|
+
* One task, or null where its ticket is out of reach or it is absent.
|
|
344
|
+
*
|
|
345
|
+
* The way back from a link: an integration that hears about its external record finds the link, the
|
|
346
|
+
* link names a task, and the task names its ticket -- whose conversation a comment belongs in.
|
|
347
|
+
*/
|
|
348
|
+
getTask(taskId: number): Promise<PhisSupportTicketTask | null>;
|
|
330
349
|
/** Records a piece of work, which is what a linked issue hangs on. */
|
|
331
350
|
addTask(input: {
|
|
332
351
|
ticketId: number;
|
|
@@ -339,6 +358,19 @@ export type PhisSupportCapabilityV1 = {
|
|
|
339
358
|
taskId: number;
|
|
340
359
|
status: number;
|
|
341
360
|
}): Promise<PhisSupportTicketTask>;
|
|
361
|
+
/**
|
|
362
|
+
* Holds a resolved ticket's requester window until the fix is delivered.
|
|
363
|
+
*
|
|
364
|
+
* For an integration that tracks releases: the merge resolved the ticket, and the requester cannot have
|
|
365
|
+
* the fix until a release carries it. False where the ticket is not resolved -- there is no window to
|
|
366
|
+
* hold. Reopening or resolving again lets go of it.
|
|
367
|
+
*/
|
|
368
|
+
awaitDelivery(ticketId: number): Promise<boolean>;
|
|
369
|
+
/**
|
|
370
|
+
* Says the fix is out: the requester window of a resolved ticket starts now. False where the ticket is
|
|
371
|
+
* not resolved or was already delivered.
|
|
372
|
+
*/
|
|
373
|
+
markDelivered(ticketId: number): Promise<boolean>;
|
|
342
374
|
/**
|
|
343
375
|
* What one person may still ask for, of one type.
|
|
344
376
|
*
|
|
@@ -388,3 +420,155 @@ export type PhisSupportCapabilityV1 = {
|
|
|
388
420
|
reference: string;
|
|
389
421
|
}): Promise<PhisSupportAllowanceGrant | null>;
|
|
390
422
|
};
|
|
423
|
+
/**
|
|
424
|
+
* What Core hands an implementation of `@phis/server/service/support-forwarding` when it builds one.
|
|
425
|
+
*
|
|
426
|
+
* Built per Site and per forward, so the context names the Site; what the implementation talks to and how
|
|
427
|
+
* it signs in is its own, which is why what it reads from Core is its own configuration and nothing else.
|
|
428
|
+
*/
|
|
429
|
+
export type PhisSupportForwardingServiceContext = {
|
|
430
|
+
/** The Add-on implementing the kind. */
|
|
431
|
+
providerId: string;
|
|
432
|
+
siteKey: string;
|
|
433
|
+
/**
|
|
434
|
+
* The implementation's own Site secrets and settings, the same two capabilities its hooks and jobs
|
|
435
|
+
* have: where the work goes (a repository, an installation) is per-Site configuration, and so are the
|
|
436
|
+
* credentials it goes with.
|
|
437
|
+
*/
|
|
438
|
+
secrets: PhisSecretsCapabilityV1;
|
|
439
|
+
settings: PhisSettingsCapabilityV1;
|
|
440
|
+
};
|
|
441
|
+
/**
|
|
442
|
+
* One place an implementation can send work to: a repository, a project, a desk.
|
|
443
|
+
*
|
|
444
|
+
* `key` is the implementation's own name for it and comes back unchanged in `PhisSupportForwardRequest`;
|
|
445
|
+
* `label` is shown to a Supporter as it is ("GitHub acme/app").
|
|
446
|
+
*/
|
|
447
|
+
export type PhisSupportForwardingTarget = {
|
|
448
|
+
key: string;
|
|
449
|
+
label: string;
|
|
450
|
+
};
|
|
451
|
+
/**
|
|
452
|
+
* Whether this implementation can take work on this Site right now, and where.
|
|
453
|
+
*
|
|
454
|
+
* Asked before a Supporter is offered anything. One implementation may offer several targets -- every
|
|
455
|
+
* repository its installation reaches, say -- and a Supporter chooses one per forward. `findings` say in an
|
|
456
|
+
* operator's terms what does not answer when `usable` is false or a target is left out.
|
|
457
|
+
*/
|
|
458
|
+
export type PhisSupportForwardingProbe = {
|
|
459
|
+
usable: boolean;
|
|
460
|
+
targets: PhisSupportForwardingTarget[];
|
|
461
|
+
findings: string[];
|
|
462
|
+
};
|
|
463
|
+
/**
|
|
464
|
+
* One ticket's work, handed over.
|
|
465
|
+
*
|
|
466
|
+
* `mirror` is the ticket type's `External`, decided by Core and not by the implementation: where it is
|
|
467
|
+
* false the external record is opened from the title alone and nothing of the conversation follows it.
|
|
468
|
+
* Where it is true, `body` is what opens it -- the ticket's first message, and only if the person who
|
|
469
|
+
* wrote it agreed to it leaving the Site. What follows afterwards reaches the implementation as thread
|
|
470
|
+
* events, through the synced link Core writes for it, and Core withholds there what may not leave.
|
|
471
|
+
*/
|
|
472
|
+
export type PhisSupportForwardRequest = {
|
|
473
|
+
/** The target the Supporter chose, by the key the probe gave it. */
|
|
474
|
+
target: string;
|
|
475
|
+
ticket: {
|
|
476
|
+
id: number;
|
|
477
|
+
threadId: number;
|
|
478
|
+
subject: string;
|
|
479
|
+
typeKey: string;
|
|
480
|
+
};
|
|
481
|
+
task: {
|
|
482
|
+
title: string;
|
|
483
|
+
};
|
|
484
|
+
mirror: boolean;
|
|
485
|
+
body: string | null;
|
|
486
|
+
/** Who forwarded it, for the external record's attribution. */
|
|
487
|
+
actor: {
|
|
488
|
+
userId: number;
|
|
489
|
+
displayName: string | null;
|
|
490
|
+
};
|
|
491
|
+
signal: AbortSignal;
|
|
492
|
+
};
|
|
493
|
+
/**
|
|
494
|
+
* The external record the work now lives in.
|
|
495
|
+
*
|
|
496
|
+
* `type` and `state` are the implementation's own vocabulary -- an issue, a pull request, open -- and Core
|
|
497
|
+
* stores them on the resource link it writes for the forward without interpreting either, as it does for
|
|
498
|
+
* every link.
|
|
499
|
+
*/
|
|
500
|
+
export type PhisSupportForwardResult = {
|
|
501
|
+
type: number;
|
|
502
|
+
externalId: string;
|
|
503
|
+
url: string | null;
|
|
504
|
+
state: number | null;
|
|
505
|
+
};
|
|
506
|
+
/**
|
|
507
|
+
* A record that already exists in the other system, named by a Supporter: what they pasted, as it is.
|
|
508
|
+
*
|
|
509
|
+
* `reference` is whatever the implementation's own people call one -- a URL, `owner/name#12` -- and each
|
|
510
|
+
* implementation reads only its own. Looking one up changes nothing anywhere: whether the link is made is
|
|
511
|
+
* Core's to decide afterwards, and the record hears of it only once it stands (`linked`).
|
|
512
|
+
*/
|
|
513
|
+
export type PhisSupportLinkLookup = {
|
|
514
|
+
reference: string;
|
|
515
|
+
signal: AbortSignal;
|
|
516
|
+
};
|
|
517
|
+
/**
|
|
518
|
+
* What an implementation answers about a reference.
|
|
519
|
+
*
|
|
520
|
+
* - `unknown`: not one of its own; Core asks the next implementation.
|
|
521
|
+
* - `refused`: its own, but no work can go there -- closed, out of the Site's reach, gone. `reason` is
|
|
522
|
+
* shown to the Supporter as it is.
|
|
523
|
+
* - `linkable`: the record, as `forward` would have answered it, and what it is called there, which
|
|
524
|
+
* becomes the engineering task's title.
|
|
525
|
+
*/
|
|
526
|
+
export type PhisSupportLinkResult = {
|
|
527
|
+
status: "unknown";
|
|
528
|
+
} | {
|
|
529
|
+
status: "refused";
|
|
530
|
+
reason: string;
|
|
531
|
+
} | {
|
|
532
|
+
status: "linkable";
|
|
533
|
+
record: PhisSupportForwardResult;
|
|
534
|
+
title: string;
|
|
535
|
+
};
|
|
536
|
+
/**
|
|
537
|
+
* A link that now stands, so the record can say where it is linked from, as a forwarded one does in its
|
|
538
|
+
* body. Nothing of the conversation travels with it: a link hands nothing over by itself.
|
|
539
|
+
*/
|
|
540
|
+
export type PhisSupportLinkedNotice = {
|
|
541
|
+
record: PhisSupportForwardResult;
|
|
542
|
+
ticket: {
|
|
543
|
+
id: number;
|
|
544
|
+
threadId: number;
|
|
545
|
+
subject: string;
|
|
546
|
+
typeKey: string;
|
|
547
|
+
};
|
|
548
|
+
/** Who linked it, for the record's attribution. */
|
|
549
|
+
actor: {
|
|
550
|
+
userId: number;
|
|
551
|
+
displayName: string | null;
|
|
552
|
+
};
|
|
553
|
+
signal: AbortSignal;
|
|
554
|
+
};
|
|
555
|
+
/**
|
|
556
|
+
* The interface of `@phis/server/service/support-forwarding`, version 1.
|
|
557
|
+
*
|
|
558
|
+
* Whether it can take work, taking it, and linking work that is already there -- an issue somebody opened
|
|
559
|
+
* in the other system before or beside the ticket: `lookup` says what a reference is, Core records the link,
|
|
560
|
+
* and `linked` tells the record. A linked record is followed exactly as a forwarded one is; only how it
|
|
561
|
+
* came to exist differs, and a `linked` that fails leaves the link standing.
|
|
562
|
+
*
|
|
563
|
+
* Everything after the hand-over is the capabilities every Add-on has -- `support:v1` to finish the engineering task the forward created,
|
|
564
|
+
* `threads:v1` to answer in the conversation, `resource-links:v1` to move the link's state -- so that what
|
|
565
|
+
* happens to a ticket stays Core's to decide.
|
|
566
|
+
*/
|
|
567
|
+
export interface PhisSupportForwardingAdapterV1 {
|
|
568
|
+
probe(input: {
|
|
569
|
+
signal: AbortSignal;
|
|
570
|
+
}): Promise<PhisSupportForwardingProbe>;
|
|
571
|
+
forward(input: PhisSupportForwardRequest): Promise<PhisSupportForwardResult>;
|
|
572
|
+
lookup(input: PhisSupportLinkLookup): Promise<PhisSupportLinkResult>;
|
|
573
|
+
linked(input: PhisSupportLinkedNotice): Promise<void>;
|
|
574
|
+
}
|
package/dist/support.js
CHANGED
|
@@ -44,6 +44,17 @@ export const PhisSupportTicketTypeFlag = {
|
|
|
44
44
|
*/
|
|
45
45
|
Requestable: 1 << 2,
|
|
46
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* What is true of one ticket, as bit flags (`support_tickets.flags`).
|
|
49
|
+
*
|
|
50
|
+
* `AwaitingDelivery`: the work is resolved and the fix is not in the requester's hands yet. An integration
|
|
51
|
+
* that tracks releases sets it when the merge resolves the ticket, and the requester window does not start
|
|
52
|
+
* until the release says the fix is out (`delivered_at`): a window that ran out before anybody could have
|
|
53
|
+
* the fix would close a ticket nobody had a chance to object to.
|
|
54
|
+
*/
|
|
55
|
+
export const PhisSupportTicketFlag = {
|
|
56
|
+
AwaitingDelivery: 1 << 0,
|
|
57
|
+
};
|
|
47
58
|
/**
|
|
48
59
|
* What is true of a Support queue, as bit flags.
|
|
49
60
|
*
|
package/dist/threads.d.ts
CHANGED
|
@@ -278,6 +278,11 @@ export type PhisThreadsCapabilityV1 = {
|
|
|
278
278
|
*
|
|
279
279
|
* `messageFlags` is normalized rather than trusted: `Internal` requires an actor who is Staff, and
|
|
280
280
|
* `Imported` is Core's to set on what arrives through an integration.
|
|
281
|
+
*
|
|
282
|
+
* One exception, and only in the narrowing direction: without an actor, an Add-on may mark a message it
|
|
283
|
+
* imports -- one carrying `externalRef` -- as `Internal`. What it brings in from outside is its own to
|
|
284
|
+
* keep from the requester, as a maintainer's comment on an issue is; nothing it writes can be made
|
|
285
|
+
* readable to more people this way, only to fewer.
|
|
281
286
|
*/
|
|
282
287
|
create(input: {
|
|
283
288
|
kind: PhisThreadKindValue;
|
|
@@ -321,6 +326,7 @@ export type PhisThreadsCapabilityV1 = {
|
|
|
321
326
|
*
|
|
322
327
|
* Idempotent on `externalRef` where one is given: the same reference answers with the thread as it
|
|
323
328
|
* stands instead of writing a second message, which is what a webhook delivered twice needs.
|
|
329
|
+
* `messageFlags` follow the terms `create` states, its exception for an imported `Internal` included.
|
|
324
330
|
*/
|
|
325
331
|
reply(input: {
|
|
326
332
|
threadId: number;
|
|
@@ -360,4 +366,27 @@ export type PhisThreadsCapabilityV1 = {
|
|
|
360
366
|
* or `reply`, so it finds its way back to a conversation it already knows about and to no other.
|
|
361
367
|
*/
|
|
362
368
|
findByExternalRef(externalRef: string): Promise<PhisThreadDetail | null>;
|
|
369
|
+
/**
|
|
370
|
+
* Records that a message of a reachable thread was written out to the other system, under that
|
|
371
|
+
* system's id for it. True when recorded now, false when it already was -- an event delivered twice
|
|
372
|
+
* finds its first export and posts nothing.
|
|
373
|
+
*
|
|
374
|
+
* An exported message is never imported back: what this Add-on wrote out and then hears about again is
|
|
375
|
+
* recognised by the reference and left alone.
|
|
376
|
+
*/
|
|
377
|
+
recordExport(input: {
|
|
378
|
+
messageId: number;
|
|
379
|
+
externalRef: string;
|
|
380
|
+
}): Promise<boolean>;
|
|
381
|
+
/** The other system's id for a message this Add-on exported, or null. */
|
|
382
|
+
findExport(messageId: number): Promise<string | null>;
|
|
383
|
+
/**
|
|
384
|
+
* Changes a message this Add-on imported, as its source changed it: new text marks it `Edited`, `null`
|
|
385
|
+
* withdraws it -- the text is gone and the message stays, `Redacted`, so the conversation still reads.
|
|
386
|
+
* False where this Add-on imported nothing under that reference.
|
|
387
|
+
*/
|
|
388
|
+
amendImported(input: {
|
|
389
|
+
externalRef: string;
|
|
390
|
+
message: string | null;
|
|
391
|
+
}): Promise<boolean>;
|
|
363
392
|
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a Timeline shows, the same for a Widget's own entries and for a Timeline Provider's answer.
|
|
3
|
+
*
|
|
4
|
+
* A Provider may run in a Module of ours, in an outside Module, or answer from an Add-on behind a Site
|
|
5
|
+
* route, so the entry is spelled here rather than in the UI package: every end that hands entries over
|
|
6
|
+
* reads and writes this shape.
|
|
7
|
+
*/
|
|
8
|
+
/** What an entry's mark says about it: a word about meaning, so the Theme decides the colour. */
|
|
9
|
+
export declare const PHI_TIMELINE_TONES: readonly ["secondary", "success", "warning", "danger"];
|
|
10
|
+
export type PhiTimelineTone = (typeof PHI_TIMELINE_TONES)[number];
|
|
11
|
+
export type PhiTimelineEntry = {
|
|
12
|
+
/** Stable within the list; the entry's identity when the list is drawn again. */
|
|
13
|
+
key: string;
|
|
14
|
+
title?: string;
|
|
15
|
+
content: string;
|
|
16
|
+
/**
|
|
17
|
+
* When it happened, as an ISO 8601 date or date-time. The Widget formats it for the reader's locale.
|
|
18
|
+
* An entry that states `time` as well shows `time`.
|
|
19
|
+
*/
|
|
20
|
+
at?: string;
|
|
21
|
+
/**
|
|
22
|
+
* When it happened, already in words: "Spring 2026", "v1.2", "Yesterday". Shown as written, and
|
|
23
|
+
* preferred over `at` where an entry states both.
|
|
24
|
+
*/
|
|
25
|
+
time?: string;
|
|
26
|
+
/** A Phi icon name, drawn in place of the mark. */
|
|
27
|
+
icon?: string;
|
|
28
|
+
tone?: PhiTimelineTone;
|
|
29
|
+
/** Still under way: the mark spins. */
|
|
30
|
+
pending?: boolean;
|
|
31
|
+
};
|
|
32
|
+
/** A Timeline Provider's answer. */
|
|
33
|
+
export type PhiTimelineProviderResult = {
|
|
34
|
+
entries: PhiTimelineEntry[];
|
|
35
|
+
};
|
|
36
|
+
export declare function isPhiTimelineTone(value: unknown): value is PhiTimelineTone;
|
|
37
|
+
/** One entry, or `null` for anything that is not one. An entry without a key or text is not one. */
|
|
38
|
+
export declare function readPhiTimelineEntry(value: unknown): PhiTimelineEntry | null;
|
|
39
|
+
export declare function readPhiTimelineEntries(value: unknown): PhiTimelineEntry[];
|
package/dist/timeline.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a Timeline shows, the same for a Widget's own entries and for a Timeline Provider's answer.
|
|
3
|
+
*
|
|
4
|
+
* A Provider may run in a Module of ours, in an outside Module, or answer from an Add-on behind a Site
|
|
5
|
+
* route, so the entry is spelled here rather than in the UI package: every end that hands entries over
|
|
6
|
+
* reads and writes this shape.
|
|
7
|
+
*/
|
|
8
|
+
/** What an entry's mark says about it: a word about meaning, so the Theme decides the colour. */
|
|
9
|
+
export const PHI_TIMELINE_TONES = ["secondary", "success", "warning", "danger"];
|
|
10
|
+
function readString(value) {
|
|
11
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
12
|
+
}
|
|
13
|
+
export function isPhiTimelineTone(value) {
|
|
14
|
+
return typeof value === "string" && PHI_TIMELINE_TONES.includes(value);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The `at` of an entry, when it is a date this reader can place. A string that is not one is dropped
|
|
18
|
+
* rather than shown: an unreadable instant would print as "Invalid Date" in the reader's language.
|
|
19
|
+
*/
|
|
20
|
+
function readInstant(value) {
|
|
21
|
+
const text = readString(value);
|
|
22
|
+
return text && !Number.isNaN(Date.parse(text)) ? text : undefined;
|
|
23
|
+
}
|
|
24
|
+
/** One entry, or `null` for anything that is not one. An entry without a key or text is not one. */
|
|
25
|
+
export function readPhiTimelineEntry(value) {
|
|
26
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const record = value;
|
|
30
|
+
const key = readString(record.key);
|
|
31
|
+
if (!key) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const title = readString(record.title);
|
|
35
|
+
const at = readInstant(record.at);
|
|
36
|
+
const time = readString(record.time);
|
|
37
|
+
const icon = readString(record.icon);
|
|
38
|
+
return {
|
|
39
|
+
key,
|
|
40
|
+
content: typeof record.content === "string" ? record.content : "",
|
|
41
|
+
...(title ? { title } : {}),
|
|
42
|
+
...(at ? { at } : {}),
|
|
43
|
+
...(time ? { time } : {}),
|
|
44
|
+
...(icon ? { icon } : {}),
|
|
45
|
+
...(isPhiTimelineTone(record.tone) ? { tone: record.tone } : {}),
|
|
46
|
+
...(record.pending === true ? { pending: true } : {}),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function readPhiTimelineEntries(value) {
|
|
50
|
+
return Array.isArray(value)
|
|
51
|
+
? value.map(readPhiTimelineEntry).filter((entry) => entry != null)
|
|
52
|
+
: [];
|
|
53
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@phis/contracts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -15,6 +15,11 @@
|
|
|
15
15
|
"prepack": "npm run build"
|
|
16
16
|
},
|
|
17
17
|
"exports": {
|
|
18
|
+
"./payments": {
|
|
19
|
+
"types": "./dist/payments.d.ts",
|
|
20
|
+
"import": "./dist/payments.js",
|
|
21
|
+
"default": "./dist/payments.js"
|
|
22
|
+
},
|
|
18
23
|
"./references": {
|
|
19
24
|
"types": "./dist/references.d.ts",
|
|
20
25
|
"import": "./dist/references.js",
|
|
@@ -114,6 +119,11 @@
|
|
|
114
119
|
"types": "./dist/layout.d.ts",
|
|
115
120
|
"import": "./dist/layout.js",
|
|
116
121
|
"default": "./dist/layout.js"
|
|
122
|
+
},
|
|
123
|
+
"./timeline": {
|
|
124
|
+
"types": "./dist/timeline.d.ts",
|
|
125
|
+
"import": "./dist/timeline.js",
|
|
126
|
+
"default": "./dist/timeline.js"
|
|
117
127
|
}
|
|
118
128
|
},
|
|
119
129
|
"files": [
|