From 830cfe92ce7b33b139f9f44e6e10b5058174cb8c Mon Sep 17 00:00:00 2001 From: Lukasz Ostrowski Date: Fri, 5 May 2023 08:15:47 +0200 Subject: [PATCH] Extract logger (#439) * Extract logger * Replace logger with shared one * Replace CRM logger with shared one * Replace E&M logger with shared one * Replace invoices logger with shared one * Replace Products Feed logger with shared one * Replace Search logger with shared one * Replace Taxes logger with shared one * Uninstall pino from apps direct dependency * Update docs * Update changeset * Bumped Klaviyo typescript version to hopefully unblock the build * Change packageManager field to pnpm 8.2.0 * removed package manager field from klaviyo package.json --- .changeset/heavy-pens-shop.md | 15 ++++ .changeset/poor-dots-play.md | 11 +++ .changeset/six-laws-do.md | 5 ++ .changeset/spicy-bottles-sort.md | 5 ++ README.md | 7 +- apps/cms/.env.example | 2 +- apps/cms/package.json | 2 - .../src/lib/cms/client/clients-execution.ts | 19 +++-- .../src/lib/cms/client/clients-operations.ts | 5 +- apps/cms/src/lib/cms/providers/contentful.ts | 20 +++++- apps/cms/src/lib/cms/providers/datocms.ts | 10 ++- apps/cms/src/lib/cms/providers/strapi.ts | 14 +++- apps/cms/src/lib/metadata.ts | 34 +++++---- .../src/pages/api/ping-provider-instance.ts | 6 +- .../src/pages/api/sync-products-variants.ts | 5 +- .../src/pages/api/webhooks/product-updated.ts | 14 ++-- .../api/webhooks/product-variant-created.ts | 6 +- .../api/webhooks/product-variant-deleted.ts | 6 +- .../api/webhooks/product-variant-updated.ts | 6 +- apps/cms/turbo.json | 2 +- apps/crm/.env.example | 2 +- apps/crm/package.json | 2 - apps/crm/src/lib/logger.ts | 17 ----- .../mailchimp/mailchimp-audience.router.ts | 3 +- .../mailchimp-config-settings-manager.ts | 2 +- .../mailchimp/mailchimp-config.router.ts | 3 +- .../mailchimp-authorize-view.tsx | 2 +- .../trpc/protected-client-procedure.ts | 5 +- .../src/pages/api/auth/mailchimp/callback.ts | 2 +- .../crm/src/pages/api/auth/mailchimp/oauth.ts | 3 +- .../pages/api/webhooks/customer-created.ts | 4 +- .../pages/api/webhooks/customer-updated.ts | 5 +- apps/emails-and-messages/package.json | 2 - apps/emails-and-messages/src/lib/logger.ts | 19 ----- .../app-configuration.router.ts | 18 +++-- .../get-app-configuration.service.ts | 8 ++- .../event-handlers/send-event-messages.ts | 6 +- .../mjml/compile-handlebars-template.ts | 5 +- .../src/modules/mjml/compile-mjml.ts | 4 +- .../get-mjml-configuration.service.ts | 8 ++- .../mjml-configuration.router.ts | 42 +++++++---- .../src/modules/mjml/html-to-plaintext.ts | 5 +- .../src/modules/mjml/send-email-with-smtp.ts | 5 +- .../src/modules/mjml/send-mjml.ts | 5 +- .../get-sendgrid-configuration.service.ts | 8 ++- .../sendgrid-configuration.router.ts | 36 +++++++--- .../src/modules/sendgrid/send-sendgrid.ts | 7 +- .../trpc/protected-client-procedure.ts | 2 +- .../src/pages/api/register.ts | 3 +- .../src/pages/api/webhooks/invoice-sent.ts | 5 +- .../src/pages/api/webhooks/notify.ts | 11 +-- .../src/pages/api/webhooks/order-cancelled.ts | 5 +- .../src/pages/api/webhooks/order-confirmed.ts | 5 +- .../src/pages/api/webhooks/order-created.ts | 5 +- .../src/pages/api/webhooks/order-fulfilled.ts | 5 +- .../pages/api/webhooks/order-fully-paid.ts | 5 +- apps/invoices/package.json | 2 - apps/invoices/src/lib/logger.ts | 19 ----- .../app-configuration.router.ts | 6 +- .../get-app-configuration.service.ts | 4 +- .../invoice-create-notifier.ts | 2 +- .../resolve-temp-pdf-file-location.ts | 2 +- .../saleor-invoice-uploader.ts | 2 +- .../trpc/protected-client-procedure.ts | 2 +- apps/invoices/src/pages/api/register.ts | 2 +- .../pages/api/webhooks/invoice-requested.ts | 2 +- apps/klaviyo/package.json | 3 +- apps/products-feed/package.json | 2 - .../src/lib/google-feed/fetch-product-data.ts | 4 +- .../src/lib/google-feed/fetch-shop-data.ts | 4 +- apps/products-feed/src/lib/logger.ts | 16 ----- .../app-configuration.router.ts | 6 +- .../get-app-configuration.service.ts | 4 +- .../category-mapping.router.ts | 6 +- .../trpc/protected-client-procedure.ts | 2 +- .../api/feed/[url]/[channel]/google.xml.ts | 4 +- apps/search/package.json | 2 - apps/search/src/lib/logger.ts | 17 ++--- .../api/webhooks/saleor/product_updated.ts | 1 - apps/taxes/package.json | 2 - apps/taxes/src/lib/logger.ts | 16 ++--- .../taxes/src/modules/app/metadata-manager.ts | 6 +- .../taxes/src/modules/app/webhook-response.ts | 4 +- .../taxes/src/modules/avatax/avatax-client.ts | 5 +- .../avatax/avatax-configuration.router.ts | 10 +-- .../avatax/avatax-configuration.service.ts | 5 +- .../modules/avatax/avatax-webhook.service.ts | 5 +- .../channels-configuration.router.ts | 6 +- .../get-channels-configuration.service.ts | 4 +- .../crud-settings/crud-settings.service.ts | 6 +- .../providers-configuration.router.ts | 4 +- .../public-providers-configuration-service.ts | 5 +- .../src/modules/taxes/active-tax-provider.ts | 6 +- .../taxes/src/modules/taxjar/taxjar-client.ts | 5 +- .../taxjar/taxjar-configuration.router.ts | 10 +-- .../taxjar/taxjar-configuration.service.ts | 5 +- .../modules/taxjar/taxjar-webhook.service.ts | 5 +- package.json | 2 +- packages/shared/index.ts | 1 + packages/shared/package.json | 4 ++ .../src/lib => packages/shared/src}/logger.ts | 5 +- pnpm-lock.yaml | 72 ++++++++----------- turbo.json | 2 +- 103 files changed, 415 insertions(+), 362 deletions(-) create mode 100644 .changeset/heavy-pens-shop.md create mode 100644 .changeset/poor-dots-play.md create mode 100644 .changeset/six-laws-do.md create mode 100644 .changeset/spicy-bottles-sort.md delete mode 100644 apps/crm/src/lib/logger.ts delete mode 100644 apps/emails-and-messages/src/lib/logger.ts delete mode 100644 apps/invoices/src/lib/logger.ts delete mode 100644 apps/products-feed/src/lib/logger.ts rename {apps/cms/src/lib => packages/shared/src}/logger.ts (74%) diff --git a/.changeset/heavy-pens-shop.md b/.changeset/heavy-pens-shop.md new file mode 100644 index 0000000..11f668d --- /dev/null +++ b/.changeset/heavy-pens-shop.md @@ -0,0 +1,15 @@ +--- +"saleor-app-emails-and-messages": minor +"saleor-app-products-feed": minor +"saleor-app-invoices": minor +"saleor-app-search": minor +"saleor-app-taxes": minor +"saleor-app-cms": minor +"saleor-app-crm": minor +"saleor-app-data-importer": minor +"saleor-app-klaviyo": minor +"saleor-app-monitoring": minor +"saleor-app-slack": minor +--- + +Changed APP_DEBUG env to APP_LOG_LEVEL diff --git a/.changeset/poor-dots-play.md b/.changeset/poor-dots-play.md new file mode 100644 index 0000000..0c43bc3 --- /dev/null +++ b/.changeset/poor-dots-play.md @@ -0,0 +1,11 @@ +--- +"saleor-app-emails-and-messages": patch +"saleor-app-products-feed": patch +"saleor-app-invoices": patch +"saleor-app-search": patch +"saleor-app-taxes": patch +"saleor-app-cms": patch +"saleor-app-crm": patch +--- + +Replaced internal logger implementation with shared logger diff --git a/.changeset/six-laws-do.md b/.changeset/six-laws-do.md new file mode 100644 index 0000000..d289313 --- /dev/null +++ b/.changeset/six-laws-do.md @@ -0,0 +1,5 @@ +--- +"@saleor/apps-shared": minor +--- + +Add Pino logger and renamed required env to be APP_LOG_LEVEL diff --git a/.changeset/spicy-bottles-sort.md b/.changeset/spicy-bottles-sort.md new file mode 100644 index 0000000..bb4e727 --- /dev/null +++ b/.changeset/spicy-bottles-sort.md @@ -0,0 +1,5 @@ +--- +"saleor-app-klaviyo": patch +--- + +Bumped Typescript version to 5.0.4 diff --git a/README.md b/README.md index ab94d2f..d8a62be 100644 --- a/README.md +++ b/README.md @@ -38,14 +38,17 @@ This repository serves as a starting point in the exploration of Saleor apps. In the `apps` folder, you will find the following applications: +- [crm](https://docs.saleor.io/docs/3.x/developer/app-store/apps/crm) - exports customers from Saleor to CRM. +- [cms](./apps/cms) - exports products from Saleor to CMS. - [data-importer](./apps/data-importer) - import data from CSV to Saleor. +- [emails-and-messages](./apps/emails-and-messages) - notifications and email communication with customers. - [invoices](./apps/invoices) - generate invoice PDF for each order. - [klaviyo](./apps/klaviyo) - send Saleor events to Klaviyo, where you can notify the customers. -- [emails-and-messages](./apps/emails-and-messages) - notifications and email communication with customers. +- [monitoring](./apps/monitoring) - send Saleor logs to 3rd party Monitoring services +- [products-feed](./apps/products-feed) - generate products feed XML - [search](./apps/search) - connect Saleor with search engines. - [slack](./apps/slack) - get notifications on Slack channel from Saleor events. - [taxes](https://docs.saleor.io/docs/3.x/developer/app-store/apps/taxes) - calculate order and checkout taxes using external services. -- [cms](./apps/cms) - exports products from Saleor to CMS. ## Development diff --git a/apps/cms/.env.example b/apps/cms/.env.example index 0dabf7d..644ccab 100644 --- a/apps/cms/.env.example +++ b/apps/cms/.env.example @@ -7,4 +7,4 @@ APL= REST_APL_ENDPOINT= REST_APL_TOKEN= -APP_DEBUG=debug # Pino logger levels +APP_LOG_LEVEL=info diff --git a/apps/cms/package.json b/apps/cms/package.json index 3248659..a8915f2 100644 --- a/apps/cms/package.json +++ b/apps/cms/package.json @@ -30,8 +30,6 @@ "graphql": "^16.6.0", "graphql-tag": "^2.12.6", "next": "13.3.0", - "pino": "^8.8.0", - "pino-pretty": "^9.1.1", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.39.1", diff --git a/apps/cms/src/lib/cms/client/clients-execution.ts b/apps/cms/src/lib/cms/client/clients-execution.ts index 85725bf..03b5322 100644 --- a/apps/cms/src/lib/cms/client/clients-execution.ts +++ b/apps/cms/src/lib/cms/client/clients-execution.ts @@ -9,14 +9,15 @@ import { ProductResponseSuccess, } from "../types"; import { getCmsIdFromSaleorItem } from "./metadata"; -import { logger as pinoLogger } from "../../logger"; +import { createLogger } from "@saleor/apps-shared"; import { CMSProvider, cmsProviders } from "../providers"; import { ProviderInstanceSchema, providersSchemaSet } from "../config"; export const pingProviderInstance = async ( providerInstanceSettings: ProviderInstanceSchema ): Promise => { - const logger = pinoLogger.child({ providerInstanceSettings }); + const logger = createLogger({ providerInstanceSettings }); + logger.debug("Ping provider instance called"); const provider = cmsProviders[ @@ -57,7 +58,8 @@ const executeCmsClientOperation = async ({ cmsClient: CmsClientOperations; productVariant: WebhookProductVariantFragment; }): Promise => { - const logger = pinoLogger.child({ cmsClient }); + const logger = createLogger({ cmsClient }); + logger.debug("Execute CMS client operation called"); const cmsId = getCmsIdFromSaleorItem(productVariant, cmsClient.cmsProviderInstanceId); @@ -84,9 +86,11 @@ const executeCmsClientOperation = async ({ try { await cmsClient.operations.updateProduct({ - // todo: change params of product methods because of below: - // * In some CMSes, cmsId may be productId. Perhaps it's better to just pass everything as one big object - // * and decide on the id on the provider level. + /* + * todo: change params of product methods because of below: + * * In some CMSes, cmsId may be productId. Perhaps it's better to just pass everything as one big object + * * and decide on the id on the provider level. + */ id: cmsId, input: { saleorId: productVariant.id, @@ -163,7 +167,8 @@ export const executeCmsClientBatchOperation = async ({ productVariant: WebhookProductVariantFragment ) => boolean; }): Promise => { - const logger = pinoLogger.child({ cmsClient }); + const logger = createLogger({ cmsClient }); + logger.debug({ operations: cmsClient.operations }, "Execute CMS client operation called"); if (cmsClient.operationType === "createBatchProducts") { diff --git a/apps/cms/src/lib/cms/client/clients-operations.ts b/apps/cms/src/lib/cms/client/clients-operations.ts index 1965468..f6fd4cd 100644 --- a/apps/cms/src/lib/cms/client/clients-operations.ts +++ b/apps/cms/src/lib/cms/client/clients-operations.ts @@ -9,9 +9,10 @@ import { import { providersSchemaSet } from "../config"; import { CMSProvider, cmsProviders } from "../providers"; import { CmsClientOperations } from "../types"; -import { logger as pinoLogger } from "../../logger"; + import { getCmsIdFromSaleorItemKey } from "./metadata"; import { type Client } from "urql"; +import { createLogger } from "@saleor/apps-shared"; type WebhookContext = Parameters["2"]; @@ -26,7 +27,7 @@ export const createCmsOperations = async ({ productVariantChannels: string[]; productVariantCmsKeys: string[]; }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ productVariantChannels, productVariantCmsKeys, }); diff --git a/apps/cms/src/lib/cms/providers/contentful.ts b/apps/cms/src/lib/cms/providers/contentful.ts index 7588aff..26745a7 100644 --- a/apps/cms/src/lib/cms/providers/contentful.ts +++ b/apps/cms/src/lib/cms/providers/contentful.ts @@ -1,10 +1,10 @@ import { v4 as uuidv4 } from "uuid"; import { ContentfulConfig, contentfulConfigSchema } from "../config"; -import { logger as pinoLogger } from "../../logger"; import { CreateOperations, ProductResponse, ProductInput } from "../types"; import { createProvider } from "./create"; import { fetchWithRateLimit } from "../data-sync"; +import { createLogger } from "@saleor/apps-shared"; const contentfulFetch = (endpoint: string, config: ContentfulConfig, options?: RequestInit) => { const baseUrl = config.baseUrl || "https://api.contentful.com"; @@ -64,6 +64,7 @@ const transformInputToBody = ({ }, }, }; + return body; }; @@ -95,7 +96,7 @@ const getEntryEndpoint = ({ }): string => `/spaces/${spaceId}/environments/${environment}/entries/${resourceId}`; const contentfulOperations: CreateOperations = (config) => { - const logger = pinoLogger.child({ cms: "strapi" }); + const logger = createLogger({ cms: "strapi" }); const { environment, spaceId, contentId, locale, apiRequestsPerSecond } = config; @@ -104,6 +105,7 @@ const contentfulOperations: CreateOperations = (config) => { const pingCMS = async () => { const endpoint = `/spaces/${spaceId}`; const response = await contentfulFetch(endpoint, config, { method: "GET" }); + logger.debug({ response }, "pingCMS response"); return { ok: response.ok, @@ -126,8 +128,10 @@ const contentfulOperations: CreateOperations = (config) => { "X-Contentful-Content-Type": contentId, }, }); + logger.debug({ response }, "createProduct response"); const json = await response.json(); + return { ...json, statusCode: response.status, @@ -144,8 +148,10 @@ const contentfulOperations: CreateOperations = (config) => { }); const getEntryResponse = await contentfulFetch(endpoint, config, { method: "GET" }); + logger.debug({ getEntryResponse }, "updateProduct getEntryResponse"); const entry = await getEntryResponse.json(); + logger.debug({ entry }, "updateProduct entry"); const response = await contentfulFetch(endpoint, config, { @@ -155,8 +161,10 @@ const contentfulOperations: CreateOperations = (config) => { "X-Contentful-Version": entry.sys.version, }, }); + logger.debug({ response }, "updateProduct response"); const json = await response.json(); + return { ...json, statusCode: response.status, @@ -178,6 +186,7 @@ const contentfulOperations: CreateOperations = (config) => { // Retry with delay x2 if by any chance hit rate limit with HTTP 429 let secondResults: ContentfulResponse[] = []; + if (failedWithLimitResults.length > 0) { logger.debug("createBatchProductsInCMS retrying failed by rate limit with delay x2"); secondResults = await fetchWithRateLimit( @@ -199,6 +208,7 @@ const contentfulOperations: CreateOperations = (config) => { // Retry with delay x2 if by any chance hit rate limit with HTTP 429 let secondResults: Response[] = []; + if (failedWithLimitResults.length > 0) { logger.debug("deleteBatchProductsInCMS retrying failed by rate limit with delay x2"); secondResults = await fetchWithRateLimit( @@ -214,36 +224,42 @@ const contentfulOperations: CreateOperations = (config) => { return { ping: async () => { const response = await pingCMS(); + logger.debug({ response }, "ping response"); return response; }, createProduct: async ({ input }) => { const result = await createProductInCMS(input); + logger.debug({ result }, "createProduct result"); return transformCreateProductResponse(result); }, updateProduct: async ({ id, input }) => { const result = await updateProductInCMS(id, input); + logger.debug({ result }, "updateProduct result"); return result; }, deleteProduct: async ({ id }) => { const response = await deleteProductInCMS(id); + logger.debug({ response }, "deleteProduct response"); return response; }, createBatchProducts: async ({ input }) => { const results = await createBatchProductsInCMS(input); + logger.debug({ results }, "createBatchProducts results"); return results.map((result) => transformCreateProductResponse(result)); }, deleteBatchProducts: async ({ ids }) => { const results = await deleteBatchProductsInCMS(ids); + logger.debug({ results }, "deleteBatchProducts results"); }, }; diff --git a/apps/cms/src/lib/cms/providers/datocms.ts b/apps/cms/src/lib/cms/providers/datocms.ts index bf9852d..0859872 100644 --- a/apps/cms/src/lib/cms/providers/datocms.ts +++ b/apps/cms/src/lib/cms/providers/datocms.ts @@ -1,9 +1,9 @@ import { createProvider } from "./create"; import { CreateOperations, ProductInput, ProductResponse } from "../types"; -import { logger as pinoLogger } from "../../logger"; import { ApiError, buildClient, SimpleSchemaTypes } from "@datocms/cma-client-node"; import { DatocmsConfig, datocmsConfigSchema } from "../config"; +import { createLogger } from "@saleor/apps-shared"; const datocmsClient = (config: DatocmsConfig, options?: RequestInit) => { const { baseUrl, token, environment } = config; @@ -46,7 +46,7 @@ const transformResponseItem = ( }; const datocmsOperations: CreateOperations = (config) => { - const logger = pinoLogger.child({ cms: "strapi" }); + const logger = createLogger({ cms: "strapi" }); const client = datocmsClient(config); @@ -96,6 +96,7 @@ const datocmsOperations: CreateOperations = (config) => { ping: async () => { try { const response = await pingCMS(); + logger.debug({ response }, "ping response"); if (!response.id) { @@ -110,6 +111,7 @@ const datocmsOperations: CreateOperations = (config) => { createProduct: async ({ input }) => { try { const item = await createProductInCMS(input); + logger.debug({ item }, "createProduct response"); return transformResponseItem(item, input); @@ -119,20 +121,24 @@ const datocmsOperations: CreateOperations = (config) => { }, updateProduct: async ({ id, input }) => { const item = await updateProductInCMS(id, input); + logger.debug({ item }, "updateProduct response"); }, deleteProduct: async ({ id }) => { const item = await deleteProductInCMS(id); + logger.debug({ item }, "deleteProduct response"); }, createBatchProducts: async ({ input }) => { const items = await createBatchProductsInCMS(input); + logger.debug({ items }, "createBatchProducts response"); return items.map((item) => transformResponseItem(item.id, item.input)); }, deleteBatchProducts: async ({ ids }) => { const items = await deleteBatchProductsInCMS(ids); + logger.debug({ items }, "deleteBatchProducts response"); }, }; diff --git a/apps/cms/src/lib/cms/providers/strapi.ts b/apps/cms/src/lib/cms/providers/strapi.ts index b5ca002..115e227 100644 --- a/apps/cms/src/lib/cms/providers/strapi.ts +++ b/apps/cms/src/lib/cms/providers/strapi.ts @@ -1,7 +1,7 @@ import { StrapiConfig, strapiConfigSchema } from "../config"; import { CreateOperations, ProductResponse, ProductInput } from "../types"; import { createProvider } from "./create"; -import { logger as pinoLogger } from "../../logger"; +import { createLogger } from "@saleor/apps-shared"; const strapiFetch = async (endpoint: string, config: StrapiConfig, options?: RequestInit) => { const { baseUrl, token } = config; @@ -31,6 +31,7 @@ const transformInputToBody = (input: ProductInput): StrapiBody => { product_slug: input.productSlug, }, }; + return body; }; @@ -78,7 +79,7 @@ const transformCreateProductResponse = ( type CreateStrapiOperations = CreateOperations; export const strapiOperations: CreateStrapiOperations = (config) => { - const logger = pinoLogger.child({ cms: "strapi" }); + const logger = createLogger({ cms: "strapi" }); const { contentTypeId } = config; @@ -86,6 +87,7 @@ export const strapiOperations: CreateStrapiOperations = (config) => { const response = await strapiFetch(`/${contentTypeId}`, config, { method: "GET", }); + logger.debug({ response }, "pingCMS response"); return { ok: response.ok }; }; @@ -96,12 +98,14 @@ export const strapiOperations: CreateStrapiOperations = (config) => { method: "POST", body: JSON.stringify(body), }); + logger.debug({ response }, "createProduct response"); return await response.json(); }; const updateProductInCMS = async (id: string, input: ProductInput) => { const body = transformInputToBody(input); + return await strapiFetch(`/${contentTypeId}/${id}`, config, { method: "PUT", body: JSON.stringify(body), @@ -130,36 +134,42 @@ export const strapiOperations: CreateStrapiOperations = (config) => { return { ping: async () => { const response = await pingCMS(); + logger.debug({ response }, "ping response"); return response; }, createProduct: async ({ input }) => { const result = await createProductInCMS(input); + logger.debug({ result }, "createProduct result"); return transformCreateProductResponse(result, input); }, updateProduct: async ({ id, input }) => { const response = await updateProductInCMS(id, input); + logger.debug({ response }, "updateProduct response"); return response; }, deleteProduct: async ({ id }) => { const response = await deleteProductInCMS(id); + logger.debug({ response }, "deleteProduct response"); return response; }, createBatchProducts: async ({ input }) => { const results = await createBatchProductsInCMS(input); + logger.debug({ results }, "createBatchProducts results"); return results.map((result) => transformCreateProductResponse(result.response, result.input)); }, deleteBatchProducts: async ({ ids }) => { const responses = await deleteBatchProductsInCMS(ids); + logger.debug({ responses }, "deleteBatchProducts responses"); return responses; diff --git a/apps/cms/src/lib/metadata.ts b/apps/cms/src/lib/metadata.ts index 89d57c0..768da99 100644 --- a/apps/cms/src/lib/metadata.ts +++ b/apps/cms/src/lib/metadata.ts @@ -8,14 +8,16 @@ import { FetchProductVariantMetadataQuery, UpdateAppMetadataDocument, } from "../../generated/graphql"; -import { logger as pinoLogger } from "../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; -// Function is using urql graphql client to fetch all available metadata. -// Before returning query result, we are transforming response to list of objects with key and value fields -// which can be used by the manager. -// Result of this query is cached by the manager. +/* + * Function is using urql graphql client to fetch all available metadata. + * Before returning query result, we are transforming response to list of objects with key and value fields + * which can be used by the manager. + * Result of this query is cached by the manager. + */ export async function fetchAllMetadata(client: Client): Promise { - const logger = pinoLogger.child({ + const logger = createLogger({ function: "fetchAllMetadata", }); @@ -31,11 +33,13 @@ export async function fetchAllMetadata(client: Client): Promise return data?.app?.privateMetadata.map((md) => ({ key: md.key, value: md.value })) || []; } -// Mutate function takes urql client and metadata entries, and construct mutation to the API. -// Before data are send, additional query for required App ID is made. -// The manager will use updated entries returned by this mutation to update it's cache. +/* + * Mutate function takes urql client and metadata entries, and construct mutation to the API. + * Before data are send, additional query for required App ID is made. + * The manager will use updated entries returned by this mutation to update it's cache. + */ export async function mutateMetadata(client: Client, metadata: MetadataEntry[]) { - const logger = pinoLogger.child({ + const logger = createLogger({ function: "mutateMetadata", }); @@ -79,9 +83,11 @@ export async function mutateMetadata(client: Client, metadata: MetadataEntry[]) } export const createSettingsManager = (client: Client) => { - // EncryptedMetadataManager gives you interface to manipulate metadata and cache values in memory. - // We recommend it for production, because all values are encrypted. - // If your use case require plain text values, you can use MetadataManager. + /* + * EncryptedMetadataManager gives you interface to manipulate metadata and cache values in memory. + * We recommend it for production, because all values are encrypted. + * If your use case require plain text values, you can use MetadataManager. + */ return new EncryptedMetadataManager({ // Secret key should be randomly created for production and set as environment variable encryptionKey: process.env.SECRET_KEY!, @@ -94,7 +100,7 @@ export async function fetchProductVariantMetadata( client: Client, productId: string ): Promise { - const logger = pinoLogger.child({ + const logger = createLogger({ function: "fetchProductVariantMetadata", productId, }); diff --git a/apps/cms/src/pages/api/ping-provider-instance.ts b/apps/cms/src/pages/api/ping-provider-instance.ts index 6f2103c..43348f0 100644 --- a/apps/cms/src/pages/api/ping-provider-instance.ts +++ b/apps/cms/src/pages/api/ping-provider-instance.ts @@ -1,11 +1,12 @@ import { NextProtectedApiHandler, createProtectedHandler } from "@saleor/app-sdk/handlers/next"; import { saleorApp } from "../../../saleor-app"; import type { NextApiRequest, NextApiResponse } from "next"; -import { logger as pinoLogger } from "../../lib/logger"; + import { createClient } from "../../lib/graphql"; import { createSettingsManager } from "../../lib/metadata"; import { getProviderInstancesSettings } from "../../lib/cms/client/settings"; import { pingProviderInstance } from "../../lib/cms/client/clients-execution"; +import { createLogger } from "@saleor/apps-shared"; export interface ProviderInstancePingApiPayload { providerInstanceId: string; @@ -23,9 +24,10 @@ const handler: NextProtectedApiHandler = async ( const { authData } = context; const { providerInstanceId } = req.body as ProviderInstancePingApiPayload; - const logger = pinoLogger.child({ + const logger = createLogger({ endpoint: "ping-provider-instance", }); + logger.debug({ providerInstanceId }, "Called endpoint ping-provider-instance"); if (req.method !== "POST") { diff --git a/apps/cms/src/pages/api/sync-products-variants.ts b/apps/cms/src/pages/api/sync-products-variants.ts index 8b29c0b..02699f3 100644 --- a/apps/cms/src/pages/api/sync-products-variants.ts +++ b/apps/cms/src/pages/api/sync-products-variants.ts @@ -6,11 +6,12 @@ import { executeCmsClientBatchOperation } from "../../lib/cms/client/clients-exe import { getChannelsSettings, getProviderInstancesSettings } from "../../lib/cms/client/settings"; import { providersSchemaSet } from "../../lib/cms/config/providers"; import { cmsProviders, CMSProvider } from "../../lib/cms/providers"; -import { logger as pinoLogger } from "../../lib/logger"; + import { createClient } from "../../lib/graphql"; import { createSettingsManager } from "../../lib/metadata"; import { batchUpdateMetadata, MetadataRecord } from "../../lib/cms/client/metadata-execution"; import { CmsBatchOperations } from "../../lib/cms/types"; +import { createLogger } from "@saleor/apps-shared"; export interface SyncProductsVariantsApiPayload { channelSlug: string; @@ -35,7 +36,7 @@ const handler: NextProtectedApiHandler = async ( ) => { const { authData } = context; - const logger = pinoLogger.child({ + const logger = createLogger({ endpoint: "sync-products-variants", }); diff --git a/apps/cms/src/pages/api/webhooks/product-updated.ts b/apps/cms/src/pages/api/webhooks/product-updated.ts index c5cb8bf..5fde6eb 100644 --- a/apps/cms/src/pages/api/webhooks/product-updated.ts +++ b/apps/cms/src/pages/api/webhooks/product-updated.ts @@ -8,10 +8,11 @@ import { saleorApp } from "../../../../saleor-app"; import { getCmsKeysFromSaleorItem } from "../../../lib/cms/client/metadata"; import { getChannelsSlugsFromSaleorItem } from "../../../lib/cms/client/channels"; import { createCmsOperations, executeCmsOperations, updateMetadata } from "../../../lib/cms/client"; -import { logger as pinoLogger } from "../../../lib/logger"; + import { createClient } from "../../../lib/graphql"; import { fetchProductVariantMetadata } from "../../../lib/metadata"; import { isAppWebhookIssuer } from "./_utils"; +import { createLogger } from "@saleor/apps-shared"; export const config = { api: { @@ -58,9 +59,10 @@ export const handler: NextWebhookApiHandler operation.operationType === "updateProduct" ); diff --git a/apps/cms/src/pages/api/webhooks/product-variant-created.ts b/apps/cms/src/pages/api/webhooks/product-variant-created.ts index c0a2cc4..c777ee7 100644 --- a/apps/cms/src/pages/api/webhooks/product-variant-created.ts +++ b/apps/cms/src/pages/api/webhooks/product-variant-created.ts @@ -7,10 +7,11 @@ import { import { saleorApp } from "../../../../saleor-app"; import { getChannelsSlugsFromSaleorItem } from "../../../lib/cms/client/channels"; import { createCmsOperations, executeCmsOperations, updateMetadata } from "../../../lib/cms/client"; -import { logger as pinoLogger } from "../../../lib/logger"; + import { createClient } from "../../../lib/graphql"; import { fetchProductVariantMetadata } from "../../../lib/metadata"; import { getCmsKeysFromSaleorItem } from "../../../lib/cms/client/metadata"; +import { createLogger } from "@saleor/apps-shared"; export const config = { api: { @@ -53,9 +54,10 @@ export const handler: NextWebhookApiHandler { logger.debug("attachAppToken middleware"); diff --git a/apps/crm/src/pages/api/auth/mailchimp/callback.ts b/apps/crm/src/pages/api/auth/mailchimp/callback.ts index af92694..ae5fcdf 100644 --- a/apps/crm/src/pages/api/auth/mailchimp/callback.ts +++ b/apps/crm/src/pages/api/auth/mailchimp/callback.ts @@ -1,6 +1,6 @@ import { NextApiHandler } from "next"; import { MailchimpClientOAuth } from "../../../../modules/mailchimp/mailchimp-client"; -import { createLogger } from "../../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; export const getBaseUrl = (headers: { [name: string]: string | string[] | undefined }): string => { const { host, "x-forwarded-proto": protocol = "http" } = headers; diff --git a/apps/crm/src/pages/api/auth/mailchimp/oauth.ts b/apps/crm/src/pages/api/auth/mailchimp/oauth.ts index 1ff8a36..c27b730 100644 --- a/apps/crm/src/pages/api/auth/mailchimp/oauth.ts +++ b/apps/crm/src/pages/api/auth/mailchimp/oauth.ts @@ -1,8 +1,9 @@ import { NextApiHandler } from "next"; -import { createLogger } from "../../../../lib/logger"; + import { processSaleorProtectedHandler } from "@saleor/app-sdk/handlers/next"; import { saleorApp } from "../../../../saleor-app"; import { SALEOR_API_URL_HEADER, SALEOR_AUTHORIZATION_BEARER_HEADER } from "@saleor/app-sdk/const"; +import { createLogger } from "@saleor/apps-shared"; export const getBaseUrl = (headers: { [name: string]: string | string[] | undefined }): string => { const { host, "x-forwarded-proto": protocol = "http" } = headers; diff --git a/apps/crm/src/pages/api/webhooks/customer-created.ts b/apps/crm/src/pages/api/webhooks/customer-created.ts index 4c946ec..cdf1a7b 100644 --- a/apps/crm/src/pages/api/webhooks/customer-created.ts +++ b/apps/crm/src/pages/api/webhooks/customer-created.ts @@ -1,6 +1,5 @@ import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; import { saleorApp } from "../../../saleor-app"; -import { logger as pinoLogger } from "../../../lib/logger"; import { CustomerCreatedDocument, CustomerCreatedPayloadFragment, @@ -9,6 +8,7 @@ import { createClient } from "../../../lib/create-graphq-client"; import { MailchimpConfigSettingsManager } from "../../../modules/mailchimp/mailchimp-config-settings-manager"; import { MailchimpClientOAuth } from "../../../modules/mailchimp/mailchimp-client"; import { metadataToMailchimpTags } from "../../../modules/saleor-customers-sync/metadata-to-mailchimp-tags"; +import { createLogger } from "@saleor/apps-shared"; export const customerCreatedWebhook = new SaleorAsyncWebhook({ name: "Customer Created in Saleor", @@ -24,7 +24,7 @@ export const customerCreatedHandler: NextWebhookApiHandler { - const logger = pinoLogger.child({ + const logger = createLogger({ webhook: customerCreatedWebhook.name, }); diff --git a/apps/crm/src/pages/api/webhooks/customer-updated.ts b/apps/crm/src/pages/api/webhooks/customer-updated.ts index 5600b80..458c8bf 100644 --- a/apps/crm/src/pages/api/webhooks/customer-updated.ts +++ b/apps/crm/src/pages/api/webhooks/customer-updated.ts @@ -1,6 +1,6 @@ import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; import { saleorApp } from "../../../saleor-app"; -import { logger as pinoLogger } from "../../../lib/logger"; + import { CustomerUpdatedDocument, CustomerUpdatedPayloadFragment, @@ -9,6 +9,7 @@ import { createClient } from "../../../lib/create-graphq-client"; import { MailchimpConfigSettingsManager } from "../../../modules/mailchimp/mailchimp-config-settings-manager"; import { MailchimpClientOAuth } from "../../../modules/mailchimp/mailchimp-client"; import { metadataToMailchimpTags } from "../../../modules/saleor-customers-sync/metadata-to-mailchimp-tags"; +import { createLogger } from "@saleor/apps-shared"; export const customerMetadataUpdatedWebhook = new SaleorAsyncWebhook({ @@ -24,7 +25,7 @@ const handler: NextWebhookApiHandler = async ( res, context ) => { - const logger = pinoLogger.child({ + const logger = createLogger({ webhook: customerMetadataUpdatedWebhook.name, }); diff --git a/apps/emails-and-messages/package.json b/apps/emails-and-messages/package.json index e26267d..8d1cbb6 100644 --- a/apps/emails-and-messages/package.json +++ b/apps/emails-and-messages/package.json @@ -42,8 +42,6 @@ "next": "13.3.0", "next-urql": "^4.0.3", "nodemailer": "^6.9.1", - "pino": "^8.8.0", - "pino-pretty": "^9.1.1", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.43.0", diff --git a/apps/emails-and-messages/src/lib/logger.ts b/apps/emails-and-messages/src/lib/logger.ts deleted file mode 100644 index 314340a..0000000 --- a/apps/emails-and-messages/src/lib/logger.ts +++ /dev/null @@ -1,19 +0,0 @@ -import pino from "pino"; - -/** - * TODO Set up log drain etc - */ -export const logger = pino({ - level: "debug", - transport: - process.env.NODE_ENV === "development" - ? { - target: "pino-pretty", - options: { - colorize: true, - }, - } - : undefined, -}); - -export const createLogger = logger.child.bind(logger); diff --git a/apps/emails-and-messages/src/modules/app-configuration/app-configuration.router.ts b/apps/emails-and-messages/src/modules/app-configuration/app-configuration.router.ts index fed3f26..853d9bc 100644 --- a/apps/emails-and-messages/src/modules/app-configuration/app-configuration.router.ts +++ b/apps/emails-and-messages/src/modules/app-configuration/app-configuration.router.ts @@ -1,4 +1,4 @@ -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { appChannelConfigurationInputSchema, appConfigInputSchema, @@ -8,8 +8,10 @@ import { router } from "../trpc/trpc-server"; import { protectedClientProcedure } from "../trpc/protected-client-procedure"; import { z } from "zod"; -// Allow access only for the dashboard users and attaches the -// configuration service to the context +/* + * Allow access only for the dashboard users and attaches the + * configuration service to the context + */ const protectedWithConfigurationService = protectedClientProcedure.use(({ next, ctx }) => next({ ctx: { @@ -26,7 +28,8 @@ export const appConfigurationRouter = router({ getChannelConfiguration: protectedWithConfigurationService .input(z.object({ channelSlug: z.string() })) .query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug("Get Channel Configuration called"); return await ctx.configurationService.getChannelConfiguration(input.channelSlug); @@ -36,13 +39,14 @@ export const appConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(appChannelConfigurationInputSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug("Set channel configuration called"); await ctx.configurationService.setChannelConfiguration(input); }), fetch: protectedWithConfigurationService.query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug("appConfigurationRouter.fetch called"); @@ -55,7 +59,7 @@ export const appConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(appConfigInputSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "appConfigurationRouter.setAndReplace called with input"); diff --git a/apps/emails-and-messages/src/modules/app-configuration/get-app-configuration.service.ts b/apps/emails-and-messages/src/modules/app-configuration/get-app-configuration.service.ts index 934e4ba..c02fd90 100644 --- a/apps/emails-and-messages/src/modules/app-configuration/get-app-configuration.service.ts +++ b/apps/emails-and-messages/src/modules/app-configuration/get-app-configuration.service.ts @@ -1,11 +1,11 @@ import { PrivateMetadataAppConfigurator } from "./app-configurator"; import { Client } from "urql"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { AppConfig, AppConfigurationPerChannel } from "./app-config"; import { getDefaultEmptyAppConfiguration } from "./app-config-container"; import { createSettingsManager } from "../../lib/metadata-manager"; -const logger = pinoLogger.child({ +const logger = createLogger({ service: "AppConfigurationService", }); @@ -25,6 +25,7 @@ export class AppConfigurationService { logger.debug("Fetch configuration from Saleor API"); const config = await this.metadataConfigurator.getConfig(); + this.configurationData = config; } @@ -64,11 +65,13 @@ export class AppConfigurationService { async getChannelConfiguration(channel: string) { logger.debug("Get channel configuration"); const configurations = await this.getConfiguration(); + if (!configurations) { return getDefaultEmptyAppConfiguration(); } const channelConfiguration = configurations.configurationsPerChannel[channel]; + return channelConfiguration || getDefaultEmptyAppConfiguration(); } @@ -81,6 +84,7 @@ export class AppConfigurationService { }) { logger.debug("Set channel configuration"); let configurations = await this.getConfiguration(); + if (!configurations) { configurations = { configurationsPerChannel: {} }; } diff --git a/apps/emails-and-messages/src/modules/event-handlers/send-event-messages.ts b/apps/emails-and-messages/src/modules/event-handlers/send-event-messages.ts index cebc824..e45fe37 100644 --- a/apps/emails-and-messages/src/modules/event-handlers/send-event-messages.ts +++ b/apps/emails-and-messages/src/modules/event-handlers/send-event-messages.ts @@ -1,6 +1,6 @@ import { AuthData } from "@saleor/app-sdk/APL"; import { Client } from "urql"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { AppConfigurationService } from "../app-configuration/get-app-configuration.service"; import { MjmlConfigurationService } from "../mjml/configuration/get-mjml-configuration.service"; import { sendMjml } from "../mjml/send-mjml"; @@ -25,7 +25,7 @@ export const sendEventMessages = async ({ payload, client, }: SendEventMessagesArgs) => { - const logger = pinoLogger.child({ + const logger = createLogger({ fn: "sendEventMessages", }); @@ -60,6 +60,7 @@ export const sendEventMessages = async ({ const mjmlConfiguration = await mjmlConfigurationService.getConfiguration({ id: channelAppConfiguration.mjmlConfigurationId, }); + if (mjmlConfiguration) { const mjmlStatus = await sendMjml({ event, @@ -86,6 +87,7 @@ export const sendEventMessages = async ({ const sendgridConfiguration = await sendgridConfigurationService.getConfiguration({ id: channelAppConfiguration.sendgridConfigurationId, }); + if (sendgridConfiguration) { const sendgridStatus = await sendSendgrid({ event, diff --git a/apps/emails-and-messages/src/modules/mjml/compile-handlebars-template.ts b/apps/emails-and-messages/src/modules/mjml/compile-handlebars-template.ts index 69f56fa..51d1a7e 100644 --- a/apps/emails-and-messages/src/modules/mjml/compile-handlebars-template.ts +++ b/apps/emails-and-messages/src/modules/mjml/compile-handlebars-template.ts @@ -1,7 +1,7 @@ import Handlebars from "handlebars"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; -const logger = pinoLogger.child({ +const logger = createLogger({ fn: "compileHandlebarsTemplate", }); @@ -10,6 +10,7 @@ export const compileHandlebarsTemplate = (template: string, variables: any) => { try { const templateDelegate = Handlebars.compile(template); const htmlTemplate = templateDelegate(variables); + logger.debug("Template successfully compiled"); return { template: htmlTemplate, diff --git a/apps/emails-and-messages/src/modules/mjml/compile-mjml.ts b/apps/emails-and-messages/src/modules/mjml/compile-mjml.ts index 07a643e..1fea8f5 100644 --- a/apps/emails-and-messages/src/modules/mjml/compile-mjml.ts +++ b/apps/emails-and-messages/src/modules/mjml/compile-mjml.ts @@ -1,7 +1,7 @@ import mjml2html from "mjml"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; -const logger = pinoLogger.child({ +const logger = createLogger({ fn: "compileMjml", }); diff --git a/apps/emails-and-messages/src/modules/mjml/configuration/get-mjml-configuration.service.ts b/apps/emails-and-messages/src/modules/mjml/configuration/get-mjml-configuration.service.ts index 4ea3c43..92835b2 100644 --- a/apps/emails-and-messages/src/modules/mjml/configuration/get-mjml-configuration.service.ts +++ b/apps/emails-and-messages/src/modules/mjml/configuration/get-mjml-configuration.service.ts @@ -1,11 +1,11 @@ import { MjmlConfigurator, PrivateMetadataMjmlConfigurator } from "./mjml-configurator"; import { Client } from "urql"; -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { MjmlConfig, MjmlConfiguration } from "./mjml-config"; import { FilterConfigurationsArgs, MjmlConfigContainer } from "./mjml-config-container"; import { createSettingsManager } from "../../../lib/metadata-manager"; -const logger = pinoLogger.child({ +const logger = createLogger({ service: "MjmlConfigurationService", }); @@ -29,6 +29,7 @@ export class MjmlConfigurationService { logger.debug("Fetch configuration from Saleor API"); const config = await this.metadataConfigurator.getConfig(); + this.configurationData = config; } @@ -82,6 +83,7 @@ export class MjmlConfigurationService { const updatedConfigurationRoot = MjmlConfigContainer.createConfiguration( await this.getConfigurationRoot() )(config); + await this.setConfigurationRoot(updatedConfigurationRoot); return updatedConfigurationRoot.configurations[ @@ -94,6 +96,7 @@ export class MjmlConfigurationService { const updatedConfigurationRoot = MjmlConfigContainer.updateConfiguration( await this.getConfigurationRoot() )(config); + this.setConfigurationRoot(updatedConfigurationRoot); } @@ -102,6 +105,7 @@ export class MjmlConfigurationService { const updatedConfigurationRoot = MjmlConfigContainer.deleteConfiguration( await this.getConfigurationRoot() )({ id }); + this.setConfigurationRoot(updatedConfigurationRoot); } } diff --git a/apps/emails-and-messages/src/modules/mjml/configuration/mjml-configuration.router.ts b/apps/emails-and-messages/src/modules/mjml/configuration/mjml-configuration.router.ts index aa45def..c26ef88 100644 --- a/apps/emails-and-messages/src/modules/mjml/configuration/mjml-configuration.router.ts +++ b/apps/emails-and-messages/src/modules/mjml/configuration/mjml-configuration.router.ts @@ -1,4 +1,4 @@ -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { mjmlCreateConfigurationSchema, mjmlDeleteConfigurationInputSchema, @@ -16,8 +16,10 @@ import { compileMjml } from "../compile-mjml"; import Handlebars from "handlebars"; import { TRPCError } from "@trpc/server"; -// Allow access only for the dashboard users and attaches the -// configuration service to the context +/* + * Allow access only for the dashboard users and attaches the + * configuration service to the context + */ const protectedWithConfigurationService = protectedClientProcedure.use(({ next, ctx }) => next({ ctx: { @@ -32,7 +34,8 @@ const protectedWithConfigurationService = protectedClientProcedure.use(({ next, export const mjmlConfigurationRouter = router({ fetch: protectedWithConfigurationService.query(async ({ ctx }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug("mjmlConfigurationRouter.fetch called"); return ctx.configurationService.getConfigurationRoot(); }), @@ -40,7 +43,8 @@ export const mjmlConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(mjmlGetConfigurationInputSchema) .query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "mjmlConfigurationRouter.get called"); return ctx.configurationService.getConfiguration(input); }), @@ -48,7 +52,8 @@ export const mjmlConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(mjmlGetConfigurationsInputSchema) .query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "mjmlConfigurationRouter.getConfigurations called"); return ctx.configurationService.getConfigurations(input); }), @@ -56,7 +61,8 @@ export const mjmlConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(mjmlCreateConfigurationSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "mjmlConfigurationRouter.create called"); return await ctx.configurationService.createConfiguration(input); }), @@ -64,9 +70,11 @@ export const mjmlConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(mjmlDeleteConfigurationInputSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "mjmlConfigurationRouter.delete called"); const existingConfiguration = await ctx.configurationService.getConfiguration(input); + if (!existingConfiguration) { throw new TRPCError({ code: "BAD_REQUEST", @@ -80,14 +88,17 @@ export const mjmlConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(mjmlUpdateOrCreateConfigurationSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "mjmlConfigurationRouter.update or create called"); const { id } = input; + if (!id) { return await ctx.configurationService.createConfiguration(input); } else { const existingConfiguration = await ctx.configurationService.getConfiguration({ id }); + if (!existingConfiguration) { throw new TRPCError({ code: "BAD_REQUEST", @@ -99,6 +110,7 @@ export const mjmlConfigurationRouter = router({ ...input, events: existingConfiguration.events, }; + await ctx.configurationService.updateConfiguration(configuration); return configuration; } @@ -107,7 +119,7 @@ export const mjmlConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(mjmlGetEventConfigurationInputSchema) .query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "mjmlConfigurationRouter.getEventConfiguration or create called"); @@ -123,6 +135,7 @@ export const mjmlConfigurationRouter = router({ } const event = configuration.events.find((e) => e.eventType === input.eventType); + if (!event) { throw new TRPCError({ code: "BAD_REQUEST", @@ -135,7 +148,7 @@ export const mjmlConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(mjmlUpdateEventConfigurationInputSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "mjmlConfigurationRouter.updateEventConfiguration or create called"); @@ -151,6 +164,7 @@ export const mjmlConfigurationRouter = router({ } const eventIndex = configuration.events.findIndex((e) => e.eventType === input.eventType); + configuration.events[eventIndex] = { active: input.active, eventType: input.eventType, @@ -171,7 +185,8 @@ export const mjmlConfigurationRouter = router({ }) ) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "mjmlConfigurationRouter.renderTemplate called"); let renderedSubject = ""; @@ -180,16 +195,19 @@ export const mjmlConfigurationRouter = router({ if (input.subject) { const compiledSubjectTemplate = Handlebars.compile(input.subject); + logger.warn("subject part"); renderedSubject = compiledSubjectTemplate(payload); } let renderedEmail = ""; + if (input.template) { const compiledSubjectTemplate = Handlebars.compile(input.template); const templatedEmail = compiledSubjectTemplate(payload); const { html: rawHtml } = compileMjml(templatedEmail); + if (rawHtml) { renderedEmail = rawHtml; } diff --git a/apps/emails-and-messages/src/modules/mjml/html-to-plaintext.ts b/apps/emails-and-messages/src/modules/mjml/html-to-plaintext.ts index f156a10..b0bfaf0 100644 --- a/apps/emails-and-messages/src/modules/mjml/html-to-plaintext.ts +++ b/apps/emails-and-messages/src/modules/mjml/html-to-plaintext.ts @@ -1,7 +1,7 @@ import { convert } from "html-to-text"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; -const logger = pinoLogger.child({ +const logger = createLogger({ fn: "htmlToPlaintext", }); @@ -9,6 +9,7 @@ export const htmlToPlaintext = (html: string) => { logger.debug("Converting HTML template to plaintext"); try { const plaintext = convert(html); + logger.debug("Converted successfully"); return { plaintext, diff --git a/apps/emails-and-messages/src/modules/mjml/send-email-with-smtp.ts b/apps/emails-and-messages/src/modules/mjml/send-email-with-smtp.ts index 76ee18b..3696f5b 100644 --- a/apps/emails-and-messages/src/modules/mjml/send-email-with-smtp.ts +++ b/apps/emails-and-messages/src/modules/mjml/send-email-with-smtp.ts @@ -1,7 +1,7 @@ import nodemailer from "nodemailer"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; -const logger = pinoLogger.child({ +const logger = createLogger({ fn: "sendEmailWithSmtp", }); @@ -33,6 +33,7 @@ export const sendEmailWithSmtp = async ({ smtpSettings, mailData }: SendMailArgs const response = await transporter.sendMail({ ...mailData, }); + logger.debug("An email has been sent"); return { response }; } catch (error) { diff --git a/apps/emails-and-messages/src/modules/mjml/send-mjml.ts b/apps/emails-and-messages/src/modules/mjml/send-mjml.ts index 3d0711d..bda34f5 100644 --- a/apps/emails-and-messages/src/modules/mjml/send-mjml.ts +++ b/apps/emails-and-messages/src/modules/mjml/send-mjml.ts @@ -1,4 +1,4 @@ -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { compileMjml } from "./compile-mjml"; import { compileHandlebarsTemplate } from "./compile-handlebars-template"; import { sendEmailWithSmtp, SendMailArgs } from "./send-email-with-smtp"; @@ -26,12 +26,13 @@ export const sendMjml = async ({ event, mjmlConfiguration, }: SendMjmlArgs) => { - const logger = pinoLogger.child({ + const logger = createLogger({ fn: "sendMjml", event, }); const eventSettings = mjmlConfiguration.events.find((e) => e.eventType === event); + if (!eventSettings) { logger.debug("No active settings for this event, skipping"); return { diff --git a/apps/emails-and-messages/src/modules/sendgrid/configuration/get-sendgrid-configuration.service.ts b/apps/emails-and-messages/src/modules/sendgrid/configuration/get-sendgrid-configuration.service.ts index fd7b576..d056506 100644 --- a/apps/emails-and-messages/src/modules/sendgrid/configuration/get-sendgrid-configuration.service.ts +++ b/apps/emails-and-messages/src/modules/sendgrid/configuration/get-sendgrid-configuration.service.ts @@ -1,11 +1,11 @@ import { SendgridConfigurator, PrivateMetadataSendgridConfigurator } from "./sendgrid-configurator"; import { Client } from "urql"; -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { SendgridConfig, SendgridConfiguration } from "./sendgrid-config"; import { FilterConfigurationsArgs, SendgridConfigContainer } from "./sendgrid-config-container"; import { createSettingsManager } from "../../../lib/metadata-manager"; -const logger = pinoLogger.child({ +const logger = createLogger({ service: "SendgridConfigurationService", }); @@ -29,6 +29,7 @@ export class SendgridConfigurationService { logger.debug("Fetch configuration from Saleor API"); const config = await this.metadataConfigurator.getConfig(); + this.configurationData = config; } @@ -82,6 +83,7 @@ export class SendgridConfigurationService { const updatedConfigurationRoot = SendgridConfigContainer.createConfiguration( await this.getConfigurationRoot() )(config); + await this.setConfigurationRoot(updatedConfigurationRoot); return updatedConfigurationRoot.configurations[ @@ -94,6 +96,7 @@ export class SendgridConfigurationService { const updatedConfigurationRoot = SendgridConfigContainer.updateConfiguration( await this.getConfigurationRoot() )(config); + this.setConfigurationRoot(updatedConfigurationRoot); } @@ -102,6 +105,7 @@ export class SendgridConfigurationService { const updatedConfigurationRoot = SendgridConfigContainer.deleteConfiguration( await this.getConfigurationRoot() )({ id }); + this.setConfigurationRoot(updatedConfigurationRoot); } } diff --git a/apps/emails-and-messages/src/modules/sendgrid/configuration/sendgrid-configuration.router.ts b/apps/emails-and-messages/src/modules/sendgrid/configuration/sendgrid-configuration.router.ts index 99253e7..52cbc43 100644 --- a/apps/emails-and-messages/src/modules/sendgrid/configuration/sendgrid-configuration.router.ts +++ b/apps/emails-and-messages/src/modules/sendgrid/configuration/sendgrid-configuration.router.ts @@ -1,4 +1,4 @@ -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { sendgridCreateConfigurationSchema, sendgridDeleteConfigurationInputSchema, @@ -13,8 +13,10 @@ import { router } from "../../trpc/trpc-server"; import { protectedClientProcedure } from "../../trpc/protected-client-procedure"; import { TRPCError } from "@trpc/server"; -// Allow access only for the dashboard users and attaches the -// configuration service to the context +/* + * Allow access only for the dashboard users and attaches the + * configuration service to the context + */ const protectedWithConfigurationService = protectedClientProcedure.use(({ next, ctx }) => next({ ctx: { @@ -29,7 +31,8 @@ const protectedWithConfigurationService = protectedClientProcedure.use(({ next, export const sendgridConfigurationRouter = router({ fetch: protectedWithConfigurationService.query(async ({ ctx }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug("sendgridConfigurationRouter.fetch called"); return ctx.configurationService.getConfigurationRoot(); }), @@ -37,7 +40,8 @@ export const sendgridConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridGetConfigurationInputSchema) .query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "sendgridConfigurationRouter.get called"); return ctx.configurationService.getConfiguration(input); }), @@ -45,7 +49,8 @@ export const sendgridConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridGetConfigurationsInputSchema) .query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "sendgridConfigurationRouter.getConfigurations called"); return ctx.configurationService.getConfigurations(input); }), @@ -53,7 +58,8 @@ export const sendgridConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridCreateConfigurationSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "sendgridConfigurationRouter.create called"); return await ctx.configurationService.createConfiguration(input); }), @@ -61,9 +67,11 @@ export const sendgridConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridDeleteConfigurationInputSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "sendgridConfigurationRouter.delete called"); const existingConfiguration = await ctx.configurationService.getConfiguration(input); + if (!existingConfiguration) { throw new TRPCError({ code: "BAD_REQUEST", @@ -77,14 +85,17 @@ export const sendgridConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridUpdateOrCreateConfigurationSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); + logger.debug(input, "sendgridConfigurationRouter.update or create called"); const { id } = input; + if (!id) { return await ctx.configurationService.createConfiguration(input); } else { const existingConfiguration = await ctx.configurationService.getConfiguration({ id }); + if (!existingConfiguration) { throw new TRPCError({ code: "BAD_REQUEST", @@ -96,6 +107,7 @@ export const sendgridConfigurationRouter = router({ ...input, events: existingConfiguration.events, }; + await ctx.configurationService.updateConfiguration(configuration); return configuration; } @@ -104,7 +116,7 @@ export const sendgridConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridGetEventConfigurationInputSchema) .query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "sendgridConfigurationRouter.getEventConfiguration or create called"); @@ -120,6 +132,7 @@ export const sendgridConfigurationRouter = router({ } const event = configuration.events.find((e) => e.eventType === input.eventType); + if (!event) { throw new TRPCError({ code: "BAD_REQUEST", @@ -132,7 +145,7 @@ export const sendgridConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(sendgridUpdateEventConfigurationInputSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "sendgridConfigurationRouter.updateEventConfiguration or create called"); @@ -148,6 +161,7 @@ export const sendgridConfigurationRouter = router({ } const eventIndex = configuration.events.findIndex((e) => e.eventType === input.eventType); + configuration.events[eventIndex] = { active: input.active, eventType: input.eventType, diff --git a/apps/emails-and-messages/src/modules/sendgrid/send-sendgrid.ts b/apps/emails-and-messages/src/modules/sendgrid/send-sendgrid.ts index c692723..6d1bc0e 100644 --- a/apps/emails-and-messages/src/modules/sendgrid/send-sendgrid.ts +++ b/apps/emails-and-messages/src/modules/sendgrid/send-sendgrid.ts @@ -1,4 +1,4 @@ -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { SendgridConfiguration } from "./configuration/sendgrid-config"; import { MailService } from "@sendgrid/mail"; import { MessageEventTypes } from "../event-handlers/message-event-types"; @@ -23,10 +23,11 @@ export const sendSendgrid = async ({ event, sendgridConfiguration, }: SendSendgridArgs) => { - const logger = pinoLogger.child({ + const logger = createLogger({ fn: "sendSendgrid", event, }); + if (!sendgridConfiguration.senderEmail) { logger.debug("Sender email has not been specified, skipping"); return { @@ -39,6 +40,7 @@ export const sendSendgrid = async ({ } const eventSettings = sendgridConfiguration.events.find((e) => e.eventType === event); + if (!eventSettings) { logger.debug("No active settings for this event, skipping"); return { @@ -74,6 +76,7 @@ export const sendSendgrid = async ({ try { const mailService = new MailService(); + mailService.setApiKey(sendgridConfiguration.apiKey); await mailService.send({ diff --git a/apps/emails-and-messages/src/modules/trpc/protected-client-procedure.ts b/apps/emails-and-messages/src/modules/trpc/protected-client-procedure.ts index 9e2b680..ce13f94 100644 --- a/apps/emails-and-messages/src/modules/trpc/protected-client-procedure.ts +++ b/apps/emails-and-messages/src/modules/trpc/protected-client-procedure.ts @@ -3,7 +3,7 @@ import { middleware, procedure } from "./trpc-server"; import { TRPCError } from "@trpc/server"; import { ProtectedHandlerError } from "@saleor/app-sdk/handlers/next"; import { saleorApp } from "../../saleor-app"; -import { logger } from "../../lib/logger"; +import { logger } from "@saleor/apps-shared"; import { createClient } from "../../lib/create-graphql-client"; const attachAppToken = middleware(async ({ ctx, next }) => { diff --git a/apps/emails-and-messages/src/pages/api/register.ts b/apps/emails-and-messages/src/pages/api/register.ts index 03e1e55..93d8cd9 100644 --- a/apps/emails-and-messages/src/pages/api/register.ts +++ b/apps/emails-and-messages/src/pages/api/register.ts @@ -2,7 +2,7 @@ import { createAppRegisterHandler } from "@saleor/app-sdk/handlers/next"; import { saleorApp } from "../../saleor-app"; import { createClient } from "../../lib/create-graphql-client"; -import { logger } from "../../lib/logger"; +import { logger } from "@saleor/apps-shared"; import { getBaseUrl } from "../../lib/get-base-url"; import { registerNotifyWebhook } from "../../lib/register-notify-webhook"; @@ -33,6 +33,7 @@ export default createAppRegisterHandler({ const client = createClient(ctx.authData.saleorApiUrl, async () => Promise.resolve({ token: ctx.authData.token }) ); + await registerNotifyWebhook({ client: client, baseUrl: baseUrl, diff --git a/apps/emails-and-messages/src/pages/api/webhooks/invoice-sent.ts b/apps/emails-and-messages/src/pages/api/webhooks/invoice-sent.ts index 656b9d3..f43cbc4 100644 --- a/apps/emails-and-messages/src/pages/api/webhooks/invoice-sent.ts +++ b/apps/emails-and-messages/src/pages/api/webhooks/invoice-sent.ts @@ -1,7 +1,7 @@ import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; import { gql } from "urql"; import { saleorApp } from "../../../saleor-app"; -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { InvoiceSentWebhookPayloadFragment, OrderDetailsFragmentDoc, @@ -49,7 +49,7 @@ const handler: NextWebhookApiHandler = async res, context ) => { - const logger = pinoLogger.child({ + const logger = createLogger({ webhook: invoiceSentWebhook.name, }); @@ -64,6 +64,7 @@ const handler: NextWebhookApiHandler = async } const recipientEmail = order.userEmail || order.user?.email; + if (!recipientEmail?.length) { logger.error(`The order ${order.number} had no email recipient set. Aborting.`); return res diff --git a/apps/emails-and-messages/src/pages/api/webhooks/notify.ts b/apps/emails-and-messages/src/pages/api/webhooks/notify.ts index 2f5b75b..40cecce 100644 --- a/apps/emails-and-messages/src/pages/api/webhooks/notify.ts +++ b/apps/emails-and-messages/src/pages/api/webhooks/notify.ts @@ -1,12 +1,14 @@ import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; import { saleorApp } from "../../../saleor-app"; -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { sendEventMessages } from "../../../modules/event-handlers/send-event-messages"; import { createClient } from "../../../lib/create-graphql-client"; import { MessageEventTypes } from "../../../modules/event-handlers/message-event-types"; -// Notify event handles multiple event types which are recognized based on payload field `notify_event`. -// Handler recognizes if event is one of the supported typed and sends appropriate message. +/* + * Notify event handles multiple event types which are recognized based on payload field `notify_event`. + * Handler recognizes if event is one of the supported typed and sends appropriate message. + */ interface NotifySubscriptionPayload { notify_event: string; @@ -62,7 +64,7 @@ export const notifyWebhook = new SaleorAsyncWebhook({ }); const handler: NextWebhookApiHandler = async (req, res, context) => { - const logger = pinoLogger.child({ + const logger = createLogger({ webhook: notifyWebhook.name, }); @@ -89,6 +91,7 @@ const handler: NextWebhookApiHandler = async (req, re }; const event = notifyEventMapping[payload.notify_event]; + if (!event) { logger.error(`The type of received notify event (${payload.notify_event}) is not supported.`); return res diff --git a/apps/emails-and-messages/src/pages/api/webhooks/order-cancelled.ts b/apps/emails-and-messages/src/pages/api/webhooks/order-cancelled.ts index 3d53001..693b65d 100644 --- a/apps/emails-and-messages/src/pages/api/webhooks/order-cancelled.ts +++ b/apps/emails-and-messages/src/pages/api/webhooks/order-cancelled.ts @@ -1,7 +1,7 @@ import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; import { gql } from "urql"; import { saleorApp } from "../../../saleor-app"; -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { OrderCancelledWebhookPayloadFragment, OrderDetailsFragmentDoc, @@ -40,7 +40,7 @@ const handler: NextWebhookApiHandler = asy res, context ) => { - const logger = pinoLogger.child({ + const logger = createLogger({ webhook: orderCancelledWebhook.name, }); @@ -55,6 +55,7 @@ const handler: NextWebhookApiHandler = asy } const recipientEmail = order.userEmail || order.user?.email; + if (!recipientEmail?.length) { logger.error(`The order ${order.number} had no email recipient set. Aborting.`); return res diff --git a/apps/emails-and-messages/src/pages/api/webhooks/order-confirmed.ts b/apps/emails-and-messages/src/pages/api/webhooks/order-confirmed.ts index bebf324..ebaf129 100644 --- a/apps/emails-and-messages/src/pages/api/webhooks/order-confirmed.ts +++ b/apps/emails-and-messages/src/pages/api/webhooks/order-confirmed.ts @@ -1,7 +1,7 @@ import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; import { gql } from "urql"; import { saleorApp } from "../../../saleor-app"; -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { OrderConfirmedWebhookPayloadFragment, OrderDetailsFragmentDoc, @@ -41,7 +41,7 @@ const handler: NextWebhookApiHandler = asy res, context ) => { - const logger = pinoLogger.child({ + const logger = createLogger({ webhook: orderConfirmedWebhook.name, }); @@ -56,6 +56,7 @@ const handler: NextWebhookApiHandler = asy } const recipientEmail = order.userEmail || order.user?.email; + if (!recipientEmail?.length) { logger.error(`The order ${order.number} had no email recipient set. Aborting.`); return res diff --git a/apps/emails-and-messages/src/pages/api/webhooks/order-created.ts b/apps/emails-and-messages/src/pages/api/webhooks/order-created.ts index cd9c47b..705c378 100644 --- a/apps/emails-and-messages/src/pages/api/webhooks/order-created.ts +++ b/apps/emails-and-messages/src/pages/api/webhooks/order-created.ts @@ -2,7 +2,7 @@ import { OrderDetailsFragmentDoc } from "./../../../../generated/graphql"; import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; import { gql } from "urql"; import { saleorApp } from "../../../saleor-app"; -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { OrderCreatedWebhookPayloadFragment } from "../../../../generated/graphql"; import { sendEventMessages } from "../../../modules/event-handlers/send-event-messages"; import { createClient } from "../../../lib/create-graphql-client"; @@ -38,7 +38,7 @@ const handler: NextWebhookApiHandler = async res, context ) => { - const logger = pinoLogger.child({ + const logger = createLogger({ webhook: orderCreatedWebhook.name, }); @@ -53,6 +53,7 @@ const handler: NextWebhookApiHandler = async } const recipientEmail = order.userEmail || order.user?.email; + if (!recipientEmail?.length) { logger.error(`The order ${order.number} had no email recipient set. Aborting.`); return res diff --git a/apps/emails-and-messages/src/pages/api/webhooks/order-fulfilled.ts b/apps/emails-and-messages/src/pages/api/webhooks/order-fulfilled.ts index 5260c25..d1d14c5 100644 --- a/apps/emails-and-messages/src/pages/api/webhooks/order-fulfilled.ts +++ b/apps/emails-and-messages/src/pages/api/webhooks/order-fulfilled.ts @@ -1,7 +1,7 @@ import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; import { gql } from "urql"; import { saleorApp } from "../../../saleor-app"; -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { OrderDetailsFragmentDoc, OrderFulfilledWebhookPayloadFragment, @@ -41,7 +41,7 @@ const handler: NextWebhookApiHandler = asy res, context ) => { - const logger = pinoLogger.child({ + const logger = createLogger({ webhook: orderFulfilledWebhook.name, }); @@ -56,6 +56,7 @@ const handler: NextWebhookApiHandler = asy } const recipientEmail = order.userEmail || order.user?.email; + if (!recipientEmail?.length) { logger.error(`The order ${order.number} had no email recipient set. Aborting.`); return res diff --git a/apps/emails-and-messages/src/pages/api/webhooks/order-fully-paid.ts b/apps/emails-and-messages/src/pages/api/webhooks/order-fully-paid.ts index d129cdb..a5191a5 100644 --- a/apps/emails-and-messages/src/pages/api/webhooks/order-fully-paid.ts +++ b/apps/emails-and-messages/src/pages/api/webhooks/order-fully-paid.ts @@ -1,7 +1,7 @@ import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; import { gql } from "urql"; import { saleorApp } from "../../../saleor-app"; -import { logger as pinoLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { OrderDetailsFragmentDoc, OrderFullyPaidWebhookPayloadFragment, @@ -41,7 +41,7 @@ const handler: NextWebhookApiHandler = asy res, context ) => { - const logger = pinoLogger.child({ + const logger = createLogger({ webhook: orderFullyPaidWebhook.name, }); @@ -56,6 +56,7 @@ const handler: NextWebhookApiHandler = asy } const recipientEmail = order.userEmail || order.user?.email; + if (!recipientEmail?.length) { logger.error(`The order ${order.number} had no email recipient set. Aborting.`); return res diff --git a/apps/invoices/package.json b/apps/invoices/package.json index 36f7e90..8b5381a 100644 --- a/apps/invoices/package.json +++ b/apps/invoices/package.json @@ -37,8 +37,6 @@ "graphql-tag": "^2.12.6", "microinvoice": "^1.0.6", "next": "13.3.0", - "pino": "^8.8.0", - "pino-pretty": "^9.1.1", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.41.0", diff --git a/apps/invoices/src/lib/logger.ts b/apps/invoices/src/lib/logger.ts deleted file mode 100644 index 4ad54f7..0000000 --- a/apps/invoices/src/lib/logger.ts +++ /dev/null @@ -1,19 +0,0 @@ -import pino from "pino"; - -/** - * TODO Set up log drain etc - */ -export const logger = pino({ - level: process.env.APP_DEBUG ?? "silent", - transport: - process.env.NODE_ENV === "development" - ? { - target: "pino-pretty", - options: { - colorize: true, - }, - } - : undefined, -}); - -export const createLogger = logger.child.bind(logger); diff --git a/apps/invoices/src/modules/app-configuration/app-configuration.router.ts b/apps/invoices/src/modules/app-configuration/app-configuration.router.ts index de9655d..bd6330e 100644 --- a/apps/invoices/src/modules/app-configuration/app-configuration.router.ts +++ b/apps/invoices/src/modules/app-configuration/app-configuration.router.ts @@ -2,13 +2,13 @@ import { router } from "../trpc/trpc-server"; import { protectedClientProcedure } from "../trpc/protected-client-procedure"; import { PrivateMetadataAppConfigurator } from "./app-configurator"; import { createSettingsManager } from "./metadata-manager"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { appConfigInputSchema } from "./app-config-input-schema"; import { GetAppConfigurationService } from "./get-app-configuration.service"; export const appConfigurationRouter = router({ fetch: protectedClientProcedure.query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug("appConfigurationRouter.fetch called"); @@ -21,7 +21,7 @@ export const appConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(appConfigInputSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "appConfigurationRouter.setAndReplace called with input"); diff --git a/apps/invoices/src/modules/app-configuration/get-app-configuration.service.ts b/apps/invoices/src/modules/app-configuration/get-app-configuration.service.ts index 1381034..03e18d0 100644 --- a/apps/invoices/src/modules/app-configuration/get-app-configuration.service.ts +++ b/apps/invoices/src/modules/app-configuration/get-app-configuration.service.ts @@ -4,7 +4,7 @@ import { ChannelsFetcher } from "../channels/channels-fetcher"; import { ShopInfoFetcher } from "../shop-info/shop-info-fetcher"; import { FallbackAppConfig } from "./fallback-app-config"; import { Client } from "urql"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; // todo test export class GetAppConfigurationService { @@ -16,7 +16,7 @@ export class GetAppConfigurationService { ) {} async getConfiguration() { - const logger = pinoLogger.child({ + const logger = createLogger({ service: "GetAppConfigurationService", saleorApiUrl: this.settings.saleorApiUrl, }); diff --git a/apps/invoices/src/modules/invoice-create-notifier/invoice-create-notifier.ts b/apps/invoices/src/modules/invoice-create-notifier/invoice-create-notifier.ts index 666c866..7c2ca69 100644 --- a/apps/invoices/src/modules/invoice-create-notifier/invoice-create-notifier.ts +++ b/apps/invoices/src/modules/invoice-create-notifier/invoice-create-notifier.ts @@ -1,6 +1,6 @@ import { Client, gql } from "urql"; import { InvoiceCreateDocument } from "../../../generated/graphql"; -import { logger } from "../../lib/logger"; +import { logger } from "@saleor/apps-shared"; gql` mutation InvoiceCreate($orderId: ID!, $invoiceInput: InvoiceCreateInput!) { diff --git a/apps/invoices/src/modules/invoice-file-name/resolve-temp-pdf-file-location.ts b/apps/invoices/src/modules/invoice-file-name/resolve-temp-pdf-file-location.ts index 6aa5061..1bdfb9e 100644 --- a/apps/invoices/src/modules/invoice-file-name/resolve-temp-pdf-file-location.ts +++ b/apps/invoices/src/modules/invoice-file-name/resolve-temp-pdf-file-location.ts @@ -1,7 +1,7 @@ import { join } from "path"; import invariant from "tiny-invariant"; import { mkdir, access, constants } from "fs/promises"; -import { logger } from "../../lib/logger"; +import { logger } from "@saleor/apps-shared"; /** * Path will be relative to built file, in dev its inside .next/server diff --git a/apps/invoices/src/modules/invoice-uploader/saleor-invoice-uploader.ts b/apps/invoices/src/modules/invoice-uploader/saleor-invoice-uploader.ts index 8797cd7..44ed3d4 100644 --- a/apps/invoices/src/modules/invoice-uploader/saleor-invoice-uploader.ts +++ b/apps/invoices/src/modules/invoice-uploader/saleor-invoice-uploader.ts @@ -9,7 +9,7 @@ import { FileUploadMutation } from "../../../generated/graphql"; * Use File instead of Blob so Saleor can understand name */ import { File } from "@web-std/file"; -import { logger } from "../../lib/logger"; +import { logger } from "@saleor/apps-shared"; const fileUpload = gql` mutation FileUpload($file: Upload!) { diff --git a/apps/invoices/src/modules/trpc/protected-client-procedure.ts b/apps/invoices/src/modules/trpc/protected-client-procedure.ts index 4bb3b5d..ac10ffc 100644 --- a/apps/invoices/src/modules/trpc/protected-client-procedure.ts +++ b/apps/invoices/src/modules/trpc/protected-client-procedure.ts @@ -4,7 +4,7 @@ import { middleware, procedure } from "./trpc-server"; import { saleorApp } from "../../saleor-app"; import { TRPCError } from "@trpc/server"; import { ProtectedHandlerError } from "@saleor/app-sdk/handlers/next"; -import { logger } from "../../lib/logger"; +import { logger } from "@saleor/apps-shared"; const attachAppToken = middleware(async ({ ctx, next }) => { logger.debug("attachAppToken middleware"); diff --git a/apps/invoices/src/pages/api/register.ts b/apps/invoices/src/pages/api/register.ts index 32bad24..618349c 100644 --- a/apps/invoices/src/pages/api/register.ts +++ b/apps/invoices/src/pages/api/register.ts @@ -4,7 +4,7 @@ import { gql } from "urql"; import { createClient } from "../../lib/graphql"; import { SaleorVersionQuery } from "../../../generated/graphql"; -import { createLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { SaleorVersionCompatibilityValidator } from "../../lib/saleor-version-compatibility-validator"; const allowedUrlsPattern = process.env.ALLOWED_DOMAIN_PATTERN; diff --git a/apps/invoices/src/pages/api/webhooks/invoice-requested.ts b/apps/invoices/src/pages/api/webhooks/invoice-requested.ts index 20acf4e..752f391 100644 --- a/apps/invoices/src/pages/api/webhooks/invoice-requested.ts +++ b/apps/invoices/src/pages/api/webhooks/invoice-requested.ts @@ -15,7 +15,7 @@ import { import { MicroinvoiceInvoiceGenerator } from "../../../modules/invoice-generator/microinvoice/microinvoice-invoice-generator"; import { hashInvoiceFilename } from "../../../modules/invoice-file-name/hash-invoice-filename"; import { resolveTempPdfFileLocation } from "../../../modules/invoice-file-name/resolve-temp-pdf-file-location"; -import { createLogger } from "../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { GetAppConfigurationService } from "../../../modules/app-configuration/get-app-configuration.service"; import { SALEOR_API_URL_HEADER } from "@saleor/app-sdk/const"; diff --git a/apps/klaviyo/package.json b/apps/klaviyo/package.json index 0d7a9c8..e08d4a1 100644 --- a/apps/klaviyo/package.json +++ b/apps/klaviyo/package.json @@ -2,7 +2,6 @@ "name": "saleor-app-klaviyo", "version": "1.5.0", "private": true, - "packageManager": "pnpm@7.18.1", "scripts": { "dev": "pnpm generate && NODE_OPTIONS='--inspect' next dev", "build": "pnpm generate && next build", @@ -57,6 +56,6 @@ "postcss": "^8.4.14", "prettier": "^2.7.1", "pretty-quick": "^3.1.3", - "typescript": "4.9.5" + "typescript": "5.0.4" } } diff --git a/apps/products-feed/package.json b/apps/products-feed/package.json index 4e79ee6..a4f5b2c 100644 --- a/apps/products-feed/package.json +++ b/apps/products-feed/package.json @@ -37,8 +37,6 @@ "jsdom": "^20.0.3", "next": "13.3.0", "next-urql": "^4.0.2", - "pino": "^8.8.0", - "pino-pretty": "^9.1.1", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.43.0", diff --git a/apps/products-feed/src/lib/google-feed/fetch-product-data.ts b/apps/products-feed/src/lib/google-feed/fetch-product-data.ts index b8f6119..d3d11c4 100644 --- a/apps/products-feed/src/lib/google-feed/fetch-product-data.ts +++ b/apps/products-feed/src/lib/google-feed/fetch-product-data.ts @@ -1,6 +1,6 @@ import { url } from "inspector"; import { Client } from "urql"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { FetchProductDataForFeedDocument, GoogleFeedProductVariantFragment, @@ -12,7 +12,7 @@ interface FetchProductDataArgs { } export const fetchProductData = async ({ client, channel }: FetchProductDataArgs) => { - const logger = pinoLogger.child({ saleorApiUrl: url, channel, route: "Google Product Feed" }); + const logger = createLogger({ saleorApiUrl: url, channel, route: "Google Product Feed" }); let result = await client .query(FetchProductDataForFeedDocument, { channel: channel as string, first: 100 }) diff --git a/apps/products-feed/src/lib/google-feed/fetch-shop-data.ts b/apps/products-feed/src/lib/google-feed/fetch-shop-data.ts index fa56fe2..605c3d7 100644 --- a/apps/products-feed/src/lib/google-feed/fetch-shop-data.ts +++ b/apps/products-feed/src/lib/google-feed/fetch-shop-data.ts @@ -1,6 +1,6 @@ import { url } from "inspector"; import { Client } from "urql"; -import { logger as pinoLogger } from "../logger"; +import { createLogger } from "@saleor/apps-shared"; import { ShopDetailsDocument } from "../../../generated/graphql"; interface FetchShopDataArgs { @@ -9,7 +9,7 @@ interface FetchShopDataArgs { } export const fetchShopData = async ({ client, channel }: FetchShopDataArgs) => { - const logger = pinoLogger.child({ saleorApiUrl: url, channel, route: "Google Product Feed" }); + const logger = createLogger({ saleorApiUrl: url, channel, route: "Google Product Feed" }); const result = await client.query(ShopDetailsDocument, {}).toPromise(); const shopDetails = result.data?.shop; diff --git a/apps/products-feed/src/lib/logger.ts b/apps/products-feed/src/lib/logger.ts deleted file mode 100644 index 6ca89d9..0000000 --- a/apps/products-feed/src/lib/logger.ts +++ /dev/null @@ -1,16 +0,0 @@ -import pino from "pino"; - -export const logger = pino({ - level: process.env.APP_DEBUG ?? "silent", - transport: - process.env.NODE_ENV === "development" - ? { - target: "pino-pretty", - options: { - colorize: true, - }, - } - : undefined, -}); - -export const createLogger = logger.child.bind(logger); diff --git a/apps/products-feed/src/modules/app-configuration/app-configuration.router.ts b/apps/products-feed/src/modules/app-configuration/app-configuration.router.ts index de9655d..bd6330e 100644 --- a/apps/products-feed/src/modules/app-configuration/app-configuration.router.ts +++ b/apps/products-feed/src/modules/app-configuration/app-configuration.router.ts @@ -2,13 +2,13 @@ import { router } from "../trpc/trpc-server"; import { protectedClientProcedure } from "../trpc/protected-client-procedure"; import { PrivateMetadataAppConfigurator } from "./app-configurator"; import { createSettingsManager } from "./metadata-manager"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { appConfigInputSchema } from "./app-config-input-schema"; import { GetAppConfigurationService } from "./get-app-configuration.service"; export const appConfigurationRouter = router({ fetch: protectedClientProcedure.query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug("appConfigurationRouter.fetch called"); @@ -21,7 +21,7 @@ export const appConfigurationRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(appConfigInputSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug(input, "appConfigurationRouter.setAndReplace called with input"); diff --git a/apps/products-feed/src/modules/app-configuration/get-app-configuration.service.ts b/apps/products-feed/src/modules/app-configuration/get-app-configuration.service.ts index 71a309d..5cbbd2c 100644 --- a/apps/products-feed/src/modules/app-configuration/get-app-configuration.service.ts +++ b/apps/products-feed/src/modules/app-configuration/get-app-configuration.service.ts @@ -4,7 +4,7 @@ import { ChannelsFetcher } from "../channels/channels-fetcher"; import { ShopInfoFetcher } from "../shop-info/shop-info-fetcher"; import { FallbackAppConfig } from "./fallback-app-config"; import { Client } from "urql"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; export class GetAppConfigurationService { constructor( @@ -15,7 +15,7 @@ export class GetAppConfigurationService { ) {} async getConfiguration() { - const logger = pinoLogger.child({ + const logger = createLogger({ service: "GetAppConfigurationService", saleorApiUrl: this.settings.saleorApiUrl, }); diff --git a/apps/products-feed/src/modules/category-mapping/category-mapping.router.ts b/apps/products-feed/src/modules/category-mapping/category-mapping.router.ts index 2deda61..d77d740 100644 --- a/apps/products-feed/src/modules/category-mapping/category-mapping.router.ts +++ b/apps/products-feed/src/modules/category-mapping/category-mapping.router.ts @@ -1,6 +1,6 @@ import { router } from "../trpc/trpc-server"; import { protectedClientProcedure } from "../trpc/protected-client-procedure"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { SetCategoryMappingInputSchema } from "./category-mapping-input-schema"; import { FetchCategoriesWithMappingDocument, @@ -13,7 +13,7 @@ export const categoryMappingRouter = router({ * Get all the category mappings to Google categories from its public metadata */ getCategoryMappings: protectedClientProcedure.query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug("categoriesRouter.getCategoryMappings called"); @@ -37,7 +37,7 @@ export const categoryMappingRouter = router({ .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) .input(SetCategoryMappingInputSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ saleorApiUrl: ctx.saleorApiUrl }); + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl }); logger.debug("categoriesRouter.setCategoryMapping called"); const { error } = await ctx.apiClient diff --git a/apps/products-feed/src/modules/trpc/protected-client-procedure.ts b/apps/products-feed/src/modules/trpc/protected-client-procedure.ts index e60c207..e976bfb 100644 --- a/apps/products-feed/src/modules/trpc/protected-client-procedure.ts +++ b/apps/products-feed/src/modules/trpc/protected-client-procedure.ts @@ -3,7 +3,7 @@ import { middleware, procedure } from "./trpc-server"; import { TRPCError } from "@trpc/server"; import { ProtectedHandlerError } from "@saleor/app-sdk/handlers/next"; import { saleorApp } from "../../saleor-app"; -import { logger } from "../../lib/logger"; +import { logger } from "@saleor/apps-shared"; import { createClient } from "../../lib/create-graphq-client"; const attachAppToken = middleware(async ({ ctx, next }) => { diff --git a/apps/products-feed/src/pages/api/feed/[url]/[channel]/google.xml.ts b/apps/products-feed/src/pages/api/feed/[url]/[channel]/google.xml.ts index f0cb08d..353ddc2 100644 --- a/apps/products-feed/src/pages/api/feed/[url]/[channel]/google.xml.ts +++ b/apps/products-feed/src/pages/api/feed/[url]/[channel]/google.xml.ts @@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { initUrqlClient } from "next-urql"; import { GoogleFeedProductVariantFragment } from "../../../../../../generated/graphql"; import { apl } from "../../../../../saleor-app"; -import { logger as pinoLogger } from "../../../../../lib/logger"; +import { createLogger } from "@saleor/apps-shared"; import { fetchProductData } from "../../../../../lib/google-feed/fetch-product-data"; import { getGoogleFeedSettings } from "../../../../../lib/google-feed/get-google-feed-settings"; import { generateGoogleXmlFeed } from "../../../../../lib/google-feed/generate-google-xml-feed"; @@ -17,7 +17,7 @@ export const handler = async (req: NextApiRequest, res: NextApiResponse) => { const url = req.query.url as string; const channel = req.query.channel as string; - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: url, channel, route: "api/feed/{url}/{channel}/google.xml", diff --git a/apps/search/package.json b/apps/search/package.json index 5fd3226..d83981e 100644 --- a/apps/search/package.json +++ b/apps/search/package.json @@ -30,8 +30,6 @@ "graphql-tag": "^2.12.6", "next": "13.3.0", "next-urql": "4.0.0", - "pino": "^8.8.0", - "pino-pretty": "^9.1.1", "react": "18.2.0", "react-dom": "18.2.0", "react-helmet": "^6.1.0", diff --git a/apps/search/src/lib/logger.ts b/apps/search/src/lib/logger.ts index 73e2b9d..d455fa1 100644 --- a/apps/search/src/lib/logger.ts +++ b/apps/search/src/lib/logger.ts @@ -1,17 +1,10 @@ -import pino from "pino"; +import { createLogger as _createLogger } from "@saleor/apps-shared"; -export const logger = pino({ - level: "debug", +/** + * Extend factory to add more settings specific for the app + */ +export const logger = _createLogger({ redact: ["token", "secretKey"], - transport: - process.env.NODE_ENV === "development" - ? { - target: "pino-pretty", - options: { - colorize: true, - }, - } - : undefined, }); export const createLogger = logger.child.bind(logger); diff --git a/apps/search/src/pages/api/webhooks/saleor/product_updated.ts b/apps/search/src/pages/api/webhooks/saleor/product_updated.ts index b323c2b..a2994a5 100644 --- a/apps/search/src/pages/api/webhooks/saleor/product_updated.ts +++ b/apps/search/src/pages/api/webhooks/saleor/product_updated.ts @@ -3,7 +3,6 @@ import { ProductUpdated, ProductUpdatedDocument } from "../../../../../generated import { saleorApp } from "../../../../../saleor-app"; import { AlgoliaSearchProvider } from "../../../../lib/algolia/algoliaSearchProvider"; import { getAlgoliaConfiguration } from "../../../../lib/algolia/getAlgoliaConfiguration"; -import { createDebug } from "../../../../lib/debug"; import { WebhookActivityTogglerService } from "../../../../domain/WebhookActivityToggler.service"; import { createClient } from "../../../../lib/graphql"; import { createLogger } from "../../../../lib/logger"; diff --git a/apps/taxes/package.json b/apps/taxes/package.json index c7f3457..79bc90f 100644 --- a/apps/taxes/package.json +++ b/apps/taxes/package.json @@ -38,7 +38,6 @@ "jotai": "^2.0.0", "jsdom": "^20.0.3", "next": "13.3.0", - "pino": "^8.8.0", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.42.1", @@ -69,7 +68,6 @@ "eslint-config-next": "12.3.1", "eslint-config-prettier": "^8.5.0", "eslint-config-saleor": "workspace:*", - "pino-pretty": "^9.1.1", "prettier": "^2.7.1", "typescript": "4.8.4" } diff --git a/apps/taxes/src/lib/logger.ts b/apps/taxes/src/lib/logger.ts index f0ad112..42c4c7f 100644 --- a/apps/taxes/src/lib/logger.ts +++ b/apps/taxes/src/lib/logger.ts @@ -1,16 +1,6 @@ -import pino from "pino"; +import { createLogger as _createLogger, Logger } from "@saleor/apps-shared"; -export const logger = pino({ - level: process.env.APP_DEBUG ?? "silent", - transport: - process.env.NODE_ENV === "development" - ? { - target: "pino-pretty", - options: { - colorize: true, - }, - } - : undefined, +export const logger = _createLogger({ redact: [ "metadata", "providerInstance.config.username", @@ -20,3 +10,5 @@ export const logger = pino({ }); export const createLogger = logger.child.bind(logger); + +export type { Logger }; diff --git a/apps/taxes/src/modules/app/metadata-manager.ts b/apps/taxes/src/modules/app/metadata-manager.ts index ac27f46..a7747db 100644 --- a/apps/taxes/src/modules/app/metadata-manager.ts +++ b/apps/taxes/src/modules/app/metadata-manager.ts @@ -5,10 +5,10 @@ import { FetchAppDetailsQuery, UpdateMetadataDocument, } from "../../../generated/graphql"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "../../lib/logger"; export async function fetchAllMetadata(client: Client): Promise { - const logger = pinoLogger.child({ service: "fetchAllMetadata" }); + const logger = createLogger({ service: "fetchAllMetadata" }); logger.debug("Fetching metadata from Saleor"); @@ -27,7 +27,7 @@ export async function fetchAllMetadata(client: Client): Promise } export async function mutateMetadata(client: Client, metadata: MetadataEntry[]) { - const logger = pinoLogger.child({ service: "mutateMetadata" }); + const logger = createLogger({ service: "mutateMetadata" }); logger.debug({ metadata }, "Mutating metadata"); // to update the metadata, ID is required diff --git a/apps/taxes/src/modules/app/webhook-response.ts b/apps/taxes/src/modules/app/webhook-response.ts index 55cfd46..b486393 100644 --- a/apps/taxes/src/modules/app/webhook-response.ts +++ b/apps/taxes/src/modules/app/webhook-response.ts @@ -1,6 +1,6 @@ import { NextApiResponse } from "next"; -import { Logger } from "pino"; -import { createLogger } from "../../lib/logger"; + +import { createLogger, Logger } from "../../lib/logger"; /* * idea: distinguish between async and sync webhooks diff --git a/apps/taxes/src/modules/avatax/avatax-client.ts b/apps/taxes/src/modules/avatax/avatax-client.ts index 21a7bd4..573a82e 100644 --- a/apps/taxes/src/modules/avatax/avatax-client.ts +++ b/apps/taxes/src/modules/avatax/avatax-client.ts @@ -1,8 +1,7 @@ import Avatax from "avatax"; import { CreateTransactionModel } from "avatax/lib/models/CreateTransactionModel"; -import pino from "pino"; import packageJson from "../../../package.json"; -import { createLogger } from "../../lib/logger"; +import { createLogger, Logger } from "../../lib/logger"; import { AvataxConfig } from "./avatax-config"; import { CommitTransactionModel } from "avatax/lib/models/CommitTransactionModel"; import { DocumentType } from "avatax/lib/enums/DocumentType"; @@ -55,7 +54,7 @@ export type ValidateAddressArgs = { export class AvataxClient { private client: Avatax; - private logger: pino.Logger; + private logger: Logger; constructor(config: AvataxConfig) { this.logger = createLogger({ service: "AvataxClient" }); diff --git a/apps/taxes/src/modules/avatax/avatax-configuration.router.ts b/apps/taxes/src/modules/avatax/avatax-configuration.router.ts index 0951fbe..c5a3a40 100644 --- a/apps/taxes/src/modules/avatax/avatax-configuration.router.ts +++ b/apps/taxes/src/modules/avatax/avatax-configuration.router.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "../../lib/logger"; import { isObfuscated } from "../../lib/utils"; import { protectedClientProcedure } from "../trpc/protected-client-procedure"; import { router } from "../trpc/trpc-server"; @@ -33,7 +33,7 @@ const postInputSchema = z.object({ export const avataxConfigurationRouter = router({ get: protectedClientProcedure.input(getInputSchema).query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "avataxConfigurationRouter.get", }); @@ -51,7 +51,7 @@ export const avataxConfigurationRouter = router({ return { ...result, config: obfuscateAvataxConfig(result.config) }; }), post: protectedClientProcedure.input(postInputSchema).mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "avataxConfigurationRouter.post", }); @@ -68,7 +68,7 @@ export const avataxConfigurationRouter = router({ return result; }), delete: protectedClientProcedure.input(deleteInputSchema).mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "avataxConfigurationRouter.delete", }); @@ -85,7 +85,7 @@ export const avataxConfigurationRouter = router({ return result; }), patch: protectedClientProcedure.input(patchInputSchema).mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "avataxConfigurationRouter.patch", }); diff --git a/apps/taxes/src/modules/avatax/avatax-configuration.service.ts b/apps/taxes/src/modules/avatax/avatax-configuration.service.ts index 6a67f4b..fa6a0ea 100644 --- a/apps/taxes/src/modules/avatax/avatax-configuration.service.ts +++ b/apps/taxes/src/modules/avatax/avatax-configuration.service.ts @@ -1,6 +1,5 @@ -import pino from "pino"; import { Client } from "urql"; -import { createLogger } from "../../lib/logger"; +import { createLogger, Logger } from "../../lib/logger"; import { createSettingsManager } from "../app/metadata-manager"; import { CrudSettingsManager } from "../crud-settings/crud-settings.service"; import { providersSchema } from "../providers-configuration/providers-config"; @@ -12,7 +11,7 @@ const getSchema = avataxInstanceConfigSchema; export class AvataxConfigurationService { private crudSettingsManager: CrudSettingsManager; - private logger: pino.Logger; + private logger: Logger; constructor(client: Client, saleorApiUrl: string) { const settingsManager = createSettingsManager(client); diff --git a/apps/taxes/src/modules/avatax/avatax-webhook.service.ts b/apps/taxes/src/modules/avatax/avatax-webhook.service.ts index da7bd71..2e7a17b 100644 --- a/apps/taxes/src/modules/avatax/avatax-webhook.service.ts +++ b/apps/taxes/src/modules/avatax/avatax-webhook.service.ts @@ -1,10 +1,9 @@ -import pino from "pino"; import { OrderCreatedSubscriptionFragment, OrderFulfilledSubscriptionFragment, TaxBaseFragment, } from "../../../generated/graphql"; -import { createLogger } from "../../lib/logger"; +import { createLogger, Logger } from "../../lib/logger"; import { ChannelConfig } from "../channels-configuration/channels-config"; import { ProviderWebhookService } from "../taxes/tax-provider-webhook"; import { avataxCalculateTaxesMaps } from "./maps/avatax-calculate-taxes-map"; @@ -16,7 +15,7 @@ import { avataxOrderFulfilledMaps } from "./maps/avatax-order-fulfilled-map"; export class AvataxWebhookService implements ProviderWebhookService { config = defaultAvataxConfig; client: AvataxClient; - private logger: pino.Logger; + private logger: Logger; constructor(config: AvataxConfig) { this.logger = createLogger({ diff --git a/apps/taxes/src/modules/channels-configuration/channels-configuration.router.ts b/apps/taxes/src/modules/channels-configuration/channels-configuration.router.ts index edd3c4b..f961485 100644 --- a/apps/taxes/src/modules/channels-configuration/channels-configuration.router.ts +++ b/apps/taxes/src/modules/channels-configuration/channels-configuration.router.ts @@ -1,4 +1,4 @@ -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "../../lib/logger"; import { createSettingsManager } from "../app/metadata-manager"; import { protectedClientProcedure } from "../trpc/protected-client-procedure"; import { router } from "../trpc/trpc-server"; @@ -10,7 +10,7 @@ import { GetChannelsConfigurationService } from "./get-channels-configuration.se // todo: refactor with crud-settings export const channelsConfigurationRouter = router({ fetch: protectedClientProcedure.query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "channelsConfigurationRouter.fetch", }); @@ -25,7 +25,7 @@ export const channelsConfigurationRouter = router({ upsert: protectedClientProcedure .input(setAndReplaceChannelsInputSchema) .mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "channelsConfigurationRouter.upsert", }); diff --git a/apps/taxes/src/modules/channels-configuration/get-channels-configuration.service.ts b/apps/taxes/src/modules/channels-configuration/get-channels-configuration.service.ts index b967c58..a0da585 100644 --- a/apps/taxes/src/modules/channels-configuration/get-channels-configuration.service.ts +++ b/apps/taxes/src/modules/channels-configuration/get-channels-configuration.service.ts @@ -1,5 +1,5 @@ import { Client } from "urql"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "../../lib/logger"; import { createSettingsManager } from "../app/metadata-manager"; import { TaxChannelsConfigurator } from "./channels-configurator"; @@ -12,7 +12,7 @@ export class GetChannelsConfigurationService { ) {} async getConfiguration() { - const logger = pinoLogger.child({ + const logger = createLogger({ service: "GetChannelsConfigurationService", saleorApiUrl: this.settings.saleorApiUrl, }); diff --git a/apps/taxes/src/modules/crud-settings/crud-settings.service.ts b/apps/taxes/src/modules/crud-settings/crud-settings.service.ts index 90a0af7..32410fd 100644 --- a/apps/taxes/src/modules/crud-settings/crud-settings.service.ts +++ b/apps/taxes/src/modules/crud-settings/crud-settings.service.ts @@ -1,14 +1,14 @@ import { SettingsManager } from "@saleor/app-sdk/settings-manager"; -import pino from "pino"; + import { z } from "zod"; -import { createLogger } from "../../lib/logger"; +import { createLogger, Logger } from "../../lib/logger"; import { createId } from "../../lib/utils"; const settingSchema = z.record(z.any()).and(z.object({ id: z.string() })); const settingsSchema = z.array(settingSchema); export class CrudSettingsManager { - private logger: pino.Logger; + private logger: Logger; constructor( private metadataManager: SettingsManager, diff --git a/apps/taxes/src/modules/providers-configuration/providers-configuration.router.ts b/apps/taxes/src/modules/providers-configuration/providers-configuration.router.ts index ef63877..be47d9d 100644 --- a/apps/taxes/src/modules/providers-configuration/providers-configuration.router.ts +++ b/apps/taxes/src/modules/providers-configuration/providers-configuration.router.ts @@ -1,11 +1,11 @@ -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "../../lib/logger"; import { protectedClientProcedure } from "../trpc/protected-client-procedure"; import { router } from "../trpc/trpc-server"; import { PublicTaxProvidersConfigurationService } from "./public-providers-configuration-service"; export const providersConfigurationRouter = router({ getAll: protectedClientProcedure.query(async ({ ctx }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "providersConfigurationRouter.getAll", }); diff --git a/apps/taxes/src/modules/providers-configuration/public-providers-configuration-service.ts b/apps/taxes/src/modules/providers-configuration/public-providers-configuration-service.ts index 8babece..7cc1bda 100644 --- a/apps/taxes/src/modules/providers-configuration/public-providers-configuration-service.ts +++ b/apps/taxes/src/modules/providers-configuration/public-providers-configuration-service.ts @@ -1,6 +1,5 @@ -import pino from "pino"; import { Client } from "urql"; -import { createLogger } from "../../lib/logger"; +import { createLogger, Logger } from "../../lib/logger"; import { obfuscateAvataxInstances } from "../avatax/avatax-config"; import { AvataxConfigurationService } from "../avatax/avatax-configuration.service"; import { obfuscateTaxJarInstances } from "../taxjar/taxjar-config"; @@ -11,7 +10,7 @@ export const TAX_PROVIDER_KEY = "tax-providers"; export class PublicTaxProvidersConfigurationService { private avataxConfigurationService: AvataxConfigurationService; private taxJarConfigurationService: TaxJarConfigurationService; - private logger: pino.Logger; + private logger: Logger; constructor(client: Client, saleorApiUrl: string) { this.avataxConfigurationService = new AvataxConfigurationService(client, saleorApiUrl); this.taxJarConfigurationService = new TaxJarConfigurationService(client, saleorApiUrl); diff --git a/apps/taxes/src/modules/taxes/active-tax-provider.ts b/apps/taxes/src/modules/taxes/active-tax-provider.ts index 8024b46..316ee92 100644 --- a/apps/taxes/src/modules/taxes/active-tax-provider.ts +++ b/apps/taxes/src/modules/taxes/active-tax-provider.ts @@ -4,14 +4,14 @@ import { OrderFulfilledSubscriptionFragment, TaxBaseFragment, } from "../../../generated/graphql"; -import { createLogger } from "../../lib/logger"; +import { createLogger, Logger } from "../../lib/logger"; import { ChannelConfig } from "../channels-configuration/channels-config"; import { ProviderConfig } from "../providers-configuration/providers-config"; import { AvataxWebhookService } from "../avatax/avatax-webhook.service"; import { TaxJarWebhookService } from "../taxjar/taxjar-webhook.service"; import { ProviderWebhookService } from "./tax-provider-webhook"; import { TaxProviderError } from "./tax-provider-error"; -import pino from "pino"; + import { getAppConfig } from "../app/get-app-config"; type ActiveTaxProviderResult = { ok: true; data: ActiveTaxProvider } | { ok: false; error: string }; @@ -63,7 +63,7 @@ export function getActiveTaxProvider( // todo: refactor to a factory export class ActiveTaxProvider implements ProviderWebhookService { private client: ProviderWebhookService; - private logger: pino.Logger; + private logger: Logger; private channel: ChannelConfig; constructor(providerInstance: ProviderConfig, channelConfig: ChannelConfig) { diff --git a/apps/taxes/src/modules/taxjar/taxjar-client.ts b/apps/taxes/src/modules/taxjar/taxjar-client.ts index 619679f..fa8e36b 100644 --- a/apps/taxes/src/modules/taxjar/taxjar-client.ts +++ b/apps/taxes/src/modules/taxjar/taxjar-client.ts @@ -1,7 +1,6 @@ -import pino from "pino"; import TaxJar from "taxjar"; import { AddressParams, Config, CreateOrderParams, TaxParams } from "taxjar/dist/util/types"; -import { createLogger } from "../../lib/logger"; +import { createLogger, Logger } from "../../lib/logger"; import { TaxJarConfig } from "./taxjar-config"; const createTaxJarSettings = (config: TaxJarConfig): Config => { @@ -27,7 +26,7 @@ export type ValidateAddressArgs = { export class TaxJarClient { private client: TaxJar; - private logger: pino.Logger; + private logger: Logger; constructor(providerConfig: TaxJarConfig) { this.logger = createLogger({ service: "TaxJarClient" }); diff --git a/apps/taxes/src/modules/taxjar/taxjar-configuration.router.ts b/apps/taxes/src/modules/taxjar/taxjar-configuration.router.ts index 25c8a80..7f89c01 100644 --- a/apps/taxes/src/modules/taxjar/taxjar-configuration.router.ts +++ b/apps/taxes/src/modules/taxjar/taxjar-configuration.router.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { logger as pinoLogger } from "../../lib/logger"; +import { createLogger } from "../../lib/logger"; import { isObfuscated } from "../../lib/utils"; import { protectedClientProcedure } from "../trpc/protected-client-procedure"; import { router } from "../trpc/trpc-server"; @@ -32,7 +32,7 @@ const postInputSchema = z.object({ export const taxjarConfigurationRouter = router({ get: protectedClientProcedure.input(getInputSchema).query(async ({ ctx, input }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "taxjarConfigurationRouter.get", }); @@ -49,7 +49,7 @@ export const taxjarConfigurationRouter = router({ return { ...result, config: obfuscateTaxJarConfig(result.config) }; }), post: protectedClientProcedure.input(postInputSchema).mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "taxjarConfigurationRouter.post", }); @@ -66,7 +66,7 @@ export const taxjarConfigurationRouter = router({ return result; }), delete: protectedClientProcedure.input(deleteInputSchema).mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "taxjarConfigurationRouter.delete", }); @@ -83,7 +83,7 @@ export const taxjarConfigurationRouter = router({ return result; }), patch: protectedClientProcedure.input(patchInputSchema).mutation(async ({ ctx, input }) => { - const logger = pinoLogger.child({ + const logger = createLogger({ saleorApiUrl: ctx.saleorApiUrl, procedure: "taxjarConfigurationRouter.patch", }); diff --git a/apps/taxes/src/modules/taxjar/taxjar-configuration.service.ts b/apps/taxes/src/modules/taxjar/taxjar-configuration.service.ts index b6b40e9..62ccb20 100644 --- a/apps/taxes/src/modules/taxjar/taxjar-configuration.service.ts +++ b/apps/taxes/src/modules/taxjar/taxjar-configuration.service.ts @@ -1,6 +1,5 @@ -import pino from "pino"; import { Client } from "urql"; -import { createLogger } from "../../lib/logger"; +import { createLogger, Logger } from "../../lib/logger"; import { createSettingsManager } from "../app/metadata-manager"; import { CrudSettingsManager } from "../crud-settings/crud-settings.service"; import { providersSchema } from "../providers-configuration/providers-config"; @@ -12,7 +11,7 @@ const getSchema = taxJarInstanceConfigSchema; export class TaxJarConfigurationService { private crudSettingsManager: CrudSettingsManager; - private logger: pino.Logger; + private logger: Logger; constructor(client: Client, saleorApiUrl: string) { const settingsManager = createSettingsManager(client); diff --git a/apps/taxes/src/modules/taxjar/taxjar-webhook.service.ts b/apps/taxes/src/modules/taxjar/taxjar-webhook.service.ts index 021f25e..0f0de5d 100644 --- a/apps/taxes/src/modules/taxjar/taxjar-webhook.service.ts +++ b/apps/taxes/src/modules/taxjar/taxjar-webhook.service.ts @@ -1,6 +1,5 @@ -import pino from "pino"; import { OrderCreatedSubscriptionFragment, TaxBaseFragment } from "../../../generated/graphql"; -import { createLogger } from "../../lib/logger"; +import { createLogger, Logger } from "../../lib/logger"; import { ChannelConfig } from "../channels-configuration/channels-config"; import { ProviderWebhookService } from "../taxes/tax-provider-webhook"; import { TaxJarClient } from "./taxjar-client"; @@ -10,7 +9,7 @@ import { taxJarOrderCreatedMaps } from "./maps/taxjar-order-created-map"; export class TaxJarWebhookService implements ProviderWebhookService { client: TaxJarClient; - private logger: pino.Logger; + private logger: Logger; constructor(config: TaxJarConfig) { const avataxClient = new TaxJarClient(config); diff --git a/package.json b/package.json index 15d6a6b..3695111 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "engines": { "node": ">=18.0.0" }, - "packageManager": "pnpm@7.29.1", + "packageManager": "pnpm@8.2.0", "lint-staged": { "*.{js,ts,tsx}": "eslint --cache --fix", "*.{ts,tsx,md}": "prettier --write" diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 2ef602f..ece0520 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -2,3 +2,4 @@ export * from "./src/is-in-iframe"; export * from "./src/macaw-theme-provider/macaw-theme-provider"; export * from "./src/no-ssr-wrapper"; export * from "./src/use-dashboard-notification"; +export * from "./src/logger"; diff --git a/packages/shared/package.json b/packages/shared/package.json index 39fe71d..c4eca1f 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,10 @@ { "name": "@saleor/apps-shared", "version": "1.4.0", + "dependencies": { + "pino": "^8.8.0", + "pino-pretty": "^9.1.1" + }, "devDependencies": { "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", diff --git a/apps/cms/src/lib/logger.ts b/packages/shared/src/logger.ts similarity index 74% rename from apps/cms/src/lib/logger.ts rename to packages/shared/src/logger.ts index 4ad54f7..5056296 100644 --- a/apps/cms/src/lib/logger.ts +++ b/packages/shared/src/logger.ts @@ -4,7 +4,8 @@ import pino from "pino"; * TODO Set up log drain etc */ export const logger = pino({ - level: process.env.APP_DEBUG ?? "silent", + level: process.env.APP_LOG_LEVEL ?? "silent", + redact: ["token", "apiKey"], transport: process.env.NODE_ENV === "development" ? { @@ -17,3 +18,5 @@ export const logger = pino({ }); export const createLogger = logger.child.bind(logger); + +export type Logger = typeof logger; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05805ab..f820209 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,12 +73,6 @@ importers: next: specifier: 13.3.0 version: 13.3.0(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) - pino: - specifier: ^8.8.0 - version: 8.9.0 - pino-pretty: - specifier: ^9.1.1 - version: 9.1.1 react: specifier: 18.2.0 version: 18.2.0 @@ -224,12 +218,6 @@ importers: next-urql: specifier: ^4.0.2 version: 4.0.3(react@18.2.0)(urql@3.0.3) - pino: - specifier: ^8.8.0 - version: 8.9.0 - pino-pretty: - specifier: ^9.1.1 - version: 9.1.1 react: specifier: 18.2.0 version: 18.2.0 @@ -535,12 +523,6 @@ importers: nodemailer: specifier: ^6.9.1 version: 6.9.1 - pino: - specifier: ^8.8.0 - version: 8.9.0 - pino-pretty: - specifier: ^9.1.1 - version: 9.1.1 react: specifier: 18.2.0 version: 18.2.0 @@ -704,12 +686,6 @@ importers: next: specifier: 13.3.0 version: 13.3.0(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) - pino: - specifier: ^8.8.0 - version: 8.9.0 - pino-pretty: - specifier: ^9.1.1 - version: 9.1.1 react: specifier: 18.2.0 version: 18.2.0 @@ -926,8 +902,8 @@ importers: specifier: ^3.1.3 version: 3.1.3(prettier@2.8.3) typescript: - specifier: 4.9.5 - version: 4.9.5 + specifier: 5.0.4 + version: 5.0.4 apps/monitoring: dependencies: @@ -1115,12 +1091,6 @@ importers: next-urql: specifier: ^4.0.2 version: 4.0.3(react@18.2.0)(urql@3.0.3) - pino: - specifier: ^8.8.0 - version: 8.9.0 - pino-pretty: - specifier: ^9.1.1 - version: 9.1.1 react: specifier: 18.2.0 version: 18.2.0 @@ -1254,12 +1224,6 @@ importers: next-urql: specifier: 4.0.0 version: 4.0.0(react@18.2.0)(urql@3.0.3) - pino: - specifier: ^8.8.0 - version: 8.9.0 - pino-pretty: - specifier: ^9.1.1 - version: 9.1.1 react: specifier: 18.2.0 version: 18.2.0 @@ -1541,9 +1505,6 @@ importers: next: specifier: 13.3.0 version: 13.3.0(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) - pino: - specifier: ^8.8.0 - version: 8.9.0 react: specifier: 18.2.0 version: 18.2.0 @@ -1629,9 +1590,6 @@ importers: eslint-config-saleor: specifier: workspace:* version: link:../../packages/eslint-config-saleor - pino-pretty: - specifier: ^9.1.1 - version: 9.1.1 prettier: specifier: ^2.7.1 version: 2.8.3 @@ -1668,6 +1626,13 @@ importers: version: 13.3.0(@babel/core@7.21.4)(react-dom@18.2.0)(react@18.2.0) packages/shared: + dependencies: + pino: + specifier: ^8.8.0 + version: 8.9.0 + pino-pretty: + specifier: ^9.1.1 + version: 9.1.1 devDependencies: '@material-ui/core': specifier: ^4.12.4 @@ -7844,6 +7809,7 @@ packages: /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + dev: false /attr-accept@2.2.2: resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} @@ -8044,6 +8010,7 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 + dev: false /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -8119,6 +8086,7 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + dev: false /buffers@0.1.1: resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} @@ -8855,6 +8823,7 @@ packages: /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dev: false /dayjs@1.11.7: resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} @@ -10358,6 +10327,7 @@ packages: /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + dev: false /execa@4.1.0: resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} @@ -10423,6 +10393,7 @@ packages: /fast-copy@3.0.0: resolution: {integrity: sha512-4HzS+9pQ5Yxtv13Lhs1Z1unMXamBdn5nA4bEi1abYpDNSpSp7ODYQ1KPMF6nTatfEzgH6/zPvXKU1zvHiUjWlA==} + dev: false /fast-csv@4.3.6: resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} @@ -10475,6 +10446,7 @@ packages: /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false /fast-shallow-equal@1.0.0: resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} @@ -10884,6 +10856,7 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 + dev: false /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} @@ -11160,6 +11133,7 @@ packages: dependencies: glob: 8.1.0 readable-stream: 3.6.0 + dev: false /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -11786,6 +11760,7 @@ packages: /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + dev: false /js-beautify@1.14.7: resolution: {integrity: sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==} @@ -12831,6 +12806,7 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 + dev: false /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} @@ -13677,6 +13653,7 @@ packages: /on-exit-leak-free@2.1.0: resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} + dev: false /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -13976,6 +13953,7 @@ packages: dependencies: readable-stream: 4.3.0 split2: 4.1.0 + dev: false /pino-pretty@9.1.1: resolution: {integrity: sha512-iJrnjgR4FWQIXZkUF48oNgoRI9BpyMhaEmihonHeCnZ6F50ZHAS4YGfGBT/ZVNsPmd+hzkIPGzjKdY08+/yAXw==} @@ -13995,6 +13973,7 @@ packages: secure-json-parse: 2.7.0 sonic-boom: 3.2.1 strip-json-comments: 3.1.1 + dev: false /pino-std-serializers@6.1.0: resolution: {integrity: sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g==} @@ -14136,6 +14115,7 @@ packages: /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + dev: false /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} @@ -14770,6 +14750,7 @@ packages: buffer: 6.0.3 events: 3.3.0 process: 0.11.10 + dev: false /readdir-glob@1.1.2: resolution: {integrity: sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==} @@ -15096,6 +15077,7 @@ packages: /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + dev: false /selderee@0.10.0: resolution: {integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==} @@ -15273,6 +15255,7 @@ packages: resolution: {integrity: sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A==} dependencies: atomic-sleep: 1.0.0 + dev: false /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} @@ -15335,6 +15318,7 @@ packages: /split2@4.1.0: resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} engines: {node: '>= 10.x'} + dev: false /sponge-case@1.0.1: resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} diff --git a/turbo.json b/turbo.json index 87544a0..2678d8c 100644 --- a/turbo.json +++ b/turbo.json @@ -1,7 +1,7 @@ { "$schema": "https://turbo.build/schema.json", "globalDependencies": ["**/.env.*local"], - "globalEnv": ["VERCEL_ENV"], + "globalEnv": ["VERCEL_ENV", "APP_LOG_LEVEL", "NODE_ENV"], "pipeline": { "build": { "env": ["NEXT_PUBLIC_VERCEL_ENV"],