Skip to content

Commit 057384c

Browse files
authored
Merge pull request #251 from ardriveapp/PE-8207-make-ar-fs-builders-gracefully-get-app-version
PE-8207: made App-Version optional for builders (default to empty string)
2 parents 96d6ecc + c8924fe commit 057384c

File tree

6 files changed

+100
-16
lines changed

6 files changed

+100
-16
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [3.0.1] - 2025-06-20
11+
12+
### Changed
13+
14+
- Updated appVersion to be optional in ArFS entities
15+
1016
## [3.0.0] - 2025-06-16
1117

1218
### Added

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ardrive-core-js",
3-
"version": "3.0.0",
3+
"version": "3.0.1",
44
"description": "ArDrive Core contains the essential back end application features to support the ArDrive CLI and Desktop apps, such as file management, Permaweb upload/download, wallet management and other common functions.",
55
"main": "./lib/exports.js",
66
"types": "./lib/exports.d.ts",

src/arfs/arfs_builders/arfs_drive_builders.test.ts

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,21 @@ const gatewayApi = new GatewayAPI({
4040
});
4141

4242
describe('ArFSPublicDriveBuilder', () => {
43+
it('handles empty app version when building from node', async () => {
44+
const nodeWithEmptyAppVersion = {
45+
...stubPublicDriveGQLNode,
46+
tags: stubPublicDriveGQLNode.tags?.map((tag) => (tag.name === 'App-Version' ? { ...tag, value: '' } : tag))
47+
};
48+
49+
const builder = ArFSPublicDriveBuilder.fromArweaveNode(nodeWithEmptyAppVersion as GQLNodeInterface, gatewayApi);
50+
stub(builder, 'getDataForTxID').resolves(stubPublicDriveGetDataResult);
51+
const driveMetaData = await builder.build(nodeWithEmptyAppVersion as GQLNodeInterface);
52+
53+
expect(driveMetaData.appVersion).to.equal('');
54+
expect(driveMetaData.appName).to.equal('ArDrive-CLI');
55+
expect(`${driveMetaData.driveId}`).to.equal('e93cf9c4-5f20-4d7a-87c4-034777cbb51e');
56+
});
57+
4358
it('constructs expected drive from node', async () => {
4459
const builder = ArFSPublicDriveBuilder.fromArweaveNode(stubPublicDriveGQLNode as GQLNodeInterface, gatewayApi);
4560
stub(builder, 'getDataForTxID').resolves(stubPublicDriveGetDataResult);
@@ -167,6 +182,26 @@ const stubPrivateDriveGetDataResult = Buffer.from(Uint8Array.from([
167182
]));
168183

169184
describe('ArFSPrivateDriveBuilder', () => {
185+
it('handles empty app version when building from node', async () => {
186+
const nodeWithEmptyAppVersion = {
187+
...stubPrivateDriveGQLNode,
188+
tags: stubPrivateDriveGQLNode.tags?.map((tag) => (tag.name === 'App-Version' ? { ...tag, value: '' } : tag))
189+
};
190+
191+
const builder = ArFSPrivateDriveBuilder.fromArweaveNode(
192+
nodeWithEmptyAppVersion as GQLNodeInterface,
193+
gatewayApi,
194+
driveKeyForStubPrivateDrive
195+
);
196+
stub(builder, 'getDataForTxID').resolves(stubPrivateDriveGetDataResult);
197+
198+
const driveMetaData = await builder.build(nodeWithEmptyAppVersion as GQLNodeInterface);
199+
200+
expect(driveMetaData.appVersion).to.equal('');
201+
expect(driveMetaData.appName).to.equal('ArDrive-CLI');
202+
expect(`${driveMetaData.driveId}`).to.equal('5ca7ddfe-effa-4fc5-8796-8f3e0502854a');
203+
});
204+
170205
it('constructs expected drive from node', async () => {
171206
const builder = ArFSPrivateDriveBuilder.fromArweaveNode(
172207
stubPrivateDriveGQLNode as GQLNodeInterface,
@@ -246,6 +281,56 @@ describe('SafeArFSDriveBuilder', () => {
246281
const stubPrivateKeyData = new PrivateKeyData({ driveKeys: [driveKeyForStubPrivateDrive] });
247282
const emptyPrivateKeyData = new PrivateKeyData({});
248283

284+
it('handles empty app version when building public drive', async () => {
285+
const nodeWithEmptyAppVersion = {
286+
...stubPublicDriveGQLNode,
287+
tags: stubPublicDriveGQLNode.tags?.map((tag) => (tag.name === 'App-Version' ? { ...tag, value: '' } : tag))
288+
};
289+
290+
stub(gatewayApi, 'gqlRequest').resolves({
291+
edges: [{ node: nodeWithEmptyAppVersion }]
292+
} as GQLTransactionsResultInterface);
293+
294+
const builder = new SafeArFSDriveBuilder({
295+
entityId: EID('e93cf9c4-5f20-4d7a-87c4-034777cbb51e'),
296+
gatewayApi,
297+
privateKeyData: emptyPrivateKeyData
298+
});
299+
300+
stub(builder, 'getDataForTxID').resolves(stubPublicDriveGetDataResult);
301+
302+
const driveMetaData = await builder.build();
303+
304+
expect(driveMetaData.appVersion).to.equal('');
305+
expect(driveMetaData.appName).to.equal('ArDrive-CLI');
306+
expect(`${driveMetaData.driveId}`).to.equal('e93cf9c4-5f20-4d7a-87c4-034777cbb51e');
307+
});
308+
309+
it('handles empty app version when building private drive', async () => {
310+
const nodeWithEmptyAppVersion = {
311+
...stubPrivateDriveGQLNode,
312+
tags: stubPrivateDriveGQLNode.tags?.map((tag) => (tag.name === 'App-Version' ? { ...tag, value: '' } : tag))
313+
};
314+
315+
stub(gatewayApi, 'gqlRequest').resolves({
316+
edges: [{ node: nodeWithEmptyAppVersion }]
317+
} as GQLTransactionsResultInterface);
318+
319+
const builder = new SafeArFSDriveBuilder({
320+
entityId: EID('5ca7ddfe-effa-4fc5-8796-8f3e0502854a'),
321+
gatewayApi,
322+
privateKeyData: stubPrivateKeyData
323+
});
324+
325+
stub(builder, 'getDataForTxID').resolves(stubPrivateDriveGetDataResult);
326+
327+
const driveMetaData = (await builder.build()) as ArFSPrivateDrive;
328+
329+
expect(driveMetaData.appVersion).to.equal('');
330+
expect(driveMetaData.appName).to.equal('ArDrive-CLI');
331+
expect(`${driveMetaData.driveId}`).to.equal('5ca7ddfe-effa-4fc5-8796-8f3e0502854a');
332+
});
333+
249334
it('constructs expected public drive from node', async () => {
250335
const builder = SafeArFSDriveBuilder.fromArweaveNode(
251336
stubPublicDriveGQLNode as GQLNodeInterface,

src/arfs/arfs_builders/arfs_drive_builders.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ export class ArFSPublicDriveBuilder extends ArFSDriveBuilder<ArFSPublicDrive> {
8080
protected async buildEntity(): Promise<ArFSPublicDrive> {
8181
if (
8282
this.appName?.length &&
83-
this.appVersion?.length &&
8483
this.arFS?.length &&
8584
this.contentType?.length &&
8685
this.driveId &&
@@ -105,7 +104,7 @@ export class ArFSPublicDriveBuilder extends ArFSDriveBuilder<ArFSPublicDrive> {
105104

106105
return new ArFSPublicDrive(
107106
this.appName,
108-
this.appVersion,
107+
this.appVersion ?? '',
109108
this.arFS,
110109
this.contentType,
111110
this.driveId,
@@ -212,7 +211,6 @@ export class ArFSPrivateDriveBuilder extends ArFSDriveBuilder<ArFSPrivateDrive>
212211
protected async buildEntity(): Promise<ArFSPrivateDrive> {
213212
if (
214213
this.appName?.length &&
215-
this.appVersion?.length &&
216214
this.arFS?.length &&
217215
this.contentType?.length &&
218216
this.driveId &&
@@ -237,7 +235,7 @@ export class ArFSPrivateDriveBuilder extends ArFSDriveBuilder<ArFSPrivateDrive>
237235

238236
return new ArFSPrivateDrive(
239237
this.appName,
240-
this.appVersion,
238+
this.appVersion ?? '',
241239
this.arFS,
242240
this.contentType,
243241
this.driveId,
@@ -363,7 +361,6 @@ export class SafeArFSDriveBuilder extends ArFSDriveBuilder<ArFSDriveEntity> {
363361
protected async buildEntity(): Promise<ArFSDriveEntity> {
364362
if (
365363
this.appName?.length &&
366-
this.appVersion?.length &&
367364
this.arFS?.length &&
368365
this.contentType?.length &&
369366
this.driveId &&
@@ -435,7 +432,7 @@ export class SafeArFSDriveBuilder extends ArFSDriveBuilder<ArFSDriveEntity> {
435432

436433
return new ArFSPrivateDriveKeyless(
437434
this.appName,
438-
this.appVersion,
435+
this.appVersion ?? '',
439436
this.arFS,
440437
this.contentType,
441438
this.driveId,
@@ -456,7 +453,7 @@ export class SafeArFSDriveBuilder extends ArFSDriveBuilder<ArFSDriveEntity> {
456453
}
457454
return new ArFSPublicDrive(
458455
this.appName,
459-
this.appVersion,
456+
this.appVersion ?? '',
460457
this.arFS,
461458
this.contentType,
462459
this.driveId,

src/arfs/arfs_builders/arfs_file_builders.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ export class ArFSPublicFileBuilder extends ArFSFileBuilder<ArFSPublicFile> {
6565
protected async buildEntity(): Promise<ArFSPublicFile> {
6666
if (
6767
this.appName?.length &&
68-
this.appVersion?.length &&
6968
this.arFS?.length &&
7069
this.contentType?.length &&
7170
this.driveId &&
@@ -95,7 +94,7 @@ export class ArFSPublicFileBuilder extends ArFSFileBuilder<ArFSPublicFile> {
9594
return Promise.resolve(
9695
new ArFSPublicFile(
9796
this.appName,
98-
this.appVersion,
97+
this.appVersion ?? '',
9998
this.arFS,
10099
this.contentType,
101100
this.driveId,
@@ -166,7 +165,6 @@ export class ArFSPrivateFileBuilder extends ArFSFileBuilder<ArFSPrivateFile> {
166165
protected async buildEntity(): Promise<ArFSPrivateFile> {
167166
if (
168167
this.appName?.length &&
169-
this.appVersion?.length &&
170168
this.arFS?.length &&
171169
this.contentType?.length &&
172170
this.driveId &&
@@ -205,7 +203,7 @@ export class ArFSPrivateFileBuilder extends ArFSFileBuilder<ArFSPrivateFile> {
205203

206204
return new ArFSPrivateFile(
207205
this.appName,
208-
this.appVersion,
206+
this.appVersion ?? '',
209207
this.arFS,
210208
this.contentType,
211209
this.driveId,

src/arfs/arfs_builders/arfs_folder_builders.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export class ArFSPublicFolderBuilder extends ArFSFolderBuilder<ArFSPublicFolder>
6464

6565
if (
6666
this.appName?.length &&
67-
this.appVersion?.length &&
6867
this.arFS?.length &&
6968
this.contentType?.length &&
7069
this.driveId &&
@@ -89,7 +88,7 @@ export class ArFSPublicFolderBuilder extends ArFSFolderBuilder<ArFSPublicFolder>
8988
return Promise.resolve(
9089
new ArFSPublicFolder(
9190
this.appName,
92-
this.appVersion,
91+
this.appVersion ?? '',
9392
this.arFS,
9493
this.contentType,
9594
this.driveId,
@@ -164,7 +163,6 @@ export class ArFSPrivateFolderBuilder extends ArFSFolderBuilder<ArFSPrivateFolde
164163

165164
if (
166165
this.appName?.length &&
167-
this.appVersion?.length &&
168166
this.arFS?.length &&
169167
this.contentType?.length &&
170168
this.driveId &&
@@ -194,7 +192,7 @@ export class ArFSPrivateFolderBuilder extends ArFSFolderBuilder<ArFSPrivateFolde
194192

195193
return new ArFSPrivateFolder(
196194
this.appName,
197-
this.appVersion,
195+
this.appVersion ?? '',
198196
this.arFS,
199197
this.contentType,
200198
this.driveId,

0 commit comments

Comments
 (0)