tywalch / electrodb

A DynamoDB library to ease the use of modeling complex hierarchical relationships and implementing a Single Table Design while keeping your query code readable.
MIT License
959 stars 59 forks source link

`Cannot find module '@aws-sdk/client-dynamodb'` with v2 sdk #196

Open miyamonz opened 1 year ago

miyamonz commented 1 year ago

Describe the bug

use electrodb in a project uses dynamodb v2 sdk, it shows the error.

Error: Cannot find module '@aws-sdk/client-dynamodb'
Require stack:
- /Users/miyamonz/my-project/node_modules/@aws-sdk/lib-dynamodb/dist-cjs/commands/BatchExecuteStatementCommand.js
- /Users/miyamonz/my-project/node_modules/@aws-sdk/lib-dynamodb/dist-cjs/DynamoDBDocument.js
- /Users/miyamonz/my-project/node_modules/@aws-sdk/lib-dynamodb/dist-cjs/index.js
- /Users/miyamonz/my-project/node_modules/electrodb/src/client.js
- /Users/miyamonz/my-project/node_modules/electrodb/src/entity.js
- /Users/miyamonz/my-project/node_modules/electrodb/index.js

ElectroDB Version 2.3.3

Entity/Service Definitions

It seems it's not related to this issue, but just in case.

``` const handPose = new Entity( { model: { entity: "handPose", version: "1", service: "hand", }, attributes: { poseId: { type: "string", required: true, readOnly: true, }, createdAt: { type: "string", required: true, readOnly: true, default: () => new Date().toISOString(), }, updatedAt: { type: "string", required: true, default: () => new Date().toISOString(), }, data: { type: CustomAttributeType("any"), required: true, }, }, indexes: { poses: { pk: { field: "pk", composite: [], template: `hand#pose`, }, sk: { field: "gsipk1", composite: ["poseId"], template: "poseId#${poseId}", }, }, }, }, { table: TABLE_NAME, client } ); ```

Expected behavior

it should work with v2 client without installing v3 client.

BTW, installing v3 though I don't use it in my project that uses v2, then the error disappeared, of course, but importing v2 and v3 causes a type error, so It would be helpful if you could address this issue.

Additional context

https://github.com/tywalch/electrodb/blob/95187d34a228fac5c3935fd0e60ac745ecee4ecd/src/client.js#L1

I think this line is the problem. it imports v3 client. it should be imported dynamically.

miyamonz commented 1 year ago

Later I found this https://github.com/tywalch/electrodb/blob/master/buildbrowser.sh you already did something about this issue.

I don't know how you deploy this as the npm library, but did something go wrong when building or deploying time? Anyway, In the node_modules/electrodb of my project, the line exists here. image

tywalch commented 1 year ago

I'll explore ways to bring this in conditionally. That said, you mentioned you have issues with both installed? Can you explain your issue there a bit more?

kevinlonigro commented 1 year ago

I have only started exploring ElectroDB and encountered the same issue.

Resolved it by only installing the v3 SDK and passed a new instance of DynamoDBClient as a replacement for DocumentClient without issue.

"dependencies": { "@aws-sdk/client-dynamodb": "^3.245.0", "electrodb": "^2.3.5" }

const { DynamoDBClient } = require('@aws-sdk/client-dynamodb'); const client = new DynamoDBClient({ region: "us-east-1" });

... }, { client, table });

miyamonz commented 1 year ago

While preparing to reproduce the environment, I found what causes this.

When using npm, there is no problem, but when yarn, it happens.

If you install electrodb by npm, @aws-sdk/client-dynamodb is included by its dependency.

$ npm ls @aws-sdk/client-dynamodb
electrodb-practice@1.0.0 /Users/miyamonz/ghq/github.com/miyamonz/electrodb-practice
└─┬ electrodb@2.3.5
  └─┬ @aws-sdk/lib-dynamodb@3.238.0
    └── @aws-sdk/client-dynamodb@3.238.0

When yarn, yarn add electrodb , then yarn list @aws-sdk/client-dynamodb , nothing exists. That's why Error: Cannot find module '@aws-sdk/client-dynamodb' happens.

You can easily reproduce this by this:

I don't know well about these differences related to dependencies. I'll check this later and add a comment if I find it.


I think it's better to make this library use the AWS SDK that library users have installed themselves. If you think so, I would like you to consider using peerDependency.

If you want to ignore that method for now and run yarn as well, you might want to add @aws-sdk/client-dynamodb in the dependencies. It's an explicit dependency in this library.

srodriki commented 1 week ago

Hey @tywalch looks like this is still a problem. The problem is just about the same with pnpm.

tywalch commented 1 week ago

@miyamonz, @srodriki, and/or @miyamonz, I just pushed up 2.14.2, can you confirm whether or not this fixes the errors you are experiencing?

srodriki commented 1 week ago

@tywalch boom! Works like a charm both with npm and pnpm.

I believe this one can be closed!