@kingteza/crud-component 1.43.0 → 1.44.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react/jsx-runtime"),d=require("@ant-design/icons"),F=require("antd"),
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react/jsx-runtime"),d=require("@ant-design/icons"),F=require("antd"),k=require("mime"),c=require("react"),Q=require("../locale/index.cjs.js"),X=require("../util/ValidationUtil.cjs.js"),q=require("../common/button/Button.cjs.js"),Y=require("../common/layout/VerticalSpace.cjs.js"),Z=require("../util/CrudUtil.cjs.js"),B=require("../util/ImageUtil.cjs.js");function v({name:n,label:e,required:l,provider:s,onUploading:a,onRemoved:f,fieldClassName:j,accept:O,rules:U,maxCount:b=1,block:_,fieldHelper:$,formLayoutProps:H,preprocessBeforeUpload:w,...R}){const h=F.Form.useFormInstance(),A=Z.getRealName(n,"upsertFieldName"),x=F.Form.useWatch(A,h),[V,p]=c.useState(!1),[S,L]=c.useState(!1),W=c.useCallback(async r=>{var o,u;try{const{file:i}=r,C=i.name;p(!0),L(!0),a==null||a(!0);const P=C??"",D=P.split("."),G=D[D.length-1],J=s.generateFileName(P),K=`${await s.getInitialPath()}/${J}.${G}`;let I=i;w&&(typeof w=="function"?I=await w(i):w.compressImage&&(I=await B.resizeImage(i)));const N=await s.upload({...i,originFileObj:I},K);a==null||a(!1),h.setFieldValue(n,N),(o=r.onSuccess)==null||o.call(r,N)}catch(i){(u=r.onError)==null||u.call(r,i)}finally{p(!1)}},[h,n,a,s]),[g,M]=c.useState([]);c.useEffect(()=>{!S&&x&&Promise.all((Array.isArray(x)?x:[x]).map(async r=>{const o=k.getType(r),u=r.split("/").pop(),i=await s.getRealUrl(r);return{uid:r,url:i,type:o,name:u}})).then(r=>M(()=>r.map(({url:u,type:i,uid:C,name:P})=>({uid:C,url:u,type:i,response:C,thumbUrl:u,name:P}))))},[x,S,V,s]);const z=c.useCallback(async r=>{const o=r.response,u=o||h.getFieldValue(n);await s.delete(u),f==null||f(),r&&h.setFieldsValue({[n]:null})},[h,n,f,s]);return t.jsxs(F.Form.Item,{label:e,required:l,name:n,...H,className:j,rules:[...l?X.required(e):[],...U??[]],help:$,children:[t.jsx("input",{hidden:!0}),t.jsx(F.Upload,{...R,fileList:g,className:((g==null?void 0:g.length)??0)>=b?"hide-upload":"",maxCount:b,customRequest:W,onRemove:z,listType:"picture",onChange:({fileList:r})=>{M(r)},style:_?{width:"100%"}:void 0,children:t.jsx(q,{loading:V,children:"Upload File"})})]})}const y=({provider:n,value:e})=>{const[l,s]=c.useState();return c.useEffect(()=>{e&&n.getRealUrl(e).then(a=>{s({mimeType:k.getType(e),url:a,fileName:e.split("/").pop()??e})})},[n,e]),l?t.jsx(E,{fileName:l.fileName,url:l==null?void 0:l.url,mimeType:l==null?void 0:l.mimeType}):t.jsx(t.Fragment,{})},E=({url:n,mimeType:e="",fileName:l})=>{const s=c.useMemo(()=>e!=null&&e.includes("image")?"image":e!=null&&e.includes("pdf")?"pdf":e!=null&&e.includes("word")?"word":e!=null&&e.includes("text")?"text":e!=null&&e.includes("presentation")?"presentation":e!=null&&e.includes("excel")||e!=null&&e.includes("spreadsheet")?"excel":"file",[e]),a=c.useMemo(()=>{switch(s){case"image":return t.jsx(d.FileImageOutlined,{});case"pdf":return t.jsx(d.FilePdfOutlined,{});case"word":return t.jsx(d.FileWordOutlined,{});case"text":return t.jsx(d.FileTextOutlined,{});case"excel":return t.jsx(d.FileExcelOutlined,{});case"presentation":return t.jsx(d.FilePptOutlined,{});default:return t.jsx(d.FileOutlined,{})}},[s]),[f,j]=c.useState(!1),{t:O}=Q.useTranslationLib();return s!=="file"&&s!=="text"?t.jsxs(t.Fragment,{children:[t.jsx(F.Modal,{open:f,title:l,onCancel:()=>j(!1),footer:t.jsx(t.Fragment,{}),width:"100%",style:{top:"8px",minHeight:"700px"},destroyOnHidden:!0,children:t.jsxs(Y,{children:[t.jsx(q,{tooltip:l,icon:t.jsx(d.ExportOutlined,{}),target:"_blank",href:n,style:{textDecoration:"none"},children:O("str.openInNewTab")}),s==="image"?t.jsx("img",{src:n,alt:l,style:{width:"100%"}}):s==="pdf"?t.jsxs("iframe",{title:l,src:n,width:"100%",height:"700px",children:["This browser does not support PDFs. Please download the PDF to view it:",t.jsx("a",{href:n,children:"Download PDF"})]}):t.jsxs("iframe",{title:l,src:`https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(n)}`,width:"100%",height:"700px",children:["This browser does not support open ",s.toUpperCase(),". Please download the",s.toUpperCase()," to view it:",t.jsxs("a",{href:n,children:["Download ",s.toUpperCase()]}),"."]})]})}),t.jsx(q,{tooltip:l,icon:a,shape:"circle",onClick:()=>j(!0)})]}):t.jsx(q,{tooltip:l,icon:a,target:"_blank",href:n,shape:"circle"})};exports.FileCellValue=E;exports.FileCrudCellValue=y;exports.default=v;
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { FC, ReactNode } from 'react';
|
|
2
2
|
import { InitialCrudField } from './CrudComponent';
|
|
3
3
|
import { FileDownloadProvider, FileUploadProvider } from './ImageCrudField';
|
|
4
|
+
import { RcFile } from 'antd/es/upload';
|
|
4
5
|
export interface FileCrudField<T> extends _FileCrudField<T> {
|
|
5
6
|
type: "file";
|
|
6
7
|
}
|
|
7
8
|
export interface _FileCrudField<T> extends InitialCrudField<T> {
|
|
8
9
|
provider: FileUploadProvider;
|
|
9
10
|
onUploading?: (isUploading: boolean) => void;
|
|
11
|
+
preprocessBeforeUpload?: {
|
|
12
|
+
compressImage?: boolean;
|
|
13
|
+
} | ((file: RcFile) => Promise<RcFile>);
|
|
10
14
|
onRemoved?: () => void;
|
|
11
15
|
fieldClassName?: string;
|
|
12
16
|
accept?: string;
|
|
@@ -14,7 +18,7 @@ export interface _FileCrudField<T> extends InitialCrudField<T> {
|
|
|
14
18
|
block?: boolean;
|
|
15
19
|
help?: ReactNode;
|
|
16
20
|
}
|
|
17
|
-
export default function FileCrudFieldComponent<T>({ name, label, required, provider, onUploading, onRemoved, fieldClassName, accept, rules, maxCount, block, fieldHelper: help, formLayoutProps, ...props }: Readonly<_FileCrudField<T>>): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export default function FileCrudFieldComponent<T>({ name, label, required, provider, onUploading, onRemoved, fieldClassName, accept, rules, maxCount, block, fieldHelper: help, formLayoutProps, preprocessBeforeUpload, ...props }: Readonly<_FileCrudField<T>>): import("react/jsx-runtime").JSX.Element;
|
|
18
22
|
export declare const FileCrudCellValue: FC<{
|
|
19
23
|
value: string;
|
|
20
24
|
provider: FileDownloadProvider;
|
|
@@ -1,173 +1,178 @@
|
|
|
1
|
-
import { jsxs as f, jsx as s, Fragment as
|
|
2
|
-
import { FileOutlined as
|
|
3
|
-
import { Form as
|
|
4
|
-
import
|
|
5
|
-
import { useState as
|
|
6
|
-
import { useTranslationLib as
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
|
|
1
|
+
import { jsxs as f, jsx as s, Fragment as b } from "react/jsx-runtime";
|
|
2
|
+
import { FileOutlined as Z, FilePptOutlined as B, FileExcelOutlined as m, FileTextOutlined as v, FileWordOutlined as y, FilePdfOutlined as T, FileImageOutlined as tt, ExportOutlined as et } from "@ant-design/icons";
|
|
3
|
+
import { Form as O, Upload as st, Modal as lt } from "antd";
|
|
4
|
+
import S from "mime";
|
|
5
|
+
import { useState as w, useCallback as j, useEffect as A, useMemo as H } from "react";
|
|
6
|
+
import { useTranslationLib as rt } from "../locale/index.es.js";
|
|
7
|
+
import nt from "../util/ValidationUtil.es.js";
|
|
8
|
+
import P from "../common/button/Button.es.js";
|
|
9
|
+
import at from "../common/layout/VerticalSpace.es.js";
|
|
10
|
+
import it from "../util/CrudUtil.es.js";
|
|
11
|
+
import ct from "../util/ImageUtil.es.js";
|
|
12
|
+
function It({
|
|
12
13
|
name: n,
|
|
13
14
|
label: t,
|
|
14
|
-
required:
|
|
15
|
+
required: l,
|
|
15
16
|
provider: e,
|
|
16
17
|
onUploading: a,
|
|
17
18
|
onRemoved: u,
|
|
18
19
|
fieldClassName: F,
|
|
19
|
-
accept:
|
|
20
|
-
rules:
|
|
21
|
-
maxCount:
|
|
22
|
-
block:
|
|
23
|
-
fieldHelper:
|
|
24
|
-
formLayoutProps:
|
|
25
|
-
|
|
20
|
+
accept: V,
|
|
21
|
+
rules: L,
|
|
22
|
+
maxCount: D = 1,
|
|
23
|
+
block: W,
|
|
24
|
+
fieldHelper: _,
|
|
25
|
+
formLayoutProps: q,
|
|
26
|
+
preprocessBeforeUpload: p,
|
|
27
|
+
...z
|
|
26
28
|
}) {
|
|
27
|
-
const d =
|
|
28
|
-
async (
|
|
29
|
-
var o,
|
|
29
|
+
const d = O.useFormInstance(), R = it.getRealName(n, "upsertFieldName"), h = O.useWatch(R, d), [N, k] = w(!1), [E, G] = w(!1), J = j(
|
|
30
|
+
async (r) => {
|
|
31
|
+
var o, c;
|
|
30
32
|
try {
|
|
31
|
-
const { file:
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
const { file: i } = r, x = i.name;
|
|
34
|
+
k(!0), G(!0), a == null || a(!0);
|
|
35
|
+
const C = x ?? "", U = C.split("."), Q = U[U.length - 1], X = e.generateFileName(C), Y = `${await e.getInitialPath()}/${X}.${Q}`;
|
|
36
|
+
let I = i;
|
|
37
|
+
p && (typeof p == "function" ? I = await p(i) : p.compressImage && (I = await ct.resizeImage(i)));
|
|
38
|
+
const $ = await e.upload(
|
|
39
|
+
{ ...i, originFileObj: I },
|
|
40
|
+
Y
|
|
36
41
|
);
|
|
37
|
-
a == null || a(!1), d.setFieldValue(n,
|
|
38
|
-
} catch (
|
|
39
|
-
(
|
|
42
|
+
a == null || a(!1), d.setFieldValue(n, $), (o = r.onSuccess) == null || o.call(r, $);
|
|
43
|
+
} catch (i) {
|
|
44
|
+
(c = r.onError) == null || c.call(r, i);
|
|
40
45
|
} finally {
|
|
41
|
-
|
|
46
|
+
k(!1);
|
|
42
47
|
}
|
|
43
48
|
},
|
|
44
49
|
[d, n, a, e]
|
|
45
|
-
), [
|
|
46
|
-
|
|
47
|
-
!
|
|
50
|
+
), [g, M] = w([]);
|
|
51
|
+
A(() => {
|
|
52
|
+
!E && h && Promise.all(
|
|
48
53
|
(Array.isArray(h) ? h : [h]).map(
|
|
49
|
-
async (
|
|
50
|
-
const o =
|
|
54
|
+
async (r) => {
|
|
55
|
+
const o = S.getType(r), c = r.split("/").pop(), i = await e.getRealUrl(r);
|
|
51
56
|
return {
|
|
52
|
-
uid:
|
|
53
|
-
url:
|
|
57
|
+
uid: r,
|
|
58
|
+
url: i,
|
|
54
59
|
type: o,
|
|
55
|
-
name:
|
|
60
|
+
name: c
|
|
56
61
|
};
|
|
57
62
|
}
|
|
58
63
|
)
|
|
59
|
-
).then((
|
|
60
|
-
}, [h,
|
|
61
|
-
const
|
|
62
|
-
async (
|
|
63
|
-
const o =
|
|
64
|
-
await e.delete(
|
|
64
|
+
).then((r) => M(() => r.map(({ url: c, type: i, uid: x, name: C }) => ({ uid: x, url: c, type: i, response: x, thumbUrl: c, name: C }))));
|
|
65
|
+
}, [h, E, N, e]);
|
|
66
|
+
const K = j(
|
|
67
|
+
async (r) => {
|
|
68
|
+
const o = r.response, c = o || d.getFieldValue(n);
|
|
69
|
+
await e.delete(c), u == null || u(), r && d.setFieldsValue({ [n]: null });
|
|
65
70
|
},
|
|
66
71
|
[d, n, u, e]
|
|
67
72
|
);
|
|
68
73
|
return /* @__PURE__ */ f(
|
|
69
|
-
|
|
74
|
+
O.Item,
|
|
70
75
|
{
|
|
71
76
|
label: t,
|
|
72
|
-
required:
|
|
77
|
+
required: l,
|
|
73
78
|
name: n,
|
|
74
|
-
...
|
|
79
|
+
...q,
|
|
75
80
|
className: F,
|
|
76
81
|
rules: [
|
|
77
|
-
...
|
|
78
|
-
...
|
|
82
|
+
...l ? nt.required(t) : [],
|
|
83
|
+
...L ?? []
|
|
79
84
|
],
|
|
80
|
-
help:
|
|
85
|
+
help: _,
|
|
81
86
|
children: [
|
|
82
87
|
/* @__PURE__ */ s("input", { hidden: !0 }),
|
|
83
88
|
/* @__PURE__ */ s(
|
|
84
|
-
|
|
89
|
+
st,
|
|
85
90
|
{
|
|
86
|
-
...
|
|
87
|
-
fileList:
|
|
88
|
-
className: ((
|
|
89
|
-
maxCount:
|
|
90
|
-
customRequest:
|
|
91
|
-
onRemove:
|
|
91
|
+
...z,
|
|
92
|
+
fileList: g,
|
|
93
|
+
className: ((g == null ? void 0 : g.length) ?? 0) >= D ? "hide-upload" : "",
|
|
94
|
+
maxCount: D,
|
|
95
|
+
customRequest: J,
|
|
96
|
+
onRemove: K,
|
|
92
97
|
listType: "picture",
|
|
93
|
-
onChange: ({ fileList:
|
|
94
|
-
|
|
98
|
+
onChange: ({ fileList: r }) => {
|
|
99
|
+
M(r);
|
|
95
100
|
},
|
|
96
|
-
style:
|
|
97
|
-
children: /* @__PURE__ */ s(
|
|
101
|
+
style: W ? { width: "100%" } : void 0,
|
|
102
|
+
children: /* @__PURE__ */ s(P, { loading: N, children: "Upload File" })
|
|
98
103
|
}
|
|
99
104
|
)
|
|
100
105
|
]
|
|
101
106
|
}
|
|
102
107
|
);
|
|
103
108
|
}
|
|
104
|
-
const
|
|
105
|
-
const [
|
|
106
|
-
return
|
|
109
|
+
const Ot = ({ provider: n, value: t }) => {
|
|
110
|
+
const [l, e] = w();
|
|
111
|
+
return A(() => {
|
|
107
112
|
t && n.getRealUrl(t).then((a) => {
|
|
108
113
|
e({
|
|
109
|
-
mimeType:
|
|
114
|
+
mimeType: S.getType(t),
|
|
110
115
|
url: a,
|
|
111
116
|
fileName: t.split("/").pop() ?? t
|
|
112
117
|
});
|
|
113
118
|
});
|
|
114
|
-
}, [n, t]),
|
|
115
|
-
|
|
119
|
+
}, [n, t]), l ? /* @__PURE__ */ s(
|
|
120
|
+
ot,
|
|
116
121
|
{
|
|
117
|
-
fileName:
|
|
118
|
-
url:
|
|
119
|
-
mimeType:
|
|
122
|
+
fileName: l.fileName,
|
|
123
|
+
url: l == null ? void 0 : l.url,
|
|
124
|
+
mimeType: l == null ? void 0 : l.mimeType
|
|
120
125
|
}
|
|
121
|
-
) : /* @__PURE__ */ s(
|
|
122
|
-
},
|
|
123
|
-
const e =
|
|
126
|
+
) : /* @__PURE__ */ s(b, {});
|
|
127
|
+
}, ot = ({ url: n, mimeType: t = "", fileName: l }) => {
|
|
128
|
+
const e = H(() => t != null && t.includes("image") ? "image" : t != null && t.includes("pdf") ? "pdf" : t != null && t.includes("word") ? "word" : t != null && t.includes("text") ? "text" : t != null && t.includes("presentation") ? "presentation" : t != null && t.includes("excel") || t != null && t.includes("spreadsheet") ? "excel" : "file", [t]), a = H(() => {
|
|
124
129
|
switch (e) {
|
|
125
130
|
case "image":
|
|
126
|
-
return /* @__PURE__ */ s(
|
|
131
|
+
return /* @__PURE__ */ s(tt, {});
|
|
127
132
|
case "pdf":
|
|
128
|
-
return /* @__PURE__ */ s(
|
|
133
|
+
return /* @__PURE__ */ s(T, {});
|
|
129
134
|
case "word":
|
|
130
|
-
return /* @__PURE__ */ s(
|
|
135
|
+
return /* @__PURE__ */ s(y, {});
|
|
131
136
|
case "text":
|
|
132
|
-
return /* @__PURE__ */ s(
|
|
137
|
+
return /* @__PURE__ */ s(v, {});
|
|
133
138
|
case "excel":
|
|
134
|
-
return /* @__PURE__ */ s(
|
|
139
|
+
return /* @__PURE__ */ s(m, {});
|
|
135
140
|
case "presentation":
|
|
136
|
-
return /* @__PURE__ */ s(
|
|
141
|
+
return /* @__PURE__ */ s(B, {});
|
|
137
142
|
default:
|
|
138
|
-
return /* @__PURE__ */ s(
|
|
143
|
+
return /* @__PURE__ */ s(Z, {});
|
|
139
144
|
}
|
|
140
|
-
}, [e]), [u, F] =
|
|
141
|
-
return e !== "file" && e !== "text" ? /* @__PURE__ */ f(
|
|
145
|
+
}, [e]), [u, F] = w(!1), { t: V } = rt();
|
|
146
|
+
return e !== "file" && e !== "text" ? /* @__PURE__ */ f(b, { children: [
|
|
142
147
|
/* @__PURE__ */ s(
|
|
143
|
-
|
|
148
|
+
lt,
|
|
144
149
|
{
|
|
145
150
|
open: u,
|
|
146
|
-
title:
|
|
151
|
+
title: l,
|
|
147
152
|
onCancel: () => F(!1),
|
|
148
|
-
footer: /* @__PURE__ */ s(
|
|
153
|
+
footer: /* @__PURE__ */ s(b, {}),
|
|
149
154
|
width: "100%",
|
|
150
155
|
style: { top: "8px", minHeight: "700px" },
|
|
151
156
|
destroyOnHidden: !0,
|
|
152
|
-
children: /* @__PURE__ */ f(
|
|
157
|
+
children: /* @__PURE__ */ f(at, { children: [
|
|
153
158
|
/* @__PURE__ */ s(
|
|
154
|
-
|
|
159
|
+
P,
|
|
155
160
|
{
|
|
156
|
-
tooltip:
|
|
157
|
-
icon: /* @__PURE__ */ s(
|
|
161
|
+
tooltip: l,
|
|
162
|
+
icon: /* @__PURE__ */ s(et, {}),
|
|
158
163
|
target: "_blank",
|
|
159
164
|
href: n,
|
|
160
165
|
style: { textDecoration: "none" },
|
|
161
|
-
children:
|
|
166
|
+
children: V("str.openInNewTab")
|
|
162
167
|
}
|
|
163
168
|
),
|
|
164
|
-
e === "image" ? /* @__PURE__ */ s("img", { src: n, alt:
|
|
169
|
+
e === "image" ? /* @__PURE__ */ s("img", { src: n, alt: l, style: { width: "100%" } }) : e === "pdf" ? /* @__PURE__ */ f("iframe", { title: l, src: n, width: "100%", height: "700px", children: [
|
|
165
170
|
"This browser does not support PDFs. Please download the PDF to view it:",
|
|
166
171
|
/* @__PURE__ */ s("a", { href: n, children: "Download PDF" })
|
|
167
172
|
] }) : /* @__PURE__ */ f(
|
|
168
173
|
"iframe",
|
|
169
174
|
{
|
|
170
|
-
title:
|
|
175
|
+
title: l,
|
|
171
176
|
src: `https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(
|
|
172
177
|
n
|
|
173
178
|
)}`,
|
|
@@ -191,18 +196,18 @@ const gt = ({ provider: n, value: t }) => {
|
|
|
191
196
|
}
|
|
192
197
|
),
|
|
193
198
|
/* @__PURE__ */ s(
|
|
194
|
-
|
|
199
|
+
P,
|
|
195
200
|
{
|
|
196
|
-
tooltip:
|
|
201
|
+
tooltip: l,
|
|
197
202
|
icon: a,
|
|
198
203
|
shape: "circle",
|
|
199
204
|
onClick: () => F(!0)
|
|
200
205
|
}
|
|
201
206
|
)
|
|
202
207
|
] }) : /* @__PURE__ */ s(
|
|
203
|
-
|
|
208
|
+
P,
|
|
204
209
|
{
|
|
205
|
-
tooltip:
|
|
210
|
+
tooltip: l,
|
|
206
211
|
icon: a,
|
|
207
212
|
target: "_blank",
|
|
208
213
|
href: n,
|
|
@@ -211,7 +216,7 @@ const gt = ({ provider: n, value: t }) => {
|
|
|
211
216
|
);
|
|
212
217
|
};
|
|
213
218
|
export {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
219
|
+
ot as FileCellValue,
|
|
220
|
+
Ot as FileCrudCellValue,
|
|
221
|
+
It as default
|
|
217
222
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kingteza/crud-component",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.44.0",
|
|
5
5
|
"description": "React CRUD component library with Ant Design",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"react",
|
|
@@ -93,6 +93,7 @@
|
|
|
93
93
|
"@eslint/js": "^9.17.0",
|
|
94
94
|
"@semantic-release/changelog": "^6.0.3",
|
|
95
95
|
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
96
|
+
"@semantic-release/exec": "^7.1.0",
|
|
96
97
|
"@semantic-release/git": "^10.0.1",
|
|
97
98
|
"@semantic-release/npm": "^13.1.1",
|
|
98
99
|
"@semantic-release/release-notes-generator": "^14.1.0",
|