n8n-nodes-commercetools 1.0.14 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE.md +19 -19
  2. package/README.md +69 -14
  3. package/dist/icons/github.dark.svg +3 -3
  4. package/dist/icons/github.svg +3 -3
  5. package/dist/nodes/Commercetools/generated/properties.js +1278 -411
  6. package/dist/nodes/Commercetools/generated/properties.js.map +1 -1
  7. package/dist/nodes/Commercetools/generated/subscription.properties.d.ts +1 -1
  8. package/dist/nodes/Commercetools/generated/subscription.properties.js +287 -287
  9. package/dist/nodes/Commercetools/generated/subscription.properties.js.map +1 -1
  10. package/dist/nodes/Commercetools/lambda/awsHandler.js +108 -0
  11. package/dist/nodes/Commercetools/lambda/gcpHandler.js +94 -0
  12. package/dist/package.json +17 -11
  13. package/package.json +17 -11
  14. package/dist/credentials/CommerceToolsOAuth2Api.credentials.d.ts +0 -9
  15. package/dist/credentials/CommerceToolsOAuth2Api.credentials.js +0 -230
  16. package/dist/credentials/CommerceToolsOAuth2Api.credentials.js.map +0 -1
  17. package/dist/nodes/Commercetools/Commercetools.node.d.ts +0 -5
  18. package/dist/nodes/Commercetools/Commercetools.node.js +0 -412
  19. package/dist/nodes/Commercetools/Commercetools.node.js.map +0 -1
  20. package/dist/nodes/Commercetools/Commercetools.node.json +0 -18
  21. package/dist/nodes/Commercetools/CommercetoolsTrigger.node.d.ts +0 -22
  22. package/dist/nodes/Commercetools/CommercetoolsTrigger.node.js +0 -69
  23. package/dist/nodes/Commercetools/CommercetoolsTrigger.node.js.map +0 -1
  24. package/dist/nodes/Commercetools/CommercetoolsTrigger.node.json +0 -21
  25. package/dist/nodes/Commercetools/generated/ctp-event-registry.json +0 -1513
  26. package/dist/nodes/Commercetools/generated/operations.json +0 -40468
  27. package/dist/nodes/Commercetools/utils/awsInfra.utils.d.ts +0 -19
  28. package/dist/nodes/Commercetools/utils/awsInfra.utils.js +0 -375
  29. package/dist/nodes/Commercetools/utils/awsInfra.utils.js.map +0 -1
  30. package/dist/nodes/Commercetools/utils/gcpInfra.utils.d.ts +0 -20
  31. package/dist/nodes/Commercetools/utils/gcpInfra.utils.js +0 -330
  32. package/dist/nodes/Commercetools/utils/gcpInfra.utils.js.map +0 -1
  33. package/dist/nodes/Commercetools/utils/subscription.utils.d.ts +0 -15
  34. package/dist/nodes/Commercetools/utils/subscription.utils.js +0 -109
  35. package/dist/nodes/Commercetools/utils/subscription.utils.js.map +0 -1
  36. package/dist/nodes/Commercetools/utils/webhookMethods.utils.d.ts +0 -8
  37. package/dist/nodes/Commercetools/utils/webhookMethods.utils.js +0 -235
  38. package/dist/nodes/Commercetools/utils/webhookMethods.utils.js.map +0 -1
  39. package/dist/scripts/parseCollection.d.ts +0 -34
  40. package/dist/scripts/parseCollection.js +0 -275
  41. package/dist/scripts/parseCollection.js.map +0 -1
  42. package/dist/tsconfig.tsbuildinfo +0 -1
package/LICENSE.md CHANGED
@@ -1,19 +1,19 @@
1
- Copyright 2025 jjtech-digital
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy of
4
- this software and associated documentation files (the "Software"), to deal in
5
- the Software without restriction, including without limitation the rights to
6
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
- of the Software, and to permit persons to whom the Software is furnished to do
8
- so, subject to the following conditions:
9
-
10
- The above copyright notice and this permission notice shall be included in all
11
- copies or substantial portions of the Software.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
- SOFTWARE.
1
+ Copyright 2025 jjtech-digital
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
package/README.md CHANGED
@@ -269,16 +269,18 @@ A hash of `{ events, hasAWS, hasGCP }` is stored in workflow static data. When `
269
269
  When `awsAccessKeyId` and `awsSecretAccessKey` are present in the credential, the node automatically provisions:
270
270
 
271
271
  - SQS queue (14-day retention, long polling)
272
- - Lambda function (Node.js) with `WEBHOOK_URL` env var
272
+ - Lambda function (Node.js 22.x) with `WEBHOOK_URL` env var
273
273
  - IAM role with SQS receive/delete and CloudWatch Logs policies
274
274
  - Event source mapping (SQS → Lambda, batch size 10)
275
275
 
276
276
  The Lambda forwards each SQS message to the n8n webhook URL as a POST request. All resources are deleted when the trigger is deactivated or its configuration changes.
277
277
 
278
+ Uses **AWS SDK for JavaScript v3** (`@aws-sdk/client-sqs`, `@aws-sdk/client-lambda`, `@aws-sdk/client-iam`, `@aws-sdk/client-sts`, `@aws-sdk/client-cloudwatch-logs`).
279
+
278
280
  **Requirements:**
279
281
 
280
282
  - Publicly reachable n8n webhook URL
281
- - AWS credentials with permissions for: SQS, Lambda, IAM, CloudWatch Logs
283
+ - AWS credentials with permissions for: SQS, Lambda, IAM, STS, CloudWatch Logs
282
284
 
283
285
  > ⚠️ AWS costs may apply.
284
286
 
@@ -356,7 +358,7 @@ npm run dev
356
358
  # Regenerate operations from the latest Postman collection + rebuild event registry
357
359
  npm run generate
358
360
 
359
- # Build
361
+ # Build (cross-platform — also copies lambda handlers to dist/ via scripts/copyLambda.js)
360
362
  npm run build
361
363
 
362
364
  # Build and watch
@@ -365,6 +367,9 @@ npm run build:watch
365
367
  # Lint
366
368
  npm run lint
367
369
  npm run lint:fix
370
+
371
+ # Run tests
372
+ npm test
368
373
  ```
369
374
 
370
375
  ### Code generation pipeline
@@ -372,7 +377,13 @@ npm run lint:fix
372
377
  ```
373
378
  scripts/generate.ts (entry point: npm run generate)
374
379
 
375
- ├── parseCollection.ts
380
+ ├── parseCollection.ts (thin orchestrator)
381
+ │ ├── collection/postmanTypes.ts PostmanItem, PostmanCollection interfaces
382
+ │ ├── collection/types.ts BodyField, ParsedOperation interfaces
383
+ │ ├── collection/helpers.ts slugify, formatLabel, isLocalizedObject
384
+ │ ├── collection/fieldExtractors.ts extractFields, extractActionBodyFields
385
+ │ ├── collection/findFolder.ts findFolder (module-level cache — PERF-5)
386
+ │ └── collection/walkItems.ts walkItems (top-level exported function)
376
387
  │ Downloads Postman collection.json → ParsedOperation[]
377
388
  │ Detects per operation:
378
389
  │ isSearch POST .../search
@@ -384,7 +395,13 @@ scripts/generate.ts (entry point: npm run generate)
384
395
  │ bodyFields extracted from Postman body.raw JSON
385
396
  │ actionBodyFields fields from inside actions[0]
386
397
 
387
- ├── generateProperties.ts
398
+ ├── generateProperties.ts (thin orchestrator — PERF-4: Map index built once)
399
+ │ ├── properties/helpers.ts Constants + shared property builders
400
+ │ ├── properties/resourceAndOperation.ts Resource + Operation dropdowns
401
+ │ ├── properties/idFields.ts ID / Key / Container / path param fields
402
+ │ ├── properties/versionAndActions.ts Actions (JSON) + Actions (UI) fixedCollection
403
+ │ ├── properties/bodyFields.ts Create / Misc-POST / Search body fields
404
+ │ └── properties/imageAndQuery.ts Image upload fields + query-param Filters
388
405
  │ ParsedOperation[] → INodeProperties[]
389
406
  │ Emits in order:
390
407
  │ 1. Resource dropdown
@@ -408,7 +425,11 @@ scripts/generate.ts (entry point: npm run generate)
408
425
  │ Extracts: *MessagePayload type literals,
409
426
  │ MessageSubscriptionResourceTypeId values,
410
427
  │ ChangeSubscriptionResourceTypeId values
411
- Filters to allowedResources: [product, customer, cart, order, business-unit, category, channel, associate-role, inventory-entry, review, shopping-list, type, payment, quote, quote-request, staged-quote, approval-rule, approval-flow, standalone-price, store, product-tailoring, customer-group, product-selection]
428
+ │ Filters to allowedResources: [product, customer, cart, order, business-unit,
429
+ │ category, channel, associate-role, inventory-entry, review, shopping-list,
430
+ │ type, payment, quote, quote-request, staged-quote, approval-rule,
431
+ │ approval-flow, standalone-price, store, product-tailoring,
432
+ │ customer-group, product-selection]
412
433
  │ → nodes/Commercetools/generated/ctp-event-registry.json
413
434
 
414
435
  └── generateSubscriptionProperties.ts
@@ -421,6 +442,37 @@ scripts/generate.ts (entry point: npm run generate)
421
442
 
422
443
  Generated files are committed to the repository. The built node works without running `generate` unless the Postman collection or SDK has changed.
423
444
 
445
+ ### Node source layout
446
+
447
+ ```
448
+ nodes/Commercetools/
449
+ ├── Commercetools.node.ts Thin action-node orchestrator (~175 lines)
450
+ ├── CommercetoolsTrigger.node.ts Webhook trigger — receives and routes events
451
+ ├── generated/ Auto-generated (do not edit manually)
452
+ │ ├── properties.ts
453
+ │ ├── operations.json
454
+ │ ├── ctp-event-registry.json
455
+ │ └── subscription.properties.ts
456
+ ├── lambda/
457
+ │ ├── awsHandler.js Lambda: SQS → n8n webhook forwarder
458
+ │ └── gcpHandler.js Cloud Function: Pub/Sub → n8n webhook forwarder
459
+ └── utils/
460
+ ├── urlBuilder.utils.ts URL construction + path-param substitution
461
+ ├── bodyBuilder.utils.ts Request body assembly for all operation types
462
+ ├── imageUpload.utils.ts SSRF-guarded image download + CT binary POST
463
+ ├── subscription.utils.ts Subscription CRUD + body building + event routing
464
+ ├── webhookMethods.utils.ts Webhook lifecycle: checkExists / create / delete
465
+ ├── cloudVerification.utils.ts AWS + GCP infrastructure existence checks
466
+ ├── awsInfra.utils.ts AWS SQS / Lambda / IAM provisioning (SDK v3)
467
+ ├── awsDelete.utils.ts AWS infrastructure teardown (SDK v3)
468
+ ├── gcpInfra.utils.ts GCP Pub/Sub / Cloud Functions provisioning
469
+ └── gcpDelete.utils.ts GCP infrastructure teardown
470
+
471
+ scripts/
472
+ ├── copyLambda.js Cross-platform postbuild: copies lambda/*.js → dist/
473
+ └── ...
474
+ ```
475
+
424
476
  ---
425
477
 
426
478
  ## Auto-Update Pipeline
@@ -450,6 +502,13 @@ New API endpoints and fields appear in the node automatically without manual dev
450
502
  | Business Unit Search: `Search Not Ready` | Business Unit Search must be activated on your project — call `PUT /{projectKey}/business-units/search/indexing-status` with `{ "activated": true }` then wait for indexing to complete |
451
503
  | GCP: private key / PEM errors | Use the **Service Account JSON** field; paste the entire `.json` key file, not individual fields |
452
504
  | GCP: deploy timeout on first activation | GCP API enablement takes time on cold projects — retry after a minute |
505
+ | GCP: `gcpRegion` missing error on activation | Open the credential and select a GCP Region — the field is required for Cloud Functions deployment |
506
+ | AWS: wrong queue ARN in GovCloud / China regions | ARN is fetched from `GetQueueAttributes` (not constructed manually) |
507
+ | AWS: `credentials are invalid` or `permissions denied` | Verify the IAM user has SQS, Lambda, IAM, STS, and CloudWatch Logs permissions |
508
+ | Build: `The syntax of the command is incorrect` on Windows | Ensure you are on v1.0.15+ — the postbuild script is now cross-platform (`scripts/copyLambda.js`) |
509
+ | Trigger: malformed webhook payload crashes execution | Update to v1.0.14 — invalid JSON payloads are now silently dropped instead of crashing the context |
510
+ | Subscription: `subscriptionId is empty` error | The subscription ID was not persisted in static data — deactivate and reactivate the workflow |
511
+ | Update operation: zero value (`0`) silently dropped | Update to v1.0.14 — `quantity: 0` and `centAmount: 0` are now sent correctly |
453
512
  | Node not visible in n8n | Run `npm install` then `npm run dev` |
454
513
  | Trigger: `"A message with the name 'PaymentMethodCreated' is unknown for the TypeId 'payment'"` | CT Subscriptions API does not support `payment-method` as a resourceTypeId. Use CT API Extensions or a schedule-based polling trigger instead. |
455
514
 
@@ -459,14 +518,10 @@ New API endpoints and fields appear in the node automatically without manual dev
459
518
 
460
519
  | Version | Changes |
461
520
  | ------- | ----------------------------------------------------------------------------------------------------------------------------|
462
- | v1.0.13 | Added Standalone Prices, Stores, Product Tailoring, Customer Groups, Product Selections, Cart Discounts, and Discount Codes |
463
- | v1.0.12 | Added Approval Rules, Approval Flows, and Associate Endpoints |
464
- | v1.0.11 | Added Quotes, Quote Requests, Staged Quotes, Messages, and API Extensions |
465
- | v1.0.10 | Added Claude AI agents and skills for automated development assistance |
466
-
467
-
468
-
469
-
521
+ | v1.0.16 | Readme Update |
522
+ | v1.0.15 | Migrated AWS infrastructure to SDK v3 (`@aws-sdk/client-*`); cross-platform postbuild script (`scripts/copyLambda.js`) fixes Windows build; lambda handlers now correctly copied to `dist/`; CI workflow adds test step and npm cache; ESLint allows `console.warn`/`console.error` for infrastructure logging |
523
+ | v1.0.14 | Added Product Discounts, Product Types, Product Projections, Tax Categories, Attribute Groups, API Clients, Recurring Orders, Recurrence Policies, Discount Groups, and In-Store Endpoints |
524
+ | v1.0.13 | Added Standalone Prices, Stores, Product Tailoring, Customer Groups, Product Selections, Cart Discounts, and Discount Codes |
470
525
  ---
471
526
 
472
527
  ## License
@@ -1,3 +1,3 @@
1
- <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path fill-rule="evenodd" clip-rule="evenodd" d="M20.0165 0C8.94791 0 0 9.01388 0 20.1653C0 29.0792 5.73324 36.6246 13.6868 39.2952C14.6812 39.496 15.0454 38.8613 15.0454 38.3274C15.0454 37.8599 15.0126 36.2575 15.0126 34.5879C9.4445 35.79 8.28498 32.1841 8.28498 32.1841C7.39015 29.847 6.06429 29.2463 6.06429 29.2463C4.24185 28.011 6.19704 28.011 6.19704 28.011C8.21861 28.1446 9.27938 30.081 9.27938 30.081C11.0686 33.1522 13.9518 32.2844 15.1118 31.7502C15.2773 30.4481 15.8079 29.5467 16.3713 29.046C11.9303 28.5785 7.25781 26.8425 7.25781 19.0967C7.25781 16.8932 8.05267 15.0905 9.31216 13.6884C9.11344 13.1877 8.41732 11.1174 9.51128 8.34644C9.51128 8.34644 11.2014 7.81217 15.0122 10.4164C16.6438 9.97495 18.3263 9.7504 20.0165 9.74851C21.7067 9.74851 23.4295 9.98246 25.0205 10.4164C28.8317 7.81217 30.5218 8.34644 30.5218 8.34644C31.6158 11.1174 30.9192 13.1877 30.7205 13.6884C32.0132 15.0905 32.7753 16.8932 32.7753 19.0967C32.7753 26.8425 28.1028 28.5449 23.6287 29.046C24.358 29.6802 24.9873 30.882 24.9873 32.7851C24.9873 35.4893 24.9545 37.6596 24.9545 38.327C24.9545 38.8613 25.3192 39.496 26.3132 39.2956C34.2667 36.6242 39.9999 29.0792 39.9999 20.1653C40.0327 9.01388 31.052 0 20.0165 0Z" fill="white"/>
3
- </svg>
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M20.0165 0C8.94791 0 0 9.01388 0 20.1653C0 29.0792 5.73324 36.6246 13.6868 39.2952C14.6812 39.496 15.0454 38.8613 15.0454 38.3274C15.0454 37.8599 15.0126 36.2575 15.0126 34.5879C9.4445 35.79 8.28498 32.1841 8.28498 32.1841C7.39015 29.847 6.06429 29.2463 6.06429 29.2463C4.24185 28.011 6.19704 28.011 6.19704 28.011C8.21861 28.1446 9.27938 30.081 9.27938 30.081C11.0686 33.1522 13.9518 32.2844 15.1118 31.7502C15.2773 30.4481 15.8079 29.5467 16.3713 29.046C11.9303 28.5785 7.25781 26.8425 7.25781 19.0967C7.25781 16.8932 8.05267 15.0905 9.31216 13.6884C9.11344 13.1877 8.41732 11.1174 9.51128 8.34644C9.51128 8.34644 11.2014 7.81217 15.0122 10.4164C16.6438 9.97495 18.3263 9.7504 20.0165 9.74851C21.7067 9.74851 23.4295 9.98246 25.0205 10.4164C28.8317 7.81217 30.5218 8.34644 30.5218 8.34644C31.6158 11.1174 30.9192 13.1877 30.7205 13.6884C32.0132 15.0905 32.7753 16.8932 32.7753 19.0967C32.7753 26.8425 28.1028 28.5449 23.6287 29.046C24.358 29.6802 24.9873 30.882 24.9873 32.7851C24.9873 35.4893 24.9545 37.6596 24.9545 38.327C24.9545 38.8613 25.3192 39.496 26.3132 39.2956C34.2667 36.6242 39.9999 29.0792 39.9999 20.1653C40.0327 9.01388 31.052 0 20.0165 0Z" fill="white"/>
3
+ </svg>
@@ -1,3 +1,3 @@
1
- <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path fill-rule="evenodd" clip-rule="evenodd" d="M20.0165 0C8.94791 0 0 9.01388 0 20.1653C0 29.0792 5.73324 36.6246 13.6868 39.2952C14.6812 39.496 15.0454 38.8613 15.0454 38.3274C15.0454 37.8599 15.0126 36.2575 15.0126 34.5879C9.4445 35.79 8.28498 32.1841 8.28498 32.1841C7.39015 29.847 6.06429 29.2463 6.06429 29.2463C4.24185 28.011 6.19704 28.011 6.19704 28.011C8.21861 28.1446 9.27938 30.081 9.27938 30.081C11.0686 33.1522 13.9518 32.2844 15.1118 31.7502C15.2773 30.4481 15.8079 29.5467 16.3713 29.046C11.9303 28.5785 7.25781 26.8425 7.25781 19.0967C7.25781 16.8932 8.05267 15.0905 9.31216 13.6884C9.11344 13.1877 8.41732 11.1174 9.51128 8.34644C9.51128 8.34644 11.2014 7.81217 15.0122 10.4164C16.6438 9.97495 18.3263 9.7504 20.0165 9.74851C21.7067 9.74851 23.4295 9.98246 25.0205 10.4164C28.8317 7.81217 30.5218 8.34644 30.5218 8.34644C31.6158 11.1174 30.9192 13.1877 30.7205 13.6884C32.0132 15.0905 32.7753 16.8932 32.7753 19.0967C32.7753 26.8425 28.1028 28.5449 23.6287 29.046C24.358 29.6802 24.9873 30.882 24.9873 32.7851C24.9873 35.4893 24.9545 37.6596 24.9545 38.327C24.9545 38.8613 25.3192 39.496 26.3132 39.2956C34.2667 36.6242 39.9999 29.0792 39.9999 20.1653C40.0327 9.01388 31.052 0 20.0165 0Z" fill="#24292F"/>
3
- </svg>
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M20.0165 0C8.94791 0 0 9.01388 0 20.1653C0 29.0792 5.73324 36.6246 13.6868 39.2952C14.6812 39.496 15.0454 38.8613 15.0454 38.3274C15.0454 37.8599 15.0126 36.2575 15.0126 34.5879C9.4445 35.79 8.28498 32.1841 8.28498 32.1841C7.39015 29.847 6.06429 29.2463 6.06429 29.2463C4.24185 28.011 6.19704 28.011 6.19704 28.011C8.21861 28.1446 9.27938 30.081 9.27938 30.081C11.0686 33.1522 13.9518 32.2844 15.1118 31.7502C15.2773 30.4481 15.8079 29.5467 16.3713 29.046C11.9303 28.5785 7.25781 26.8425 7.25781 19.0967C7.25781 16.8932 8.05267 15.0905 9.31216 13.6884C9.11344 13.1877 8.41732 11.1174 9.51128 8.34644C9.51128 8.34644 11.2014 7.81217 15.0122 10.4164C16.6438 9.97495 18.3263 9.7504 20.0165 9.74851C21.7067 9.74851 23.4295 9.98246 25.0205 10.4164C28.8317 7.81217 30.5218 8.34644 30.5218 8.34644C31.6158 11.1174 30.9192 13.1877 30.7205 13.6884C32.0132 15.0905 32.7753 16.8932 32.7753 19.0967C32.7753 26.8425 28.1028 28.5449 23.6287 29.046C24.358 29.6802 24.9873 30.882 24.9873 32.7851C24.9873 35.4893 24.9545 37.6596 24.9545 38.327C24.9545 38.8613 25.3192 39.496 26.3132 39.2956C34.2667 36.6242 39.9999 29.0792 39.9999 20.1653C40.0327 9.01388 31.052 0 20.0165 0Z" fill="#24292F"/>
3
+ </svg>