From 7d009fae4c5adf5a182250e73aab638c5bf81dec Mon Sep 17 00:00:00 2001 From: Christian Foidl Date: Thu, 5 Mar 2026 14:30:44 +0100 Subject: [PATCH 1/3] test: remove json imports, move to constant imports --- .changeset/itchy-pandas-report.md | 8 + .../tests/DrupalkitJsonApiError.test.ts | 2 +- .../fixtures/jsonapi_article_collection.ts | 898 ++++++++++++++++++ .../tests/fixtures/jsonapi_article_detail.ts | 128 +++ .../tests/fixtures/jsonapi_file_upload.ts | 42 + .../tests/fixtures/jsonapi_include_error.ts | 30 + .../jsonapi/tests/fixtures/jsonapi_index.ts | 35 + .../tests/fixtures/jsonapi_index_error.ts | 20 + .../tests/fixtures/jsonapi_menu_items.ts | 46 + .../fixtures/jsonapi_menu_items_error.ts | 30 + .../tests/fixtures/jsonapi_multiple_errors.ts | 46 + packages/jsonapi/tests/menu.test.ts | 4 +- packages/jsonapi/tests/resources.test.ts | 12 +- .../DrupalkitJsonApiError.test.ts.snap | Bin 765 -> 771 bytes .../jsonapi/tests/snapshots/menu.test.ts.snap | Bin 801 -> 810 bytes .../tests/snapshots/resources.test.ts.snap | Bin 28264 -> 29260 bytes .../DrupalkitSimpleOauthAuthCode.test.ts | 2 +- .../tests/fixtures/auth_code_response.ts | 5 + .../tests/DrupalkitSimpleOauth.test.ts | 6 +- .../tests/fixtures/error_response.ts | 10 + .../tests/fixtures/token_response.ts | 10 + .../tests/fixtures/userinfo_response.ts | 13 + .../user-api/tests/DrupalkitUserApi.test.ts | 2 +- .../user-api/tests/fixtures/user_response.ts | 77 ++ 24 files changed, 1412 insertions(+), 14 deletions(-) create mode 100644 .changeset/itchy-pandas-report.md create mode 100644 packages/jsonapi/tests/fixtures/jsonapi_article_collection.ts create mode 100644 packages/jsonapi/tests/fixtures/jsonapi_article_detail.ts create mode 100644 packages/jsonapi/tests/fixtures/jsonapi_file_upload.ts create mode 100644 packages/jsonapi/tests/fixtures/jsonapi_include_error.ts create mode 100644 packages/jsonapi/tests/fixtures/jsonapi_index.ts create mode 100644 packages/jsonapi/tests/fixtures/jsonapi_index_error.ts create mode 100644 packages/jsonapi/tests/fixtures/jsonapi_menu_items.ts create mode 100644 packages/jsonapi/tests/fixtures/jsonapi_menu_items_error.ts create mode 100644 packages/jsonapi/tests/fixtures/jsonapi_multiple_errors.ts create mode 100644 packages/simple-oauth-auth-code/tests/fixtures/auth_code_response.ts create mode 100644 packages/simple-oauth/tests/fixtures/error_response.ts create mode 100644 packages/simple-oauth/tests/fixtures/token_response.ts create mode 100644 packages/simple-oauth/tests/fixtures/userinfo_response.ts create mode 100644 packages/user-api/tests/fixtures/user_response.ts diff --git a/.changeset/itchy-pandas-report.md b/.changeset/itchy-pandas-report.md new file mode 100644 index 0000000..a5d56a3 --- /dev/null +++ b/.changeset/itchy-pandas-report.md @@ -0,0 +1,8 @@ +--- +"@drupal-kit/simple-oauth-auth-code": patch +"@drupal-kit/simple-oauth": patch +"@drupal-kit/user-api": patch +"@drupal-kit/jsonapi": patch +--- + +Fix inter-dependency resolution diff --git a/packages/jsonapi/tests/DrupalkitJsonApiError.test.ts b/packages/jsonapi/tests/DrupalkitJsonApiError.test.ts index 484fdc3..74f9b09 100644 --- a/packages/jsonapi/tests/DrupalkitJsonApiError.test.ts +++ b/packages/jsonapi/tests/DrupalkitJsonApiError.test.ts @@ -2,7 +2,7 @@ import test from "ava"; import { DrupalkitError, UNKNOWN_ERROR_PREFIX } from "@drupal-kit/core"; import { DrupalkitJsonApiError } from "../src/index.js"; -import JsonApiErrorResponse from "./fixtures/jsonapi_multiple_errors.json" with { type: "json" }; +import JsonApiErrorResponse from "./fixtures/jsonapi_multiple_errors.js"; const request = { method: "GET", diff --git a/packages/jsonapi/tests/fixtures/jsonapi_article_collection.ts b/packages/jsonapi/tests/fixtures/jsonapi_article_collection.ts new file mode 100644 index 0000000..d23b0a4 --- /dev/null +++ b/packages/jsonapi/tests/fixtures/jsonapi_article_collection.ts @@ -0,0 +1,898 @@ +const JsonApiArticleCollection = { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + data: [ + { + type: "node--article", + id: "58e198f6-41af-48b0-b889-596adcb9622e", + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e?resourceVersion=id%3A3", + }, + }, + attributes: { + drupal_internal__nid: 3, + drupal_internal__vid: 3, + langcode: "de", + revision_timestamp: "2023-02-23T11:10:08+00:00", + revision_log: null, + status: true, + title: "Milchfreie und köstliche Milchschokolade", + created: "2023-01-27T09:38:39+00:00", + changed: "2023-02-23T11:10:08+00:00", + promote: true, + sticky: false, + default_langcode: true, + revision_translation_affected: true, + path: { + alias: "/articles/milchfreie-und-koestliche-milchschokolade", + pid: 4, + langcode: "de", + }, + content_translation_source: "und", + content_translation_outdated: false, + body: { + value: + "

Der Kalender ist voll von Ausreden für Schokoladenliebhaber, von religiösen Festen bis zu Geburtstagen - und sogar dem Weltschokoladentag am 7. Juli. Aber auch Veganer oder Menschen, die sich milchfrei ernähren, müssen nicht leer ausgehen, denn es gibt viele köstliche vegane Schokoladensorten im Angebot.

Milchfreie Milchschokolade wird weitgehend auf die gleiche Weise hergestellt wie normale Schokolade, bis zu dem Punkt, an dem die Milch hinzugefügt wird. Die Kakaobohnen werden ein paar Stunden lang geröstet, bis sie einen reichen Geschmack entwickeln. Die äußeren Schalen werden entfernt, und die inneren Nibs werden gemahlen, um eine Paste zu erhalten, die mit Kakaobutter gemischt werden kann, um den gewünschten Prozentsatz an Schokolade herzustellen. Aromen, Zucker und Milch werden in unterschiedlichen Mengen hinzugefügt, um die gewünschte Schokoladenart zu erhalten. Die Schokolade ist zu diesem Zeitpunkt körnig und muss püriert werden, bis sie glatt ist - das kann Tage dauern! Schließlich wird sie durch Erhitzen und Abkühlen temperiert, bis sie verzehrfertig ist.

Wie also bekommen vegane Chocolatiers den cremigen Milchgeschmack und die Textur in ihre Produkte?

", + format: "ckeditor", + processed: + "

Der Kalender ist voll von Ausreden für Schokoladenliebhaber, von religiösen Festen bis zu Geburtstagen - und sogar dem Weltschokoladentag am 7. Juli. Aber auch Veganer oder Menschen, die sich milchfrei ernähren, müssen nicht leer ausgehen, denn es gibt viele köstliche vegane Schokoladensorten im Angebot.

Milchfreie Milchschokolade wird weitgehend auf die gleiche Weise hergestellt wie normale Schokolade, bis zu dem Punkt, an dem die Milch hinzugefügt wird. Die Kakaobohnen werden ein paar Stunden lang geröstet, bis sie einen reichen Geschmack entwickeln. Die äußeren Schalen werden entfernt, und die inneren Nibs werden gemahlen, um eine Paste zu erhalten, die mit Kakaobutter gemischt werden kann, um den gewünschten Prozentsatz an Schokolade herzustellen. Aromen, Zucker und Milch werden in unterschiedlichen Mengen hinzugefügt, um die gewünschte Schokoladenart zu erhalten. Die Schokolade ist zu diesem Zeitpunkt körnig und muss püriert werden, bis sie glatt ist - das kann Tage dauern! Schließlich wird sie durch Erhitzen und Abkühlen temperiert, bis sie verzehrfertig ist.

Wie also bekommen vegane Chocolatiers den cremigen Milchgeschmack und die Textur in ihre Produkte?

", + summary: + "Der Kalender ist voll von Ausreden für Schokoladenliebhaber, von religiösen Festen bis zu Geburtstagen - und sogar dem Weltschokoladentag am 7. Juli. Aber auch Veganer oder Menschen, die sich milchfrei ernähren, müssen nicht leer ausgehen, denn es gibt viele köstliche vegane Schokoladensorten im Angebot.", + }, + }, + relationships: { + node_type: { + data: null, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/relationships/node_type?resourceVersion=id%3A3", + }, + }, + }, + revision_uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/revision_uid?resourceVersion=id%3A3", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/relationships/revision_uid?resourceVersion=id%3A3", + }, + }, + }, + uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/uid?resourceVersion=id%3A3", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/relationships/uid?resourceVersion=id%3A3", + }, + }, + }, + field_media: { + data: { + type: "media--image", + id: "6530afc8-5635-45b7-a3d9-920d7e10c39e", + meta: { + drupal_internal__target_id: 8, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/field_media?resourceVersion=id%3A3", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/relationships/field_media?resourceVersion=id%3A3", + }, + }, + }, + }, + meta: { + localeInfo: [ + { + langcode: "en", + path: "/articles/dairy-free-and-delicious-milk-chocolate", + }, + ], + }, + }, + { + type: "node--article", + id: "331b2b21-41f9-46bf-a043-4856441ec83f", + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/331b2b21-41f9-46bf-a043-4856441ec83f?resourceVersion=id%3A4", + }, + }, + attributes: { + drupal_internal__nid: 4, + drupal_internal__vid: 4, + langcode: "de", + revision_timestamp: "2023-02-23T11:10:08+00:00", + revision_log: null, + status: true, + title: "Das richtige Angebot für den Einkauf im Supermarkt", + created: "2023-01-27T10:01:50+00:00", + changed: "2023-02-23T11:10:08+00:00", + promote: true, + sticky: false, + default_langcode: true, + revision_translation_affected: true, + path: { + alias: + "/articles/das-richtige-angebot-fuer-den-einkauf-im-supermarkt", + pid: 5, + langcode: "de", + }, + content_translation_source: "und", + content_translation_outdated: false, + body: { + value: + "

Das wird Sie vielleicht nicht überraschen - aber Ihr Supermarkt ist ein heißes Pflaster für ein Marketing-Chaos, das darauf abzielt, den Gewinn zu steigern und die Verbraucher dazu zu bringen, mehr auszugeben, als sie beabsichtigen. Bei den Tricks, die alle Supermärkte anwenden, handelt es sich manchmal um sinnvolle Maßnahmen, die jeder Einzelhändler ergreifen sollte, um seinen Umsatz zu steigern - aber einige sind vielleicht subtiler und weniger offensichtlich, als Sie vielleicht denken.

Da Artikel und Dokumentarfilme, die das Bewusstsein der Verbraucher schärfen, dieses Thema häufig aufgreifen, ist es wahrscheinlich, dass es den Einzelhändlern immer schwerer fällt, mit den offensichtlichsten Tricks durchzukommen. Wir werden immer versiertere Verbraucher, und es gibt wahrscheinlich nicht viel, was uns entgeht. Aber hier sind ein paar Tricks des Einzelhandels, die Sie beachten sollten, wenn Sie im Supermarkt Ihre wöchentlichen Vorräte aufstocken.

", + format: "ckeditor", + processed: + "

Das wird Sie vielleicht nicht überraschen - aber Ihr Supermarkt ist ein heißes Pflaster für ein Marketing-Chaos, das darauf abzielt, den Gewinn zu steigern und die Verbraucher dazu zu bringen, mehr auszugeben, als sie beabsichtigen. Bei den Tricks, die alle Supermärkte anwenden, handelt es sich manchmal um sinnvolle Maßnahmen, die jeder Einzelhändler ergreifen sollte, um seinen Umsatz zu steigern - aber einige sind vielleicht subtiler und weniger offensichtlich, als Sie vielleicht denken.

Da Artikel und Dokumentarfilme, die das Bewusstsein der Verbraucher schärfen, dieses Thema häufig aufgreifen, ist es wahrscheinlich, dass es den Einzelhändlern immer schwerer fällt, mit den offensichtlichsten Tricks durchzukommen. Wir werden immer versiertere Verbraucher, und es gibt wahrscheinlich nicht viel, was uns entgeht. Aber hier sind ein paar Tricks des Einzelhandels, die Sie beachten sollten, wenn Sie im Supermarkt Ihre wöchentlichen Vorräte aufstocken.

", + summary: + "Das wird Sie vielleicht nicht überraschen - aber Ihr Supermarkt ist ein heißes Pflaster für ein Marketing-Chaos, das darauf abzielt, den Gewinn zu steigern und die Verbraucher dazu zu bringen, mehr auszugeben, als sie beabsichtigen.", + }, + }, + relationships: { + node_type: { + data: null, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/331b2b21-41f9-46bf-a043-4856441ec83f/relationships/node_type?resourceVersion=id%3A4", + }, + }, + }, + revision_uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/331b2b21-41f9-46bf-a043-4856441ec83f/revision_uid?resourceVersion=id%3A4", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/331b2b21-41f9-46bf-a043-4856441ec83f/relationships/revision_uid?resourceVersion=id%3A4", + }, + }, + }, + uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/331b2b21-41f9-46bf-a043-4856441ec83f/uid?resourceVersion=id%3A4", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/331b2b21-41f9-46bf-a043-4856441ec83f/relationships/uid?resourceVersion=id%3A4", + }, + }, + }, + field_media: { + data: { + type: "media--image", + id: "b45b811e-f377-413e-bc76-7c59f14e6b4a", + meta: { + drupal_internal__target_id: 2, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/331b2b21-41f9-46bf-a043-4856441ec83f/field_media?resourceVersion=id%3A4", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/331b2b21-41f9-46bf-a043-4856441ec83f/relationships/field_media?resourceVersion=id%3A4", + }, + }, + }, + }, + meta: { + localeInfo: [ + { + langcode: "en", + path: "/articles/real-deal-supermarket-savvy-shopping", + }, + ], + }, + }, + { + type: "node--article", + id: "c0250ce7-7b5b-4b41-8557-647c858b29a2", + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/c0250ce7-7b5b-4b41-8557-647c858b29a2?resourceVersion=id%3A5", + }, + }, + attributes: { + drupal_internal__nid: 5, + drupal_internal__vid: 5, + langcode: "de", + revision_timestamp: "2023-02-23T11:10:08+00:00", + revision_log: null, + status: true, + title: "Probieren Sie es aus und bauen Sie Ihre eigenen Kräuter an!", + created: "2023-01-30T08:11:24+00:00", + changed: "2023-02-23T11:10:08+00:00", + promote: true, + sticky: false, + default_langcode: true, + revision_translation_affected: true, + path: { + alias: + "/articles/probieren-sie-es-aus-und-bauen-sie-ihre-eigenen-kraeuter", + pid: 6, + langcode: "de", + }, + content_translation_source: "und", + content_translation_outdated: false, + body: { + value: + "

Es gibt nichts Besseres, als einen eigenen Vorrat an frischen Kräutern zu haben, die man beim Kochen sofort verwenden kann. Egal, ob Sie einen großen Garten oder eine kleine Fensterbank in der Küche haben, es gibt immer genug Platz für etwas Selbstgezogenes.

Außenbereich

Minze

Minze ist eine großartige Pflanze, denn sie ist winterhart und kann in fast jedem Boden wachsen. Minze kann wild wachsen, also halten Sie sie in einem Topf, sonst könnte sie sich ausbreiten und Ihren ganzen Garten erobern.

Salbei

Wie die Minze ist auch der Salbei eine sehr wüchsige Pflanze, die sich in Ihrem Garten ausbreitet, wenn Sie es zulassen. Die hocharomatische Salbeipflanze kann in einem Topf oder einem Blumenbeet in gut durchlässigem Boden gepflanzt werden. Die beste Art, das Kraut aufzubewahren, ist, die Blätter an der Sonne zu trocknen und in einem kühlen, dunklen Schrank in einem verschlossenen Behälter aufzubewahren.

Rosmarin

Rosmarinpflanzen wachsen zu schönen Sträuchern heran. Rosmarin lässt sich leicht aus Stecklingen ziehen, aber er verträgt keinen Frost. Stellen Sie daher Töpfe oder gepflanzte Sträucher in der Nähe des Hauses auf, um sie vor der Kälte zu schützen. Er wächst gut in Töpfen, da er trockene Böden mag, kann aber auch gut in der Erde überleben. Wenn Sie den Rosmarin beschneiden, um ihn in eine bessere Form zu bringen, bewahren Sie die Zweige auf und hängen Sie sie kopfüber auf, um das Aroma zu bewahren und sie für Lebensmittel zu verwenden.

", + format: "ckeditor", + processed: + "

Es gibt nichts Besseres, als einen eigenen Vorrat an frischen Kräutern zu haben, die man beim Kochen sofort verwenden kann. Egal, ob Sie einen großen Garten oder eine kleine Fensterbank in der Küche haben, es gibt immer genug Platz für etwas Selbstgezogenes.

Außenbereich

Minze

Minze ist eine großartige Pflanze, denn sie ist winterhart und kann in fast jedem Boden wachsen. Minze kann wild wachsen, also halten Sie sie in einem Topf, sonst könnte sie sich ausbreiten und Ihren ganzen Garten erobern.

Salbei

Wie die Minze ist auch der Salbei eine sehr wüchsige Pflanze, die sich in Ihrem Garten ausbreitet, wenn Sie es zulassen. Die hocharomatische Salbeipflanze kann in einem Topf oder einem Blumenbeet in gut durchlässigem Boden gepflanzt werden. Die beste Art, das Kraut aufzubewahren, ist, die Blätter an der Sonne zu trocknen und in einem kühlen, dunklen Schrank in einem verschlossenen Behälter aufzubewahren.

Rosmarin

Rosmarinpflanzen wachsen zu schönen Sträuchern heran. Rosmarin lässt sich leicht aus Stecklingen ziehen, aber er verträgt keinen Frost. Stellen Sie daher Töpfe oder gepflanzte Sträucher in der Nähe des Hauses auf, um sie vor der Kälte zu schützen. Er wächst gut in Töpfen, da er trockene Böden mag, kann aber auch gut in der Erde überleben. Wenn Sie den Rosmarin beschneiden, um ihn in eine bessere Form zu bringen, bewahren Sie die Zweige auf und hängen Sie sie kopfüber auf, um das Aroma zu bewahren und sie für Lebensmittel zu verwenden.

", + summary: + "Es gibt nichts Besseres, als einen eigenen Vorrat an frischen Kräutern zu haben, die man beim Kochen sofort verwenden kann. Egal, ob Sie einen großen Garten oder eine kleine Fensterbank in der Küche haben, es gibt immer genug Platz für etwas Selbstgezogenes.", + }, + }, + relationships: { + node_type: { + data: null, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/c0250ce7-7b5b-4b41-8557-647c858b29a2/relationships/node_type?resourceVersion=id%3A5", + }, + }, + }, + revision_uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/c0250ce7-7b5b-4b41-8557-647c858b29a2/revision_uid?resourceVersion=id%3A5", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/c0250ce7-7b5b-4b41-8557-647c858b29a2/relationships/revision_uid?resourceVersion=id%3A5", + }, + }, + }, + uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/c0250ce7-7b5b-4b41-8557-647c858b29a2/uid?resourceVersion=id%3A5", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/c0250ce7-7b5b-4b41-8557-647c858b29a2/relationships/uid?resourceVersion=id%3A5", + }, + }, + }, + field_media: { + data: { + type: "media--image", + id: "e8871454-98b9-4421-988b-b63b7e749566", + meta: { + drupal_internal__target_id: 7, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/c0250ce7-7b5b-4b41-8557-647c858b29a2/field_media?resourceVersion=id%3A5", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/c0250ce7-7b5b-4b41-8557-647c858b29a2/relationships/field_media?resourceVersion=id%3A5", + }, + }, + }, + }, + meta: { + localeInfo: [ + { + langcode: "en", + path: "/articles/give-it-go-and-grow-your-own-herbs", + }, + ], + }, + }, + { + type: "node--article", + id: "708bbe72-76d1-4e20-919c-e2785e0d7e93", + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/708bbe72-76d1-4e20-919c-e2785e0d7e93?resourceVersion=id%3A6", + }, + }, + attributes: { + drupal_internal__nid: 6, + drupal_internal__vid: 6, + langcode: "de", + revision_timestamp: "2023-02-23T11:10:08+00:00", + revision_log: null, + status: true, + title: "Ein Applaus für Karotten", + created: "2023-01-30T08:19:20+00:00", + changed: "2023-02-23T11:10:08+00:00", + promote: true, + sticky: false, + default_langcode: true, + revision_translation_affected: true, + path: { + alias: "/articles/ein-applaus-fuer-karotten", + pid: 7, + langcode: "de", + }, + content_translation_source: "und", + content_translation_outdated: false, + body: { + value: + '

Ein Hoch auf die bescheidene Karotte! Dieses süße und gesunde "Alltagsgemüse" hat es in sich. Großartiger Geschmack, fantastische Farbe, und wenn man den alten Geschichten Glauben schenkt, kann sie sogar helfen, im Dunkeln besser zu sehen.

Wer kocht nicht gern mit diesem vielseitigen Wurzelgemüse? Wir braten sie, kochen sie, mischen sie in Suppen und reiben sie in Salate. Die bescheidene Karotte ist eines unserer Lieblingsgemüse und wird schon seit Tausenden von Jahren angebaut. Damals gab es aber eher lila, rote, gelbe oder weiße Karotten und nicht die orangefarbenen, die wir heute so gut kennen.

Was ist also passiert? Seit wann ist Orange die bevorzugte Farbe?

Es waren die Niederländer im 17. Jahrhundert, die die orangefarbene Sorte kultivierten und populär machten, wahrscheinlich wegen ihrer leuchtenden Farbe und ihres höheren Gehalts an Beta-Carotin. Es wird auch vermutet, dass sie als Hommage an Wilhelm von Oranien angebaut wurde, der den Kampf um die Unabhängigkeit der Niederlande anführte.

Aus welchem Grund auch immer, die orangefarbene Sorte hat sich durchgesetzt, aber halten Sie auf Bauernmärkten und in Lebensmittelgeschäften Ausschau nach den "Heritage"-Sorten, deren Mischung aus Violett, Gelb, Orange und Weiß sich besonders gut zum Kochen eignet und als Beilage absolut großartig aussieht.

', + format: "ckeditor", + processed: + '

Ein Hoch auf die bescheidene Karotte! Dieses süße und gesunde "Alltagsgemüse" hat es in sich. Großartiger Geschmack, fantastische Farbe, und wenn man den alten Geschichten Glauben schenkt, kann sie sogar helfen, im Dunkeln besser zu sehen.

Wer kocht nicht gern mit diesem vielseitigen Wurzelgemüse? Wir braten sie, kochen sie, mischen sie in Suppen und reiben sie in Salate. Die bescheidene Karotte ist eines unserer Lieblingsgemüse und wird schon seit Tausenden von Jahren angebaut. Damals gab es aber eher lila, rote, gelbe oder weiße Karotten und nicht die orangefarbenen, die wir heute so gut kennen.

Was ist also passiert? Seit wann ist Orange die bevorzugte Farbe?

Es waren die Niederländer im 17. Jahrhundert, die die orangefarbene Sorte kultivierten und populär machten, wahrscheinlich wegen ihrer leuchtenden Farbe und ihres höheren Gehalts an Beta-Carotin. Es wird auch vermutet, dass sie als Hommage an Wilhelm von Oranien angebaut wurde, der den Kampf um die Unabhängigkeit der Niederlande anführte.

Aus welchem Grund auch immer, die orangefarbene Sorte hat sich durchgesetzt, aber halten Sie auf Bauernmärkten und in Lebensmittelgeschäften Ausschau nach den "Heritage"-Sorten, deren Mischung aus Violett, Gelb, Orange und Weiß sich besonders gut zum Kochen eignet und als Beilage absolut großartig aussieht.

', + summary: + 'Ein Hoch auf die bescheidene Karotte! Dieses süße und gesunde "Alltagsgemüse" hat es in sich. Großartiger Geschmack, fantastische Farbe, und wenn man den alten Geschichten Glauben schenkt, kann sie sogar helfen, im Dunkeln besser zu sehen.', + }, + }, + relationships: { + node_type: { + data: null, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/708bbe72-76d1-4e20-919c-e2785e0d7e93/relationships/node_type?resourceVersion=id%3A6", + }, + }, + }, + revision_uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/708bbe72-76d1-4e20-919c-e2785e0d7e93/revision_uid?resourceVersion=id%3A6", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/708bbe72-76d1-4e20-919c-e2785e0d7e93/relationships/revision_uid?resourceVersion=id%3A6", + }, + }, + }, + uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/708bbe72-76d1-4e20-919c-e2785e0d7e93/uid?resourceVersion=id%3A6", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/708bbe72-76d1-4e20-919c-e2785e0d7e93/relationships/uid?resourceVersion=id%3A6", + }, + }, + }, + field_media: { + data: { + type: "media--image", + id: "5560b9b2-b088-44e8-9213-18864ee7c8ae", + meta: { + drupal_internal__target_id: 5, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/708bbe72-76d1-4e20-919c-e2785e0d7e93/field_media?resourceVersion=id%3A6", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/708bbe72-76d1-4e20-919c-e2785e0d7e93/relationships/field_media?resourceVersion=id%3A6", + }, + }, + }, + }, + meta: { + localeInfo: [ + { + langcode: "en", + path: "/articles/lets-hear-it-carrots", + }, + ], + }, + }, + { + type: "node--article", + id: "bc3ae841-d9fe-4f95-b1cd-bb5ac2ace4d3", + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/bc3ae841-d9fe-4f95-b1cd-bb5ac2ace4d3?resourceVersion=id%3A7", + }, + }, + attributes: { + drupal_internal__nid: 7, + drupal_internal__vid: 7, + langcode: "de", + revision_timestamp: "2023-02-23T11:10:08+00:00", + revision_log: null, + status: true, + title: "Verleihen Sie Ihren Haferflocken das ultimative Makeover", + created: "2023-01-30T08:26:39+00:00", + changed: "2023-02-23T11:10:08+00:00", + promote: true, + sticky: false, + default_langcode: true, + revision_translation_affected: true, + path: { + alias: + "/articles/verleihen-sie-ihren-haferflocken-das-ultimative-makeover", + pid: 8, + langcode: "de", + }, + content_translation_source: "und", + content_translation_outdated: false, + body: { + value: + "

Sie sind vegan, glutenfrei, fettarm, ballaststoffreich und können sogar den Cholesterinspiegel senken - aber Haferflocken sind doch langweilig, oder? Bevor Sie die langweiligen Haferflocken in die Tonne kloppen, sollten Sie sich von unseren Topping-Ideen inspirieren lassen, die Ihre Haferflocken in nur wenigen Minuten von fade zu kreativ und köstlich machen.

Ob Haferflocken, Haferbrei, heiße Müsli oder einfach nur Haferflocken - Haferflocken sind auf der ganzen Welt beliebt, aber in letzter Zeit bekommt der einfache Hafer ein neues Gesicht. Vorbei sind die Zeiten der faden Frühstücksschalen mit dickem Brei, denn Haferflocken werden jetzt als köstliche Mahlzeit serviert, die zu jeder Tageszeit passt. Trendige Haferflockenriegel, die man sich selbst zusammenstellen kann, tauchen immer häufiger auf und bieten das ultimative Haferflockenerlebnis. Die Gäste können wählen, ob die Haferflocken mit Milch oder Wasser zubereitet werden sollen, und dann nach Belieben süße, herzhafte oder sogar pikante Beläge hinzufügen.

Klingt toll, nicht wahr? Bevor Sie also die Tür des Schranks mit dem unscheinbaren Glas Haferflocken schließen, sollten Sie einige dieser leckeren Garnier-Ideen ausprobieren, um Ihre eigenen Haferflocken neu zu gestalten.

", + format: "ckeditor", + processed: + "

Sie sind vegan, glutenfrei, fettarm, ballaststoffreich und können sogar den Cholesterinspiegel senken - aber Haferflocken sind doch langweilig, oder? Bevor Sie die langweiligen Haferflocken in die Tonne kloppen, sollten Sie sich von unseren Topping-Ideen inspirieren lassen, die Ihre Haferflocken in nur wenigen Minuten von fade zu kreativ und köstlich machen.

Ob Haferflocken, Haferbrei, heiße Müsli oder einfach nur Haferflocken - Haferflocken sind auf der ganzen Welt beliebt, aber in letzter Zeit bekommt der einfache Hafer ein neues Gesicht. Vorbei sind die Zeiten der faden Frühstücksschalen mit dickem Brei, denn Haferflocken werden jetzt als köstliche Mahlzeit serviert, die zu jeder Tageszeit passt. Trendige Haferflockenriegel, die man sich selbst zusammenstellen kann, tauchen immer häufiger auf und bieten das ultimative Haferflockenerlebnis. Die Gäste können wählen, ob die Haferflocken mit Milch oder Wasser zubereitet werden sollen, und dann nach Belieben süße, herzhafte oder sogar pikante Beläge hinzufügen.

Klingt toll, nicht wahr? Bevor Sie also die Tür des Schranks mit dem unscheinbaren Glas Haferflocken schließen, sollten Sie einige dieser leckeren Garnier-Ideen ausprobieren, um Ihre eigenen Haferflocken neu zu gestalten.

", + summary: + "Sie sind vegan, glutenfrei, fettarm, ballaststoffreich und können sogar den Cholesterinspiegel senken - aber Haferflocken sind doch langweilig, oder? ", + }, + }, + relationships: { + node_type: { + data: null, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/bc3ae841-d9fe-4f95-b1cd-bb5ac2ace4d3/relationships/node_type?resourceVersion=id%3A7", + }, + }, + }, + revision_uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/bc3ae841-d9fe-4f95-b1cd-bb5ac2ace4d3/revision_uid?resourceVersion=id%3A7", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/bc3ae841-d9fe-4f95-b1cd-bb5ac2ace4d3/relationships/revision_uid?resourceVersion=id%3A7", + }, + }, + }, + uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/bc3ae841-d9fe-4f95-b1cd-bb5ac2ace4d3/uid?resourceVersion=id%3A7", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/bc3ae841-d9fe-4f95-b1cd-bb5ac2ace4d3/relationships/uid?resourceVersion=id%3A7", + }, + }, + }, + field_media: { + data: { + type: "media--image", + id: "f1af4452-15a1-46ec-9b7e-871212a0ee4c", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/bc3ae841-d9fe-4f95-b1cd-bb5ac2ace4d3/field_media?resourceVersion=id%3A7", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/bc3ae841-d9fe-4f95-b1cd-bb5ac2ace4d3/relationships/field_media?resourceVersion=id%3A7", + }, + }, + }, + }, + meta: { + localeInfo: [ + { + langcode: "en", + path: "/articles/give-your-oatmeal-ultimate-makeover", + }, + ], + }, + }, + { + type: "node--article", + id: "7ba6c26b-b6b6-4fdf-8566-c9dc1d2133ad", + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/7ba6c26b-b6b6-4fdf-8566-c9dc1d2133ad?resourceVersion=id%3A8", + }, + }, + attributes: { + drupal_internal__nid: 8, + drupal_internal__vid: 8, + langcode: "de", + revision_timestamp: "2023-02-23T11:10:08+00:00", + revision_log: null, + status: true, + title: "Überspringen Sie die Spirituosen mit köstlichen Mocktails", + created: "2023-01-30T08:24:15+00:00", + changed: "2023-02-23T11:10:08+00:00", + promote: true, + sticky: false, + default_langcode: true, + revision_translation_affected: true, + path: { + alias: + "/articles/ueberspringen-sie-die-spirituosen-mit-koestlichen-mocktails", + pid: 9, + langcode: "de", + }, + content_translation_source: "und", + content_translation_outdated: false, + body: { + value: + "

Feiern Sie eine Cocktailparty? Warum dann nicht etwas ebenso Besonderes für diejenigen auftischen, die keinen Alkohol trinken, aber trotzdem mitfeiern wollen? Denn was wäre eine Cocktailparty ohne die tollen Gläser mit gemischten Früchten, die bunten Farben und natürlich die kleinen Schirmchen? Tragen Sie Ihren Teil zum Umweltschutz bei, indem Sie auf Plastikstrohhalme verzichten und sich stattdessen ein paar tolle Alternativen aus Glas, Metall oder sogar Bambus besorgen. Vergessen Sie nicht die klassischen Cocktailgläser und die coolen Becher, die diese Rezepte erst so richtig zum Leben erwecken.

Also, schnappen Sie sich den Cocktailmixer, lassen Sie die Spirituosen weg und schütteln Sie diese köstlich erfrischenden Mocktails, die weder Ihnen noch Ihren Gästen an Geschmack oder Stil mangeln werden.

Mango-Köstlich

Dieser köstliche Drink hat einen raffinierten Geschmack, der ideal für Erwachsene ist, und die Farbe passt perfekt zu einem spätsommerlichen BBQ.

Anleitung

Schütteln Sie ein paar Gurkenscheiben und etwas Honig in einem Cocktailshaker gut durch. Einen Schuss Mangopüree und den Saft einer Limette hinzufügen. Etwas Eis hinzufügen und kräftig schütteln. Durch ein Sieb in ein schickes Glas gießen und mit Ginger Beer auffüllen. Ein paar Limettenscheiben, und schon kann es losgehen.

", + format: "ckeditor", + processed: + "

Feiern Sie eine Cocktailparty? Warum dann nicht etwas ebenso Besonderes für diejenigen auftischen, die keinen Alkohol trinken, aber trotzdem mitfeiern wollen? Denn was wäre eine Cocktailparty ohne die tollen Gläser mit gemischten Früchten, die bunten Farben und natürlich die kleinen Schirmchen? Tragen Sie Ihren Teil zum Umweltschutz bei, indem Sie auf Plastikstrohhalme verzichten und sich stattdessen ein paar tolle Alternativen aus Glas, Metall oder sogar Bambus besorgen. Vergessen Sie nicht die klassischen Cocktailgläser und die coolen Becher, die diese Rezepte erst so richtig zum Leben erwecken.

Also, schnappen Sie sich den Cocktailmixer, lassen Sie die Spirituosen weg und schütteln Sie diese köstlich erfrischenden Mocktails, die weder Ihnen noch Ihren Gästen an Geschmack oder Stil mangeln werden.

Mango-Köstlich

Dieser köstliche Drink hat einen raffinierten Geschmack, der ideal für Erwachsene ist, und die Farbe passt perfekt zu einem spätsommerlichen BBQ.

Anleitung

Schütteln Sie ein paar Gurkenscheiben und etwas Honig in einem Cocktailshaker gut durch. Einen Schuss Mangopüree und den Saft einer Limette hinzufügen. Etwas Eis hinzufügen und kräftig schütteln. Durch ein Sieb in ein schickes Glas gießen und mit Ginger Beer auffüllen. Ein paar Limettenscheiben, und schon kann es losgehen.

", + summary: + "Feiern Sie eine Cocktailparty? Warum dann nicht etwas ebenso Besonderes für diejenigen auftischen, die keinen Alkohol trinken, aber trotzdem mitfeiern wollen? ", + }, + }, + relationships: { + node_type: { + data: null, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/7ba6c26b-b6b6-4fdf-8566-c9dc1d2133ad/relationships/node_type?resourceVersion=id%3A8", + }, + }, + }, + revision_uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/7ba6c26b-b6b6-4fdf-8566-c9dc1d2133ad/revision_uid?resourceVersion=id%3A8", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/7ba6c26b-b6b6-4fdf-8566-c9dc1d2133ad/relationships/revision_uid?resourceVersion=id%3A8", + }, + }, + }, + uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/7ba6c26b-b6b6-4fdf-8566-c9dc1d2133ad/uid?resourceVersion=id%3A8", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/7ba6c26b-b6b6-4fdf-8566-c9dc1d2133ad/relationships/uid?resourceVersion=id%3A8", + }, + }, + }, + field_media: { + data: { + type: "media--image", + id: "de14673c-55ac-41ff-823d-3047e9ce2e72", + meta: { + drupal_internal__target_id: 3, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/7ba6c26b-b6b6-4fdf-8566-c9dc1d2133ad/field_media?resourceVersion=id%3A8", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/7ba6c26b-b6b6-4fdf-8566-c9dc1d2133ad/relationships/field_media?resourceVersion=id%3A8", + }, + }, + }, + }, + meta: { + localeInfo: [ + { + langcode: "en", + path: "/articles/skip-spirits-delicious-mocktails", + }, + ], + }, + }, + { + type: "node--article", + id: "5e462a38-de37-4769-add2-998db91fd839", + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/5e462a38-de37-4769-add2-998db91fd839?resourceVersion=id%3A9", + }, + }, + attributes: { + drupal_internal__nid: 9, + drupal_internal__vid: 9, + langcode: "de", + revision_timestamp: "2023-02-23T11:10:08+00:00", + revision_log: null, + status: true, + title: "Der Umami-Führer für unsere Lieblingspilze", + created: "2023-01-30T08:17:34+00:00", + changed: "2023-02-23T11:10:08+00:00", + promote: true, + sticky: false, + default_langcode: true, + revision_translation_affected: true, + path: { + alias: "/articles/der-umami-fuehrer-fuer-unsere-lieblingspilze", + pid: 10, + langcode: "de", + }, + content_translation_source: "und", + content_translation_outdated: false, + body: { + value: + "

Wir sind der Meinung, dass Pilze eine der besten Zutaten sind, mit denen man kochen kann. Es gibt viele essbare Sorten, jede mit ihrer eigenen, unverwechselbaren Form, Größe und Geschmack. Und wer würde bei so kuriosen Namen wie Pfifferling, Zigeunerpilz, Füllhorn oder Waldhenne nicht gerne mehr über das Kochen mit dem mächtigen Pilz erfahren?

Eines der besten Dinge an Pilzen ist ihre Vielseitigkeit. Sie können gebraten, geröstet, gegrillt, gedünstet oder sogar in der Mikrowelle gegart werden. Und sie können als Hauptzutat für ein Gericht serviert oder einfach als Teil der Mischung hinzugefügt werden. Das macht Pilze zu einer idealen Wahl für die Zubereitung absolut köstlicher vegetarischer Gerichte.

Werfen wir also einen Blick auf einige unserer Lieblingspilzsorten. Vielleicht haben Sie noch nie mit ihnen gekocht, aber das sollte Sie nicht abschrecken. Mit ihren köstlichen, unverwechselbaren Aromen können Sie Suppen, Vorspeisen und Soßen ganz einfach verwandeln und erstaunliche Nudel- oder Pfannengerichte kreieren.

Probieren Sie die lieblichen Shiitake. Sie werden in der asiatischen Küche verwendet und können getrocknet und rehydriert gekauft werden, um einen kräftigen, tiefen Geschmack zu erhalten. Oder Sie kaufen ihn frisch und fügen ihn zu Suppen und Pfannengerichten hinzu. Dieser Pilz hat nicht nur einen intensiven Geschmack, sondern sieht auch schön aus. Das tiefe Braun und die glatten Formen geben Ihrem Gericht eine besondere Textur. In getrockneter Form und rehydriert sind sie die perfekte Ergänzung für eine tiefe und würzige Brühe für ein Risotto.

Der prächtige sonnige Pfifferling mit seinem gelben Fruchtfleisch hat einen fruchtigen Geschmack - aber es ist erwähnenswert, dass es viele Nachahmer gibt, und man sollte darauf achten, dass man die richtigen isst. Diese sehen in einem Omelett oder einer asiatischen Suppe großartig aus, um die Gelbtöne zu ergänzen.

Die braune Morchel bietet einen fleischigen und unverwechselbaren Geschmack, und Sie werden wahrscheinlich lieben, wie außergewöhnlich sie in einer Mahlzeit aussieht. Die Morchel ist ein beliebter Pilz im Frühjahr, wenn ihr Angebot besonders groß ist.

Eine Delikatesse ist der Enoki mit seinen winzigen weißen Köpfen, die in Büscheln wachsen. Sie können sogar roh in Salaten verzehrt werden. Schließlich können Sie den beliebten Austernpilz wählen. Sie heißen so, weil sie nicht wie ein Pilz aussehen, sondern den Innereien einer Auster ähneln, und ihr süßer Geschmack ist köstlich.

", + format: "ckeditor", + processed: + "

Wir sind der Meinung, dass Pilze eine der besten Zutaten sind, mit denen man kochen kann. Es gibt viele essbare Sorten, jede mit ihrer eigenen, unverwechselbaren Form, Größe und Geschmack. Und wer würde bei so kuriosen Namen wie Pfifferling, Zigeunerpilz, Füllhorn oder Waldhenne nicht gerne mehr über das Kochen mit dem mächtigen Pilz erfahren?

Eines der besten Dinge an Pilzen ist ihre Vielseitigkeit. Sie können gebraten, geröstet, gegrillt, gedünstet oder sogar in der Mikrowelle gegart werden. Und sie können als Hauptzutat für ein Gericht serviert oder einfach als Teil der Mischung hinzugefügt werden. Das macht Pilze zu einer idealen Wahl für die Zubereitung absolut köstlicher vegetarischer Gerichte.

Werfen wir also einen Blick auf einige unserer Lieblingspilzsorten. Vielleicht haben Sie noch nie mit ihnen gekocht, aber das sollte Sie nicht abschrecken. Mit ihren köstlichen, unverwechselbaren Aromen können Sie Suppen, Vorspeisen und Soßen ganz einfach verwandeln und erstaunliche Nudel- oder Pfannengerichte kreieren.

Probieren Sie die lieblichen Shiitake. Sie werden in der asiatischen Küche verwendet und können getrocknet und rehydriert gekauft werden, um einen kräftigen, tiefen Geschmack zu erhalten. Oder Sie kaufen ihn frisch und fügen ihn zu Suppen und Pfannengerichten hinzu. Dieser Pilz hat nicht nur einen intensiven Geschmack, sondern sieht auch schön aus. Das tiefe Braun und die glatten Formen geben Ihrem Gericht eine besondere Textur. In getrockneter Form und rehydriert sind sie die perfekte Ergänzung für eine tiefe und würzige Brühe für ein Risotto.

Der prächtige sonnige Pfifferling mit seinem gelben Fruchtfleisch hat einen fruchtigen Geschmack - aber es ist erwähnenswert, dass es viele Nachahmer gibt, und man sollte darauf achten, dass man die richtigen isst. Diese sehen in einem Omelett oder einer asiatischen Suppe großartig aus, um die Gelbtöne zu ergänzen.

Die braune Morchel bietet einen fleischigen und unverwechselbaren Geschmack, und Sie werden wahrscheinlich lieben, wie außergewöhnlich sie in einer Mahlzeit aussieht. Die Morchel ist ein beliebter Pilz im Frühjahr, wenn ihr Angebot besonders groß ist.

Eine Delikatesse ist der Enoki mit seinen winzigen weißen Köpfen, die in Büscheln wachsen. Sie können sogar roh in Salaten verzehrt werden. Schließlich können Sie den beliebten Austernpilz wählen. Sie heißen so, weil sie nicht wie ein Pilz aussehen, sondern den Innereien einer Auster ähneln, und ihr süßer Geschmack ist köstlich.

", + summary: + "Wir sind der Meinung, dass Pilze eine der besten Zutaten sind, mit denen man kochen kann. Es gibt viele essbare Sorten, jede mit ihrer eigenen, unverwechselbaren Form, Größe und Geschmack. ", + }, + }, + relationships: { + node_type: { + data: null, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/5e462a38-de37-4769-add2-998db91fd839/relationships/node_type?resourceVersion=id%3A9", + }, + }, + }, + revision_uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/5e462a38-de37-4769-add2-998db91fd839/revision_uid?resourceVersion=id%3A9", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/5e462a38-de37-4769-add2-998db91fd839/relationships/revision_uid?resourceVersion=id%3A9", + }, + }, + }, + uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/5e462a38-de37-4769-add2-998db91fd839/uid?resourceVersion=id%3A9", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/5e462a38-de37-4769-add2-998db91fd839/relationships/uid?resourceVersion=id%3A9", + }, + }, + }, + field_media: { + data: { + type: "media--image", + id: "8f8895dc-d6e4-469f-8a89-f6729cdfed0f", + meta: { + drupal_internal__target_id: 4, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/5e462a38-de37-4769-add2-998db91fd839/field_media?resourceVersion=id%3A9", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/5e462a38-de37-4769-add2-998db91fd839/relationships/field_media?resourceVersion=id%3A9", + }, + }, + }, + }, + meta: { + localeInfo: [ + { + langcode: "en", + path: "/articles/umami-guide-our-favorite-mushrooms", + }, + ], + }, + }, + { + type: "node--article", + id: "79cb4f78-4ae0-4db1-b4e7-5fa9758b9a30", + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/79cb4f78-4ae0-4db1-b4e7-5fa9758b9a30?resourceVersion=id%3A10", + }, + }, + attributes: { + drupal_internal__nid: 10, + drupal_internal__vid: 10, + langcode: "de", + revision_timestamp: "2023-02-23T11:10:08+00:00", + revision_log: null, + status: true, + title: "Missgeschicke beim Backen - unsere Tipps zur Fehlerbehebung", + created: "2023-01-30T08:21:41+00:00", + changed: "2023-02-23T11:10:08+00:00", + promote: true, + sticky: false, + default_langcode: true, + revision_translation_affected: true, + path: { + alias: + "/articles/missgeschicke-beim-backen-unsere-tipps-zur-fehlerbehebung", + pid: 11, + langcode: "de", + }, + content_translation_source: "und", + content_translation_outdated: false, + body: { + value: + "

Sie halten sich an das Rezept, wiegen alle Zutaten ab, verwenden die richtige Ofentemperatur und nehmen sich Zeit - und trotzdem wird Ihr Gebäck am Ende matschig, geht nicht auf oder schmeckt einfach nur furchtbar. Wir haben eine Liste mit den frustrierendsten Backproblemen und den Techniken, die Sie anwenden können, um sie zu vermeiden, zusammengestellt.

Ihr Kuchen ist nicht aufgegangen

Öffnen Sie auf keinen Fall die Ofentür mitten in der Backzeit. Die Hitze zischt heraus und zerstört die chemische Reaktion, die in Ihrem Kuchen stattfindet. Ihr Backtriebmittel braucht die Hitze, um aktiviert zu werden, und Sie könnten es abtöten.

Ihr Kuchen ist zäh und hart

Wenn Ihr heller Biskuit die Konsistenz eines Reservereifens hat, haben Sie Ihren Teig möglicherweise zu stark gemischt. Behalten Sie die Leichtigkeit Ihres Kuchenteigs bei, indem Sie die Zutaten vorsichtig und behutsam unterheben, aber nur so weit, bis sie gerade vermischt sind. Wenn Sie zu viel unterheben, tritt das Gluten im Mehl aus und Sie backen eher Brot als Kuchen.

", + format: "ckeditor", + processed: + "

Sie halten sich an das Rezept, wiegen alle Zutaten ab, verwenden die richtige Ofentemperatur und nehmen sich Zeit - und trotzdem wird Ihr Gebäck am Ende matschig, geht nicht auf oder schmeckt einfach nur furchtbar. Wir haben eine Liste mit den frustrierendsten Backproblemen und den Techniken, die Sie anwenden können, um sie zu vermeiden, zusammengestellt.

Ihr Kuchen ist nicht aufgegangen

Öffnen Sie auf keinen Fall die Ofentür mitten in der Backzeit. Die Hitze zischt heraus und zerstört die chemische Reaktion, die in Ihrem Kuchen stattfindet. Ihr Backtriebmittel braucht die Hitze, um aktiviert zu werden, und Sie könnten es abtöten.

Ihr Kuchen ist zäh und hart

Wenn Ihr heller Biskuit die Konsistenz eines Reservereifens hat, haben Sie Ihren Teig möglicherweise zu stark gemischt. Behalten Sie die Leichtigkeit Ihres Kuchenteigs bei, indem Sie die Zutaten vorsichtig und behutsam unterheben, aber nur so weit, bis sie gerade vermischt sind. Wenn Sie zu viel unterheben, tritt das Gluten im Mehl aus und Sie backen eher Brot als Kuchen.

", + summary: + "Man hält sich an das Rezept, wiegt alle Zutaten ab, wählt die richtige Ofentemperatur und nimmt sich Zeit, und trotzdem wird das Backwerk am Ende matschig, geht nicht auf oder schmeckt einfach nur furchtbar.", + }, + }, + relationships: { + node_type: { + data: null, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/79cb4f78-4ae0-4db1-b4e7-5fa9758b9a30/relationships/node_type?resourceVersion=id%3A10", + }, + }, + }, + revision_uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/79cb4f78-4ae0-4db1-b4e7-5fa9758b9a30/revision_uid?resourceVersion=id%3A10", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/79cb4f78-4ae0-4db1-b4e7-5fa9758b9a30/relationships/revision_uid?resourceVersion=id%3A10", + }, + }, + }, + uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/79cb4f78-4ae0-4db1-b4e7-5fa9758b9a30/uid?resourceVersion=id%3A10", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/79cb4f78-4ae0-4db1-b4e7-5fa9758b9a30/relationships/uid?resourceVersion=id%3A10", + }, + }, + }, + field_media: { + data: { + type: "media--image", + id: "e1a3b027-8983-44a7-bbea-403898ba0260", + meta: { + drupal_internal__target_id: 6, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/79cb4f78-4ae0-4db1-b4e7-5fa9758b9a30/field_media?resourceVersion=id%3A10", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/79cb4f78-4ae0-4db1-b4e7-5fa9758b9a30/relationships/field_media?resourceVersion=id%3A10", + }, + }, + }, + }, + meta: { + localeInfo: [ + { + langcode: "en", + path: "/articles/baking-mishaps-our-troubleshooting-tips", + }, + ], + }, + }, + ], + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article", + }, + }, +} as const; + +export default JsonApiArticleCollection; diff --git a/packages/jsonapi/tests/fixtures/jsonapi_article_detail.ts b/packages/jsonapi/tests/fixtures/jsonapi_article_detail.ts new file mode 100644 index 0000000..ed96586 --- /dev/null +++ b/packages/jsonapi/tests/fixtures/jsonapi_article_detail.ts @@ -0,0 +1,128 @@ +const JsonApiArticleDetail = { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + data: { + type: "node--article", + id: "5f5f5f5f-5f5f-5f5f-5f5f-5f5f5f5f5f5f", + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/5f5f5f5f-5f5f-5f5f-5f5f-5f5f5f5f5f5f", + }, + }, + attributes: { + drupal_internal__nid: 3, + drupal_internal__vid: 3, + langcode: "de", + revision_timestamp: "2023-02-23T11:10:08+00:00", + revision_log: null, + status: true, + title: "Milchfreie und köstliche Milchschokolade", + created: "2023-01-27T09:38:39+00:00", + changed: "2023-02-23T11:10:08+00:00", + promote: true, + sticky: false, + default_langcode: true, + revision_translation_affected: true, + path: { + alias: "/articles/milchfreie-und-koestliche-milchschokolade", + pid: 4, + langcode: "de", + }, + content_translation_source: "und", + content_translation_outdated: false, + body: { + value: + "

Der Kalender ist voll von Ausreden für Schokoladenliebhaber, von religiösen Festen bis zu Geburtstagen - und sogar dem Weltschokoladentag am 7. Juli. Aber auch Veganer oder Menschen, die sich milchfrei ernähren, müssen nicht leer ausgehen, denn es gibt viele köstliche vegane Schokoladensorten im Angebot.

Milchfreie Milchschokolade wird weitgehend auf die gleiche Weise hergestellt wie normale Schokolade, bis zu dem Punkt, an dem die Milch hinzugefügt wird. Die Kakaobohnen werden ein paar Stunden lang geröstet, bis sie einen reichen Geschmack entwickeln. Die äußeren Schalen werden entfernt, und die inneren Nibs werden gemahlen, um eine Paste zu erhalten, die mit Kakaobutter gemischt werden kann, um den gewünschten Prozentsatz an Schokolade herzustellen. Aromen, Zucker und Milch werden in unterschiedlichen Mengen hinzugefügt, um die gewünschte Schokoladenart zu erhalten. Die Schokolade ist zu diesem Zeitpunkt körnig und muss püriert werden, bis sie glatt ist - das kann Tage dauern! Schließlich wird sie durch Erhitzen und Abkühlen temperiert, bis sie verzehrfertig ist.

Wie also bekommen vegane Chocolatiers den cremigen Milchgeschmack und die Textur in ihre Produkte?

", + format: "ckeditor", + processed: + "

Der Kalender ist voll von Ausreden für Schokoladenliebhaber, von religiösen Festen bis zu Geburtstagen - und sogar dem Weltschokoladentag am 7. Juli. Aber auch Veganer oder Menschen, die sich milchfrei ernähren, müssen nicht leer ausgehen, denn es gibt viele köstliche vegane Schokoladensorten im Angebot.

Milchfreie Milchschokolade wird weitgehend auf die gleiche Weise hergestellt wie normale Schokolade, bis zu dem Punkt, an dem die Milch hinzugefügt wird. Die Kakaobohnen werden ein paar Stunden lang geröstet, bis sie einen reichen Geschmack entwickeln. Die äußeren Schalen werden entfernt, und die inneren Nibs werden gemahlen, um eine Paste zu erhalten, die mit Kakaobutter gemischt werden kann, um den gewünschten Prozentsatz an Schokolade herzustellen. Aromen, Zucker und Milch werden in unterschiedlichen Mengen hinzugefügt, um die gewünschte Schokoladenart zu erhalten. Die Schokolade ist zu diesem Zeitpunkt körnig und muss püriert werden, bis sie glatt ist - das kann Tage dauern! Schließlich wird sie durch Erhitzen und Abkühlen temperiert, bis sie verzehrfertig ist.

Wie also bekommen vegane Chocolatiers den cremigen Milchgeschmack und die Textur in ihre Produkte?

", + summary: + "Der Kalender ist voll von Ausreden für Schokoladenliebhaber, von religiösen Festen bis zu Geburtstagen - und sogar dem Weltschokoladentag am 7. Juli. Aber auch Veganer oder Menschen, die sich milchfrei ernähren, müssen nicht leer ausgehen, denn es gibt viele köstliche vegane Schokoladensorten im Angebot.", + }, + }, + relationships: { + node_type: { + data: null, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/relationships/node_type?resourceVersion=id%3A3", + }, + }, + }, + revision_uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/revision_uid?resourceVersion=id%3A3", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/relationships/revision_uid?resourceVersion=id%3A3", + }, + }, + }, + uid: { + data: { + type: "user--user", + id: "f0d79a17-a6b1-4c34-ba1b-ae298826f68a", + meta: { + drupal_internal__target_id: 1, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/uid?resourceVersion=id%3A3", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/relationships/uid?resourceVersion=id%3A3", + }, + }, + }, + field_media: { + data: { + type: "media--image", + id: "6530afc8-5635-45b7-a3d9-920d7e10c39e", + meta: { + drupal_internal__target_id: 8, + }, + }, + links: { + related: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/field_media?resourceVersion=id%3A3", + }, + self: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e/relationships/field_media?resourceVersion=id%3A3", + }, + }, + }, + }, + meta: { + localeInfo: [ + { + langcode: "en", + path: "/articles/dairy-free-and-delicious-milk-chocolate", + }, + ], + }, + }, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/article/58e198f6-41af-48b0-b889-596adcb9622e?resourceVersion=id%3A3", + }, + }, +} as const; + +export default JsonApiArticleDetail; diff --git a/packages/jsonapi/tests/fixtures/jsonapi_file_upload.ts b/packages/jsonapi/tests/fixtures/jsonapi_file_upload.ts new file mode 100644 index 0000000..35e2ded --- /dev/null +++ b/packages/jsonapi/tests/fixtures/jsonapi_file_upload.ts @@ -0,0 +1,42 @@ +const JsonApiFileUpload = { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + data: { + type: "file--file", + id: "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + links: { + self: { + href: "https://my-drupal.com/jsonapi/file/file/a1b2c3d4-e5f6-7890-abcd-ef1234567890", + }, + }, + attributes: { + drupal_internal__fid: 123, + langcode: "en", + filename: "test-image.jpg", + uri: { + value: "public://2024-01/test-image.jpg", + url: "/sites/default/files/2024-01/test-image.jpg", + }, + filemime: "image/jpeg", + filesize: 12345, + status: true, + created: "2024-01-15T10:30:00+00:00", + changed: "2024-01-15T10:30:00+00:00", + }, + }, + links: { + self: { + href: "https://my-drupal.com/jsonapi/node/with-file/5f5f5f5f-5f5f-5f5f-5f5f-5f5f5f5f5f5f/field_image", + }, + }, +} as const; + +export default JsonApiFileUpload; diff --git a/packages/jsonapi/tests/fixtures/jsonapi_include_error.ts b/packages/jsonapi/tests/fixtures/jsonapi_include_error.ts new file mode 100644 index 0000000..41a3296 --- /dev/null +++ b/packages/jsonapi/tests/fixtures/jsonapi_include_error.ts @@ -0,0 +1,30 @@ +const JsonApiIncludeError = { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + errors: [ + { + title: "Bad Request", + status: "400", + detail: + "`wrong-field` is not a valid relationship field name. Possible values: node_type, revision_uid, uid, menu_link, field_media.", + links: { + via: { + href: "https://my-drupal.com/jsonapi/node/article/5f5f5f5f-5f5f-5f5f-5f5f-5f5f5f5f5f5f", + }, + info: { + href: "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1", + }, + }, + }, + ], +} as const; + +export default JsonApiIncludeError; diff --git a/packages/jsonapi/tests/fixtures/jsonapi_index.ts b/packages/jsonapi/tests/fixtures/jsonapi_index.ts new file mode 100644 index 0000000..333d3e1 --- /dev/null +++ b/packages/jsonapi/tests/fixtures/jsonapi_index.ts @@ -0,0 +1,35 @@ +const JsonApiIndex = { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + data: [], + links: { + "file--file": { + href: "https://my-drupal.com/jsonapi/file/file", + }, + "media--image": { + href: "https://my-drupal.com/jsonapi/media/image", + }, + "node--article": { + href: "https://my-drupal.com/jsonapi/node/article", + }, + "node--page": { + href: "https://my-drupal.com/jsonapi/node/page", + }, + self: { + href: "https://my-drupal.com/jsonapi", + }, + "user--user": { + href: "https://my-drupal.com/jsonapi/user/user", + }, + }, +} as const; + +export default JsonApiIndex; diff --git a/packages/jsonapi/tests/fixtures/jsonapi_index_error.ts b/packages/jsonapi/tests/fixtures/jsonapi_index_error.ts new file mode 100644 index 0000000..1684181 --- /dev/null +++ b/packages/jsonapi/tests/fixtures/jsonapi_index_error.ts @@ -0,0 +1,20 @@ +const JsonApiIndexError = { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + errros: [ + { + title: "Error", + status: "500", + }, + ], +} as const; + +export default JsonApiIndexError; diff --git a/packages/jsonapi/tests/fixtures/jsonapi_menu_items.ts b/packages/jsonapi/tests/fixtures/jsonapi_menu_items.ts new file mode 100644 index 0000000..08e57bc --- /dev/null +++ b/packages/jsonapi/tests/fixtures/jsonapi_menu_items.ts @@ -0,0 +1,46 @@ +const JsonApiMenuItems = { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + data: [ + { + type: "menu_link_content--menu_link_content", + id: "menu_link_content:1c6d3476-61b1-4b7e-a580-6fa63bdac5d1", + attributes: { + description: null, + enabled: true, + expanded: false, + menu_name: "my_menu", + meta: { + entity_id: "2", + }, + options: [], + parent: "", + provider: "menu_link_content", + route: { + name: "entity.node.canonical", + parameters: { + node: "14", + }, + }, + title: "Test-Page", + url: "/test-page", + weight: 0, + }, + }, + ], + links: { + self: { + href: "https://my-drupal.com/jsonapi/menu_items/my_menu", + }, + }, +} as const; + +export default JsonApiMenuItems; diff --git a/packages/jsonapi/tests/fixtures/jsonapi_menu_items_error.ts b/packages/jsonapi/tests/fixtures/jsonapi_menu_items_error.ts new file mode 100644 index 0000000..20958fa --- /dev/null +++ b/packages/jsonapi/tests/fixtures/jsonapi_menu_items_error.ts @@ -0,0 +1,30 @@ +const JsonApiMenuItemsError = { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + errors: [ + { + title: "Not Found", + status: "404", + detail: + 'The "menu" parameter was not converted for the path "/jsonapi/menu_items/{menu}" (route name: "jsonapi_menu_items.menu")', + links: { + via: { + href: "https://my-drupal.com/jsonapi/menu_items/non_existant", + }, + info: { + href: "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5", + }, + }, + }, + ], +} as const; + +export default JsonApiMenuItemsError; diff --git a/packages/jsonapi/tests/fixtures/jsonapi_multiple_errors.ts b/packages/jsonapi/tests/fixtures/jsonapi_multiple_errors.ts new file mode 100644 index 0000000..4716a1a --- /dev/null +++ b/packages/jsonapi/tests/fixtures/jsonapi_multiple_errors.ts @@ -0,0 +1,46 @@ +const JsonApiErrorResponse = { + jsonapi: { + version: "1.0", + meta: { + links: { + self: { + href: "http://jsonapi.org/format/1.0/", + }, + }, + }, + }, + errors: [ + { + title: "Bad Request", + status: "400", + detail: + "`wrong-field` is not a valid relationship field name. Possible values: node_type, revision_uid, uid, menu_link, field_media.", + links: { + via: { + href: "https://my-drupal.com/jsonapi/node/article/5f5f5f5f-5f5f-5f5f-5f5f-5f5f5f5f5f5f", + }, + info: { + href: "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1", + }, + }, + }, + { + title: "Unprocessable Entity", + status: "422", + detail: "field_firstname: Dieser Wert sollte nicht leer sein.", + source: { + pointer: "/data/attributes/field_firstname", + }, + }, + { + title: "Unprocessable Entity", + status: "422", + detail: "field_lastname: Dieser Wert sollte nicht leer sein.", + source: { + pointer: "/data/attributes/field_lastname", + }, + }, + ], +} as const; + +export default JsonApiErrorResponse; diff --git a/packages/jsonapi/tests/menu.test.ts b/packages/jsonapi/tests/menu.test.ts index 1737d69..95f2c0c 100644 --- a/packages/jsonapi/tests/menu.test.ts +++ b/packages/jsonapi/tests/menu.test.ts @@ -4,8 +4,8 @@ import { setupServer } from "msw/node"; import { Drupalkit } from "@drupal-kit/core"; import { DrupalkitJsonApi, DrupalkitJsonApiError } from "../src/index.js"; -import JsonApiMenuItemsError from "./fixtures/jsonapi_menu_items_error.json" with { type: "json" }; -import JsonApiMenuItems from "./fixtures/jsonapi_menu_items.json" with { type: "json" }; +import JsonApiMenuItemsError from "./fixtures/jsonapi_menu_items_error.js"; +import JsonApiMenuItems from "./fixtures/jsonapi_menu_items.js"; const BASE_URL = "https://my-drupal.com"; diff --git a/packages/jsonapi/tests/resources.test.ts b/packages/jsonapi/tests/resources.test.ts index 0816135..c2e4912 100644 --- a/packages/jsonapi/tests/resources.test.ts +++ b/packages/jsonapi/tests/resources.test.ts @@ -5,12 +5,12 @@ import { setupServer } from "msw/node"; import { Drupalkit } from "@drupal-kit/core"; import { DrupalkitJsonApi, DrupalkitJsonApiError } from "../src/index.js"; -import JsonApiArticleCollection from "./fixtures/jsonapi_article_collection.json" with { type: "json" }; -import JsonApiArticleDetail from "./fixtures/jsonapi_article_detail.json" with { type: "json" }; -import JsonApiFileUpload from "./fixtures/jsonapi_file_upload.json" with { type: "json" }; -import JsonApiIncludeError from "./fixtures/jsonapi_include_error.json" with { type: "json" }; -import JsonApiIndexError from "./fixtures/jsonapi_index_error.json" with { type: "json" }; -import JsonApiIndex from "./fixtures/jsonapi_index.json" with { type: "json" }; +import JsonApiArticleCollection from "./fixtures/jsonapi_article_collection.js"; +import JsonApiArticleDetail from "./fixtures/jsonapi_article_detail.js"; +import JsonApiFileUpload from "./fixtures/jsonapi_file_upload.js"; +import JsonApiIncludeError from "./fixtures/jsonapi_include_error.js"; +import JsonApiIndexError from "./fixtures/jsonapi_index_error.js"; +import JsonApiIndex from "./fixtures/jsonapi_index.js"; import "./types.js"; diff --git a/packages/jsonapi/tests/snapshots/DrupalkitJsonApiError.test.ts.snap b/packages/jsonapi/tests/snapshots/DrupalkitJsonApiError.test.ts.snap index 127ea883719a2c88cfc87634611b3c8e5ffb354e..37a94f789d06c91b6a2d383655b4bd7ccdc57e61 100644 GIT binary patch literal 771 zcmV+e1N{6!RzVA4)0uT(fb_#Mdh-C#0Du`BpT^RfG5iRzSXC+&z)3&^oI<=^94cu5NC2RU05=g}6VC#S zZ?*R*bm;w9R;yLOOMqj56_`P97Jb0dG>%8)xR8Z;ywf*Y?bbSiWVFMCWlB57*#Va# zVumDlLMz)9G0R+-;ytRfZEdY+OG^C`vQ4IRL@jp|(>ybDAgs`;m56AbWxpP&q$P#g zpU2fU1E5TMAWl=|4=jIHA?v4!a`FDwjslrmuoYw8Y<*aLc+kacO-{I>}3 z9sxcLcgsK5EiX&ybReZMp*lL-{Wh@c9|)ewc+~@#^M>M%{TjE7-g6J&)v#OX-1RtA z*jU$4r!ZE#&c)3j==b~e{!(3=-C)~jr$a4mU^-!AWpSmLYnH;rg?iWZr00000000BMRLySFKoIuYNn5po1hqGiSQQ~INt~vohloRq+CxF26$l|t z>Bb&6+itvOcbzm+1p*0)6K}wQ@&ud^FVPdvz?}nk#&!+C1=3!KHJ+LE{O-(`_d!=k z??Asi2E&bj!<(CjMlsJ&P)aII110spkCCdxvTh-5k<$QE z+ueQe46%QT)oRrumn>4UNCj=|1>#twjGuiljEh`7+8rtx?$rYh!r!G_(@+}9=zt0C zV>5yoj_ve#L{k$QvOYBEj?|iW1tfMc=r(%!&@rP3YUniJ8l5^Z_iHqL^&yNqf`PY!)oa>0okg?k@A`LwJUDndH`-cbMS= z(&yrBIcILmPD?r&E2+f8K&GeP$4;FAXXzNP*_O3v7vh$FkBeq6(ByT|tb8UtDKu8< zDF||9t!GTscHQA{*cdK1q}p?Llr++lLc1#PTB}Q|Ij?K*mYR*8>5ChgxYAgfoMJmk zp)p5)RQFXJG12g3-`&>|mzlfCkX@z>_XN1NgY2pQ;gvtQK3x#1%lx{^22#&Ja|#J( zehd;$6ZtCA+9X)mDJ<@1jwn4(I7t!m5yekPvpB3pq>Tv(L6-rV93drB|B5s-VVsje zwURA)z?C)$UfOhng9b&PfHG7|Aq>!vdp$!1;4%JNgc%sx_OBhA(lS;aOhQAe^-nY` zJPsozJ*zd9EN4v!cF`W#|LOs8^#*gjEzZk11HThA`EqgiO-GW422`$7 vH`!X38KZbNHlW?YpwAWM`d^~tH=Tjz@M=8XbRE*BPvP?eECc{8lm-9*cqU}k diff --git a/packages/jsonapi/tests/snapshots/menu.test.ts.snap b/packages/jsonapi/tests/snapshots/menu.test.ts.snap index aefed0aec929e725d00931e621494888ecfaa9e3..51a6c89e35d35c3e8d8f2caa7282e97f0e07e951 100644 GIT binary patch literal 810 zcmV+_1J(RNRzVQas7n8(6Ax$c%AVMjC##-O4 zlS}TUyLG@45(*L>9YPdTAw@(>g(#>%LX`XiB&1YGv{b;IbIy4$2)5eU`F5V)%zm%y z2G&lz_lgTgxZJ)f zvt-PWajUz{EkQK8PESvRsvs3qBYF(rOmf#}NK1^SuZOwU(sms9EOb)Emz+X(9e*cI zTq{2T{K{PFYf;1oq-3{xy`F&73ITNjE|C;lWjwYrDK`kXDZ{Gcun7=>CW&lHD^LX~ zX^hV(my*YmlFP;f6HJK6>GlPWrR)^P&aUl*JDsFU9V_q!_r*%fYTFBo z%k4(H)onEvyUV=6mafh>+CA1@=-SL$vRjftO$8DC0hNHn)Z` zYsm5Lg?`EqEAMsSgWOPE>igIdGvp<9qyyh|;JhK3DHZ5*%>dS9*i?Z&@+?%iFB~!G zoXjy@$+p}0(BwIAcKEC52R3h7%ny9WVs2WChemF1ge+nn7d-lpK|GfX;)U;wY>B+LIyQcL0-t*qAKZ?+tek^2S!0C$vq>i_@% literal 801 zcmV++1K#{WRzVE6EQ5l$W$UsY5?*$+=)&4&Lqz&*eY z;2bvQv2oYgrY^_0_-wUW2saQ`5uU^N84%BB-}*e(GNnR#Sd!MZ(-;i<;^KShLJ$0C zC(TSNe?a^s~PMn+i4znaZvMpEk-p(fxemVB#E`Ud)L1LclPYfRFn5ylA5VC-R$ z0SHMEKEA}IkV2Y;)C5gR5zsDWsUJuAS?#tv;yD)2KbD`TH0X=u{s8F_KvfXhR3y*T zN&v5b@2``f zPDteC*DdL~E)o!tuqaBc$OB~jnqKLCkZzQuwOF_&H;$1I2E{u*BH5{g#k;;oSuU7A zrR-oRC>hdO3=JwN(#2{kg4v`gH#f+ZOjCy}D4N~k87rx>j7QYp8jO9`P^s@;>!%E{ z@(HA$<$~%`-6xiqAuq8bc>W7;$&l34D(!OG0+EX+Mrm(Ak>M4G4S4n-Ud#p&=J0s(+A-U*`Y{U$w_s&j fBFFdYXu%+F$Fb(j7Dwj7X=`vw32?i7YG diff --git a/packages/jsonapi/tests/snapshots/resources.test.ts.snap b/packages/jsonapi/tests/snapshots/resources.test.ts.snap index 872f6fa3c2674b59241c114178a7f6774cb8bdba..dae1adce2806f3ab5d35a70ca019efc21173347c 100644 GIT binary patch literal 29260 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%0ADE82$(jaa&m>kzkQ|;NsI(43VQr-)0 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 I4Fc?c0hLs;p8x;= diff --git a/packages/simple-oauth-auth-code/tests/DrupalkitSimpleOauthAuthCode.test.ts b/packages/simple-oauth-auth-code/tests/DrupalkitSimpleOauthAuthCode.test.ts index abe7e65..961af42 100644 --- a/packages/simple-oauth-auth-code/tests/DrupalkitSimpleOauthAuthCode.test.ts +++ b/packages/simple-oauth-auth-code/tests/DrupalkitSimpleOauthAuthCode.test.ts @@ -4,7 +4,7 @@ import { setupServer } from "msw/node"; import { Drupalkit, DrupalkitOptions } from "@drupal-kit/core"; import { DrupalkitSimpleOauthAuthCode } from "../src/index.js"; -import AuthCodeResponse from "./fixtures/auth_code_response.json" with { type: "json" }; +import AuthCodeResponse from "./fixtures/auth_code_response.js"; const BASE_URL = "https://my-drupal.com"; diff --git a/packages/simple-oauth-auth-code/tests/fixtures/auth_code_response.ts b/packages/simple-oauth-auth-code/tests/fixtures/auth_code_response.ts new file mode 100644 index 0000000..1039d25 --- /dev/null +++ b/packages/simple-oauth-auth-code/tests/fixtures/auth_code_response.ts @@ -0,0 +1,5 @@ +const AuthCodeResponse = { + code: "def502004ab5bdf2b7f027b6e81aaa4f6fcc689500c6c572b740a585f1625a713f18f239a7c485897e23ea58f1f5f181a8ac728b71bacc32cd79ba9ef2a4c21bc82eefe0a1f777b5b77ebbe8bd450d4b8858430afe085cfc5c43052aadf180219dce466cebcd8fb6313cad1e02bdec206ce47e1e9e986413c781f020e6ddc924858371ae3598a285a830d67491398e12d043709f67e26c5fa1a01f56892bd2658fb068e169c3100421085fcaa0215740eb7cbbdb0fdb4cbf82e016a365711973476486bb4eec471b16ea0bbffadd9f95df88230e9851d69a20f26c862468b3f2ee23f03c88e63611157d10c844ad6c2caba1b6336da30ac08f2c870fef2218bd3935a344a78ffd99da0bd7115a55d3cfbce96e6b0ff6368639364d6d6f522abe9cc4e956728e116c1326c435d717e860916180e1798517c3aa", +} as const; + +export default AuthCodeResponse; diff --git a/packages/simple-oauth/tests/DrupalkitSimpleOauth.test.ts b/packages/simple-oauth/tests/DrupalkitSimpleOauth.test.ts index 46791f6..b4bbe81 100644 --- a/packages/simple-oauth/tests/DrupalkitSimpleOauth.test.ts +++ b/packages/simple-oauth/tests/DrupalkitSimpleOauth.test.ts @@ -7,9 +7,9 @@ import { DrupalkitSimpleOauth, DrupalkitSimpleOauthError, } from "../src/index.js"; -import ErrorResponse from "./fixtures/error_response.json" with { type: "json" }; -import TokenResponse from "./fixtures/token_response.json" with { type: "json" }; -import UserInfoResponse from "./fixtures/userinfo_response.json" with { type: "json" }; +import ErrorResponse from "./fixtures/error_response.js"; +import TokenResponse from "./fixtures/token_response.js"; +import UserInfoResponse from "./fixtures/userinfo_response.js"; const BASE_URL = "https://my-drupal.com"; diff --git a/packages/simple-oauth/tests/fixtures/error_response.ts b/packages/simple-oauth/tests/fixtures/error_response.ts new file mode 100644 index 0000000..bbebc2b --- /dev/null +++ b/packages/simple-oauth/tests/fixtures/error_response.ts @@ -0,0 +1,10 @@ +const ErrorResponse = { + error: "invalid_request", + error_description: + "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", + hint: "Authorization code has been revoked", + message: + "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.", +} as const; + +export default ErrorResponse; diff --git a/packages/simple-oauth/tests/fixtures/token_response.ts b/packages/simple-oauth/tests/fixtures/token_response.ts new file mode 100644 index 0000000..7d74600 --- /dev/null +++ b/packages/simple-oauth/tests/fixtures/token_response.ts @@ -0,0 +1,10 @@ +const TokenResponse = { + token_type: "Bearer", + expires_in: 300, + access_token: + "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjZlN2ZiNmJiODNlNzZkOWIxOGU2MjAxZmZhYmY3YWFlZTE2OTZiOTMxZGFjOGQ0YTI4ODY0ZjJlZTI1ODA1MGYyZDAwZDE5NDYwNDAxMjY2In0.eyJhdWQiOiJtdm5wb2dJWU9zSngyQWw4YUdaemtIeTYzU3JJYVVvLU16d0pBSzhWU0lNIiwianRpIjoiNmU3ZmI2YmI4M2U3NmQ5YjE4ZTYyMDFmZmFiZjdhYWVlMTY5NmI5MzFkYWM4ZDRhMjg4NjRmMmVlMjU4MDUwZjJkMDBkMTk0NjA0MDEyNjYiLCJpYXQiOjE2Nzg4NjYzODksIm5iZiI6MTY3ODg2NjM4OSwiZXhwIjoxNjc4ODY2Njg5Ljk2MjIzMzEsInNjb3BlIjpbImFsbG93X2FsbCJdLCJzdWIiOiI0NSJ9.A6Ur4pciXtNSEl8mWEjW1DUll-zR4wSXjnS4FMnDHIV_mWclAQxgHuUexSYWnDASCpKC9TohqtSa2aPB_ymP2JhSaz9FTtYklFR2CmYz01HgZ83GGisNhvbdCx67CaWfluVS1fT-PFmut6fAUhbDWcQ7pt3sAZR4Rc6-iCWWe-lx5fnrli5S_egzuqJGj-NkoDg9s3yU6yvsPT8dObN-5Bl2qfU9VA21PYuWo89e-rm56mLexiuGUtPZHOa1hXGQ3WPEu3qlThtxaFgPyN4mFA0ql7JLV4Md2DrMcU8U598epro41KH9K6OvxOKbGFkQupXE-lODN0f3E4O_6Mr0Xk7YNtAna117fQEuoeAusJb024aZ-pxKNN2xjFUbesa6XvCNnkNKgDCaXWL4RWngD7lftYncsH6JoocqRgMmdzZGlf1A4fZtqaFs_DdC_JjjX2eyZZqVLv-wuJ04iGm3BXblUfBjaVx96tlhF30rfih9Cyu3psCzzoE7JLbqeAL6Vn6hQdZmZOyV_36-pOWEdZopy5tY2pZAmUAuUJFG40VEAGzh3dCuSVmni16f0OgQDS_ZpV0xCwEIc_UpkemY33EPVGU8zWWtztELVY6mAzEsR8xZwmtL8x4HadkU4wKoemos1KwwDM26tLR_x6K3H38aMl-M1PuCp2xkQg1gF_s", + refresh_token: + "def50200ca9707211ac5eee68c5acf9a84f169e0655580b3cfbadf479465d3cb26923cafdc827f459429b6445168c81903df56d2005df9212b63b712158a4b3e59db82c894bc9c88571e44dc8366b9951c5e11799b6b18fbb1eca8774986a6a161a8c4bebd6c604958bd123a3daef60adc2dd9e7acbf1c6003a5d1357a7c325da9b5123a8db4b1eed60abe7697019833359029d824599c799d5cd44ff4a21b3dc1f63b1ab96b958b77d91c2fde6c856762c47228cade0a2847c6c52abdd40ba960e1a53be4e5096489e73ecf143050c33c8ed63bd49d73ac56bf323fa970e77ba85faadf5896311cef5e2f3496f2a9851b48041d3b66227438f347e41726ac914467fd4f671b949f30c597a251e31b54811ab134f937f0df60c4b99819eb621fb3d110f07005354ea459e64b05d4642fa784d002b900047f63d8f55ca7cbbd4b1398e0ca1a6f2b76a1ec43a21072c4c3ba46846e7ae643682a7d8f4fa601de9febc854dd7f799323fccd4c4e94b5351022a6acbcb91462063707df028f9af39936ffe3a2a6127f5ce39b31260ff11c21fb43a8cd91fe4dff75", +} as const; + +export default TokenResponse; diff --git a/packages/simple-oauth/tests/fixtures/userinfo_response.ts b/packages/simple-oauth/tests/fixtures/userinfo_response.ts new file mode 100644 index 0000000..dab5874 --- /dev/null +++ b/packages/simple-oauth/tests/fixtures/userinfo_response.ts @@ -0,0 +1,13 @@ +const UserInfoResponse = { + sub: "45", + name: "Marcelo.Ziemann61", + preferred_username: "Marcelo.Ziemann61", + email: "Patience_Larkin75@example.org", + email_verified: true, + locale: "de", + zoneinfo: null, + updated_at: "1678809645", + profile: "https://my-drupal.com/users/marceloziemann61", +} as const; + +export default UserInfoResponse; diff --git a/packages/user-api/tests/DrupalkitUserApi.test.ts b/packages/user-api/tests/DrupalkitUserApi.test.ts index 4762743..8175b85 100644 --- a/packages/user-api/tests/DrupalkitUserApi.test.ts +++ b/packages/user-api/tests/DrupalkitUserApi.test.ts @@ -4,7 +4,7 @@ import { setupServer } from "msw/node"; import { Drupalkit, DrupalkitOptions } from "@drupal-kit/core"; import { DrupalkitUserApi } from "../src/index.js"; -import UserResponse from "./fixtures/user_response.json" assert { type: "json" }; +import UserResponse from "./fixtures/user_response.js"; const BASE_URL = "https://my-drupal.com"; diff --git a/packages/user-api/tests/fixtures/user_response.ts b/packages/user-api/tests/fixtures/user_response.ts new file mode 100644 index 0000000..7fa03f7 --- /dev/null +++ b/packages/user-api/tests/fixtures/user_response.ts @@ -0,0 +1,77 @@ +const UserResponse = { + uid: [ + { + value: 47, + }, + ], + uuid: [ + { + value: "e04a5e5a-96a6-4427-a037-d925e929b802", + }, + ], + langcode: [ + { + value: "de", + }, + ], + name: [ + { + value: "Chaim54", + }, + ], + created: [ + { + value: "2023-03-16T08:28:17+00:00", + format: "Y-m-d\\TH:i:sP", + }, + ], + changed: [ + { + value: "2023-03-16T08:28:17+00:00", + format: "Y-m-d\\TH:i:sP", + }, + ], + default_langcode: [ + { + value: true, + }, + ], + path: [ + { + alias: null, + pid: null, + langcode: "de", + }, + ], + content_translation_source: [ + { + value: "und", + }, + ], + content_translation_outdated: [ + { + value: false, + }, + ], + content_translation_uid: [ + { + target_id: 0, + target_type: "user", + target_uuid: "5f93bd07-c1a4-4c92-a41c-c4bec9694c05", + url: "/user/0", + }, + ], + content_translation_status: [ + { + value: true, + }, + ], + content_translation_created: [ + { + value: "2023-03-16T08:28:17+00:00", + format: "Y-m-d\\TH:i:sP", + }, + ], +} as const; + +export default UserResponse; From 5e639b28f776ee785c185b4bd2805d3dd532227d Mon Sep 17 00:00:00 2001 From: Christian Foidl Date: Thu, 5 Mar 2026 14:32:08 +0100 Subject: [PATCH 2/3] ci: migrate main workflow to blacksmith runners --- .github/workflows/main.yml | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 479fbc2..a2538a1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,7 +1,7 @@ name: Lint & Test on: - push: + push: pull_request: types: [opened, synchronize, reopened] @@ -10,34 +10,17 @@ concurrency: ${{ github.workflow }}-${{ github.ref }} jobs: lint-and-test: name: Lint & Test - runs-on: ubuntu-latest - defaults: - run: - shell: nix develop --command bash {0} + runs-on: blacksmith-2vcpu-ubuntu-2404-arm steps: - name: Checkout Repo uses: actions/checkout@v4 - - name: Install nix - uses: nixbuild/nix-quick-install-action@v26 + - uses: pnpm/action-setup@v4 - - name: Get pnpm store directory - id: pnpm-cache - run: echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - - uses: actions/cache@v4 - name: Setup pnpm cache + - uses: actions/setup-node@v4 with: - path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - - name: Set token config - run: | - echo "//npm.wunderwerk.dev/:_authToken=${NPM_TOKEN}" >> .npmrc - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + node-version: "22" + cache: "pnpm" - name: Install dependencies run: pnpm install From e498f4e230256335888b9eae93e3a820a35a82ab Mon Sep 17 00:00:00 2001 From: Christian Foidl Date: Thu, 5 Mar 2026 14:36:14 +0100 Subject: [PATCH 3/3] ci: cancel in progress main workflow runs on newer --- .github/workflows/main.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a2538a1..3ec785d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,7 +5,9 @@ on: pull_request: types: [opened, synchronize, reopened] -concurrency: ${{ github.workflow }}-${{ github.ref }} +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: lint-and-test: