@oa-sdk/spec-bundler 0.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/LICENSE +201 -0
- package/README.md +240 -0
- package/dist/archiver.d.ts +22 -0
- package/dist/archiver.js +155 -0
- package/dist/category-parser.d.ts +15 -0
- package/dist/category-parser.js +115 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +760 -0
- package/dist/context-generator.d.ts +14 -0
- package/dist/context-generator.js +297 -0
- package/dist/freshness.d.ts +41 -0
- package/dist/freshness.js +365 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.js +705 -0
- package/dist/link-rewriter.d.ts +65 -0
- package/dist/link-rewriter.js +777 -0
- package/dist/resolver.d.ts +27 -0
- package/dist/resolver.js +276 -0
- package/dist/schema.d.ts +563 -0
- package/dist/schema.js +670 -0
- package/dist/section-slicer.d.ts +12 -0
- package/dist/section-slicer.js +114 -0
- package/dist/topic.d.ts +62 -0
- package/dist/topic.js +262 -0
- package/dist/tree-shaker.d.ts +40 -0
- package/dist/tree-shaker.js +523 -0
- package/dist/types.d.ts +369 -0
- package/dist/types.js +2 -0
- package/package.json +29 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
export type DeduplicationStrategy = "warn-overwrite" | "overwrite" | "error";
|
|
2
|
+
export type UnbundledPolicy = "warn" | "error" | "preserve" | "github-fallback";
|
|
3
|
+
export interface TargetMapping {
|
|
4
|
+
/** Source path or glob pattern relative to the manifest directory */
|
|
5
|
+
source: string;
|
|
6
|
+
/** Destination directory or file path inside the bundle */
|
|
7
|
+
dest: string;
|
|
8
|
+
/** Optional target-specific glob exclusion patterns */
|
|
9
|
+
exclude?: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface DeduplicationConfig {
|
|
12
|
+
/** Strategy to handle destination path collisions (default: "warn-overwrite") */
|
|
13
|
+
byPath?: DeduplicationStrategy;
|
|
14
|
+
/** Whether to report/track content hash duplicates (default: true) */
|
|
15
|
+
byContentHash?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface LinkResolutionConfig {
|
|
18
|
+
/** Whether automatic link resolution and rewriting is enabled (default: true) */
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
/** Whether to rewrite internal relative markdown links according to bundle destination (default: true) */
|
|
21
|
+
rewriteRelativeLinks?: boolean;
|
|
22
|
+
/** Whether to normalize file:/// absolute local URLs to bundle relative paths (default: true) */
|
|
23
|
+
normalizeFileSchemes?: boolean;
|
|
24
|
+
/** Policy for links pointing to files outside the bundle (default: "warn") */
|
|
25
|
+
unbundledPolicy?: UnbundledPolicy;
|
|
26
|
+
/** Upstream Git repository URL base for github-fallback policy (e.g. "https://github.com/samchon/ttsc-ex/blob/master") */
|
|
27
|
+
gitRepositoryUrl?: string;
|
|
28
|
+
}
|
|
29
|
+
export type DocumentCategory = "feature" | "mechanism" | "error" | "issue" | "convention";
|
|
30
|
+
export type TraversalDirection = "downstream" | "upstream" | "bidirectional";
|
|
31
|
+
export type DocumentFidelity = "full" | "contract-only" | "summary";
|
|
32
|
+
export type TopicWorkPhase = "develop" | "fix" | "test" | "review";
|
|
33
|
+
export type TraversalMode = "hybrid" | "reachability" | "explicit";
|
|
34
|
+
export type LockfileMode = "consolidated" | "split";
|
|
35
|
+
export interface TreeShakeConfig {
|
|
36
|
+
/** Whether tree-shaking reachability pruning is enabled (default: false) */
|
|
37
|
+
enabled?: boolean;
|
|
38
|
+
/** Entrypoint file paths (bundle-dest or relative to workspace) from which reachability is computed */
|
|
39
|
+
entrypoints: string[];
|
|
40
|
+
/**
|
|
41
|
+
* Allowed boundary patterns. Only references matching these globs can be pulled into this bundle/topic.
|
|
42
|
+
* Traversal strictly halts at boundary edges without pulling in external subgraphs.
|
|
43
|
+
*/
|
|
44
|
+
scope?: string[];
|
|
45
|
+
/**
|
|
46
|
+
* Boundary stop patterns (e.g. globs matching contributing.md, README.md).
|
|
47
|
+
* References matching these patterns become terminal leaves and are never traversed.
|
|
48
|
+
*/
|
|
49
|
+
stopAt?: string[];
|
|
50
|
+
/** Optional maximum traversal hop depth from entrypoints */
|
|
51
|
+
maxDepth?: number;
|
|
52
|
+
/** Unconditionally preserved file patterns exempt from tree-shaking pruning (e.g. ambient context docs) */
|
|
53
|
+
preserve?: string[];
|
|
54
|
+
/** Whether to log/report pruned files in the bundle result (default: true) */
|
|
55
|
+
reportEliminated?: boolean;
|
|
56
|
+
/** Traversal direction (default: "downstream") */
|
|
57
|
+
direction?: TraversalDirection;
|
|
58
|
+
/** Maximum traversal depth when traversing upstream (default: 1) */
|
|
59
|
+
upstreamDepth?: number;
|
|
60
|
+
/** Allowed document categories (unmatched categories pruned) */
|
|
61
|
+
includeCategories?: DocumentCategory[];
|
|
62
|
+
/** Document categories strictly excluded */
|
|
63
|
+
excludeCategories?: DocumentCategory[];
|
|
64
|
+
/** Level of detail/fidelity per category or upstream contracts */
|
|
65
|
+
categoryFidelity?: Partial<Record<DocumentCategory | "upstream" | "default", DocumentFidelity>>;
|
|
66
|
+
/**
|
|
67
|
+
* Reachability traversal mode:
|
|
68
|
+
* - "hybrid" (default): Preserves explicitly declared target files while discovering unlisted dependencies.
|
|
69
|
+
* - "reachability": Strictly prunes any file not reachable from entrypoints.
|
|
70
|
+
* - "explicit": Only bundles files matched by targets without reachability expansion.
|
|
71
|
+
*/
|
|
72
|
+
traversalMode?: TraversalMode;
|
|
73
|
+
/** Whether to unconditionally preserve all files matched by targets (default: true in hybrid mode) */
|
|
74
|
+
preserveTargets?: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface TopicScopeConfig {
|
|
77
|
+
/** Entrypoint files from which reachability traversal begins */
|
|
78
|
+
entrypoints?: string[];
|
|
79
|
+
/** Traversal direction: "downstream" (default), "upstream", or "bidirectional" */
|
|
80
|
+
direction?: TraversalDirection;
|
|
81
|
+
/** Maximum traversal depth when traversing upstream (default: 1) */
|
|
82
|
+
upstreamDepth?: number;
|
|
83
|
+
/** Maximum traversal hop depth from entrypoints (downstream) */
|
|
84
|
+
maxDepth?: number;
|
|
85
|
+
/** Allowed boundary globs for files pulled into this topic */
|
|
86
|
+
include?: string[];
|
|
87
|
+
/** Glob patterns strictly excluded from this topic */
|
|
88
|
+
exclude?: string[];
|
|
89
|
+
/** Boundary stop patterns where traversal halts without expanding (e.g. globs matching contributing.md, README.md) */
|
|
90
|
+
stopAt?: string[];
|
|
91
|
+
/** Optional section heading patterns to slice from markdown documents */
|
|
92
|
+
sections?: string[];
|
|
93
|
+
/** Allowed document categories (unmatched categories pruned) */
|
|
94
|
+
includeCategories?: DocumentCategory[];
|
|
95
|
+
/** Document categories strictly excluded */
|
|
96
|
+
excludeCategories?: DocumentCategory[];
|
|
97
|
+
/** Level of detail/fidelity per category or upstream contracts */
|
|
98
|
+
categoryFidelity?: Partial<Record<DocumentCategory | "upstream" | "default", DocumentFidelity>>;
|
|
99
|
+
/** Traversal mode ("hybrid" | "reachability" | "explicit") */
|
|
100
|
+
traversalMode?: TraversalMode;
|
|
101
|
+
/** Whether to preserve all declared targets */
|
|
102
|
+
preserveTargets?: boolean;
|
|
103
|
+
}
|
|
104
|
+
export interface TopicContextConfig {
|
|
105
|
+
/** Context description or high-level summary */
|
|
106
|
+
description?: string;
|
|
107
|
+
/** Custom CONTEXT.md template file path relative to manifest, or inline template string */
|
|
108
|
+
template?: string;
|
|
109
|
+
/** Target domain or subsystem identifier (e.g. "paint.canvas") */
|
|
110
|
+
domain?: string;
|
|
111
|
+
/** Associated issue / ticket ID (e.g. "SPEC-101", "#42") */
|
|
112
|
+
issue?: string;
|
|
113
|
+
/** Category tags (e.g. ["paint", "canvas", "brush"]) */
|
|
114
|
+
tags?: string[];
|
|
115
|
+
/** System prompt or task instructions for LLM/agent consumers */
|
|
116
|
+
prompt?: string;
|
|
117
|
+
/** Target engineer persona or role */
|
|
118
|
+
persona?: string;
|
|
119
|
+
/** Prerequisites or dependent topic names */
|
|
120
|
+
prerequisites?: string[];
|
|
121
|
+
/** Declarative list of ambient/background context documents */
|
|
122
|
+
docs?: TargetMapping[];
|
|
123
|
+
/** Whether to synthesize CONTEXT.md at bundle root (default: true when context is defined) */
|
|
124
|
+
generateContextDoc?: boolean;
|
|
125
|
+
/** Arbitrary structured metadata */
|
|
126
|
+
metadata?: Record<string, any>;
|
|
127
|
+
}
|
|
128
|
+
export interface TopicProfile {
|
|
129
|
+
/** Work activity lifecycle phase designated for this topic (develop, fix, test, review) */
|
|
130
|
+
phase?: TopicWorkPhase;
|
|
131
|
+
/** Initial worker or author who established this topic definition */
|
|
132
|
+
author?: string;
|
|
133
|
+
/** Optional human-readable description of this topic export profile */
|
|
134
|
+
description?: string;
|
|
135
|
+
/** Output zip archive or directory path relative to manifest */
|
|
136
|
+
output?: string;
|
|
137
|
+
/** Output bundle format (default: inherits from root manifest or "zip") */
|
|
138
|
+
format?: "zip" | "directory";
|
|
139
|
+
/** Declarative list of target file mappings designated for this topic */
|
|
140
|
+
targets: TargetMapping[];
|
|
141
|
+
/** Optional topic-specific glob exclusion patterns */
|
|
142
|
+
exclude?: string[];
|
|
143
|
+
/** Optional topic-specific deduplication rules */
|
|
144
|
+
deduplicate?: DeduplicationConfig;
|
|
145
|
+
/** Optional topic-specific markdown/typespec link resolution configuration */
|
|
146
|
+
linkResolution?: LinkResolutionConfig;
|
|
147
|
+
/** Optional topic-specific tree-shaking and boundary-scoped reachability configuration */
|
|
148
|
+
treeShake?: TreeShakeConfig;
|
|
149
|
+
/** Declarative extraction scope and boundary limits */
|
|
150
|
+
scope?: TopicScopeConfig;
|
|
151
|
+
/** Ambient background context, metadata, prompt, and documentation */
|
|
152
|
+
context?: TopicContextConfig;
|
|
153
|
+
}
|
|
154
|
+
export interface BundleManifest {
|
|
155
|
+
$schema?: string;
|
|
156
|
+
name: string;
|
|
157
|
+
version: string;
|
|
158
|
+
description?: string;
|
|
159
|
+
/** Work activity lifecycle phase designated for this manifest/topic */
|
|
160
|
+
phase?: TopicWorkPhase;
|
|
161
|
+
/** Initial worker or author who established this manifest/topic definition */
|
|
162
|
+
author?: string;
|
|
163
|
+
/** Output zip archive or directory path relative to manifest */
|
|
164
|
+
output: string;
|
|
165
|
+
/** Output bundle format (default: "zip") */
|
|
166
|
+
format?: "zip" | "directory";
|
|
167
|
+
/** Declarative list of target file mappings */
|
|
168
|
+
targets: TargetMapping[];
|
|
169
|
+
/** Global glob exclusion patterns */
|
|
170
|
+
exclude?: string[];
|
|
171
|
+
/** Deduplication rules */
|
|
172
|
+
deduplicate?: DeduplicationConfig;
|
|
173
|
+
/** Markdown reference link resolution options */
|
|
174
|
+
linkResolution?: LinkResolutionConfig;
|
|
175
|
+
/** Declarative tree-shaking reachability configuration */
|
|
176
|
+
treeShake?: TreeShakeConfig;
|
|
177
|
+
/** Declarative extraction scope and boundary limits */
|
|
178
|
+
scope?: TopicScopeConfig;
|
|
179
|
+
/** Ambient background context, metadata, prompt, and documentation */
|
|
180
|
+
context?: TopicContextConfig;
|
|
181
|
+
/** Declarative named topic profiles for repeatable modular documentation bundling */
|
|
182
|
+
topics?: Record<string, TopicProfile>;
|
|
183
|
+
/** Lockfile storage mode: "consolidated" (default) or "split" */
|
|
184
|
+
lockfileMode?: LockfileMode;
|
|
185
|
+
}
|
|
186
|
+
export interface ResolvedFileEntry {
|
|
187
|
+
sourceAbsolutePath: string;
|
|
188
|
+
sourceRelativePath: string;
|
|
189
|
+
/** Normalized POSIX destination path inside bundle (e.g. "skills/my-skill/SKILL.md") */
|
|
190
|
+
bundleDestPath: string;
|
|
191
|
+
sha256: string;
|
|
192
|
+
size: number;
|
|
193
|
+
mtime: number;
|
|
194
|
+
}
|
|
195
|
+
export interface LockfileEntry {
|
|
196
|
+
source: string;
|
|
197
|
+
sha256: string;
|
|
198
|
+
size: number;
|
|
199
|
+
mtime: number;
|
|
200
|
+
}
|
|
201
|
+
export interface TopicLockData {
|
|
202
|
+
generatedAt: string;
|
|
203
|
+
aggregateHash: string;
|
|
204
|
+
filesCount: number;
|
|
205
|
+
totalSizeBytes: number;
|
|
206
|
+
entries: Record<string, LockfileEntry>;
|
|
207
|
+
}
|
|
208
|
+
export interface BundleLockfile {
|
|
209
|
+
manifestVersion: string;
|
|
210
|
+
bundleName: string;
|
|
211
|
+
generatedAt: string;
|
|
212
|
+
aggregateHash: string;
|
|
213
|
+
filesCount: number;
|
|
214
|
+
totalSizeBytes: number;
|
|
215
|
+
entries: Record<string, LockfileEntry>;
|
|
216
|
+
/** Consolidated topic lock data dictionary */
|
|
217
|
+
topics?: Record<string, TopicLockData>;
|
|
218
|
+
}
|
|
219
|
+
export interface FileStructuralDiff {
|
|
220
|
+
file: string;
|
|
221
|
+
type: "markdown" | "typespec" | "other";
|
|
222
|
+
addedAnchors?: string[];
|
|
223
|
+
removedAnchors?: string[];
|
|
224
|
+
addedSymbols?: string[];
|
|
225
|
+
removedSymbols?: string[];
|
|
226
|
+
lineDelta?: number;
|
|
227
|
+
}
|
|
228
|
+
export interface SemanticDriftReport {
|
|
229
|
+
addedFiles: string[];
|
|
230
|
+
removedFiles: string[];
|
|
231
|
+
modifiedFiles: FileStructuralDiff[];
|
|
232
|
+
}
|
|
233
|
+
export interface ReachabilityHop {
|
|
234
|
+
parentDest: string;
|
|
235
|
+
rawRef: string;
|
|
236
|
+
}
|
|
237
|
+
export interface DependencyTreeNode {
|
|
238
|
+
path: string;
|
|
239
|
+
size: number;
|
|
240
|
+
isEntrypoint: boolean;
|
|
241
|
+
isBoundaryTerminal?: boolean;
|
|
242
|
+
direction?: "downstream" | "upstream";
|
|
243
|
+
category?: DocumentCategory;
|
|
244
|
+
children: DependencyTreeNode[];
|
|
245
|
+
}
|
|
246
|
+
export interface LinkRewriteRecord {
|
|
247
|
+
file: string;
|
|
248
|
+
line: number;
|
|
249
|
+
column: number;
|
|
250
|
+
originalHref: string;
|
|
251
|
+
rewrittenHref: string;
|
|
252
|
+
targetBundleDest?: string;
|
|
253
|
+
linkKind: "inline" | "reference-def";
|
|
254
|
+
}
|
|
255
|
+
export interface PlannedArchiveEntry {
|
|
256
|
+
source: string;
|
|
257
|
+
dest: string;
|
|
258
|
+
size: number;
|
|
259
|
+
sha256: string;
|
|
260
|
+
}
|
|
261
|
+
export interface PackOptions {
|
|
262
|
+
force?: boolean;
|
|
263
|
+
dryRun?: boolean;
|
|
264
|
+
json?: boolean;
|
|
265
|
+
diff?: boolean;
|
|
266
|
+
topic?: string;
|
|
267
|
+
treeShake?: boolean;
|
|
268
|
+
lockfileMode?: LockfileMode;
|
|
269
|
+
}
|
|
270
|
+
export interface LinkDiagnostic {
|
|
271
|
+
file: string;
|
|
272
|
+
line: number;
|
|
273
|
+
column?: number;
|
|
274
|
+
originalHref: string;
|
|
275
|
+
rewrittenHref?: string;
|
|
276
|
+
targetBundleDest?: string;
|
|
277
|
+
severity: "info" | "warning" | "error";
|
|
278
|
+
message: string;
|
|
279
|
+
suggestedTarget?: string;
|
|
280
|
+
linkKind?: "inline" | "reference-def";
|
|
281
|
+
}
|
|
282
|
+
export interface FreshnessResult {
|
|
283
|
+
isFresh: boolean;
|
|
284
|
+
currentAggregateHash: string;
|
|
285
|
+
lockAggregateHash?: string;
|
|
286
|
+
added: string[];
|
|
287
|
+
removed: string[];
|
|
288
|
+
modified: string[];
|
|
289
|
+
semanticDiff?: SemanticDriftReport;
|
|
290
|
+
}
|
|
291
|
+
export interface PackResult {
|
|
292
|
+
outputPath: string;
|
|
293
|
+
filesCount: number;
|
|
294
|
+
totalSizeBytes: number;
|
|
295
|
+
aggregateHash: string;
|
|
296
|
+
diagnostics: LinkDiagnostic[];
|
|
297
|
+
skipped: boolean;
|
|
298
|
+
topic?: string;
|
|
299
|
+
phase?: TopicWorkPhase;
|
|
300
|
+
author?: string;
|
|
301
|
+
dryRun?: boolean;
|
|
302
|
+
eliminatedFiles?: string[];
|
|
303
|
+
boundaryTerminals?: string[];
|
|
304
|
+
upstreamNodes?: string[];
|
|
305
|
+
direction?: TraversalDirection;
|
|
306
|
+
categoryBreakdown?: Record<string, number>;
|
|
307
|
+
plannedEntries?: PlannedArchiveEntry[];
|
|
308
|
+
rewrites?: LinkRewriteRecord[];
|
|
309
|
+
predictedLockfile?: BundleLockfile;
|
|
310
|
+
freshness?: FreshnessResult;
|
|
311
|
+
unbundledDiagnostics?: LinkDiagnostic[];
|
|
312
|
+
}
|
|
313
|
+
export interface DryRunReport {
|
|
314
|
+
manifest: string;
|
|
315
|
+
bundleName: string;
|
|
316
|
+
bundleVersion: string;
|
|
317
|
+
outputPath: string;
|
|
318
|
+
format: "zip" | "directory";
|
|
319
|
+
topic?: string;
|
|
320
|
+
phase?: TopicWorkPhase;
|
|
321
|
+
author?: string;
|
|
322
|
+
dryRun: true;
|
|
323
|
+
skipped: boolean;
|
|
324
|
+
filesCount: number;
|
|
325
|
+
totalSizeBytes: number;
|
|
326
|
+
aggregateHash: string;
|
|
327
|
+
plannedEntries: PlannedArchiveEntry[];
|
|
328
|
+
rewrites: LinkRewriteRecord[];
|
|
329
|
+
diagnostics: LinkDiagnostic[];
|
|
330
|
+
unbundledDiagnostics: LinkDiagnostic[];
|
|
331
|
+
predictedLockfile: BundleLockfile;
|
|
332
|
+
freshness: FreshnessResult;
|
|
333
|
+
eliminatedFiles?: string[];
|
|
334
|
+
boundaryTerminals?: string[];
|
|
335
|
+
upstreamNodes?: string[];
|
|
336
|
+
direction?: TraversalDirection;
|
|
337
|
+
categoryBreakdown?: Record<string, number>;
|
|
338
|
+
}
|
|
339
|
+
export interface BundleManifestBom {
|
|
340
|
+
manifestName: string;
|
|
341
|
+
manifestVersion: string;
|
|
342
|
+
topic?: string;
|
|
343
|
+
topicPhase?: TopicWorkPhase;
|
|
344
|
+
topicAuthor?: string;
|
|
345
|
+
topicContext?: TopicContextConfig;
|
|
346
|
+
topicScope?: TopicScopeConfig;
|
|
347
|
+
direction?: TraversalDirection;
|
|
348
|
+
categoryBreakdown?: Record<string, number>;
|
|
349
|
+
generatedAt: string;
|
|
350
|
+
fileCount: number;
|
|
351
|
+
files: string[];
|
|
352
|
+
sourceToBundle: Record<string, string>;
|
|
353
|
+
bundleToSource: Record<string, string>;
|
|
354
|
+
}
|
|
355
|
+
export interface BundlePathResolution {
|
|
356
|
+
/** The resolved POSIX relative path inside the bundle (e.g. "scenario/docs/req.md") */
|
|
357
|
+
bundlePath: string;
|
|
358
|
+
/** The fragment anchor if present (e.g. "#user-profile"), or undefined */
|
|
359
|
+
anchor?: string;
|
|
360
|
+
/** The full rewritten reference including anchor (e.g. "scenario/docs/req.md#user-profile") */
|
|
361
|
+
fullReference: string;
|
|
362
|
+
/** Whether the target file actually exists in the bundle archive */
|
|
363
|
+
existsInBundle: boolean;
|
|
364
|
+
/** The original query string passed to resolve */
|
|
365
|
+
originalQuery: string;
|
|
366
|
+
/** If the file was not found, a suggested closest file candidate inside the bundle */
|
|
367
|
+
suggestedTarget?: string;
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oa-sdk/spec-bundler",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Declarative manifest-driven specification bundler with automated markdown link rewriting, deduplication, and lockfile freshness verification.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/mineclover/oa-sdk-releases.git"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=22"
|
|
18
|
+
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"spec-bundler": "./dist/cli.js",
|
|
21
|
+
"meta-bundler": "./dist/cli.js"
|
|
22
|
+
},
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"import": "./dist/index.js"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|