First, you should think about in which form you finally need the cards/business objects in your program to do something meaningful with it. From what you wrote I assume if you have all those objects in form of Javascript code/objects, you can actually shuffle or deal the cards as well as execute the code when a player decides to use one of his cards. Note, for these use cases, you do not need any hierarchy, the hierarchy is something you only need for maintaining the card types and their "business rules".
If you do not have a full team of five to ten people implementing (and maintaining) the code for these 3000 objects, you need definitely some declarative approach to describe / implement most of them. And I am pretty sure in 3000 objects, there will be all kind of repetitions/similarities in the behaviour. For example, I can imagine your example
"when you summon minion deal 1dmg to random enemy"
might occur often in the form
"when you summon <X> deal <Y> to enemies of type <Z>"
So you could try to make use of that and create an object generator, based on some tabular input and some rules, and try if you can generate most of the objects, including the Javascript code for the behaviour, based on code templates with placeholders. Of course, there will be some objects with rules too complex for your generator, so you will need to implement them manually, but you should aim for these being only a small portion of the whole set of objects.
So what you finally need to store is
- the tabular input for your generator
- the implementation for the (hopefully few) objects which cannot be generated
The input data for your generator maybe stored in a spreadsheet, "DSL like" text, XML or JSON files, or in a (lightweight) database, depending on what you feel most comfortable with. If there is only one person at a time maintaining the rules, I would probably go for a spreadsheet, for many people I would probably try a database. In both cases it might be necessary to provide "template strings" or fields with code snippets in the table. Call this a "generator DSL", if you like. 3000 rows in a spreadsheet is quite manageable by one person, especially when you can make use of the filter and sorting capabilities. "name", "color", "rarity", "expansion", "type of enemy" or "business rule type" - with a spreadsheet program you can filter or sort your cards "ad hoc" according to these attributes, without having the need to invest too much thought beforehand into the hierarchies you might need.
The remaining "non-generatable" objects might be implemented in ordinary text files, directly in Javascript. Or, you can generate even those objects, but provide some "hook" where you can add manually written code. The technique for organizing this additional code (one file for all, one file per object, whatever) is mostly dependent of how many of them there will finally be.