Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
7db4d24817 | |||
dc599585b8 | |||
a22e32cd32 | |||
4647181807 | |||
99c3935d0c | |||
05523dc7a1 | |||
dc99cfa229 | |||
23f8dc55d0 | |||
ffaf0fc97a | |||
2a0425ff54 | |||
9adcdee0a0 | |||
786f8d4365 |
73
changelog.md
Normal file
73
changelog.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 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.17",
|
"version": "3.0.23",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@push.rocks/smartbucket",
|
"name": "@push.rocks/smartbucket",
|
||||||
"version": "3.0.17",
|
"version": "3.0.23",
|
||||||
"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.17",
|
"version": "3.0.23",
|
||||||
"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": [
|
||||||
|
2378
pnpm-lock.yaml
generated
2378
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
3
qenv.yml
3
qenv.yml
@ -1,3 +1,4 @@
|
|||||||
required:
|
required:
|
||||||
- S3_KEY
|
- S3_KEY
|
||||||
- S3_SECRET
|
- S3_SECRET
|
||||||
|
- S3_ENDPOINT
|
24
test/test.trash.ts
Normal file
24
test/test.trash.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
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');
|
||||||
|
});
|
||||||
|
|
||||||
|
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.17',
|
version: '3.0.23',
|
||||||
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: '{}',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -14,11 +14,12 @@ export class SmartBucket {
|
|||||||
/**
|
/**
|
||||||
* the constructor of SmartBucket
|
* the constructor of SmartBucket
|
||||||
*/
|
*/
|
||||||
constructor(configArg: IS3Descriptor) {
|
constructor(configArg: plugins.tsclass.storage.IS3Descriptor) {
|
||||||
this.config = configArg;
|
this.config = configArg;
|
||||||
|
|
||||||
const protocol = configArg.useSsl === false ? 'http' : 'https';
|
const protocol = configArg.useSsl === false ? 'http' : 'https';
|
||||||
const endpoint = `${protocol}://${configArg.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,
|
||||||
@ -43,4 +44,4 @@ export class SmartBucket {
|
|||||||
public async getBucketByName(bucketName: string) {
|
public async getBucketByName(bucketName: string) {
|
||||||
return Bucket.getBucketByName(this, bucketName);
|
return Bucket.getBucketByName(this, bucketName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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> {
|
||||||
|
Reference in New Issue
Block a user