Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
c7f0c97341 | |||
e7f60465ff | |||
7db4d24817 | |||
dc599585b8 | |||
a22e32cd32 | |||
4647181807 | |||
99c3935d0c | |||
05523dc7a1 | |||
dc99cfa229 | |||
23f8dc55d0 | |||
ffaf0fc97a | |||
2a0425ff54 | |||
9adcdee0a0 | |||
786f8d4365 | |||
67244ba5cf | |||
a9bb31c2a2 |
79
changelog.md
Normal file
79
changelog.md
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 2024-11-18 - 3.0.24 - fix(metadata)
|
||||||
|
Fix metadata handling to address type assertion and data retrieval.
|
||||||
|
|
||||||
|
- Fixed type assertion issues in `MetaData` class properties with type non-null assertions.
|
||||||
|
- Corrected the handling of JSON data retrieval in `MetaData.storeCustomMetaData` function.
|
||||||
|
|
||||||
|
## 2024-10-16 - 3.0.23 - fix(dependencies)
|
||||||
|
Update package dependencies for improved functionality and security.
|
||||||
|
|
||||||
|
- Updated @aws-sdk/client-s3 to version ^3.670.0 for enhanced S3 client capabilities.
|
||||||
|
- Updated @push.rocks/smartstream to version ^3.2.4.
|
||||||
|
- Updated the dev dependency @push.rocks/tapbundle to version ^5.3.0.
|
||||||
|
|
||||||
|
## 2024-07-28 - 3.0.22 - fix(dependencies)
|
||||||
|
Update dependencies and improve bucket retrieval logging
|
||||||
|
|
||||||
|
- Updated @aws-sdk/client-s3 to ^3.620.0
|
||||||
|
- Updated @git.zone/tsbuild to ^2.1.84
|
||||||
|
- Updated @git.zone/tsrun to ^1.2.49
|
||||||
|
- Updated @push.rocks/smartpromise to ^4.0.4
|
||||||
|
- Updated @tsclass/tsclass to ^4.1.2
|
||||||
|
- Added a log for when a bucket is not found by name in getBucketByName method
|
||||||
|
|
||||||
|
## 2024-07-04 - 3.0.21 - fix(test)
|
||||||
|
Update endpoint configuration in tests to use environment variable
|
||||||
|
|
||||||
|
- Modified `qenv.yml` to include `S3_ENDPOINT` as a required environment variable.
|
||||||
|
- Updated test files to fetch `S3_ENDPOINT` from environment instead of hardcoding.
|
||||||
|
|
||||||
|
## 2024-06-19 - 3.0.20 - Fix and Stability Updates
|
||||||
|
Improved overall stability and consistency.
|
||||||
|
|
||||||
|
## 2024-06-18 - 3.0.18 - Delete Functions Consistency
|
||||||
|
Ensured more consistency between delete methods and trash behavior.
|
||||||
|
|
||||||
|
## 2024-06-17 - 3.0.17 to 3.0.16 - Fix and Update
|
||||||
|
Routine updates and fixes performed.
|
||||||
|
|
||||||
|
## 2024-06-11 - 3.0.15 to 3.0.14 - Fix and Update
|
||||||
|
Routine updates and fixes performed.
|
||||||
|
|
||||||
|
## 2024-06-10 - 3.0.13 - Trash Feature Completion
|
||||||
|
Finished work on trash feature.
|
||||||
|
|
||||||
|
## 2024-06-09 - 3.0.12 - Fix and Update
|
||||||
|
Routine updates and fixes performed.
|
||||||
|
|
||||||
|
## 2024-06-08 - 3.0.11 to 3.0.10 - Fix and Update
|
||||||
|
Routine updates and fixes performed.
|
||||||
|
|
||||||
|
## 2024-06-03 - 3.0.10 - Fix and Update
|
||||||
|
Routine updates and fixes performed.
|
||||||
|
|
||||||
|
## 2024-05-29 - 3.0.9 - Update Description
|
||||||
|
Updated project description.
|
||||||
|
|
||||||
|
## 2024-05-27 - 3.0.8 to 3.0.6 - Pathing and Core Updates
|
||||||
|
Routine updates and fixes performed.
|
||||||
|
- S3 paths' pathing differences now correctly handled with a reducePath method.
|
||||||
|
|
||||||
|
## 2024-05-21 - 3.0.5 to 3.0.4 - Fix and Update
|
||||||
|
Routine updates and fixes performed.
|
||||||
|
|
||||||
|
## 2024-05-17 - 3.0.3 to 3.0.2 - Fix and Update
|
||||||
|
Routine updates and fixes performed.
|
||||||
|
|
||||||
|
## 2024-05-17 - 3.0.0 - Major Release
|
||||||
|
Introduced breaking changes in core and significant improvements.
|
||||||
|
|
||||||
|
## 2024-05-05 - 2.0.5 - Breaking Changes
|
||||||
|
Introduced breaking changes in core functionality.
|
||||||
|
|
||||||
|
## 2024-04-14 - 2.0.4 - TSConfig Update
|
||||||
|
Updated TypeScript configuration.
|
||||||
|
|
||||||
|
## 2024-01-01 - 2.0.2 - Organization Scheme Update
|
||||||
|
Switched to the new organizational scheme.
|
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@push.rocks/smartbucket",
|
"name": "@push.rocks/smartbucket",
|
||||||
"version": "3.0.16",
|
"version": "3.0.24",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@push.rocks/smartbucket",
|
"name": "@push.rocks/smartbucket",
|
||||||
"version": "3.0.16",
|
"version": "3.0.24",
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@push.rocks/smartpath": "^5.0.18",
|
"@push.rocks/smartpath": "^5.0.18",
|
||||||
|
16
package.json
16
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@push.rocks/smartbucket",
|
"name": "@push.rocks/smartbucket",
|
||||||
"version": "3.0.16",
|
"version": "3.0.24",
|
||||||
"description": "A TypeScript library offering simple and cloud-agnostic object storage with advanced features like bucket creation, file and directory management, and data streaming.",
|
"description": "A TypeScript library offering simple and cloud-agnostic object storage with advanced features like bucket creation, file and directory management, and data streaming.",
|
||||||
"main": "dist_ts/index.js",
|
"main": "dist_ts/index.js",
|
||||||
"typings": "dist_ts/index.d.ts",
|
"typings": "dist_ts/index.d.ts",
|
||||||
@ -12,22 +12,22 @@
|
|||||||
"build": "(tsbuild --web --allowimplicitany)"
|
"build": "(tsbuild --web --allowimplicitany)"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@git.zone/tsbuild": "^2.1.80",
|
"@git.zone/tsbuild": "^2.1.84",
|
||||||
"@git.zone/tsrun": "^1.2.46",
|
"@git.zone/tsrun": "^1.2.49",
|
||||||
"@git.zone/tstest": "^1.0.90",
|
"@git.zone/tstest": "^1.0.90",
|
||||||
"@push.rocks/qenv": "^6.0.5",
|
"@push.rocks/qenv": "^6.0.5",
|
||||||
"@push.rocks/tapbundle": "^5.0.23"
|
"@push.rocks/tapbundle": "^5.3.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.598.0",
|
"@aws-sdk/client-s3": "^3.670.0",
|
||||||
"@push.rocks/smartmime": "^2.0.2",
|
"@push.rocks/smartmime": "^2.0.2",
|
||||||
"@push.rocks/smartpath": "^5.0.18",
|
"@push.rocks/smartpath": "^5.0.18",
|
||||||
"@push.rocks/smartpromise": "^4.0.3",
|
"@push.rocks/smartpromise": "^4.0.4",
|
||||||
"@push.rocks/smartrx": "^3.0.7",
|
"@push.rocks/smartrx": "^3.0.7",
|
||||||
"@push.rocks/smartstream": "^3.0.44",
|
"@push.rocks/smartstream": "^3.2.4",
|
||||||
"@push.rocks/smartstring": "^4.0.15",
|
"@push.rocks/smartstring": "^4.0.15",
|
||||||
"@push.rocks/smartunique": "^3.0.9",
|
"@push.rocks/smartunique": "^3.0.9",
|
||||||
"@tsclass/tsclass": "^4.0.59"
|
"@tsclass/tsclass": "^4.1.2"
|
||||||
},
|
},
|
||||||
"private": false,
|
"private": false,
|
||||||
"files": [
|
"files": [
|
||||||
|
11365
pnpm-lock.yaml
generated
11365
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
1
qenv.yml
1
qenv.yml
@ -1,3 +1,4 @@
|
|||||||
required:
|
required:
|
||||||
- S3_KEY
|
- S3_KEY
|
||||||
- S3_SECRET
|
- S3_SECRET
|
||||||
|
- S3_ENDPOINT
|
28
test/test.trash.ts
Normal file
28
test/test.trash.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import { expect, expectAsync, tap } from '@push.rocks/tapbundle';
|
||||||
|
import { Qenv } from '@push.rocks/qenv';
|
||||||
|
|
||||||
|
import * as smartbucket from '../ts/index.js';
|
||||||
|
|
||||||
|
const testQenv = new Qenv('./', './.nogit/');
|
||||||
|
|
||||||
|
let testSmartbucket: smartbucket.SmartBucket;
|
||||||
|
let myBucket: smartbucket.Bucket;
|
||||||
|
let baseDirectory: smartbucket.Directory;
|
||||||
|
|
||||||
|
tap.test('should create a valid smartbucket', async () => {
|
||||||
|
testSmartbucket = new smartbucket.SmartBucket({
|
||||||
|
accessKey: await testQenv.getEnvVarOnDemand('S3_KEY'),
|
||||||
|
accessSecret: await testQenv.getEnvVarOnDemand('S3_SECRET'),
|
||||||
|
endpoint: await testQenv.getEnvVarOnDemand('S3_ENDPOINT'),
|
||||||
|
});
|
||||||
|
expect(testSmartbucket).toBeInstanceOf(smartbucket.SmartBucket);
|
||||||
|
myBucket = await testSmartbucket.getBucketByName('testzone');
|
||||||
|
expect(myBucket).toBeInstanceOf(smartbucket.Bucket);
|
||||||
|
expect(myBucket.name).toEqual('testzone');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('', async () => {
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
export default tap.start();
|
22
test/test.ts
22
test/test.ts
@ -13,24 +13,22 @@ tap.test('should create a valid smartbucket', async () => {
|
|||||||
testSmartbucket = new smartbucket.SmartBucket({
|
testSmartbucket = new smartbucket.SmartBucket({
|
||||||
accessKey: await testQenv.getEnvVarOnDemand('S3_KEY'),
|
accessKey: await testQenv.getEnvVarOnDemand('S3_KEY'),
|
||||||
accessSecret: await testQenv.getEnvVarOnDemand('S3_SECRET'),
|
accessSecret: await testQenv.getEnvVarOnDemand('S3_SECRET'),
|
||||||
endpoint: 's3.eu-central-1.wasabisys.com',
|
endpoint: await testQenv.getEnvVarOnDemand('S3_ENDPOINT'),
|
||||||
});
|
});
|
||||||
});
|
expect(testSmartbucket).toBeInstanceOf(smartbucket.SmartBucket);
|
||||||
|
|
||||||
tap.skip.test('should create testbucket', async () => {
|
|
||||||
// await testSmartbucket.createBucket('testzone');
|
|
||||||
});
|
|
||||||
|
|
||||||
tap.skip.test('should remove testbucket', async () => {
|
|
||||||
// await testSmartbucket.removeBucket('testzone');
|
|
||||||
});
|
|
||||||
|
|
||||||
tap.test('should get a bucket', async () => {
|
|
||||||
myBucket = await testSmartbucket.getBucketByName('testzone');
|
myBucket = await testSmartbucket.getBucketByName('testzone');
|
||||||
expect(myBucket).toBeInstanceOf(smartbucket.Bucket);
|
expect(myBucket).toBeInstanceOf(smartbucket.Bucket);
|
||||||
expect(myBucket.name).toEqual('testzone');
|
expect(myBucket.name).toEqual('testzone');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
tap.skip.test('should create testbucket', async () => {
|
||||||
|
// await testSmartbucket.createBucket('testzone2');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.skip.test('should remove testbucket', async () => {
|
||||||
|
// await testSmartbucket.removeBucket('testzone2');
|
||||||
|
});
|
||||||
|
|
||||||
// Fast operations
|
// Fast operations
|
||||||
tap.test('should store data in bucket fast', async () => {
|
tap.test('should store data in bucket fast', async () => {
|
||||||
await myBucket.fastPut({
|
await myBucket.fastPut({
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* autocreated commitinfo by @pushrocks/commitinfo
|
* autocreated commitinfo by @push.rocks/commitinfo
|
||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@push.rocks/smartbucket',
|
name: '@push.rocks/smartbucket',
|
||||||
version: '3.0.16',
|
version: '3.0.24',
|
||||||
description: 'A TypeScript library offering simple and cloud-agnostic object storage with advanced features like bucket creation, file and directory management, and data streaming.'
|
description: 'A TypeScript library offering simple and cloud-agnostic object storage with advanced features like bucket creation, file and directory management, and data streaming.'
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ export class Bucket {
|
|||||||
console.log(`Taking this as base for new Bucket instance`);
|
console.log(`Taking this as base for new Bucket instance`);
|
||||||
return new this(smartbucketRef, bucketNameArg);
|
return new this(smartbucketRef, bucketNameArg);
|
||||||
} else {
|
} else {
|
||||||
|
console.log(`did not find bucket by name: ${bucketNameArg}`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,13 +66,13 @@ export class Directory {
|
|||||||
* gets a file by name
|
* gets a file by name
|
||||||
*/
|
*/
|
||||||
public async getFile(optionsArg: {
|
public async getFile(optionsArg: {
|
||||||
name: string;
|
path: string;
|
||||||
createWithContents?: string | Buffer;
|
createWithContents?: string | Buffer;
|
||||||
getFromTrash?: boolean;
|
getFromTrash?: boolean;
|
||||||
}): Promise<File> {
|
}): Promise<File> {
|
||||||
const pathDescriptor = {
|
const pathDescriptor = {
|
||||||
directory: this,
|
directory: this,
|
||||||
path: optionsArg.name,
|
path: optionsArg.path,
|
||||||
};
|
};
|
||||||
const exists = await this.bucketRef.fastExists({
|
const exists = await this.bucketRef.fastExists({
|
||||||
path: await helpers.reducePathDescriptorToPath(pathDescriptor),
|
path: await helpers.reducePathDescriptorToPath(pathDescriptor),
|
||||||
@ -88,13 +88,13 @@ export class Directory {
|
|||||||
if (!exists && optionsArg.createWithContents) {
|
if (!exists && optionsArg.createWithContents) {
|
||||||
await File.create({
|
await File.create({
|
||||||
directory: this,
|
directory: this,
|
||||||
name: optionsArg.name,
|
name: optionsArg.path,
|
||||||
contents: optionsArg.createWithContents,
|
contents: optionsArg.createWithContents,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return new File({
|
return new File({
|
||||||
directoryRefArg: this,
|
directoryRefArg: this,
|
||||||
fileName: optionsArg.name,
|
fileName: optionsArg.path,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,19 +283,30 @@ export class Directory {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* removes a file within the directory
|
* removes a file within the directory
|
||||||
|
* uses file class to make sure effects for metadata etc. are handled correctly
|
||||||
* @param optionsArg
|
* @param optionsArg
|
||||||
*/
|
*/
|
||||||
public async fastRemove(optionsArg: { path: string }) {
|
public async fastRemove(optionsArg: {
|
||||||
const path = plugins.path.join(this.getBasePath(), optionsArg.path);
|
path: string
|
||||||
await this.bucketRef.fastRemove({
|
/**
|
||||||
path,
|
* wether the file should be placed into trash. Default is false.
|
||||||
|
*/
|
||||||
|
mode?: 'permanent' | 'trash';
|
||||||
|
}) {
|
||||||
|
const file = await this.getFile({
|
||||||
|
path: optionsArg.path,
|
||||||
|
});
|
||||||
|
await file.delete({
|
||||||
|
mode: optionsArg.mode ? optionsArg.mode : 'permanent',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* deletes the directory with all its contents
|
* deletes the directory with all its contents
|
||||||
*/
|
*/
|
||||||
public async delete() {
|
public async delete(optionsArg: {
|
||||||
|
mode?: 'permanent' | 'trash';
|
||||||
|
}) {
|
||||||
const deleteDirectory = async (directoryArg: Directory) => {
|
const deleteDirectory = async (directoryArg: Directory) => {
|
||||||
const childDirectories = await directoryArg.listDirectories();
|
const childDirectories = await directoryArg.listDirectories();
|
||||||
if (childDirectories.length === 0) {
|
if (childDirectories.length === 0) {
|
||||||
@ -307,9 +318,9 @@ export class Directory {
|
|||||||
}
|
}
|
||||||
const files = await directoryArg.listFiles();
|
const files = await directoryArg.listFiles();
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
await directoryArg.fastRemove({
|
await file.delete({
|
||||||
path: file.name,
|
mode: optionsArg.mode ? optionsArg.mode : 'permanent',
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await deleteDirectory(this);
|
await deleteDirectory(this);
|
||||||
|
@ -10,7 +10,7 @@ export class MetaData {
|
|||||||
|
|
||||||
// lets find the existing metadata file
|
// lets find the existing metadata file
|
||||||
metaData.metadataFile = await metaData.fileRef.parentDirectoryRef.getFile({
|
metaData.metadataFile = await metaData.fileRef.parentDirectoryRef.getFile({
|
||||||
name: metaData.fileRef.name + '.metadata',
|
path: metaData.fileRef.name + '.metadata',
|
||||||
createWithContents: '{}',
|
createWithContents: '{}',
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -21,12 +21,12 @@ export class MetaData {
|
|||||||
/**
|
/**
|
||||||
* the file that contains the metadata
|
* the file that contains the metadata
|
||||||
*/
|
*/
|
||||||
metadataFile: File;
|
metadataFile!: File;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the file that the metadata is for
|
* the file that the metadata is for
|
||||||
*/
|
*/
|
||||||
fileRef: File;
|
fileRef!: File;
|
||||||
|
|
||||||
public async getFileType(optionsArg?: {
|
public async getFileType(optionsArg?: {
|
||||||
useFileExtension?: boolean;
|
useFileExtension?: boolean;
|
||||||
@ -44,13 +44,13 @@ export class MetaData {
|
|||||||
const stat = await this.fileRef.parentDirectoryRef.bucketRef.fastStat({
|
const stat = await this.fileRef.parentDirectoryRef.bucketRef.fastStat({
|
||||||
path: this.fileRef.getBasePath(),
|
path: this.fileRef.getBasePath(),
|
||||||
});
|
});
|
||||||
return stat.ContentLength;
|
return stat.ContentLength!;
|
||||||
}
|
}
|
||||||
|
|
||||||
private prefixCustomMetaData = 'custom_';
|
private prefixCustomMetaData = 'custom_';
|
||||||
|
|
||||||
public async storeCustomMetaData<T = any>(optionsArg: { key: string; value: T }) {
|
public async storeCustomMetaData<T = any>(optionsArg: { key: string; value: T }) {
|
||||||
const data = await this.metadataFile.getContentsAsString();
|
const data = await this.metadataFile.getJsonData();
|
||||||
data[this.prefixCustomMetaData + optionsArg.key] = optionsArg.value;
|
data[this.prefixCustomMetaData + optionsArg.key] = optionsArg.value;
|
||||||
await this.metadataFile.writeJsonData(data);
|
await this.metadataFile.writeJsonData(data);
|
||||||
}
|
}
|
||||||
|
@ -16,16 +16,17 @@ export class SmartBucket {
|
|||||||
*/
|
*/
|
||||||
constructor(configArg: plugins.tsclass.storage.IS3Descriptor) {
|
constructor(configArg: plugins.tsclass.storage.IS3Descriptor) {
|
||||||
this.config = configArg;
|
this.config = configArg;
|
||||||
const endpoint = this.config.endpoint.startsWith('http://') || this.config.endpoint.startsWith('https://')
|
|
||||||
? this.config.endpoint
|
const protocol = configArg.useSsl === false ? 'http' : 'https';
|
||||||
: `https://${this.config.endpoint}`;
|
const port = configArg.port ? `:${configArg.port}` : '';
|
||||||
|
const endpoint = `${protocol}://${configArg.endpoint}${port}`;
|
||||||
|
|
||||||
this.s3Client = new plugins.s3.S3Client({
|
this.s3Client = new plugins.s3.S3Client({
|
||||||
endpoint,
|
endpoint,
|
||||||
region: this.config.region || 'us-east-1',
|
region: configArg.region || 'us-east-1',
|
||||||
credentials: {
|
credentials: {
|
||||||
accessKeyId: this.config.accessKey,
|
accessKeyId: configArg.accessKey,
|
||||||
secretAccessKey: this.config.accessSecret,
|
secretAccessKey: configArg.accessSecret,
|
||||||
},
|
},
|
||||||
forcePathStyle: true, // Necessary for S3-compatible storage like MinIO or Wasabi
|
forcePathStyle: true, // Necessary for S3-compatible storage like MinIO or Wasabi
|
||||||
});
|
});
|
||||||
|
@ -21,7 +21,7 @@ export class Trash {
|
|||||||
const trashDir = await this.getTrashDir();
|
const trashDir = await this.getTrashDir();
|
||||||
const originalPath = await helpers.reducePathDescriptorToPath(pathDescriptor);
|
const originalPath = await helpers.reducePathDescriptorToPath(pathDescriptor);
|
||||||
const trashKey = await this.getTrashKeyByOriginalBasePath(originalPath);
|
const trashKey = await this.getTrashKeyByOriginalBasePath(originalPath);
|
||||||
return trashDir.getFile({ name: trashKey });
|
return trashDir.getFile({ path: trashKey });
|
||||||
}
|
}
|
||||||
|
|
||||||
public async getTrashKeyByOriginalBasePath (originalPath: string): Promise<string> {
|
public async getTrashKeyByOriginalBasePath (originalPath: string): Promise<string> {
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
"module": "NodeNext",
|
"module": "NodeNext",
|
||||||
"moduleResolution": "NodeNext",
|
"moduleResolution": "NodeNext",
|
||||||
"esModuleInterop": true,
|
"esModuleInterop": true,
|
||||||
"verbatimModuleSyntax": true
|
"verbatimModuleSyntax": true,
|
||||||
|
"strict": true
|
||||||
},
|
},
|
||||||
"exclude": [
|
"exclude": [
|
||||||
"dist_*/**/*.d.ts"
|
"dist_*/**/*.d.ts"
|
||||||
|
Reference in New Issue
Block a user