Skip to content

feat(Base Set): move thirdParty ids onto variants_detailed + additive schema/server retrocompat - #1392

Closed
lamplis wants to merge 6 commits into
tcgdex:masterfrom
lamplis:pr/u-base-set-thirdparty-to-variants
Closed

feat(Base Set): move thirdParty ids onto variants_detailed + additive schema/server retrocompat#1392
lamplis wants to merge 6 commits into
tcgdex:masterfrom
lamplis:pr/u-base-set-thirdparty-to-variants

Conversation

@lamplis

@lamplis lamplis commented Apr 22, 2026

Copy link
Copy Markdown
Contributor

Summary

Migrate every card in data/Base/Base Set/ (102 files) so that thirdParty (cardmarket, tcgplayer) lives on variants_detailed[*] instead of at the card root, plus the minimal additive schema widening and server-side reconstruction needed to keep both the V2 API response and the compiled JSON artifact byte-compatible for existing consumers.

Files in this PR (107 total)

  • Data: data/Base/Base Set/*.ts (102 files)
  • Schema: interfaces.d.ts, meta/definitions/api.d.ts
  • Server retrocompat: server/src/V2/Components/Card.ts, server/compiler/utils/cardUtil.ts, server/compiler/utils/translationUtil.ts

Data changes

  • Root-level thirdParty blocks are moved into the canonical variants_detailed entry for each Base Set card.
  • Where multiple printings exist (1999-2000-copyright, shadowless, unlimited, 1st edition), Cardmarket product ids are attached to the specific variant they belong to.
  • No other card fields are touched.

Schema changes (additive only)

  • CardmarketVersion token type (V${number} | BASE | LIBRE) added to VariantType. Used for placeholder variants emitted by the Cardmarket sync when a productId cannot be matched to a canonical source variant.
  • 'Yellow A' literal added to VariantType for alternate-art sibling printings that share a name and number with a base printing but use a local id suffixed with "a" (for example XY150a, PHF024a, FFI055a).
  • Optional variant_detailed.cardmarketLabels?: string[] for the raw OCR-derived labels used by human reviewers to reconcile placeholder variants to canonical type / subtype / stamp.

Server retrocompat

  • Live V2 API (server/src/V2/Components/Card.ts):
    • resolveRootPricingFromVariants reconstructs root-level cardmarket / tcgplayer pricing from variants_detailed[0].thirdParty, falling back to the first variant that carries a populated pricing block.
    • Per-variant pricing is now populated from variant.thirdParty.
    • Legacy path preserved: cards that still hold root thirdParty (object-variant promos, trainer kits) continue to work unchanged.
  • Compiled JSON (server/compiler/utils/cardUtil.ts):
    • resolveRootThirdPartyFromVariants synthesises the deprecated root thirdParty field from the first variants_detailed entry that carries one, so that direct JSON consumers keep seeing the same shape.
    • Root thirdParty is only @deprecated in the Card interface docstring; no behavior change for clients.
  • server/compiler/utils/translationUtil.ts: small additive support for the new variant tokens (CardmarketVersion, Yellow A).

Retrocompat guarantees

  • V2 API: card.pricing.cardmarket / card.pricing.tcgplayer continue to resolve correctly for migrated cards via the new variant-based reconstruction. Non-migrated cards keep using the existing root thirdParty code path with zero behavior change for them.
  • Compiled JSON: root thirdParty is preserved byte-for-byte on migrated cards through the new compile-time synthesis helper. Verified on base1-1 (Alakazam) and base1-10 (Mewtwo): same {cardmarket, tcgplayer} object as before the migration. Non-migrated base2-1 (Clefable) is unchanged.
  • GraphQL: no breaking change. The schema is derived from the same interfaces, and every addition is an optional field or widened union.

Scope (intentional)

This PR is intentionally scoped to a single set so the variant move plus additive schema and server retrocompat shape can be reviewed end-to-end on a small, well-understood data surface (Base Set, all printings). Once merged, the remaining root-thirdParty cards can be moved in a single mechanical follow-up PR using the same canonical-variant landing rule, since the schema and server pieces only need to land once.

Validation

Locally ran the full upstream CI gate (.github/workflows/test.yml), including Bruno integration:

Gate Result
bun install --frozen-lockfile (root + server) clean
bun run validate (root TS, tsc --noEmit) green
cd server && bun run compile exit 0, 36236 / 36238 files loaded (the 2 could not load file warnings come from the pre-existing empty-path corner in server/compiler/utils/util.ts and are not introduced here)
cd server && bun run --bun validate (server TS, tsgo --noEmit) green
cd .bruno && bru run --env Developpement 68 / 68 requests, 121 / 121 assertions - covers REST cards, filtering, random, sets, GraphQL (card, cards, serie, series, set, sets), and regression tickets #467, #471, #474, #475, #489, #562, #566, #567

Compiled JSON spot check (server/generated/en/cards.json):

  • base1-1 Alakazam (migrated): root thirdParty = {cardmarket: 273696, tcgplayer: 42346}, reconstructed from variants_detailed[0].thirdParty.
  • base1-10 Mewtwo (migrated): same pattern, retrocompat confirmed.
  • base2-1 Clefable (Base Set 2, not in this PR): unchanged, no regression on non-migrated cards.

@TCGdexBOT

TCGdexBOT commented Apr 22, 2026

Copy link
Copy Markdown
Member

🃏 102 Cards Changed

Details: 102 modified

Alakazam (base1-1) (found using en)
Language Language Language
English (en)
Alakazam (English)
French (fr)
Alakazam (French)
Spanish (es)
Alakazam (Spanish)
Spanish (Mexico) (es-mx)
Alakazam (Spanish (Mexico))
Italian (it)
Alakazam (Italian)
Portuguese (pt)
Alakazam (Portuguese)
Portuguese (Brazil) (pt-br)
Alakazam (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Alakazam (Portuguese (Portugal))
German (de)
Alakazam (German)
Dutch (nl)
Alakazam (Dutch)
Polish (pl)
Alakazam (Polish)
Russian (ru)
Alakazam (Russian)

File: [data/Base/Base Set/1.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/1.ts)
Set: Base Set
Rarity: Rare

Mewtwo (base1-10) (found using en)
Language Language Language
English (en)
Mewtwo (English)
French (fr)
Mewtwo (French)
Spanish (es)
Mewtwo (Spanish)
Spanish (Mexico) (es-mx)
Mewtwo (Spanish (Mexico))
Italian (it)
Mewtwo (Italian)
Portuguese (pt)
Mewtwo (Portuguese)
Portuguese (Brazil) (pt-br)
Mewtwo (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Mewtwo (Portuguese (Portugal))
German (de)
Mewtwo (German)
Dutch (nl)
Mewtwo (Dutch)
Polish (pl)
Mewtwo (Polish)
Russian (ru)
Mewtwo (Russian)

File: [data/Base/Base Set/10.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/10.ts)
Set: Base Set
Rarity: Rare

Lightning Energy (base1-100) (found using en)
Language Language Language
English (en)
Lightning Energy (English)
French (fr)
Lightning Energy (French)
Spanish (es)
Lightning Energy (Spanish)
Spanish (Mexico) (es-mx)
Lightning Energy (Spanish (Mexico))
Italian (it)
Lightning Energy (Italian)
Portuguese (pt)
Lightning Energy (Portuguese)
Portuguese (Brazil) (pt-br)
Lightning Energy (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Lightning Energy (Portuguese (Portugal))
German (de)
Lightning Energy (German)
Dutch (nl)
Lightning Energy (Dutch)
Polish (pl)
Lightning Energy (Polish)
Russian (ru)
Lightning Energy (Russian)

File: [data/Base/Base Set/100.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/100.ts)
Set: Base Set
Rarity: Common

Psychic Energy (base1-101) (found using en)
Language Language Language
English (en)
Psychic Energy (English)
French (fr)
Psychic Energy (French)
Spanish (es)
Psychic Energy (Spanish)
Spanish (Mexico) (es-mx)
Psychic Energy (Spanish (Mexico))
Italian (it)
Psychic Energy (Italian)
Portuguese (pt)
Psychic Energy (Portuguese)
Portuguese (Brazil) (pt-br)
Psychic Energy (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Psychic Energy (Portuguese (Portugal))
German (de)
Psychic Energy (German)
Dutch (nl)
Psychic Energy (Dutch)
Polish (pl)
Psychic Energy (Polish)
Russian (ru)
Psychic Energy (Russian)

File: [data/Base/Base Set/101.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/101.ts)
Set: Base Set
Rarity: Common

Water Energy (base1-102) (found using en)
Language Language Language
English (en)
Water Energy (English)
French (fr)
Water Energy (French)
Spanish (es)
Water Energy (Spanish)
Spanish (Mexico) (es-mx)
Water Energy (Spanish (Mexico))
Italian (it)
Water Energy (Italian)
Portuguese (pt)
Water Energy (Portuguese)
Portuguese (Brazil) (pt-br)
Water Energy (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Water Energy (Portuguese (Portugal))
German (de)
Water Energy (German)
Dutch (nl)
Water Energy (Dutch)
Polish (pl)
Water Energy (Polish)
Russian (ru)
Water Energy (Russian)

File: [data/Base/Base Set/102.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/102.ts)
Set: Base Set
Rarity: Common

Nidoking (base1-11) (found using en)
Language Language Language
English (en)
Nidoking (English)
French (fr)
Nidoking (French)
Spanish (es)
Nidoking (Spanish)
Spanish (Mexico) (es-mx)
Nidoking (Spanish (Mexico))
Italian (it)
Nidoking (Italian)
Portuguese (pt)
Nidoking (Portuguese)
Portuguese (Brazil) (pt-br)
Nidoking (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Nidoking (Portuguese (Portugal))
German (de)
Nidoking (German)
Dutch (nl)
Nidoking (Dutch)
Polish (pl)
Nidoking (Polish)
Russian (ru)
Nidoking (Russian)

File: [data/Base/Base Set/11.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/11.ts)
Set: Base Set
Rarity: Rare

Ninetales (base1-12) (found using en)
Language Language Language
English (en)
Ninetales (English)
French (fr)
Ninetales (French)
Spanish (es)
Ninetales (Spanish)
Spanish (Mexico) (es-mx)
Ninetales (Spanish (Mexico))
Italian (it)
Ninetales (Italian)
Portuguese (pt)
Ninetales (Portuguese)
Portuguese (Brazil) (pt-br)
Ninetales (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Ninetales (Portuguese (Portugal))
German (de)
Ninetales (German)
Dutch (nl)
Ninetales (Dutch)
Polish (pl)
Ninetales (Polish)
Russian (ru)
Ninetales (Russian)

File: [data/Base/Base Set/12.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/12.ts)
Set: Base Set
Rarity: Rare

Poliwrath (base1-13) (found using en)
Language Language Language
English (en)
Poliwrath (English)
French (fr)
Poliwrath (French)
Spanish (es)
Poliwrath (Spanish)
Spanish (Mexico) (es-mx)
Poliwrath (Spanish (Mexico))
Italian (it)
Poliwrath (Italian)
Portuguese (pt)
Poliwrath (Portuguese)
Portuguese (Brazil) (pt-br)
Poliwrath (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Poliwrath (Portuguese (Portugal))
German (de)
Poliwrath (German)
Dutch (nl)
Poliwrath (Dutch)
Polish (pl)
Poliwrath (Polish)
Russian (ru)
Poliwrath (Russian)

File: [data/Base/Base Set/13.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/13.ts)
Set: Base Set
Rarity: Rare

Raichu (base1-14) (found using en)
Language Language Language
English (en)
Raichu (English)
French (fr)
Raichu (French)
Spanish (es)
Raichu (Spanish)
Spanish (Mexico) (es-mx)
Raichu (Spanish (Mexico))
Italian (it)
Raichu (Italian)
Portuguese (pt)
Raichu (Portuguese)
Portuguese (Brazil) (pt-br)
Raichu (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Raichu (Portuguese (Portugal))
German (de)
Raichu (German)
Dutch (nl)
Raichu (Dutch)
Polish (pl)
Raichu (Polish)
Russian (ru)
Raichu (Russian)

File: [data/Base/Base Set/14.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/14.ts)
Set: Base Set
Rarity: Rare

Venusaur (base1-15) (found using en)
Language Language Language
English (en)
Venusaur (English)
French (fr)
Venusaur (French)
Spanish (es)
Venusaur (Spanish)
Spanish (Mexico) (es-mx)
Venusaur (Spanish (Mexico))
Italian (it)
Venusaur (Italian)
Portuguese (pt)
Venusaur (Portuguese)
Portuguese (Brazil) (pt-br)
Venusaur (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Venusaur (Portuguese (Portugal))
German (de)
Venusaur (German)
Dutch (nl)
Venusaur (Dutch)
Polish (pl)
Venusaur (Polish)
Russian (ru)
Venusaur (Russian)

File: [data/Base/Base Set/15.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/15.ts)
Set: Base Set
Rarity: Rare

Zapdos (base1-16) (found using en)
Language Language Language
English (en)
Zapdos (English)
French (fr)
Zapdos (French)
Spanish (es)
Zapdos (Spanish)
Spanish (Mexico) (es-mx)
Zapdos (Spanish (Mexico))
Italian (it)
Zapdos (Italian)
Portuguese (pt)
Zapdos (Portuguese)
Portuguese (Brazil) (pt-br)
Zapdos (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Zapdos (Portuguese (Portugal))
German (de)
Zapdos (German)
Dutch (nl)
Zapdos (Dutch)
Polish (pl)
Zapdos (Polish)
Russian (ru)
Zapdos (Russian)

File: [data/Base/Base Set/16.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/16.ts)
Set: Base Set
Rarity: Rare

Beedrill (base1-17) (found using en)
Language Language Language
English (en)
Beedrill (English)
French (fr)
Beedrill (French)
Spanish (es)
Beedrill (Spanish)
Spanish (Mexico) (es-mx)
Beedrill (Spanish (Mexico))
Italian (it)
Beedrill (Italian)
Portuguese (pt)
Beedrill (Portuguese)
Portuguese (Brazil) (pt-br)
Beedrill (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Beedrill (Portuguese (Portugal))
German (de)
Beedrill (German)
Dutch (nl)
Beedrill (Dutch)
Polish (pl)
Beedrill (Polish)
Russian (ru)
Beedrill (Russian)

File: [data/Base/Base Set/17.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/17.ts)
Set: Base Set
Rarity: Rare

Dragonair (base1-18) (found using en)
Language Language Language
English (en)
Dragonair (English)
French (fr)
Dragonair (French)
Spanish (es)
Dragonair (Spanish)
Spanish (Mexico) (es-mx)
Dragonair (Spanish (Mexico))
Italian (it)
Dragonair (Italian)
Portuguese (pt)
Dragonair (Portuguese)
Portuguese (Brazil) (pt-br)
Dragonair (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Dragonair (Portuguese (Portugal))
German (de)
Dragonair (German)
Dutch (nl)
Dragonair (Dutch)
Polish (pl)
Dragonair (Polish)
Russian (ru)
Dragonair (Russian)

File: [data/Base/Base Set/18.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/18.ts)
Set: Base Set
Rarity: Rare

Dugtrio (base1-19) (found using en)
Language Language Language
English (en)
Dugtrio (English)
French (fr)
Dugtrio (French)
Spanish (es)
Dugtrio (Spanish)
Spanish (Mexico) (es-mx)
Dugtrio (Spanish (Mexico))
Italian (it)
Dugtrio (Italian)
Portuguese (pt)
Dugtrio (Portuguese)
Portuguese (Brazil) (pt-br)
Dugtrio (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Dugtrio (Portuguese (Portugal))
German (de)
Dugtrio (German)
Dutch (nl)
Dugtrio (Dutch)
Polish (pl)
Dugtrio (Polish)
Russian (ru)
Dugtrio (Russian)

File: [data/Base/Base Set/19.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/19.ts)
Set: Base Set
Rarity: Rare

Blastoise (base1-2) (found using en)
Language Language Language
English (en)
Blastoise (English)
French (fr)
Blastoise (French)
Spanish (es)
Blastoise (Spanish)
Spanish (Mexico) (es-mx)
Blastoise (Spanish (Mexico))
Italian (it)
Blastoise (Italian)
Portuguese (pt)
Blastoise (Portuguese)
Portuguese (Brazil) (pt-br)
Blastoise (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Blastoise (Portuguese (Portugal))
German (de)
Blastoise (German)
Dutch (nl)
Blastoise (Dutch)
Polish (pl)
Blastoise (Polish)
Russian (ru)
Blastoise (Russian)

File: [data/Base/Base Set/2.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/2.ts)
Set: Base Set
Rarity: Rare

Electabuzz (base1-20) (found using en)
Language Language Language
English (en)
Electabuzz (English)
French (fr)
Electabuzz (French)
Spanish (es)
Electabuzz (Spanish)
Spanish (Mexico) (es-mx)
Electabuzz (Spanish (Mexico))
Italian (it)
Electabuzz (Italian)
Portuguese (pt)
Electabuzz (Portuguese)
Portuguese (Brazil) (pt-br)
Electabuzz (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Electabuzz (Portuguese (Portugal))
German (de)
Electabuzz (German)
Dutch (nl)
Electabuzz (Dutch)
Polish (pl)
Electabuzz (Polish)
Russian (ru)
Electabuzz (Russian)

File: [data/Base/Base Set/20.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/20.ts)
Set: Base Set
Rarity: Rare

Electrode (base1-21) (found using en)
Language Language Language
English (en)
Electrode (English)
French (fr)
Electrode (French)
Spanish (es)
Electrode (Spanish)
Spanish (Mexico) (es-mx)
Electrode (Spanish (Mexico))
Italian (it)
Electrode (Italian)
Portuguese (pt)
Electrode (Portuguese)
Portuguese (Brazil) (pt-br)
Electrode (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Electrode (Portuguese (Portugal))
German (de)
Electrode (German)
Dutch (nl)
Electrode (Dutch)
Polish (pl)
Electrode (Polish)
Russian (ru)
Electrode (Russian)

File: [data/Base/Base Set/21.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/21.ts)
Set: Base Set
Rarity: Rare

Pidgeotto (base1-22) (found using en)
Language Language Language
English (en)
Pidgeotto (English)
French (fr)
Pidgeotto (French)
Spanish (es)
Pidgeotto (Spanish)
Spanish (Mexico) (es-mx)
Pidgeotto (Spanish (Mexico))
Italian (it)
Pidgeotto (Italian)
Portuguese (pt)
Pidgeotto (Portuguese)
Portuguese (Brazil) (pt-br)
Pidgeotto (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Pidgeotto (Portuguese (Portugal))
German (de)
Pidgeotto (German)
Dutch (nl)
Pidgeotto (Dutch)
Polish (pl)
Pidgeotto (Polish)
Russian (ru)
Pidgeotto (Russian)

File: [data/Base/Base Set/22.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/22.ts)
Set: Base Set
Rarity: Rare

Arcanine (base1-23) (found using en)
Language Language Language
English (en)
Arcanine (English)
French (fr)
Arcanine (French)
Spanish (es)
Arcanine (Spanish)
Spanish (Mexico) (es-mx)
Arcanine (Spanish (Mexico))
Italian (it)
Arcanine (Italian)
Portuguese (pt)
Arcanine (Portuguese)
Portuguese (Brazil) (pt-br)
Arcanine (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Arcanine (Portuguese (Portugal))
German (de)
Arcanine (German)
Dutch (nl)
Arcanine (Dutch)
Polish (pl)
Arcanine (Polish)
Russian (ru)
Arcanine (Russian)

File: [data/Base/Base Set/23.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/23.ts)
Set: Base Set
Rarity: Uncommon

Charmeleon (base1-24) (found using en)
Language Language Language
English (en)
Charmeleon (English)
French (fr)
Charmeleon (French)
Spanish (es)
Charmeleon (Spanish)
Spanish (Mexico) (es-mx)
Charmeleon (Spanish (Mexico))
Italian (it)
Charmeleon (Italian)
Portuguese (pt)
Charmeleon (Portuguese)
Portuguese (Brazil) (pt-br)
Charmeleon (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Charmeleon (Portuguese (Portugal))
German (de)
Charmeleon (German)
Dutch (nl)
Charmeleon (Dutch)
Polish (pl)
Charmeleon (Polish)
Russian (ru)
Charmeleon (Russian)

File: [data/Base/Base Set/24.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/24.ts)
Set: Base Set
Rarity: Uncommon

Dewgong (base1-25) (found using en)
Language Language Language
English (en)
Dewgong (English)
French (fr)
Dewgong (French)
Spanish (es)
Dewgong (Spanish)
Spanish (Mexico) (es-mx)
Dewgong (Spanish (Mexico))
Italian (it)
Dewgong (Italian)
Portuguese (pt)
Dewgong (Portuguese)
Portuguese (Brazil) (pt-br)
Dewgong (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Dewgong (Portuguese (Portugal))
German (de)
Dewgong (German)
Dutch (nl)
Dewgong (Dutch)
Polish (pl)
Dewgong (Polish)
Russian (ru)
Dewgong (Russian)

File: [data/Base/Base Set/25.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/25.ts)
Set: Base Set
Rarity: Uncommon

Dratini (base1-26) (found using en)
Language Language Language
English (en)
Dratini (English)
French (fr)
Dratini (French)
Spanish (es)
Dratini (Spanish)
Spanish (Mexico) (es-mx)
Dratini (Spanish (Mexico))
Italian (it)
Dratini (Italian)
Portuguese (pt)
Dratini (Portuguese)
Portuguese (Brazil) (pt-br)
Dratini (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Dratini (Portuguese (Portugal))
German (de)
Dratini (German)
Dutch (nl)
Dratini (Dutch)
Polish (pl)
Dratini (Polish)
Russian (ru)
Dratini (Russian)

File: [data/Base/Base Set/26.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/26.ts)
Set: Base Set
Rarity: Uncommon

Farfetch'd (base1-27) (found using en)
Language Language Language
English (en)
Farfetch'd (English)
French (fr)
Farfetch'd (French)
Spanish (es)
Farfetch'd (Spanish)
Spanish (Mexico) (es-mx)
Farfetch'd (Spanish (Mexico))
Italian (it)
Farfetch'd (Italian)
Portuguese (pt)
Farfetch'd (Portuguese)
Portuguese (Brazil) (pt-br)
Farfetch'd (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Farfetch'd (Portuguese (Portugal))
German (de)
Farfetch'd (German)
Dutch (nl)
Farfetch'd (Dutch)
Polish (pl)
Farfetch'd (Polish)
Russian (ru)
Farfetch'd (Russian)

File: [data/Base/Base Set/27.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/27.ts)
Set: Base Set
Rarity: Uncommon

Growlithe (base1-28) (found using en)
Language Language Language
English (en)
Growlithe (English)
French (fr)
Growlithe (French)
Spanish (es)
Growlithe (Spanish)
Spanish (Mexico) (es-mx)
Growlithe (Spanish (Mexico))
Italian (it)
Growlithe (Italian)
Portuguese (pt)
Growlithe (Portuguese)
Portuguese (Brazil) (pt-br)
Growlithe (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Growlithe (Portuguese (Portugal))
German (de)
Growlithe (German)
Dutch (nl)
Growlithe (Dutch)
Polish (pl)
Growlithe (Polish)
Russian (ru)
Growlithe (Russian)

File: [data/Base/Base Set/28.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/28.ts)
Set: Base Set
Rarity: Uncommon

Haunter (base1-29) (found using en)
Language Language Language
English (en)
Haunter (English)
French (fr)
Haunter (French)
Spanish (es)
Haunter (Spanish)
Spanish (Mexico) (es-mx)
Haunter (Spanish (Mexico))
Italian (it)
Haunter (Italian)
Portuguese (pt)
Haunter (Portuguese)
Portuguese (Brazil) (pt-br)
Haunter (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Haunter (Portuguese (Portugal))
German (de)
Haunter (German)
Dutch (nl)
Haunter (Dutch)
Polish (pl)
Haunter (Polish)
Russian (ru)
Haunter (Russian)

File: [data/Base/Base Set/29.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/29.ts)
Set: Base Set
Rarity: Uncommon

Chansey (base1-3) (found using en)
Language Language Language
English (en)
Chansey (English)
French (fr)
Chansey (French)
Spanish (es)
Chansey (Spanish)
Spanish (Mexico) (es-mx)
Chansey (Spanish (Mexico))
Italian (it)
Chansey (Italian)
Portuguese (pt)
Chansey (Portuguese)
Portuguese (Brazil) (pt-br)
Chansey (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Chansey (Portuguese (Portugal))
German (de)
Chansey (German)
Dutch (nl)
Chansey (Dutch)
Polish (pl)
Chansey (Polish)
Russian (ru)
Chansey (Russian)

File: [data/Base/Base Set/3.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/3.ts)
Set: Base Set
Rarity: Rare

Ivysaur (base1-30) (found using en)
Language Language Language
English (en)
Ivysaur (English)
French (fr)
Ivysaur (French)
Spanish (es)
Ivysaur (Spanish)
Spanish (Mexico) (es-mx)
Ivysaur (Spanish (Mexico))
Italian (it)
Ivysaur (Italian)
Portuguese (pt)
Ivysaur (Portuguese)
Portuguese (Brazil) (pt-br)
Ivysaur (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Ivysaur (Portuguese (Portugal))
German (de)
Ivysaur (German)
Dutch (nl)
Ivysaur (Dutch)
Polish (pl)
Ivysaur (Polish)
Russian (ru)
Ivysaur (Russian)

File: [data/Base/Base Set/30.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/30.ts)
Set: Base Set
Rarity: Uncommon

Jynx (base1-31) (found using en)
Language Language Language
English (en)
Jynx (English)
French (fr)
Jynx (French)
Spanish (es)
Jynx (Spanish)
Spanish (Mexico) (es-mx)
Jynx (Spanish (Mexico))
Italian (it)
Jynx (Italian)
Portuguese (pt)
Jynx (Portuguese)
Portuguese (Brazil) (pt-br)
Jynx (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Jynx (Portuguese (Portugal))
German (de)
Jynx (German)
Dutch (nl)
Jynx (Dutch)
Polish (pl)
Jynx (Polish)
Russian (ru)
Jynx (Russian)

File: [data/Base/Base Set/31.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/31.ts)
Set: Base Set
Rarity: Uncommon

Kadabra (base1-32) (found using en)
Language Language Language
English (en)
Kadabra (English)
French (fr)
Kadabra (French)
Spanish (es)
Kadabra (Spanish)
Spanish (Mexico) (es-mx)
Kadabra (Spanish (Mexico))
Italian (it)
Kadabra (Italian)
Portuguese (pt)
Kadabra (Portuguese)
Portuguese (Brazil) (pt-br)
Kadabra (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Kadabra (Portuguese (Portugal))
German (de)
Kadabra (German)
Dutch (nl)
Kadabra (Dutch)
Polish (pl)
Kadabra (Polish)
Russian (ru)
Kadabra (Russian)

File: [data/Base/Base Set/32.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/32.ts)
Set: Base Set
Rarity: Uncommon

Kakuna (base1-33) (found using en)
Language Language Language
English (en)
Kakuna (English)
French (fr)
Kakuna (French)
Spanish (es)
Kakuna (Spanish)
Spanish (Mexico) (es-mx)
Kakuna (Spanish (Mexico))
Italian (it)
Kakuna (Italian)
Portuguese (pt)
Kakuna (Portuguese)
Portuguese (Brazil) (pt-br)
Kakuna (Portuguese (Brazil))
Portuguese (Portugal) (pt-pt)
Kakuna (Portuguese (Portugal))
German (de)
Kakuna (German)
Dutch (nl)
Kakuna (Dutch)
Polish (pl)
Kakuna (Polish)
Russian (ru)
Kakuna (Russian)

File: [data/Base/Base Set/33.ts](https://github.com/tcgdex/cards-database/blob/3cd5ba024f95ecf300f6bf36756234eba0427983/data/Base/Base Set/33.ts)
Set: Base Set
Rarity: Uncommon

Note: Comment truncated due to GitHub size limitations. Some cards were omitted.

@lamplis

lamplis commented Apr 22, 2026

Copy link
Copy Markdown
Contributor Author

Hi @thomas-bassett ,
what do you think about migrating set by set to the new variants model maintaining retro-compatibility?
When we validate this first commit, I'll send the other sets, one by one.

Comment thread .github/scripts/load-cards.ts Outdated
rarity?: string;
set: { name: string };
hasImage: boolean;
cardmarketIds?: number[];

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we remove all edits within .github.
There isn't a reason to change the comments or actions for this

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added a link to cardmarket to test the cardmarket thirdparty id
If you don't want it, I'll remove it @FalconChipp

@FalconChipp FalconChipp Apr 22, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please. Up to Aivor to change the git workflows.
If anything, put it in a separate pr and let him review when he gets the time

Comment thread .github/workflows/comment-pr.yml Outdated
working-directory: .github/scripts
permissions:
pull-requests: write
contents: read

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here please

Comment thread data/Base/Base Set/1.ts
subtype: "unlimited",
subtype: "1999-2000-copyright",
thirdParty: {
cardmarket: 273696,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How are you sourcing this information? I checked just this one because it's very a specific subtype and its just linking to the standard

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me subtype: "1999-2000-copyright" is the basic normal card.
there is no "normal" variant so I mapped it to the standard cardmarket card.
But if "1999-2000-copyright" is not the basic original card, should I create a basic "normal" variant instead?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found default basic card seem to be the "unlimited" (https://youtu.be/FIgZahAte7A?si=aY-stT7SDftmVQ4v)
Do you agree? @thomas-bassett

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the 1999-2000 copyright version is the 4th print and likely is just thrown in on cardmarket to be 1 id.
but the "base" version of the card the way i looked at things should be the first print of the card.

in this card the first edition shadowless would be the first card printed

@thomas-bassett thomas-bassett self-assigned this Apr 25, 2026
lamplis and others added 2 commits April 29, 2026 08:03
…dback

Restore workflow/comment script files to base content and replace the Base Set migration with the corrected variant-level mapping so marketplace IDs stay on the intended existing variants.
@lamplis

lamplis commented Apr 29, 2026

Copy link
Copy Markdown
Contributor Author

Hello,
Changes implemented :) @thomas-bassett @FalconChipp
thx for review

@lamplis

lamplis commented Apr 30, 2026

Copy link
Copy Markdown
Contributor Author

The windows job often fails.
I proposed a fix in #1370

@FalconChipp FalconChipp left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Git workflow changes removed

Comment thread data/Base/Base Set/1.ts Outdated
variants: [
{
type: "holo",
subtype: "1999-2000-copyright",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why are you switching this around. I think you missed my point in the other comment. the base version "should" be the first print.

@thomas-bassett thomas-bassett left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please clean up the PR. the description still has all of the old changes in it. same with title.

Also if we are going to move the ids over can get get all of the IDs so we can merge it once? Falcon has some tools that help with the extraction

@lamplis lamplis changed the title feat(data/Base Set): move thirdParty ids to variant level + server retrocompat feat(Base Set): move thirdParty ids onto variants_detailed + additive schema/server retrocompat May 5, 2026
@lamplis

lamplis commented May 5, 2026

Copy link
Copy Markdown
Contributor Author

Thanks Thomas. I cleaned up the PR title and description so they now match the actual 107-file diff.

On the broader "move all of the ids over once" point: I kept this PR scoped as the proof point for the full shape change, since it is the first one that combines (1) the additive VariantType widening, (2) cardmarketLabels, (3) the server-side retrocompat reconstruction, and (4) the first full-set migration on a set with multiple printings (Base Set 1st edition / shadowless / unlimited). That lets the schema/server contract be reviewed separately from a much larger mechanical data sweep.

That is also the same cadence Falcon has been using in the recent merged variant-migration PRs (#1375, #1376, #1378, #1381, #1382, #1393, #1408, #1409, #1410). Once this lands, I can follow immediately with one mechanical bulk PR for the remaining root-thirdParty cards so we only do the schema/server part once.

If you would rather I close this and reopen as one giant PR instead, say the word and I will do that. The tradeoff is just that the additive schema/server review then gets mixed into a much larger data-only migration.

}

/**
* Retrocompat helper: reconstruct the deprecated root-level `thirdParty`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this already exsists just not at compile time

@thomas-bassett

Copy link
Copy Markdown
Contributor

Thanks Thomas. I cleaned up the PR title and description so they now match the actual 107-file diff.

On the broader "move all of the ids over once" point: I kept this PR scoped as the proof point for the full shape change, since it is the first one that combines (1) the additive VariantType widening, (2) cardmarketLabels, (3) the server-side retrocompat reconstruction, and (4) the first full-set migration on a set with multiple printings (Base Set 1st edition / shadowless / unlimited). That lets the schema/server contract be reviewed separately from a much larger mechanical data sweep.

That is also the same cadence Falcon has been using in the recent merged variant-migration PRs (#1375, #1376, #1378, #1381, #1382, #1393, #1408, #1409, #1410). Once this lands, I can follow immediately with one mechanical bulk PR for the remaining root-thirdParty cards so we only do the schema/server part once.

If you would rather I close this and reopen as one giant PR instead, say the word and I will do that. The tradeoff is just that the additive schema/server review then gets mixed into a much larger data-only migration.

Did you? i still see all the server changes not needed in a Data PR. these MUST be split up unless abosulty nessasary like a new feature.

I dont think the server changes you made are nessasary but its a mess im not sure what changes are what. this should be like 3 differnt prs (data,cmversion,thirdparty fallback) although the last one isnt needed.

also looking at #1381 all variants have been given third-party ids. this is what I meant about filling out all the ids. If we don't do this now we will just need to come back and do them again later so lets get them done now.

I am going to close this PR for now. please split this up into small concise PRs and we can go from there.

@lamplis
lamplis deleted the pr/u-base-set-thirdparty-to-variants branch May 6, 2026 21:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants