@delta-comic/model 0.0.0-semantically-released

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.
@@ -0,0 +1,2 @@
1
+ export * from './struct';
2
+ export * as uni from './model';
@@ -0,0 +1,49 @@
1
+ import { default as dayjs } from 'dayjs';
2
+ import { Component } from 'vue';
3
+ import { Item } from './item';
4
+ import { User } from './user';
5
+ import { SourcedKeyMap, Struct, MetaData, RStream } from '../struct';
6
+ export interface RawComment {
7
+ sender: User;
8
+ content: {
9
+ type: 'string' | 'html';
10
+ text: string;
11
+ };
12
+ time: number;
13
+ id: string;
14
+ childrenCount: number;
15
+ likeCount: number;
16
+ isLiked: boolean;
17
+ reported: boolean;
18
+ $$plugin: string;
19
+ $$meta?: MetaData;
20
+ isTop: boolean;
21
+ }
22
+ export type CommentRow = Component<{
23
+ comment: Comment;
24
+ item: Item;
25
+ parentComment?: Comment;
26
+ }>;
27
+ export declare abstract class Comment extends Struct<RawComment> implements RawComment {
28
+ static commentRow: import('vue').ShallowReactive<SourcedKeyMap<[plugin: string, name: string], CommentRow>>;
29
+ constructor(v: RawComment);
30
+ abstract sender: User;
31
+ content: {
32
+ type: 'string' | 'html';
33
+ text: string;
34
+ };
35
+ time: number;
36
+ get $time(): dayjs.Dayjs;
37
+ id: string;
38
+ childrenCount: number;
39
+ likeCount: number;
40
+ isTop: boolean;
41
+ isLiked: boolean;
42
+ reported: boolean;
43
+ $$plugin: string;
44
+ $$meta?: MetaData;
45
+ abstract like(signal?: AbortSignal): PromiseLike<boolean>;
46
+ abstract report(signal?: AbortSignal): PromiseLike<any>;
47
+ abstract sendComment(text: string, signal?: AbortSignal): PromiseLike<any>;
48
+ abstract children: RStream<Comment>;
49
+ }
@@ -0,0 +1,48 @@
1
+ import { AudioSrc, MediaSrc, TextTrackInit } from 'vidstack';
2
+ import { Component } from 'vue';
3
+ import { Image } from './image';
4
+ import { SourcedKeyMap, RStream, SourcedKeyType } from '../struct';
5
+ import * as comment from './comment';
6
+ import * as ep from './ep';
7
+ import * as item from './item';
8
+ export type PreloadValue = item.Item | undefined;
9
+ export type ContentPageLike = new (preload: PreloadValue, id: string, ep: string) => ContentPage;
10
+ export type ContentType_ = SourcedKeyType<typeof ContentPage.contentPage>;
11
+ export type ContentType = Exclude<ContentType_, string>;
12
+ export type ViewComp = Component<{
13
+ page: ContentPage;
14
+ isFullScreen: boolean;
15
+ }>;
16
+ export type ViewLayoutComp = Component<{
17
+ page: ContentPage;
18
+ }>;
19
+ export declare abstract class ContentPage<T extends object = any> {
20
+ id: string;
21
+ ep: string;
22
+ static viewLayout: import('vue').ShallowReactive<SourcedKeyMap<[plugin: string, name: string], ViewLayoutComp>>;
23
+ static contentPage: import('vue').ShallowReactive<SourcedKeyMap<[plugin: string, name: string], ContentPageLike>>;
24
+ constructor(preload: PreloadValue, id: string, ep: string);
25
+ abstract contentType: ContentType;
26
+ pid: import('..').PromiseWithResolvers<string>;
27
+ preload: import('vue').ShallowRef<PreloadValue, PreloadValue>;
28
+ detail: import('..').PromiseWithResolvers<item.Item>;
29
+ union: import('vue').ComputedRef<PreloadValue>;
30
+ recommends: import('..').PromiseWithResolvers<item.Item[]>;
31
+ abstract comments: RStream<comment.Comment>;
32
+ eps: import('..').PromiseWithResolvers<ep.Ep[]>;
33
+ abstract loadAll(signal?: AbortSignal): Promise<any>;
34
+ abstract reloadAll(signal?: AbortSignal): Promise<any>;
35
+ abstract plugin: string;
36
+ abstract loadAllOffline(save: T): Promise<any>;
37
+ abstract exportOffline(): Promise<T>;
38
+ abstract ViewComp: ViewComp;
39
+ }
40
+ export declare abstract class ContentImagePage extends ContentPage {
41
+ images: import('..').PromiseWithResolvers<Image[]>;
42
+ }
43
+ export type VideoConfig = {
44
+ textTrack?: TextTrackInit[];
45
+ } & Exclude<MediaSrc, string | AudioSrc>[];
46
+ export declare abstract class ContentVideoPage extends ContentPage {
47
+ videos: import('..').PromiseWithResolvers<VideoConfig>;
48
+ }
@@ -0,0 +1,8 @@
1
+ export declare abstract class Downloader {
2
+ abstract id: string;
3
+ abstract name: string;
4
+ abstract $$plugin: string;
5
+ abstract begin: () => void;
6
+ abstract resume: () => void;
7
+ abstract pause: () => void;
8
+ }
@@ -0,0 +1,14 @@
1
+ import { Struct, MetaData } from '../struct';
2
+ export interface RawEp {
3
+ name: string;
4
+ index: string;
5
+ $$plugin: string;
6
+ $$meta?: MetaData;
7
+ }
8
+ export declare class Ep extends Struct<RawEp> implements RawEp {
9
+ name: string;
10
+ index: string;
11
+ $$plugin: string;
12
+ $$meta?: MetaData;
13
+ constructor(v: RawEp);
14
+ }
@@ -0,0 +1,21 @@
1
+ import { MetaData } from '../struct';
2
+ import { Resource, RawResource, ProcessStep_ } from './resource';
3
+ export interface RawImage {
4
+ $$plugin: string;
5
+ $$meta?: MetaData;
6
+ path: string;
7
+ forkNamespace: string;
8
+ processSteps?: ProcessStep_[];
9
+ }
10
+ export declare class Image extends Resource {
11
+ static is(value: unknown): value is Image;
12
+ static create(v: RawResource | RawImage, aspect?: ImageAspect): Image;
13
+ protected constructor(v: RawResource | RawImage, aspect?: ImageAspect);
14
+ get aspect(): Partial<ImageAspect>;
15
+ set aspect(v: Partial<ImageAspect>);
16
+ }
17
+ export interface ImageAspect {
18
+ width: number;
19
+ height: number;
20
+ }
21
+ export type Image_ = string | Image;
@@ -0,0 +1,8 @@
1
+ export * as comment from './comment';
2
+ export * as content from './content';
3
+ export * as download from './download';
4
+ export * as ep from './ep';
5
+ export * as image from './image';
6
+ export * as item from './item';
7
+ export * as resource from './resource';
8
+ export * as user from './user';
@@ -0,0 +1,108 @@
1
+ import { default as dayjs } from 'dayjs';
2
+ import { Component } from 'vue';
3
+ import { RawResource } from './resource';
4
+ import { SourcedKeyMap, Struct, MetaData } from '../struct';
5
+ import { ContentType, ContentType_ } from './content';
6
+ import { Ep, RawEp } from './ep';
7
+ import * as image from './image';
8
+ export interface Category {
9
+ name: string;
10
+ group: string;
11
+ search: {
12
+ keyword: string;
13
+ source: string;
14
+ sort: string;
15
+ };
16
+ }
17
+ export interface Author {
18
+ label: string;
19
+ icon: RawResource | image.RawImage | string;
20
+ description: string;
21
+ /**
22
+ * 为空则不可订阅
23
+ * 否则传入的为`defineConfig`中定义的`subscribe.type`
24
+ */ subscribe?: string;
25
+ actions?: string[];
26
+ $$meta?: MetaData;
27
+ $$plugin: string;
28
+ }
29
+ export interface RawItem {
30
+ cover: RawResource | image.RawImage;
31
+ title: string;
32
+ id: string;
33
+ /** @alias tags */
34
+ categories: Category[];
35
+ author: Author[];
36
+ viewNumber?: number;
37
+ likeNumber?: number;
38
+ commentNumber?: number;
39
+ isLiked?: boolean;
40
+ updateTime?: number;
41
+ customIsAI?: boolean;
42
+ contentType: ContentType_;
43
+ length: string;
44
+ epLength: string;
45
+ $$plugin: string;
46
+ $$meta: MetaData;
47
+ description?: Description;
48
+ thisEp: RawEp;
49
+ commentSendable: boolean;
50
+ customIsSafe?: boolean;
51
+ }
52
+ export type ItemCardComp = Component<{
53
+ item: Item;
54
+ freeHeight?: boolean;
55
+ disabled?: boolean;
56
+ type?: 'default' | 'big' | 'small';
57
+ class?: any;
58
+ style?: any;
59
+ }, any, any, any, any, {
60
+ click: [];
61
+ }, {
62
+ default(): void;
63
+ smallTopInfo(): void;
64
+ cover(): void;
65
+ }>;
66
+ export type ItemTranslator = (raw: RawItem) => Item;
67
+ export type Description = string | {
68
+ type: 'html';
69
+ content: string;
70
+ } | {
71
+ type: 'text';
72
+ content: string;
73
+ };
74
+ export declare abstract class Item extends Struct<RawItem> implements RawItem {
75
+ static itemTranslator: import('vue').ShallowReactive<SourcedKeyMap<[plugin: string, name: string], ItemTranslator>>;
76
+ static create(raw: RawItem): Item;
77
+ static authorIcon: import('vue').ShallowReactive<SourcedKeyMap<[plugin: string, name: string], Component>>;
78
+ static itemCard: import('vue').ShallowReactive<SourcedKeyMap<[plugin: string, name: string], ItemCardComp>>;
79
+ abstract like(signal?: AbortSignal): PromiseLike<boolean>;
80
+ abstract report(signal?: AbortSignal): PromiseLike<any>;
81
+ abstract sendComment(text: string, signal?: AbortSignal): PromiseLike<any>;
82
+ static is(value: unknown): value is Item;
83
+ cover: RawResource | image.RawImage;
84
+ get $cover(): image.Image;
85
+ title: string;
86
+ id: string;
87
+ categories: Category[];
88
+ author: Author[];
89
+ viewNumber?: number;
90
+ likeNumber?: number;
91
+ commentNumber?: number;
92
+ isLiked?: boolean;
93
+ description?: Description;
94
+ updateTime?: number;
95
+ get $updateTime(): dayjs.Dayjs;
96
+ contentType: ContentType;
97
+ length: string;
98
+ epLength: string;
99
+ $$plugin: string;
100
+ $$meta: MetaData;
101
+ thisEp: RawEp;
102
+ customIsSafe?: boolean;
103
+ get $thisEp(): Ep;
104
+ constructor(v: RawItem);
105
+ commentSendable: boolean;
106
+ customIsAI?: boolean;
107
+ get $isAi(): boolean;
108
+ }
@@ -0,0 +1,36 @@
1
+ import { SourcedKeyMap, Struct, MetaData } from '../struct';
2
+ export type ProcessInstance = (nowPath: string, resource: Resource) => Promise<[path: string, exit: boolean]>;
3
+ export interface ProcessStep {
4
+ referenceName: string;
5
+ ignoreExit?: boolean;
6
+ }
7
+ export type ProcessStep_ = ProcessStep | string;
8
+ export interface ResourceType {
9
+ type: string;
10
+ urls: string[];
11
+ test: (url: string, signal: AbortSignal) => PromiseLike<void>;
12
+ }
13
+ export interface RawResource {
14
+ $$plugin: string;
15
+ $$meta?: MetaData;
16
+ pathname: string;
17
+ type: string;
18
+ processSteps?: ProcessStep_[];
19
+ }
20
+ export declare class Resource extends Struct<RawResource> implements RawResource {
21
+ static processInstances: import('vue').ShallowReactive<SourcedKeyMap<[plugin: string, referenceName: string], ProcessInstance>>;
22
+ static fork: import('vue').ShallowReactive<SourcedKeyMap<[plugin: string, type: string], ResourceType>>;
23
+ static precedenceFork: import('vue').ShallowReactive<SourcedKeyMap<[plugin: string, type: string], string>>;
24
+ static is(value: unknown): value is Resource;
25
+ static create(v: RawResource): Resource;
26
+ protected constructor(v: RawResource);
27
+ type: string;
28
+ pathname: string;
29
+ processSteps: ProcessStep[];
30
+ $$meta?: MetaData;
31
+ $$plugin: string;
32
+ getUrl(): Promise<string>;
33
+ omittedForks: import('vue').ShallowReactive<Set<string>>;
34
+ getThisFork(): string;
35
+ localChangeFork(): boolean;
36
+ }
@@ -0,0 +1,23 @@
1
+ import { Component } from 'vue';
2
+ import { RawResource } from './resource';
3
+ import { Image } from './image';
4
+ export interface RawUser {
5
+ avatar?: RawResource;
6
+ name: string;
7
+ id: string;
8
+ $$plugin: string;
9
+ }
10
+ export declare abstract class User {
11
+ static userBase: import('vue').ShallowReactive<Map<string, User>>;
12
+ static userEditorBase: import('vue').ShallowReactive<Map<string, Component>>;
13
+ constructor(v: RawUser);
14
+ avatar?: Image;
15
+ name: string;
16
+ id: string;
17
+ $$plugin: string;
18
+ abstract customUser: object;
19
+ }
20
+ export type UserCardComp = Component<{
21
+ user: User;
22
+ isSmall?: boolean;
23
+ }>;
@@ -0,0 +1,5 @@
1
+ export type MetaData = Record<string | number, any>;
2
+ export * from './promise';
3
+ export * from './store';
4
+ export * from './stream';
5
+ export * from './struct';
@@ -0,0 +1,49 @@
1
+ import { Raw } from 'vue';
2
+ type PromiseContentEmits<TR> = {
3
+ success: TR;
4
+ error: any;
5
+ finial: void;
6
+ };
7
+ /**
8
+ * 扩展内容的`Promise`,可视为普通`Promise`使用
9
+ */
10
+ export declare class PromiseContent<T, TPF extends any = T, TEmits extends PromiseContentEmits<TPF> = PromiseContentEmits<TPF>> implements PromiseLike<T> {
11
+ private promise;
12
+ private processor;
13
+ [Symbol.toStringTag]: string;
14
+ private static _this;
15
+ static isPromiseContent(value: unknown): value is PromiseContent<any>;
16
+ static fromPromise<T, TP = T>(promise: Promise<T>, processor?: (val: T) => TP): RPromiseContent<T, TP>;
17
+ /**
18
+ * 使用`PromiseContent.fromPromise`或`PromiseContent.fromAsyncFunction`代替`new PromiseContent`
19
+ */
20
+ private constructor();
21
+ loadPromise(promise: Promise<T>): Promise<void>;
22
+ private emitter;
23
+ onError(processor: (err: TEmits['error']) => any): () => void;
24
+ onSuccess(processor: (err: TEmits['success']) => any): () => void;
25
+ onFinal(processor: (err: TEmits['finial']) => any): () => void;
26
+ /**
27
+ * 对`this.data.value`做出处理,多次调用仅最后一次生效
28
+ */
29
+ setProcessor<TP>(processor: (val: T) => TP): RPromiseContent<T, TP>;
30
+ catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null): Promise<T | TResult>;
31
+ then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
32
+ finally(onfinally?: (() => void) | null): Promise<T>;
33
+ data: import('vue').ShallowRef<TPF | undefined, TPF | undefined>;
34
+ isLoading: import('vue').ShallowRef<boolean, boolean>;
35
+ isError: import('vue').ShallowRef<boolean, boolean>;
36
+ errorCause: import('vue').ShallowRef<Error | undefined, Error | undefined>;
37
+ isEmpty: import('vue').ShallowRef<boolean, boolean>;
38
+ static fromAsyncFunction<T extends (...args: any[]) => Promise<any>>(asyncFunction: T): (...args: Parameters<T>) => RPromiseContent<Awaited<ReturnType<T>>>;
39
+ static resolve<T>(data: T): RPromiseContent<Awaited<T>, Awaited<T>>;
40
+ static withResolvers<T>(isLoading?: boolean): PromiseWithResolvers<T>;
41
+ }
42
+ export type PromiseWithResolvers<T> = {
43
+ content: RPromiseContent<T>;
44
+ reject: (reason?: any) => void;
45
+ resolve: (value: T | PromiseLike<T>) => void;
46
+ reset: (isLoading?: boolean) => void;
47
+ };
48
+ export type RPromiseContent<T, PTF = T> = Raw<PromiseContent<T, PTF>>;
49
+ export {};
@@ -0,0 +1,33 @@
1
+ /**
2
+ * 比如有很多需要注明来自哪个插件的值都可以用
3
+ */
4
+ export declare class SourcedValue<T extends [string, string]> {
5
+ separator: string;
6
+ toJSON(value: T | string): T;
7
+ parse(value: string): T;
8
+ toString(value: T | string): string;
9
+ stringify(value: T): string;
10
+ constructor(separator?: string);
11
+ }
12
+ export type SourcedKeyType<T extends SourcedKeyMap<[string, string], any> | SourcedValue<any>> = T extends SourcedKeyMap<[string, string], any> ? Parameters<T['get']>[0] : Parameters<T['toJSON']>[0];
13
+ /**
14
+ * 相比较于普通的Map,这个元素的key操作可以是`TKey | string`
15
+ * _但内部保存仍使用`SourcedValue.toString`作为key_
16
+ */
17
+ export declare class SourcedKeyMap<TKey extends [string, string], TValue> extends SourcedValue<TKey> implements Map<string, TValue> {
18
+ static create<TKey extends [string, string], TValue>(separator?: string): import('vue').ShallowReactive<SourcedKeyMap<TKey, TValue>>;
19
+ private constructor();
20
+ private store;
21
+ get size(): number;
22
+ [Symbol.toStringTag]: string;
23
+ clear(): void;
24
+ delete(key: string | TKey): boolean;
25
+ forEach(callbackfn: (value: TValue, key: string, map: Map<string, TValue>) => void, thisArg?: any): void;
26
+ get(key: string | TKey): TValue | undefined;
27
+ has(key: string | TKey): boolean;
28
+ set(key: string | TKey, value: TValue): this;
29
+ entries(): MapIterator<[string, TValue]>;
30
+ keys(): MapIterator<string>;
31
+ values(): MapIterator<TValue>;
32
+ [Symbol.iterator](): MapIterator<[string, TValue]>;
33
+ }
@@ -0,0 +1,80 @@
1
+ import { Raw, Ref } from 'vue';
2
+ type RawGenerator<T> = (abortSignal: AbortSignal, that: Stream<T>) => IterableIterator<T[], void, Stream<T>> | AsyncIterableIterator<T[], void, Stream<T>>;
3
+ /**
4
+ * _(网络)_ 数据流
5
+ */
6
+ export type RStream<T> = Raw<Stream<T>>;
7
+ /**
8
+ * 可迭代 _(网络)_ 数据流
9
+ */
10
+ export declare class Stream<T> implements AsyncIterableIterator<T[], void> {
11
+ /**
12
+ * 使用`Stream.create`代替`new Stream`
13
+ */
14
+ private constructor();
15
+ private static _this;
16
+ static isStream(stream: any): stream is Stream<any>;
17
+ static create<T>(generator: RawGenerator<T>): RStream<T>;
18
+ [x: symbol]: any;
19
+ private abortController;
20
+ private generator;
21
+ private _setupData;
22
+ /** 初始存在的数据(置顶) */
23
+ setupData(data: T[]): this;
24
+ next(igRequesting?: boolean): Promise<IteratorResult<T[], void>>;
25
+ return(): Promise<IteratorResult<T[], void>>;
26
+ throw(e?: any): Promise<IteratorResult<T[], void>>;
27
+ /** 重置 */
28
+ reset(): void;
29
+ /** 重试 */
30
+ retry(): Promise<IteratorResult<T[], void>>;
31
+ /** 一次性全部加载 */
32
+ nextToDone(): Promise<T[]>;
33
+ /** 停止正在进行的请求 */
34
+ stop(): void;
35
+ [Symbol.asyncIterator](): this;
36
+ /** 错误(如果有) */
37
+ error: import('vue').ShallowRef<void | Error | undefined, void | Error | undefined>;
38
+ /** 数据 */
39
+ data: Ref<T[]>;
40
+ /** 数据 */
41
+ get _data(): T[];
42
+ /** 当前页 */
43
+ page: import('vue').ShallowRef<number, number>;
44
+ /** 当前页 */
45
+ get _page(): number;
46
+ /** 总页数 */
47
+ pages: import('vue').ShallowRef<number, number>;
48
+ /** 总页数 */
49
+ get _pages(): number;
50
+ /** 总条目数 */
51
+ total: import('vue').ShallowRef<number, number>;
52
+ /** 总条目数 */
53
+ get _total(): number;
54
+ /** 单页条目数 */
55
+ pageSize: import('vue').ShallowRef<number, number>;
56
+ /** 单页条目数 */
57
+ get _pageSize(): number;
58
+ /** 数据当前总数 */
59
+ length: import('vue').ComputedRef<number>;
60
+ /** 数据当前总数 */
61
+ get _length(): number;
62
+ /** 是否正在网络请求 */
63
+ isRequesting: import('vue').ShallowRef<boolean, boolean>;
64
+ /** 是否正在网络请求 */
65
+ get _isRequesting(): boolean;
66
+ /** 是否全部获取完成 */
67
+ isDone: import('vue').ShallowRef<boolean, boolean>;
68
+ /** 是否全部获取完成 */
69
+ get _isDone(): boolean;
70
+ /** 是否无结果 */
71
+ isNoData: import('vue').ComputedRef<boolean>;
72
+ /** 是否无结果 */
73
+ get _isNoData(): boolean;
74
+ /** 是否当前为空 */
75
+ isEmpty: import('vue').ComputedRef<boolean>;
76
+ /** 是否当前为空 */
77
+ get _isEmpty(): boolean;
78
+ }
79
+ export declare const callbackToPromise: <T = void>(fn: (resolve: (result: T | PromiseLike<T>) => void) => any) => Promise<T>;
80
+ export {};
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 可以结构化的数据,调用`toJSON`获取纯粹的json(没有get/set或method)
3
+ */
4
+ export declare class Struct<TRaw extends object> {
5
+ protected $$raw: TRaw;
6
+ toJSON(): TRaw;
7
+ /**
8
+ * @param $$raw 一个纯粹json对象,不可以是高级对象
9
+ */
10
+ constructor($$raw: TRaw);
11
+ static toRaw<T extends object, TRaw = T extends Struct<infer TR> ? TR : T>(item: T): TRaw;
12
+ }
package/dist/pack.tgz ADDED
Binary file
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@delta-comic/model",
3
+ "version": "0.0.0-semantically-released",
4
+ "description": "空阙虱楼",
5
+ "homepage": "https://github.com/delta-comic/delta-comic-core",
6
+ "license": "AGPL-3.0-only",
7
+ "author": {
8
+ "name": "wenxig",
9
+ "email": "wenxinguo12@gmail.com"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/delta-comic/delta-comic-core.git"
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "type": "module",
19
+ "main": "./dist/index.js",
20
+ "module": "./dist/index.js",
21
+ "types": "./dist/lib/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/lib/index.d.ts",
25
+ "import": "./dist/index.js",
26
+ "require": "./dist/index.cjs"
27
+ }
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "dependencies": {
33
+ "@vueuse/core": "^14.2.1",
34
+ "dayjs": "^1.11.19",
35
+ "mitt": "^3.0.1",
36
+ "vidstack": "^1.12.13",
37
+ "@delta-comic/utils": "0.0.0-semantically-released",
38
+ "@delta-comic/request": "0.0.0-semantically-released"
39
+ },
40
+ "peerDependencies": {
41
+ "vue": "^3.5"
42
+ },
43
+ "release": {
44
+ "extends": "../../release.config.js",
45
+ "tagFormat": "model-${version}"
46
+ },
47
+ "dist": {
48
+ "tarball": "./dist/pack.tgz"
49
+ },
50
+ "readme": "./README.md",
51
+ "scripts": {
52
+ "build": "vite build && pnpm pack --out ./dist/pack.tgz"
53
+ }
54
+ }