@relayfile/adapter-core 0.3.5 → 0.3.7
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/dist/src/digest/index.d.ts +50 -0
- package/dist/src/digest/index.d.ts.map +1 -0
- package/dist/src/digest/index.js +138 -0
- package/dist/src/digest/index.js.map +1 -0
- package/dist/src/digest/index.test.d.ts +2 -0
- package/dist/src/digest/index.test.d.ts.map +1 -0
- package/dist/src/digest/index.test.js +68 -0
- package/dist/src/digest/index.test.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface DigestWindow {
|
|
2
|
+
readonly from: string;
|
|
3
|
+
readonly to: string;
|
|
4
|
+
}
|
|
5
|
+
export interface DigestChangeEvent {
|
|
6
|
+
readonly id?: string;
|
|
7
|
+
readonly timestamp?: string;
|
|
8
|
+
readonly occurredAt?: string;
|
|
9
|
+
readonly eventType?: string;
|
|
10
|
+
readonly type?: string;
|
|
11
|
+
readonly action?: string;
|
|
12
|
+
readonly canonicalPath?: string;
|
|
13
|
+
readonly path?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface DigestContext {
|
|
16
|
+
readonly provider: string;
|
|
17
|
+
readonly window: DigestWindow;
|
|
18
|
+
changeEvents(filter?: {
|
|
19
|
+
providers?: string[];
|
|
20
|
+
paths?: string[];
|
|
21
|
+
}): Promise<readonly DigestChangeEvent[]>;
|
|
22
|
+
}
|
|
23
|
+
export interface DigestBullet {
|
|
24
|
+
readonly text: string;
|
|
25
|
+
readonly canonicalPath: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DigestSection {
|
|
28
|
+
readonly provider: string;
|
|
29
|
+
readonly bullets: readonly DigestBullet[];
|
|
30
|
+
}
|
|
31
|
+
export type DigestHandler = (ctx: DigestContext) => Promise<DigestSection | null>;
|
|
32
|
+
export interface DigestActionRule {
|
|
33
|
+
readonly verbs: string;
|
|
34
|
+
readonly pastTense: string;
|
|
35
|
+
}
|
|
36
|
+
export interface DigestAliasConfig {
|
|
37
|
+
readonly mode?: "parent-scoped" | "any";
|
|
38
|
+
readonly segments?: readonly string[];
|
|
39
|
+
readonly parentSegments?: readonly string[];
|
|
40
|
+
}
|
|
41
|
+
export interface CreateDigestHandlerOptions {
|
|
42
|
+
readonly provider?: string;
|
|
43
|
+
readonly pathPrefix?: string;
|
|
44
|
+
readonly identify: (canonicalPath: string) => string;
|
|
45
|
+
readonly actionRules?: readonly DigestActionRule[];
|
|
46
|
+
readonly defaultPastTense?: string;
|
|
47
|
+
readonly alias?: DigestAliasConfig;
|
|
48
|
+
}
|
|
49
|
+
export declare function createDigestHandler(options: CreateDigestHandlerOptions): DigestHandler;
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/digest/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,YAAY,CAAC,MAAM,CAAC,EAAE;QACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,GAAG,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;AAElF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,KAAK,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;CACpC;AA4CD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,aAAa,CA2BtF"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
const DEFAULT_ALIAS_SEGMENTS = new Set([
|
|
2
|
+
"by-assignee",
|
|
3
|
+
"by-creator",
|
|
4
|
+
"by-day",
|
|
5
|
+
"by-database",
|
|
6
|
+
"by-folder",
|
|
7
|
+
"by-id",
|
|
8
|
+
"by-key",
|
|
9
|
+
"by-name",
|
|
10
|
+
"by-parent",
|
|
11
|
+
"by-priority",
|
|
12
|
+
"by-ref",
|
|
13
|
+
"by-space",
|
|
14
|
+
"by-state",
|
|
15
|
+
"by-status",
|
|
16
|
+
"by-title",
|
|
17
|
+
"by-uuid",
|
|
18
|
+
]);
|
|
19
|
+
const DEFAULT_PARENT_SEGMENTS = new Set([
|
|
20
|
+
"channels",
|
|
21
|
+
"commits",
|
|
22
|
+
"databases",
|
|
23
|
+
"deployments",
|
|
24
|
+
"issues",
|
|
25
|
+
"pages",
|
|
26
|
+
"pipelines",
|
|
27
|
+
"projects",
|
|
28
|
+
"pulls",
|
|
29
|
+
"sprints",
|
|
30
|
+
"spaces",
|
|
31
|
+
"tags",
|
|
32
|
+
"tasks",
|
|
33
|
+
"teams",
|
|
34
|
+
"users",
|
|
35
|
+
]);
|
|
36
|
+
export function createDigestHandler(options) {
|
|
37
|
+
const compiledRules = compileActionRules(options.actionRules ?? []);
|
|
38
|
+
const defaultPastTense = options.defaultPastTense ?? "was updated";
|
|
39
|
+
const aliasMode = options.alias?.mode ?? "parent-scoped";
|
|
40
|
+
const aliasSegments = new Set(options.alias?.segments ?? DEFAULT_ALIAS_SEGMENTS);
|
|
41
|
+
const aliasParents = new Set(options.alias?.parentSegments ?? DEFAULT_PARENT_SEGMENTS);
|
|
42
|
+
return async (ctx) => {
|
|
43
|
+
const provider = options.provider ?? ctx.provider;
|
|
44
|
+
const prefix = normalizeDigestPath(options.pathPrefix ?? provider);
|
|
45
|
+
const events = await ctx.changeEvents({ providers: [ctx.provider] });
|
|
46
|
+
const bullets = events
|
|
47
|
+
.filter((event) => hasDigestPath(event, prefix, provider, aliasMode, aliasSegments, aliasParents))
|
|
48
|
+
.slice()
|
|
49
|
+
.sort(compareEvents)
|
|
50
|
+
.map((event) => {
|
|
51
|
+
const canonicalPath = normalizeDigestPath(digestEventPath(event));
|
|
52
|
+
return {
|
|
53
|
+
text: `${options.identify(canonicalPath)} ${pastTense(event, compiledRules, defaultPastTense)}`,
|
|
54
|
+
canonicalPath,
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
return bullets.length === 0 ? null : { provider: ctx.provider, bullets };
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function hasDigestPath(event, prefix, provider, aliasMode, aliasSegments, aliasParents) {
|
|
61
|
+
const eventPath = digestEventPath(event);
|
|
62
|
+
if (!eventPath || !isCanonicalDigestPath(eventPath, provider, aliasMode, aliasSegments, aliasParents)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return (eventPath === prefix
|
|
66
|
+
|| eventPath === `/${prefix}`
|
|
67
|
+
|| eventPath.startsWith(`${prefix}/`)
|
|
68
|
+
|| eventPath.startsWith(`/${prefix}/`));
|
|
69
|
+
}
|
|
70
|
+
function isCanonicalDigestPath(path, provider, aliasMode, aliasSegments, aliasParents) {
|
|
71
|
+
const segments = normalizeDigestPath(path).split("/").filter(Boolean);
|
|
72
|
+
const leaf = segments.at(-1) ?? "";
|
|
73
|
+
return (leaf !== "LAYOUT.md" &&
|
|
74
|
+
leaf !== "_index.json" &&
|
|
75
|
+
!hasDigestAliasDirectory(segments, provider, aliasMode, aliasSegments, aliasParents));
|
|
76
|
+
}
|
|
77
|
+
function hasDigestAliasDirectory(segments, provider, aliasMode, aliasSegments, aliasParents) {
|
|
78
|
+
if ((segments[0] ?? "") !== provider)
|
|
79
|
+
return false;
|
|
80
|
+
for (let index = 1; index < segments.length - 1; index += 1) {
|
|
81
|
+
const segment = segments[index];
|
|
82
|
+
if (!segment || !aliasSegments.has(segment))
|
|
83
|
+
continue;
|
|
84
|
+
if (aliasMode === "any")
|
|
85
|
+
return true;
|
|
86
|
+
const parent = segments[index - 1];
|
|
87
|
+
if (parent && aliasParents.has(parent)) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
function compareEvents(left, right) {
|
|
94
|
+
const leftMs = eventTimeMs(left);
|
|
95
|
+
const rightMs = eventTimeMs(right);
|
|
96
|
+
return (leftMs - rightMs ||
|
|
97
|
+
compareDigestStrings(left.id ?? "", right.id ?? "") ||
|
|
98
|
+
compareDigestStrings(digestEventPath(left), digestEventPath(right)));
|
|
99
|
+
}
|
|
100
|
+
function compareDigestStrings(left, right) {
|
|
101
|
+
if (left < right)
|
|
102
|
+
return -1;
|
|
103
|
+
if (left > right)
|
|
104
|
+
return 1;
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
function eventTime(event) {
|
|
108
|
+
return event.timestamp ?? event.occurredAt ?? "";
|
|
109
|
+
}
|
|
110
|
+
function eventTimeMs(event) {
|
|
111
|
+
const raw = eventTime(event);
|
|
112
|
+
if (!raw)
|
|
113
|
+
return Number.NEGATIVE_INFINITY;
|
|
114
|
+
const ms = Date.parse(raw);
|
|
115
|
+
return Number.isNaN(ms) ? Number.NEGATIVE_INFINITY : ms;
|
|
116
|
+
}
|
|
117
|
+
function digestEventPath(event) {
|
|
118
|
+
return event.canonicalPath ?? event.path ?? "";
|
|
119
|
+
}
|
|
120
|
+
function normalizeDigestPath(path) {
|
|
121
|
+
return path.replace(/^\/+/u, "");
|
|
122
|
+
}
|
|
123
|
+
function pastTense(event, rules, defaultPastTense) {
|
|
124
|
+
const action = (event.action ?? event.eventType ?? event.type ?? "").toLowerCase();
|
|
125
|
+
for (const rule of rules) {
|
|
126
|
+
if (rule.regex.test(action)) {
|
|
127
|
+
return rule.pastTense;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return defaultPastTense;
|
|
131
|
+
}
|
|
132
|
+
function compileActionRules(rules) {
|
|
133
|
+
return rules.map((rule) => ({
|
|
134
|
+
regex: new RegExp(`(^|[^a-z0-9])(${rule.verbs})([^a-z0-9]|$)`, "u"),
|
|
135
|
+
pastTense: rule.pastTense,
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/digest/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/digest/index.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { createDigestHandler, } from "./index.js";
|
|
4
|
+
test("createDigestHandler emits sorted bullets and filters alias/index/layout paths", async () => {
|
|
5
|
+
const digest = createDigestHandler({
|
|
6
|
+
provider: "alpha",
|
|
7
|
+
identify: (path) => path.split("/").at(-1) ?? path,
|
|
8
|
+
actionRules: [
|
|
9
|
+
{ verbs: "create|created", pastTense: "was created" },
|
|
10
|
+
{ verbs: "delete|deleted", pastTense: "was deleted" },
|
|
11
|
+
],
|
|
12
|
+
});
|
|
13
|
+
const ctx = {
|
|
14
|
+
provider: "alpha",
|
|
15
|
+
window: { from: "2026-01-01T00:00:00.000Z", to: "2026-01-02T00:00:00.000Z" },
|
|
16
|
+
async changeEvents(filter) {
|
|
17
|
+
assert.deepEqual(filter, { providers: ["alpha"] });
|
|
18
|
+
return [
|
|
19
|
+
{ id: "2", timestamp: "2026-01-01T09:00:00.000Z", action: "updated", canonicalPath: "/alpha/issues/by-id/ISS-1.json" },
|
|
20
|
+
{ id: "1", timestamp: "2026-01-01T08:00:00.000Z", action: "created", canonicalPath: "/alpha/issues/ISS-1.json" },
|
|
21
|
+
{ id: "3", timestamp: "2026-01-01T10:00:00.000Z", action: "deleted", canonicalPath: "/alpha/issues/_index.json" },
|
|
22
|
+
{ id: "4", timestamp: "2026-01-01T11:00:00.000Z", action: "deleted", canonicalPath: "/alpha/LAYOUT.md" },
|
|
23
|
+
];
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
assert.deepEqual(await digest(ctx), {
|
|
27
|
+
provider: "alpha",
|
|
28
|
+
bullets: [
|
|
29
|
+
{
|
|
30
|
+
text: "ISS-1.json was created",
|
|
31
|
+
canonicalPath: "alpha/issues/ISS-1.json",
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
test("createDigestHandler supports provider aliases with alias.mode=any", async () => {
|
|
37
|
+
const digest = createDigestHandler({
|
|
38
|
+
provider: "beta",
|
|
39
|
+
identify: (path) => path,
|
|
40
|
+
alias: {
|
|
41
|
+
mode: "any",
|
|
42
|
+
segments: ["by-folder"],
|
|
43
|
+
},
|
|
44
|
+
actionRules: [
|
|
45
|
+
{ verbs: "archive|archived", pastTense: "was archived" },
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
const ctx = {
|
|
49
|
+
provider: "beta",
|
|
50
|
+
window: { from: "2026-01-01T00:00:00.000Z", to: "2026-01-02T00:00:00.000Z" },
|
|
51
|
+
async changeEvents() {
|
|
52
|
+
return [
|
|
53
|
+
{ id: "1", timestamp: "2026-01-01T08:00:00.000Z", action: "archived", canonicalPath: "/beta/notes/not_1.json" },
|
|
54
|
+
{ id: "2", timestamp: "2026-01-01T09:00:00.000Z", action: "archived", canonicalPath: "/beta/notes/by-folder/fol_1/_index.json" },
|
|
55
|
+
];
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
assert.deepEqual(await digest(ctx), {
|
|
59
|
+
provider: "beta",
|
|
60
|
+
bullets: [
|
|
61
|
+
{
|
|
62
|
+
text: "beta/notes/not_1.json was archived",
|
|
63
|
+
canonicalPath: "beta/notes/not_1.json",
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/digest/index.test.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ export * from "./docs/updater.js";
|
|
|
22
22
|
export * from "./storage-bridge/index.js";
|
|
23
23
|
export * from "./atomic-index/index.js";
|
|
24
24
|
export * from "./emit-auxiliary/index.js";
|
|
25
|
+
export * from "./digest/index.js";
|
|
25
26
|
export * from "./alias-slug.js";
|
|
26
27
|
export * from "./layout-contract.js";
|
|
27
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -22,6 +22,7 @@ export * from "./docs/updater.js";
|
|
|
22
22
|
export * from "./storage-bridge/index.js";
|
|
23
23
|
export * from "./atomic-index/index.js";
|
|
24
24
|
export * from "./emit-auxiliary/index.js";
|
|
25
|
+
export * from "./digest/index.js";
|
|
25
26
|
export * from "./alias-slug.js";
|
|
26
27
|
export * from "./layout-contract.js";
|
|
27
28
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
|