@alfresco/adf-core 8.1.0-15447920937 → 8.1.0-15467664243
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/bundles/assets/adf-core/i18n/de.json +1 -1
- package/esm2022/auth/authentication-interceptor/authentication.interceptor.mjs +4 -4
- package/esm2022/lib/card-view/components/card-view/card-view.component.mjs +3 -3
- package/esm2022/lib/form/components/form-renderer.component.mjs +3 -3
- package/esm2022/lib/form/components/inplace-form-input/inplace-form-input.component.mjs +3 -3
- package/esm2022/lib/form/components/widgets/amount/amount.widget.mjs +3 -3
- package/esm2022/lib/form/components/widgets/date/date.widget.mjs +3 -3
- package/esm2022/lib/form/components/widgets/date-time/date-time.widget.mjs +3 -3
- package/esm2022/lib/form/components/widgets/decimal/decimal.component.mjs +3 -3
- package/esm2022/lib/form/components/widgets/multiline-text/multiline-text.widget.mjs +3 -3
- package/esm2022/lib/form/components/widgets/number/number.widget.mjs +3 -3
- package/esm2022/lib/form/components/widgets/text/text.widget.mjs +3 -3
- package/esm2022/lib/viewer/components/viewer-render/viewer-render.component.mjs +20 -12
- package/esm2022/lib/viewer/components/viewer.component.mjs +3 -18
- package/fesm2022/adf-core.mjs +39 -47
- package/fesm2022/adf-core.mjs.map +1 -1
- package/fesm2022/alfresco-adf-core-auth.mjs +3 -3
- package/fesm2022/alfresco-adf-core-auth.mjs.map +1 -1
- package/lib/card-view/components/card-view/card-view.component.scss +0 -1
- package/lib/form/components/form-renderer.component.scss +0 -9
- package/lib/form/components/inplace-form-input/inplace-form-input.component.scss +1 -1
- package/lib/viewer/components/viewer-render/viewer-render.component.d.ts +9 -5
- package/lib/viewer/components/viewer.component.d.ts +0 -2
- package/lib/viewer/components/viewer.component.scss +14 -1
- package/package.json +4 -4
|
@@ -47,20 +47,20 @@ class AuthenticationInterceptor {
|
|
|
47
47
|
intercept(req, next) {
|
|
48
48
|
if (req.context.get(SHOULD_ADD_AUTH_TOKEN)) {
|
|
49
49
|
return this.authService.addTokenToHeader(req.url, req.headers).pipe(mergeMap((headersWithBearer) => {
|
|
50
|
-
const headerWithContentType = this.appendJsonContentType(headersWithBearer
|
|
50
|
+
const headerWithContentType = this.appendJsonContentType(headersWithBearer);
|
|
51
51
|
const kcReq = req.clone({ headers: headerWithContentType });
|
|
52
52
|
return next.handle(kcReq).pipe(catchError((error) => throwError(error)));
|
|
53
53
|
}));
|
|
54
54
|
}
|
|
55
55
|
return next.handle(req).pipe(catchError((error) => throwError(error)));
|
|
56
56
|
}
|
|
57
|
-
appendJsonContentType(headers
|
|
57
|
+
appendJsonContentType(headers) {
|
|
58
58
|
// prevent adding any content type, to properly handle formData with boundary browser generated value,
|
|
59
59
|
// as adding any Content-Type its going to break the upload functionality
|
|
60
60
|
if (headers.get('Content-Type') === 'multipart/form-data') {
|
|
61
61
|
return headers.delete('Content-Type');
|
|
62
62
|
}
|
|
63
|
-
if (!headers.get('Content-Type')
|
|
63
|
+
if (!headers.get('Content-Type')) {
|
|
64
64
|
return headers.set('Content-Type', 'application/json;charset=UTF-8');
|
|
65
65
|
}
|
|
66
66
|
return headers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alfresco-adf-core-auth.mjs","sources":["../../../../lib/core/auth/src/authentication.ts","../../../../lib/core/auth/src/authentication-interceptor/authentication.interceptor.ts","../../../../lib/core/auth/src/index.ts","../../../../lib/core/auth/src/alfresco-adf-core-auth.ts"],"sourcesContent":["/*!\n * @license\n * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { HttpHeaders } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nexport abstract class Authentication {\n public abstract addTokenToHeader(requestUrl: string, headers: HttpHeaders): Observable<HttpHeaders>;\n}\n","/*!\n * @license\n * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n HttpContextToken,\n HttpHandler,\n HttpHeaderResponse,\n HttpHeaders,\n HttpInterceptor,\n HttpProgressEvent,\n HttpRequest,\n HttpResponse,\n HttpSentEvent,\n HttpUserEvent\n} from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable, throwError as observableThrowError } from 'rxjs';\nimport { catchError, mergeMap } from 'rxjs/operators';\nimport { Authentication } from '../authentication';\n\nexport const SHOULD_ADD_AUTH_TOKEN = new HttpContextToken<boolean>(() => false);\n\n@Injectable()\nexport class AuthenticationInterceptor implements HttpInterceptor {\n constructor(private authService: Authentication) {}\n\n intercept(\n req: HttpRequest<any>,\n next: HttpHandler\n ): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {\n if (req.context.get(SHOULD_ADD_AUTH_TOKEN)) {\n return this.authService.addTokenToHeader(req.url, req.headers).pipe(\n mergeMap((headersWithBearer) => {\n const headerWithContentType = this.appendJsonContentType(headersWithBearer
|
|
1
|
+
{"version":3,"file":"alfresco-adf-core-auth.mjs","sources":["../../../../lib/core/auth/src/authentication.ts","../../../../lib/core/auth/src/authentication-interceptor/authentication.interceptor.ts","../../../../lib/core/auth/src/index.ts","../../../../lib/core/auth/src/alfresco-adf-core-auth.ts"],"sourcesContent":["/*!\n * @license\n * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { HttpHeaders } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nexport abstract class Authentication {\n public abstract addTokenToHeader(requestUrl: string, headers: HttpHeaders): Observable<HttpHeaders>;\n}\n","/*!\n * @license\n * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n HttpContextToken,\n HttpHandler,\n HttpHeaderResponse,\n HttpHeaders,\n HttpInterceptor,\n HttpProgressEvent,\n HttpRequest,\n HttpResponse,\n HttpSentEvent,\n HttpUserEvent\n} from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable, throwError as observableThrowError } from 'rxjs';\nimport { catchError, mergeMap } from 'rxjs/operators';\nimport { Authentication } from '../authentication';\n\nexport const SHOULD_ADD_AUTH_TOKEN = new HttpContextToken<boolean>(() => false);\n\n@Injectable()\nexport class AuthenticationInterceptor implements HttpInterceptor {\n constructor(private authService: Authentication) {}\n\n intercept(\n req: HttpRequest<any>,\n next: HttpHandler\n ): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {\n if (req.context.get(SHOULD_ADD_AUTH_TOKEN)) {\n return this.authService.addTokenToHeader(req.url, req.headers).pipe(\n mergeMap((headersWithBearer) => {\n const headerWithContentType = this.appendJsonContentType(headersWithBearer);\n const kcReq = req.clone({ headers: headerWithContentType });\n return next.handle(kcReq).pipe(catchError((error) => observableThrowError(error)));\n })\n );\n }\n\n return next.handle(req).pipe(catchError((error) => observableThrowError(error)));\n }\n\n private appendJsonContentType(headers: HttpHeaders): HttpHeaders {\n // prevent adding any content type, to properly handle formData with boundary browser generated value,\n // as adding any Content-Type its going to break the upload functionality\n\n if (headers.get('Content-Type') === 'multipart/form-data') {\n return headers.delete('Content-Type');\n }\n\n if (!headers.get('Content-Type')) {\n return headers.set('Content-Type', 'application/json;charset=UTF-8');\n }\n\n return headers;\n }\n}\n","/*!\n * @license\n * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './authentication';\nexport * from './authentication-interceptor/authentication.interceptor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["observableThrowError","i1.Authentication"],"mappings":";;;;;;AAAA;;;;;;;;;;;;;;;AAeG;MAKmB,cAAc,CAAA;AAEnC;;ACtBD;;;;;;;;;;;;;;;AAeG;AAmBI,MAAM,qBAAqB,GAAG,IAAI,gBAAgB,CAAU,MAAM,KAAK,EAAE;MAGnE,yBAAyB,CAAA;AAClC,IAAA,WAAA,CAAoB,WAA2B,EAAA;QAA3B,IAAW,CAAA,WAAA,GAAX,WAAW,CAAgB;KAAI;IAEnD,SAAS,CACL,GAAqB,EACrB,IAAiB,EAAA;QAEjB,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE;YACxC,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAC/D,QAAQ,CAAC,CAAC,iBAAiB,KAAI;gBAC3B,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;AAC5E,gBAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;gBAC5D,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,KAAKA,UAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACtF,CAAC,CACL,CAAC;SACL;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,KAAKA,UAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACpF;AAEO,IAAA,qBAAqB,CAAC,OAAoB,EAAA;;;QAI9C,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,qBAAqB,EAAE;AACvD,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;SACzC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;YAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC;SACxE;AAED,QAAA,OAAO,OAAO,CAAC;KAClB;+GAjCQ,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;mHAAzB,yBAAyB,EAAA,CAAA,CAAA,EAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;;;ACpCX;;;;;;;;;;;;;;;AAeG;;ACfH;;AAEG;;;;"}
|
|
@@ -219,15 +219,6 @@
|
|
|
219
219
|
text-align: center;
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
-
&-label {
|
|
223
|
-
width: 32px;
|
|
224
|
-
height: 16px;
|
|
225
|
-
font-size: var(--theme-caption-font-size);
|
|
226
|
-
line-height: var(--theme-headline-line-height);
|
|
227
|
-
text-align: left;
|
|
228
|
-
white-space: nowrap;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
222
|
&-form-mat-card-actions {
|
|
232
223
|
padding-bottom: 25px;
|
|
233
224
|
padding-right: 25px;
|
|
@@ -19,7 +19,9 @@ import { EventEmitter, Injector, OnChanges, OnInit, TemplateRef } from '@angular
|
|
|
19
19
|
import { MatDialog } from '@angular/material/dialog';
|
|
20
20
|
import { Track } from '../../models/viewer.model';
|
|
21
21
|
import { ViewUtilService } from '../../services/view-util.service';
|
|
22
|
+
import { BehaviorSubject } from 'rxjs';
|
|
22
23
|
import * as i0 from "@angular/core";
|
|
24
|
+
type ViewerType = 'media' | 'image' | 'pdf' | 'external' | 'text' | 'custom' | 'unknown';
|
|
23
25
|
export declare class ViewerRenderComponent implements OnChanges, OnInit {
|
|
24
26
|
private viewUtilService;
|
|
25
27
|
private extensionService;
|
|
@@ -42,8 +44,6 @@ export declare class ViewerRenderComponent implements OnChanges, OnInit {
|
|
|
42
44
|
mimeType: string;
|
|
43
45
|
/** Override Content filename. */
|
|
44
46
|
fileName: string;
|
|
45
|
-
/** Override loading status */
|
|
46
|
-
isLoading: boolean;
|
|
47
47
|
/** Enable when where is possible the editing functionalities */
|
|
48
48
|
readOnly: boolean;
|
|
49
49
|
/**
|
|
@@ -77,8 +77,8 @@ export declare class ViewerRenderComponent implements OnChanges, OnInit {
|
|
|
77
77
|
extensionsSupportedByTemplates: string[];
|
|
78
78
|
extension: string;
|
|
79
79
|
internalFileName: string;
|
|
80
|
-
viewerType:
|
|
81
|
-
|
|
80
|
+
viewerType: ViewerType;
|
|
81
|
+
readonly isLoading$: BehaviorSubject<boolean>;
|
|
82
82
|
/**
|
|
83
83
|
* Returns a list of the active Viewer content extensions.
|
|
84
84
|
*
|
|
@@ -97,6 +97,7 @@ export declare class ViewerRenderComponent implements OnChanges, OnInit {
|
|
|
97
97
|
constructor(viewUtilService: ViewUtilService, extensionService: AppExtensionService, dialog: MatDialog, injector: Injector);
|
|
98
98
|
ngOnInit(): void;
|
|
99
99
|
ngOnChanges(): void;
|
|
100
|
+
markAsLoaded(): void;
|
|
100
101
|
private setUpBlobData;
|
|
101
102
|
private setUpUrlFile;
|
|
102
103
|
scrollTop(): void;
|
|
@@ -104,6 +105,9 @@ export declare class ViewerRenderComponent implements OnChanges, OnInit {
|
|
|
104
105
|
onSubmitFile(newImageBlob: Blob): void;
|
|
105
106
|
onUnsupportedFile(): void;
|
|
106
107
|
onClose(): void;
|
|
108
|
+
private canBePreviewed;
|
|
109
|
+
private setDefaultLoadingState;
|
|
107
110
|
static ɵfac: i0.ɵɵFactoryDeclaration<ViewerRenderComponent, never>;
|
|
108
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ViewerRenderComponent, "adf-viewer-render", never, { "urlFile": { "alias": "urlFile"; "required": false; }; "blobFile": { "alias": "blobFile"; "required": false; }; "allowFullScreen": { "alias": "allowFullScreen"; "required": false; }; "allowThumbnails": { "alias": "allowThumbnails"; "required": false; }; "thumbnailsTemplate": { "alias": "thumbnailsTemplate"; "required": false; }; "mimeType": { "alias": "mimeType"; "required": false; }; "fileName": { "alias": "fileName"; "required": false; }; "
|
|
111
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ViewerRenderComponent, "adf-viewer-render", never, { "urlFile": { "alias": "urlFile"; "required": false; }; "blobFile": { "alias": "blobFile"; "required": false; }; "allowFullScreen": { "alias": "allowFullScreen"; "required": false; }; "allowThumbnails": { "alias": "allowThumbnails"; "required": false; }; "thumbnailsTemplate": { "alias": "thumbnailsTemplate"; "required": false; }; "mimeType": { "alias": "mimeType"; "required": false; }; "fileName": { "alias": "fileName"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "allowedEditActions": { "alias": "allowedEditActions"; "required": false; }; "tracks": { "alias": "tracks"; "required": false; }; "nodeId": { "alias": "nodeId"; "required": false; }; "viewerTemplateExtensions": { "alias": "viewerTemplateExtensions"; "required": false; }; "customError": { "alias": "customError"; "required": false; }; }, { "extensionChange": "extensionChange"; "submitFile": "submitFile"; "close": "close"; "isSaving": "isSaving"; }, never, never, true, never>;
|
|
109
112
|
}
|
|
113
|
+
export {};
|
|
@@ -131,7 +131,6 @@ export declare class ViewerComponent<T> implements OnDestroy, OnInit, OnChanges
|
|
|
131
131
|
private _fileName;
|
|
132
132
|
private _fileNameWithoutExtension;
|
|
133
133
|
private _fileExtension;
|
|
134
|
-
displayName: string;
|
|
135
134
|
downloadPromptTimer: number;
|
|
136
135
|
downloadPromptReminderTimer: number;
|
|
137
136
|
mimeTypeIconUrl: string;
|
|
@@ -160,7 +159,6 @@ export declare class ViewerComponent<T> implements OnDestroy, OnInit, OnChanges
|
|
|
160
159
|
enterFullScreen(): void;
|
|
161
160
|
onSubmitFile(newImageBlob: Blob): void;
|
|
162
161
|
ngOnDestroy(): void;
|
|
163
|
-
getDisplayFileName(): string;
|
|
164
162
|
private configureAndInitDownloadPrompt;
|
|
165
163
|
private configureDownloadPromptProperties;
|
|
166
164
|
private initDownloadPrompt;
|
|
@@ -55,10 +55,23 @@
|
|
|
55
55
|
|
|
56
56
|
&__display-name {
|
|
57
57
|
font-size: var(--theme-subheading-2-font-size);
|
|
58
|
+
opacity: 0.87;
|
|
58
59
|
line-height: 1.5;
|
|
60
|
+
letter-spacing: -0.4px;
|
|
61
|
+
font-weight: normal;
|
|
62
|
+
font-style: normal;
|
|
63
|
+
font-stretch: normal;
|
|
59
64
|
vertical-align: middle;
|
|
60
65
|
color: var(--adf-theme-foreground-text-color);
|
|
61
|
-
|
|
66
|
+
|
|
67
|
+
&-without-extension {
|
|
68
|
+
display: inline-block;
|
|
69
|
+
text-overflow: ellipsis;
|
|
70
|
+
overflow: hidden;
|
|
71
|
+
max-width: 400px;
|
|
72
|
+
white-space: nowrap;
|
|
73
|
+
vertical-align: bottom;
|
|
74
|
+
}
|
|
62
75
|
}
|
|
63
76
|
|
|
64
77
|
&-container {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfresco/adf-core",
|
|
3
3
|
"description": "Alfresco ADF core",
|
|
4
|
-
"version": "8.1.0-
|
|
4
|
+
"version": "8.1.0-15467664243",
|
|
5
5
|
"author": "Hyland Software, Inc. and its affiliates",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"angular-oauth2-oidc": "17.0.2",
|
|
61
61
|
"angular-oauth2-oidc-jwks": "17.0.2",
|
|
62
62
|
"date-fns": "^2.30.0",
|
|
63
|
-
"rxjs": "7.8.
|
|
63
|
+
"rxjs": "7.8.1",
|
|
64
64
|
"tslib": "^2.3.0"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
@@ -75,8 +75,8 @@
|
|
|
75
75
|
"@angular/router": ">=16.0.0",
|
|
76
76
|
"@mat-datetimepicker/core": ">=12.0.1",
|
|
77
77
|
"@ngx-translate/core": ">=14.0.0",
|
|
78
|
-
"@alfresco/js-api": ">=9.1.0-
|
|
79
|
-
"@alfresco/adf-extensions": ">=8.1.0-
|
|
78
|
+
"@alfresco/js-api": ">=9.1.0-15467664243",
|
|
79
|
+
"@alfresco/adf-extensions": ">=8.1.0-15467664243",
|
|
80
80
|
"minimatch": ">=10.0.0",
|
|
81
81
|
"pdfjs-dist": ">=3.3.122",
|
|
82
82
|
"ts-morph": ">=20.0.0"
|