Compare commits

...

2 commits

Author SHA1 Message Date
Lukasz Ostrowski
bbc7a7f8f9 restore invoices 2023-09-07 16:59:20 +02:00
Lukasz Ostrowski
7fa1648349 add ts-reset and adjust codebase 2023-09-07 16:49:56 +02:00
57 changed files with 236 additions and 108 deletions

View file

@ -57,6 +57,7 @@
"@graphql-typed-document-node/core": "3.2.0", "@graphql-typed-document-node/core": "3.2.0",
"@testing-library/react": "^14.0.0", "@testing-library/react": "^14.0.0",
"@testing-library/react-hooks": "^8.0.1", "@testing-library/react-hooks": "^8.0.1",
"@total-typescript/ts-reset": "^0.5.1",
"@types/qs": "^6.9.7", "@types/qs": "^6.9.7",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",

1
apps/cms-v2/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

View file

@ -19,7 +19,7 @@ export class AppConfig {
connections: [], connections: [],
}; };
constructor(initialData?: RootConfig.Shape) { constructor(initialData?: RootConfig.Shape | unknown) {
if (initialData) { if (initialData) {
this.rootData = RootConfig.Schema.parse(initialData); this.rootData = RootConfig.Schema.parse(initialData);
} }

View file

@ -2,6 +2,7 @@ import { BuilderIoProviderConfig } from "@/modules/configuration";
import { WebhookProductVariantFragment } from "../../../../generated/graphql"; import { WebhookProductVariantFragment } from "../../../../generated/graphql";
import { createLogger } from "@saleor/apps-shared"; import { createLogger } from "@saleor/apps-shared";
import { FieldsMapper } from "../fields-mapper"; import { FieldsMapper } from "../fields-mapper";
import { z } from "zod";
// https://www.builder.io/c/docs/write-api // https://www.builder.io/c/docs/write-api
export class BuilderIoClient { export class BuilderIoClient {
@ -43,7 +44,7 @@ export class BuilderIoClient {
private async updateProductVariantCall( private async updateProductVariantCall(
builderIoEntryId: string, builderIoEntryId: string,
variant: WebhookProductVariantFragment variant: WebhookProductVariantFragment,
) { ) {
try { try {
const response = await fetch(this.endpoint + `/${builderIoEntryId}`, { const response = await fetch(this.endpoint + `/${builderIoEntryId}`, {
@ -71,13 +72,13 @@ export class BuilderIoClient {
{ {
entriesToUpdate, entriesToUpdate,
}, },
"Trying to update variants in builder.io with following IDs" "Trying to update variants in builder.io with following IDs",
); );
return Promise.all( return Promise.all(
entriesToUpdate.map((id) => { entriesToUpdate.map((id) => {
return this.updateProductVariantCall(id, variant); return this.updateProductVariantCall(id, variant);
}) }),
); );
} }
@ -94,7 +95,7 @@ export class BuilderIoClient {
return Promise.all( return Promise.all(
entriesToUpdate.map((id) => { entriesToUpdate.map((id) => {
return this.updateProductVariantCall(id, variant); return this.updateProductVariantCall(id, variant);
}) }),
); );
} }
} }
@ -112,8 +113,8 @@ export class BuilderIoClient {
"Content-Type": "application/json", "Content-Type": "application/json",
Authorization: `Bearer ${this.config.privateApiKey}`, Authorization: `Bearer ${this.config.privateApiKey}`,
}, },
}) }),
) ),
); );
} }
@ -127,15 +128,23 @@ export class BuilderIoClient {
variantID: variantId, variantID: variantId,
variantFieldMapping: this.config.productVariantFieldsMapping.variantId, variantFieldMapping: this.config.productVariantFieldsMapping.variantId,
}, },
"Trying to fetch variant from Builder.io" "Trying to fetch variant from Builder.io",
); );
const expectedSchema = z.object({
results: z.array(
z.object({
id: z.string(),
}),
),
});
return fetch( return fetch(
`https://cdn.builder.io/api/v3/content/${this.config.modelName}?apiKey=${this.config.publicApiKey}&query.data.${this.config.productVariantFieldsMapping.variantId}.$eq=${variantId}&limit=10&includeUnpublished=false&cacheSeconds=0` `https://cdn.builder.io/api/v3/content/${this.config.modelName}?apiKey=${this.config.publicApiKey}&query.data.${this.config.productVariantFieldsMapping.variantId}.$eq=${variantId}&limit=10&includeUnpublished=false&cacheSeconds=0`,
) )
.then((res) => res.json()) .then((res) => expectedSchema.parse(res.json()))
.then((data) => { .then((data) => {
return data.results.map((result: any) => result.id) as string[]; return data.results.map((result) => result.id) as string[];
}) })
.catch((err) => { .catch((err) => {
this.logger.error(err, "Failed to fetch builder.io entry id"); this.logger.error(err, "Failed to fetch builder.io entry id");

View file

@ -51,6 +51,7 @@
"@graphql-typed-document-node/core": "3.2.0", "@graphql-typed-document-node/core": "3.2.0",
"@testing-library/react": "^14.0.0", "@testing-library/react": "^14.0.0",
"@testing-library/react-hooks": "^8.0.1", "@testing-library/react-hooks": "^8.0.1",
"@total-typescript/ts-reset": "^0.5.1",
"@types/mailchimp__mailchimp_marketing": "^3.0.7", "@types/mailchimp__mailchimp_marketing": "^3.0.7",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",

1
apps/crm/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

View file

@ -23,7 +23,7 @@ export const AppBridgePersistence = {
} }
try { try {
return JSON.parse(storageItem as string); return JSON.parse(storageItem as string) as AppBridgeStorageState;
} catch (e) { } catch (e) {
return null; return null;
} }

View file

@ -1,5 +1,5 @@
import { beforeEach, describe, expect, it, vi } from "vitest"; import { beforeEach, describe, expect, it, vi } from "vitest";
import { MailchimpConfigSettingsManagerV1 } from "./mailchimp-config-settings-manager"; import { MailchimpConfigSettingsManagerV1, MailchimpConfigType } from "./mailchimp-config-settings-manager";
import { Client } from "urql"; import { Client } from "urql";
import { SettingsManager, SettingsValue } from "@saleor/app-sdk/settings-manager"; import { SettingsManager, SettingsValue } from "@saleor/app-sdk/settings-manager";
@ -70,9 +70,11 @@ describe("MailchimpConfigSettingsManagerV1", () => {
dc: "us41", dc: "us41",
}); });
const parsedSetValue = JSON.parse(valueHasBeenSet!); const parsedSetValue = JSON.parse(valueHasBeenSet!) as {
config: MailchimpConfigType
};
expect(parsedSetValue.config.customerCreateEvent.enabled).toBe(false); expect(parsedSetValue.config.customerCreateEvent?.enabled).toBe(false);
}); });
it("Calls settings manager with default customerCreateEvent setting to be disabled", async () => { it("Calls settings manager with default customerCreateEvent setting to be disabled", async () => {
@ -90,9 +92,11 @@ describe("MailchimpConfigSettingsManagerV1", () => {
dc: "us41", dc: "us41",
}); });
const parsedSetValue = JSON.parse(valueHasBeenSet!); const parsedSetValue = JSON.parse(valueHasBeenSet!) as {
config: MailchimpConfigType
};
expect(parsedSetValue.config.customerCreateEvent.enabled).toBe(false); expect(parsedSetValue.config.customerCreateEvent?.enabled).toBe(false);
}); });
it(".get returns null if data doesnt match schema", async () => { it(".get returns null if data doesnt match schema", async () => {

View file

@ -1,6 +1,8 @@
import { NextApiHandler } from "next"; import { NextApiHandler } from "next";
import { MailchimpClientOAuth } from "../../../../modules/mailchimp/mailchimp-client"; import { MailchimpClientOAuth } from "../../../../modules/mailchimp/mailchimp-client";
import { createLogger } from "@saleor/apps-shared"; import { createLogger } from "@saleor/apps-shared";
import { z } from "zod";
import * as Sentry from "@sentry/nextjs";
export const getBaseUrl = (headers: { [name: string]: string | string[] | undefined }): string => { export const getBaseUrl = (headers: { [name: string]: string | string[] | undefined }): string => {
const { host, "x-forwarded-proto": protocol = "http" } = headers; const { host, "x-forwarded-proto": protocol = "http" } = headers;
@ -8,6 +10,17 @@ export const getBaseUrl = (headers: { [name: string]: string | string[] | undefi
return `${protocol}://${host}`; return `${protocol}://${host}`;
}; };
const tokenResponseSchema = z.object({
access_token: z.string().min(1),
});
const metadataResponseSchema = z.object({
dc: z.string().min(1),
login: z.object({
email: z.string().min(1),
}),
});
const handler: NextApiHandler = async (req, res) => { const handler: NextApiHandler = async (req, res) => {
const baseUrl = getBaseUrl(req.headers); const baseUrl = getBaseUrl(req.headers);
@ -28,25 +41,46 @@ const handler: NextApiHandler = async (req, res) => {
}), }),
}); });
const { access_token } = await tokenResponse.json(); let accessToken: string;
logger.debug({ access_token }, "Received mailchimp access_token"); try {
const tokenResponseJson = await tokenResponse.json();
const parsedTokenResponse = tokenResponseSchema.parse(tokenResponseJson);
const metadataResponse = await fetch("https://login.mailchimp.com/oauth2/metadata", { accessToken = parsedTokenResponse.access_token;
headers: { } catch {
Authorization: `OAuth ${access_token}`, Sentry.captureException(
}, "Mailchimp token response doesnt contain access_token or can't be fetched",
}); );
const metadata = await metadataResponse.json(); return res.status(500).end();
}
const mc = new MailchimpClientOAuth(metadata.dc, access_token); logger.debug({ access_token: accessToken }, "Received mailchimp access_token");
await mc.ping(); try {
const metadataResponse = await fetch("https://login.mailchimp.com/oauth2/metadata", {
headers: {
Authorization: `OAuth ${accessToken}`,
},
});
return res.redirect( const metadataJson = await metadataResponse.json();
`/configuration/mailchimp/oauth-success?token=${access_token}&email=${metadata.login.email}&dc=${metadata.dc}`
); // todo maybe move to cookie const parsedMetadata = metadataResponseSchema.parse(metadataJson);
const mc = new MailchimpClientOAuth(parsedMetadata.dc, accessToken);
await mc.ping();
return res.redirect(
`/configuration/mailchimp/oauth-success?token=${accessToken}&email=${parsedMetadata.login.email}&dc=${parsedMetadata.dc}`,
);
} catch {
Sentry.captureException("Mailchimp oauth metadata cant be fetched or is malformed");
return res.status(500).end();
}
}; };
export default handler; export default handler;

View file

@ -49,6 +49,7 @@
"@graphql-typed-document-node/core": "3.2.0", "@graphql-typed-document-node/core": "3.2.0",
"@testing-library/react": "^14.0.0", "@testing-library/react": "^14.0.0",
"@testing-library/react-hooks": "^8.0.1", "@testing-library/react-hooks": "^8.0.1",
"@total-typescript/ts-reset": "^0.5.1",
"@types/dot-object": "^2.1.2", "@types/dot-object": "^2.1.2",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",

1
apps/data-importer/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

View file

@ -61,6 +61,7 @@
"@graphql-typed-document-node/core": "3.2.0", "@graphql-typed-document-node/core": "3.2.0",
"@testing-library/react": "^14.0.0", "@testing-library/react": "^14.0.0",
"@testing-library/react-hooks": "^8.0.1", "@testing-library/react-hooks": "^8.0.1",
"@total-typescript/ts-reset": "^0.5.1",
"@types/html-to-text": "^9.0.0", "@types/html-to-text": "^9.0.0",
"@types/mjml": "^4.7.0", "@types/mjml": "^4.7.0",
"@types/nodemailer": "^6.4.7", "@types/nodemailer": "^6.4.7",

1
apps/emails-and-messages/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

1
apps/invoices/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

View file

@ -37,7 +37,7 @@ const runMigration = async () => {
.catch((e) => { .catch((e) => {
console.error("❌ Error removing metadata", e); console.error("❌ Error removing metadata", e);
}); });
}) }),
); );
console.log(results); console.log(results);

View file

@ -44,7 +44,7 @@ const runMigration = async () => {
.catch((e) => { .catch((e) => {
console.log( console.log(
`🚫 failed to create empty config for ${env.saleorApiUrl}. Env may not exist.`, `🚫 failed to create empty config for ${env.saleorApiUrl}. Env may not exist.`,
e.message e.message,
); );
}); });
} }
@ -60,7 +60,7 @@ const runMigration = async () => {
.catch((e) => { .catch((e) => {
console.error("🚫 Failed to migrate ", env.saleorApiUrl, e); console.error("🚫 Failed to migrate ", env.saleorApiUrl, e);
}); });
}) }),
); );
}; };

View file

@ -38,7 +38,7 @@ const runReport = async () => {
metadata: metadata, metadata: metadata,
env: env.saleorApiUrl, env: env.saleorApiUrl,
})); }));
}) }),
); );
const report = results.map((r: any) => ({ const report = results.map((r: any) => ({

View file

@ -47,7 +47,7 @@ export const appConfigurationRouter = router({
.input( .input(
z.object({ z.object({
channelSlug: z.string(), channelSlug: z.string(),
}) }),
) )
.mutation(async ({ ctx, input }) => { .mutation(async ({ ctx, input }) => {
const appConfigV2 = const appConfigV2 =

View file

@ -17,7 +17,10 @@ export interface AppConfigurator {
export class PrivateMetadataAppConfiguratorV1 implements AppConfigurator { export class PrivateMetadataAppConfiguratorV1 implements AppConfigurator {
private metadataKey = "app-config"; private metadataKey = "app-config";
constructor(private metadataManager: SettingsManager, private saleorApiUrl: string) {} constructor(
private metadataManager: SettingsManager,
private saleorApiUrl: string,
) {}
getConfig(): Promise<AppConfigV1 | undefined> { getConfig(): Promise<AppConfigV1 | undefined> {
return this.metadataManager.get(this.metadataKey, this.saleorApiUrl).then((data) => { return this.metadataManager.get(this.metadataKey, this.saleorApiUrl).then((data) => {

View file

@ -18,13 +18,13 @@ describe("config-v1-to-v2-migration.service", () => {
service = new ConfigV1ToV2MigrationService(mockClient, "https://example.com/graphql/"); service = new ConfigV1ToV2MigrationService(mockClient, "https://example.com/graphql/");
vi.spyOn(service.configMetadataManager, "set").mockImplementationOnce(async () => vi.spyOn(service.configMetadataManager, "set").mockImplementationOnce(async () =>
Promise.resolve() Promise.resolve(),
); );
}); });
it("Returns a pure V2 config if V1 config is not present", async () => { it("Returns a pure V2 config if V1 config is not present", async () => {
vi.spyOn(service.metadataV1AppConfigurator, "getConfig").mockImplementationOnce(async () => vi.spyOn(service.metadataV1AppConfigurator, "getConfig").mockImplementationOnce(async () =>
Promise.resolve(undefined) Promise.resolve(undefined),
); );
const migrationResult = await service.migrate(); const migrationResult = await service.migrate();
@ -41,7 +41,7 @@ describe("config-v1-to-v2-migration.service", () => {
address: getMockAddress(), address: getMockAddress(),
}, },
}, },
}) }),
); );
const migrationResult = await service.migrate(); const migrationResult = await service.migrate();
@ -49,13 +49,13 @@ describe("config-v1-to-v2-migration.service", () => {
expect(migrationResult.getChannelsOverrides()).toEqual( expect(migrationResult.getChannelsOverrides()).toEqual(
expect.objectContaining({ expect.objectContaining({
"default-channel": expect.objectContaining(getMockAddress()), "default-channel": expect.objectContaining(getMockAddress()),
}) }),
); );
}); });
it("Runs a beforeSave callback and saves modified state in metadata - missing v1 config scenario", async () => { it("Runs a beforeSave callback and saves modified state in metadata - missing v1 config scenario", async () => {
vi.spyOn(service.metadataV1AppConfigurator, "getConfig").mockImplementationOnce(async () => vi.spyOn(service.metadataV1AppConfigurator, "getConfig").mockImplementationOnce(async () =>
Promise.resolve(undefined) Promise.resolve(undefined),
); );
const beforeSaveCb = vi.fn().mockImplementationOnce((config: AppConfigV2) => { const beforeSaveCb = vi.fn().mockImplementationOnce((config: AppConfigV2) => {
@ -79,7 +79,7 @@ describe("config-v1-to-v2-migration.service", () => {
address: getMockAddress(), address: getMockAddress(),
}, },
}, },
}) }),
); );
const beforeSaveCb = vi.fn().mockImplementationOnce((config: AppConfigV2) => { const beforeSaveCb = vi.fn().mockImplementationOnce((config: AppConfigV2) => {

View file

@ -10,12 +10,15 @@ export class ConfigV1ToV2MigrationService {
configMetadataManager: AppConfigV2MetadataManager; configMetadataManager: AppConfigV2MetadataManager;
metadataV1AppConfigurator: PrivateMetadataAppConfiguratorV1; metadataV1AppConfigurator: PrivateMetadataAppConfiguratorV1;
constructor(private client: SimpleGraphqlClient, private saleorApiUrl: string) { constructor(
private client: SimpleGraphqlClient,
private saleorApiUrl: string,
) {
this.settingsManager = createSettingsManager(client); this.settingsManager = createSettingsManager(client);
this.configMetadataManager = new AppConfigV2MetadataManager(this.settingsManager); this.configMetadataManager = new AppConfigV2MetadataManager(this.settingsManager);
this.metadataV1AppConfigurator = new PrivateMetadataAppConfiguratorV1( this.metadataV1AppConfigurator = new PrivateMetadataAppConfiguratorV1(
this.settingsManager, this.settingsManager,
this.saleorApiUrl this.saleorApiUrl,
); );
} }

View file

@ -22,7 +22,7 @@ describe("ConfigV1ToV2Transformer", function () {
expect(v2.getChannelsOverrides()).toEqual( expect(v2.getChannelsOverrides()).toEqual(
expect.objectContaining({ expect.objectContaining({
"default-channel": getMockAddress(), "default-channel": getMockAddress(),
}) }),
); );
}); });
@ -42,7 +42,7 @@ describe("ConfigV1ToV2Transformer", function () {
expect.objectContaining({ expect.objectContaining({
"default-channel": getMockAddress(), "default-channel": getMockAddress(),
"custom-channel": getMockAddress(), "custom-channel": getMockAddress(),
}) }),
); );
}); });
@ -66,7 +66,7 @@ describe("ConfigV1ToV2Transformer", function () {
...getMockAddress(), ...getMockAddress(),
city: "", city: "",
}, },
}) }),
); );
}); });
}); });

View file

@ -8,7 +8,7 @@ export class MicroinvoiceInvoiceGenerator implements InvoiceGenerator {
constructor( constructor(
private settings = { private settings = {
locale: "en-US", locale: "en-US",
} },
) {} ) {}
async generate(input: { async generate(input: {
order: OrderPayloadFragment; order: OrderPayloadFragment;
@ -19,17 +19,7 @@ export class MicroinvoiceInvoiceGenerator implements InvoiceGenerator {
const { invoiceNumber, order, companyAddressData, filename } = input; const { invoiceNumber, order, companyAddressData, filename } = input;
const microinvoiceInstance = new Microinvoice({ const microinvoiceInstance = new Microinvoice({
style: { style: {},
/*
* header: {
* image: {
* path: "./examples/logo.png",
* width: 50,
* height: 19,
* },
* },
*/
},
data: { data: {
invoice: { invoice: {
name: `Invoice ${invoiceNumber}`, name: `Invoice ${invoiceNumber}`,
@ -63,12 +53,6 @@ export class MicroinvoiceInvoiceGenerator implements InvoiceGenerator {
order.billingAddress?.country.country, order.billingAddress?.country.country,
], ],
}, },
/*
* {
* label: "Tax Identifier",
* value: "todo",
* },
*/
], ],
seller: [ seller: [
@ -84,28 +68,9 @@ export class MicroinvoiceInvoiceGenerator implements InvoiceGenerator {
companyAddressData.countryArea, companyAddressData.countryArea,
], ],
}, },
/*
* {
* label: "Tax Identifier",
* value: "todo",
* },
*/
], ],
legal: [ legal: [],
/*
* {
* value: "Lorem ipsum dolor sit amet, consectetur adipiscing elit",
* weight: "bold",
* color: "primary",
* },
* {
* value: "sed do eiusmod tempor incididunt ut labore et dolore magna.",
* weight: "bold",
* color: "secondary",
* },
*/
],
details: { details: {
header: [ header: [

View file

@ -0,0 +1,10 @@
export type ShopAddress = {
city: string;
cityArea: string;
companyName: string;
country: string;
countryArea: string;
postalCode: string;
streetAddress1: string;
streetAddress2: string;
};

View file

@ -156,7 +156,7 @@ const invoiceNumberGenerator = new InvoiceNumberGenerator();
export const handler: NextWebhookApiHandler<InvoiceRequestedPayloadFragment> = async ( export const handler: NextWebhookApiHandler<InvoiceRequestedPayloadFragment> = async (
req, req,
res, res,
context context,
) => { ) => {
const { authData, payload, baseUrl } = context; const { authData, payload, baseUrl } = context;
const logger = createLogger({ domain: authData.saleorApiUrl, url: baseUrl }); const logger = createLogger({ domain: authData.saleorApiUrl, url: baseUrl });
@ -176,7 +176,7 @@ export const handler: NextWebhookApiHandler<InvoiceRequestedPayloadFragment> = a
*/ */
const invoiceName = invoiceNumberGenerator.generateFromOrder( const invoiceName = invoiceNumberGenerator.generateFromOrder(
order as OrderPayloadFragment, order as OrderPayloadFragment,
InvoiceNumberGenerationStrategy.localizedDate("en-US") // todo connect locale -> where from? InvoiceNumberGenerationStrategy.localizedDate("en-US"), // todo connect locale -> where from?
); );
Sentry.addBreadcrumb({ Sentry.addBreadcrumb({
@ -270,7 +270,7 @@ export const handler: NextWebhookApiHandler<InvoiceRequestedPayloadFragment> = a
await new InvoiceCreateNotifier(client).notifyInvoiceCreated( await new InvoiceCreateNotifier(client).notifyInvoiceCreated(
orderId, orderId,
invoiceName, invoiceName,
uploadedFileUrl uploadedFileUrl,
); );
Sentry.addBreadcrumb({ Sentry.addBreadcrumb({

View file

@ -43,6 +43,7 @@
"@graphql-codegen/typescript-operations": "4.0.1", "@graphql-codegen/typescript-operations": "4.0.1",
"@graphql-codegen/typescript-urql": "3.7.3", "@graphql-codegen/typescript-urql": "3.7.3",
"@graphql-typed-document-node/core": "3.2.0", "@graphql-typed-document-node/core": "3.2.0",
"@total-typescript/ts-reset": "^0.5.1",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",
"autoprefixer": "^10.4.7", "autoprefixer": "^10.4.7",

1
apps/klaviyo/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

View file

@ -56,13 +56,13 @@ export const customerCreatedWebhook = new SaleorAsyncWebhook<CustomerCreatedWebh
event: "CUSTOMER_CREATED", event: "CUSTOMER_CREATED",
apl: saleorApp.apl, apl: saleorApp.apl,
query: UntypedCustomerCreatedDocument, query: UntypedCustomerCreatedDocument,
} },
); );
const handler: NextWebhookApiHandler<CustomerCreatedWebhookPayloadFragment> = async ( const handler: NextWebhookApiHandler<CustomerCreatedWebhookPayloadFragment> = async (
req, req,
res, res,
context context,
) => { ) => {
console.debug("customerCreatedWebhook handler called"); console.debug("customerCreatedWebhook handler called");
@ -94,7 +94,8 @@ const handler: NextWebhookApiHandler<CustomerCreatedWebhookPayloadFragment> = as
const klaviyoResponse = await klaviyoClient.send(klaviyoMetric, userEmail, payload); const klaviyoResponse = await klaviyoClient.send(klaviyoMetric, userEmail, payload);
if (klaviyoResponse.status !== 200) { if (klaviyoResponse.status !== 200) {
const klaviyoMessage = ` Message: ${(await klaviyoResponse.json())?.message}.` || ""; const klaviyoMessage =
` Message: ${((await klaviyoResponse.json()) as { message: string })?.message}.` || "";
console.debug("Klaviyo returned error: ", klaviyoMessage); console.debug("Klaviyo returned error: ", klaviyoMessage);

View file

@ -68,7 +68,7 @@ export const fulfillmentCreatedWebhook =
const handler: NextWebhookApiHandler<FulfillmentCreatedWebhookPayloadFragment> = async ( const handler: NextWebhookApiHandler<FulfillmentCreatedWebhookPayloadFragment> = async (
req, req,
res, res,
context context,
) => { ) => {
console.debug("fulfillmentCreatedWebhook handler called"); console.debug("fulfillmentCreatedWebhook handler called");
@ -98,7 +98,8 @@ const handler: NextWebhookApiHandler<FulfillmentCreatedWebhookPayloadFragment> =
const klaviyoResponse = await klaviyoClient.send(klaviyoMetric, userEmail, payload); const klaviyoResponse = await klaviyoClient.send(klaviyoMetric, userEmail, payload);
if (klaviyoResponse.status !== 200) { if (klaviyoResponse.status !== 200) {
const klaviyoMessage = ` Message: ${(await klaviyoResponse.json())?.message}.` || ""; const klaviyoMessage =
` Message: ${((await klaviyoResponse.json()) as { message: string })?.message}.` || "";
console.debug("Klaviyo returned error: ", klaviyoMessage); console.debug("Klaviyo returned error: ", klaviyoMessage);

View file

@ -38,7 +38,7 @@ export const orderCreatedWebhook = new SaleorAsyncWebhook<OrderCreatedWebhookPay
const handler: NextWebhookApiHandler<OrderCreatedWebhookPayloadFragment> = async ( const handler: NextWebhookApiHandler<OrderCreatedWebhookPayloadFragment> = async (
req, req,
res, res,
context context,
) => { ) => {
console.debug("orderCreatedWebhook handler called"); console.debug("orderCreatedWebhook handler called");
@ -69,7 +69,8 @@ const handler: NextWebhookApiHandler<OrderCreatedWebhookPayloadFragment> = async
const klaviyoResponse = await klaviyoClient.send(klaviyoMetric, userEmail, payload); const klaviyoResponse = await klaviyoClient.send(klaviyoMetric, userEmail, payload);
if (klaviyoResponse.status !== 200) { if (klaviyoResponse.status !== 200) {
const klaviyoMessage = ` Message: ${(await klaviyoResponse.json())?.message}.` || ""; const klaviyoMessage =
` Message: ${((await klaviyoResponse.json()) as { message: string })?.message}.` || "";
console.debug("Klaviyo returned error: ", klaviyoMessage); console.debug("Klaviyo returned error: ", klaviyoMessage);
return res.status(500).json({ return res.status(500).json({

View file

@ -38,7 +38,7 @@ export const orderFullyPaidWebhook = new SaleorAsyncWebhook<OrderFullyPaidWebhoo
const handler: NextWebhookApiHandler<OrderFullyPaidWebhookPayloadFragment> = async ( const handler: NextWebhookApiHandler<OrderFullyPaidWebhookPayloadFragment> = async (
req, req,
res, res,
context context,
) => { ) => {
console.debug("orderFullyPaidWebhook handler called"); console.debug("orderFullyPaidWebhook handler called");
@ -70,7 +70,8 @@ const handler: NextWebhookApiHandler<OrderFullyPaidWebhookPayloadFragment> = asy
const klaviyoResponse = await klaviyoClient.send(klaviyoMetric, userEmail, payload); const klaviyoResponse = await klaviyoClient.send(klaviyoMetric, userEmail, payload);
if (klaviyoResponse.status !== 200) { if (klaviyoResponse.status !== 200) {
const klaviyoMessage = ` Message: ${(await klaviyoResponse.json())?.message}.` || ""; const klaviyoMessage =
` Message: ${((await klaviyoResponse.json()) as { message: string })?.message}.` || "";
console.debug("Klaviyo returned error: ", klaviyoMessage); console.debug("Klaviyo returned error: ", klaviyoMessage);

View file

@ -56,6 +56,7 @@
"@graphql-typed-document-node/core": "3.2.0", "@graphql-typed-document-node/core": "3.2.0",
"@testing-library/react": "^14.0.0", "@testing-library/react": "^14.0.0",
"@testing-library/react-hooks": "^8.0.1", "@testing-library/react-hooks": "^8.0.1",
"@total-typescript/ts-reset": "^0.5.1",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",
"eslint": "8.46.0", "eslint": "8.46.0",

1
apps/products-feed/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

View file

@ -94,7 +94,6 @@ describe("AppConfig", function () {
expect( expect(
() => () =>
new AppConfig({ new AppConfig({
// @ts-expect-error
foo: "bar", foo: "bar",
}), }),
).toThrow(); ).toThrow();

View file

@ -72,7 +72,7 @@ export class AppConfig {
imageSize: imageSizeFieldSchema.parse(undefined), imageSize: imageSizeFieldSchema.parse(undefined),
}; };
constructor(initialData?: RootConfig) { constructor(initialData?: RootConfig | unknown) {
if (initialData) { if (initialData) {
try { try {
this.rootData = rootAppConfigSchema.parse(initialData); this.rootData = rootAppConfigSchema.parse(initialData);

View file

@ -1,9 +1,13 @@
import { SettingsManager } from "@saleor/app-sdk/settings-manager"; import { SettingsManager } from "@saleor/app-sdk/settings-manager";
import { z } from "zod";
export class CacheConfigurator { export class CacheConfigurator {
private metadataKeyPrefix = "cursor-cache-"; private metadataKeyPrefix = "cursor-cache-";
constructor(private metadataManager: SettingsManager, private saleorApiUrl: string) {} constructor(
private metadataManager: SettingsManager,
private saleorApiUrl: string,
) {}
private constructKey(channel: string) { private constructKey(channel: string) {
return this.metadataKeyPrefix + channel; return this.metadataKeyPrefix + channel;
@ -16,7 +20,7 @@ export class CacheConfigurator {
} }
try { try {
return JSON.parse(data); return z.array(z.string()).parse(JSON.parse(data));
} catch (e) { } catch (e) {
throw new Error("Invalid metadata value, can't be parsed"); throw new Error("Invalid metadata value, can't be parsed");
} }

View file

@ -52,6 +52,7 @@
"@graphql-codegen/typescript-operations": "4.0.1", "@graphql-codegen/typescript-operations": "4.0.1",
"@graphql-codegen/typescript-urql": "3.7.3", "@graphql-codegen/typescript-urql": "3.7.3",
"@graphql-typed-document-node/core": "3.2.0", "@graphql-typed-document-node/core": "3.2.0",
"@total-typescript/ts-reset": "^0.5.1",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",
"@vitejs/plugin-react": "4.0.4", "@vitejs/plugin-react": "4.0.4",

1
apps/search/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

View file

@ -7,7 +7,9 @@ export const useWebhooksStatus = () => {
const fetch: typeof window.fetch = useAuthenticatedFetch(); const fetch: typeof window.fetch = useAuthenticatedFetch();
const fetchFn = useCallback(() => { const fetchFn = useCallback(() => {
return fetch("/api/webhooks-status").then((resp) => resp.json()); return fetch("/api/webhooks-status").then(
(resp) => resp.json() as unknown as WebhooksStatusResponse,
);
/** /**
* fetch from SDK is not wrapped with memo todo * fetch from SDK is not wrapped with memo todo
*/ */

View file

@ -27,7 +27,7 @@ export class AppConfig {
}, },
}; };
constructor(initialData?: AppConfigRootSchemaFields) { constructor(initialData?: AppConfigRootSchemaFields | unknown) {
if (initialData) { if (initialData) {
this.rootData = AppConfigRootSchema.parse(initialData); this.rootData = AppConfigRootSchema.parse(initialData);
} }

View file

@ -1,4 +1,4 @@
import { NextProtectedApiHandler } from "@saleor/app-sdk/handlers/next"; import { NextProtectedApiHandler, ProtectedHandlerContext } from "@saleor/app-sdk/handlers/next";
import { SettingsManager } from "@saleor/app-sdk/settings-manager"; import { SettingsManager } from "@saleor/app-sdk/settings-manager";
import { createMocks } from "node-mocks-http"; import { createMocks } from "node-mocks-http";
import { Client, OperationResult } from "urql"; import { Client, OperationResult } from "urql";
@ -8,11 +8,12 @@ import { IWebhookActivityTogglerService } from "../../domain/WebhookActivityTogg
import { SearchProvider } from "../../lib/searchProvider"; import { SearchProvider } from "../../lib/searchProvider";
import { webhooksStatusHandlerFactory } from "../../pages/api/webhooks-status"; import { webhooksStatusHandlerFactory } from "../../pages/api/webhooks-status";
import { AppConfig } from "../../modules/configuration/configuration"; import { AppConfig } from "../../modules/configuration/configuration";
import { NextApiRequest, NextApiResponse } from "next";
/** /**
* Context provided from ProtectedApiHandler to handler body * Context provided from ProtectedApiHandler to handler body
*/ */
const mockWebhookContext = { const mockWebhookContext: ProtectedHandlerContext = {
authData: { authData: {
appId: "app-id", appId: "app-id",
domain: "domain.saleor.io", domain: "domain.saleor.io",
@ -20,6 +21,10 @@ const mockWebhookContext = {
saleorApiUrl: "https://domain.saleor.io/graphql", saleorApiUrl: "https://domain.saleor.io/graphql",
}, },
baseUrl: "localhost:3000", baseUrl: "localhost:3000",
user: {
email: "",
userPermissions: [],
},
}; };
const appWebhooksResponseData: Pick<OperationResult<FetchOwnWebhooksQuery, any>, "data"> = { const appWebhooksResponseData: Pick<OperationResult<FetchOwnWebhooksQuery, any>, "data"> = {
@ -90,6 +95,7 @@ describe("webhooksStatusHandler", () => {
it("Disables webhooks if Algolia settings are not saved in Saleor Metadata", async function () { it("Disables webhooks if Algolia settings are not saved in Saleor Metadata", async function () {
const { req, res } = createMocks({}); const { req, res } = createMocks({});
// @ts-expect-error - mock doesnt contain next-specific fields
await handler(req, res, mockWebhookContext); await handler(req, res, mockWebhookContext);
expect(webhooksTogglerServiceMock.disableOwnWebhooks).toHaveBeenCalled(); expect(webhooksTogglerServiceMock.disableOwnWebhooks).toHaveBeenCalled();
@ -113,6 +119,7 @@ describe("webhooksStatusHandler", () => {
const { req, res } = createMocks({}); const { req, res } = createMocks({});
// @ts-expect-error - mock doesnt contain next-specific fields
await handler(req, res, mockWebhookContext); await handler(req, res, mockWebhookContext);
expect(webhooksTogglerServiceMock.disableOwnWebhooks).toHaveBeenCalled(); expect(webhooksTogglerServiceMock.disableOwnWebhooks).toHaveBeenCalled();

View file

@ -54,6 +54,7 @@
"@graphql-typed-document-node/core": "3.2.0", "@graphql-typed-document-node/core": "3.2.0",
"@testing-library/react": "^14.0.0", "@testing-library/react": "^14.0.0",
"@testing-library/react-hooks": "^8.0.1", "@testing-library/react-hooks": "^8.0.1",
"@total-typescript/ts-reset": "^0.5.1",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",
"eslint": "8.46.0", "eslint": "8.46.0",

1
apps/segment/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

View file

@ -4,7 +4,7 @@ import { RootConfig } from "./schemas/root-config.schema";
export class AppConfig { export class AppConfig {
private rootData: RootConfig.Shape = null; private rootData: RootConfig.Shape = null;
constructor(initialData?: RootConfig.Shape) { constructor(initialData?: RootConfig.Shape | unknown) {
if (initialData) { if (initialData) {
this.rootData = RootConfig.Schema.parse(initialData); this.rootData = RootConfig.Schema.parse(initialData);
} }

View file

@ -45,6 +45,7 @@
"@graphql-codegen/typescript-operations": "4.0.1", "@graphql-codegen/typescript-operations": "4.0.1",
"@graphql-codegen/typescript-urql": "3.7.3", "@graphql-codegen/typescript-urql": "3.7.3",
"@graphql-typed-document-node/core": "3.2.0", "@graphql-typed-document-node/core": "3.2.0",
"@total-typescript/ts-reset": "^0.5.1",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",
"@typescript-eslint/eslint-plugin": "^5.36.2", "@typescript-eslint/eslint-plugin": "^5.36.2",

1
apps/slack/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

View file

@ -40,7 +40,7 @@ export const useAppApi = <D>({ url, options, skip }: UseFetchProps) => {
const json = await res.json(); const json = await res.json();
setData(json); setData(json as D);
} catch (e) { } catch (e) {
setError(e as unknown); setError(e as unknown);
} finally { } finally {

View file

@ -55,6 +55,7 @@
"@graphql-typed-document-node/core": "3.2.0", "@graphql-typed-document-node/core": "3.2.0",
"@testing-library/react": "^14.0.0", "@testing-library/react": "^14.0.0",
"@testing-library/react-hooks": "^8.0.1", "@testing-library/react-hooks": "^8.0.1",
"@total-typescript/ts-reset": "^0.5.1",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",
"@vitejs/plugin-react": "4.0.4", "@vitejs/plugin-react": "4.0.4",

1
apps/taxes/reset.d.ts vendored Normal file
View file

@ -0,0 +1 @@
import "@total-typescript/ts-reset";

View file

@ -67,6 +67,7 @@
"vals", "vals",
"urql", "urql",
"Protos", "Protos",
"Consts",
"pino", "pino",
"IFRAME", "IFRAME",
"dedupe" "dedupe"
@ -82,6 +83,7 @@
"**/*.spec.ts", "**/*.spec.ts",
"**/graphql.ts", "**/graphql.ts",
"**/CHANGELOG.md", "**/CHANGELOG.md",
"**/schema.graphql" "**/schema.graphql",
"**/*mock*"
] ]
} }

View file

@ -10,6 +10,7 @@
"devDependencies": { "devDependencies": {
"@playwright/test": "^1.35.1", "@playwright/test": "^1.35.1",
"@saleor/app-sdk": "0.43.1", "@saleor/app-sdk": "0.43.1",
"@total-typescript/ts-reset": "^0.5.1",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"eslint-config-saleor": "workspace:*", "eslint-config-saleor": "workspace:*",
"zod": "3.21.4" "zod": "3.21.4"

View file

@ -2,6 +2,7 @@
"name": "eslint-config-saleor", "name": "eslint-config-saleor",
"version": "0.4.5", "version": "0.4.5",
"devDependencies": { "devDependencies": {
"@total-typescript/ts-reset": "^0.5.1",
"eslint": "8.46.0", "eslint": "8.46.0",
"eslint-config-next": "13.4.8", "eslint-config-next": "13.4.8",
"eslint-config-prettier": "8.8.0", "eslint-config-prettier": "8.8.0",

View file

@ -21,6 +21,7 @@
"@storybook/react": "^7.0.12", "@storybook/react": "^7.0.12",
"@storybook/react-vite": "^7.0.12", "@storybook/react-vite": "^7.0.12",
"@storybook/testing-library": "^0.0.14-next.2", "@storybook/testing-library": "^0.0.14-next.2",
"@total-typescript/ts-reset": "^0.5.1",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",
"@vanilla-extract/vite-plugin": "^3.8.1", "@vanilla-extract/vite-plugin": "^3.8.1",

View file

@ -17,6 +17,7 @@
"@material-ui/lab": "4.0.0-alpha.61", "@material-ui/lab": "4.0.0-alpha.61",
"@saleor/app-sdk": "0.43.1", "@saleor/app-sdk": "0.43.1",
"@saleor/macaw-ui": "0.8.0-pre.127", "@saleor/macaw-ui": "0.8.0-pre.127",
"@total-typescript/ts-reset": "^0.5.1",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",
"@types/semver": "^7.5.0", "@types/semver": "^7.5.0",

View file

@ -6,6 +6,7 @@
}, },
"devDependencies": { "devDependencies": {
"@saleor/app-sdk": "0.41.1", "@saleor/app-sdk": "0.41.1",
"@total-typescript/ts-reset": "^0.5.1",
"eslint": "8.46.0", "eslint": "8.46.0",
"eslint-config-saleor": "workspace:*", "eslint-config-saleor": "workspace:*",
"next": "13.4.8", "next": "13.4.8",

View file

@ -11,6 +11,7 @@
"devDependencies": { "devDependencies": {
"@saleor/app-sdk": "0.43.1", "@saleor/app-sdk": "0.43.1",
"@saleor/macaw-ui": "0.8.0-pre.127", "@saleor/macaw-ui": "0.8.0-pre.127",
"@total-typescript/ts-reset": "^0.5.1",
"@types/react": "18.2.5", "@types/react": "18.2.5",
"@types/react-dom": "18.2.5", "@types/react-dom": "18.2.5",
"eslint-config-saleor": "workspace:*", "eslint-config-saleor": "workspace:*",

View file

@ -176,6 +176,9 @@ importers:
'@testing-library/react-hooks': '@testing-library/react-hooks':
specifier: ^8.0.1 specifier: ^8.0.1
version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/qs': '@types/qs':
specifier: ^6.9.7 specifier: ^6.9.7
version: 6.9.7 version: 6.9.7
@ -312,6 +315,9 @@ importers:
'@testing-library/react-hooks': '@testing-library/react-hooks':
specifier: ^8.0.1 specifier: ^8.0.1
version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/mailchimp__mailchimp_marketing': '@types/mailchimp__mailchimp_marketing':
specifier: ^3.0.7 specifier: ^3.0.7
version: 3.0.7 version: 3.0.7
@ -442,6 +448,9 @@ importers:
'@testing-library/react-hooks': '@testing-library/react-hooks':
specifier: ^8.0.1 specifier: ^8.0.1
version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/dot-object': '@types/dot-object':
specifier: ^2.1.2 specifier: ^2.1.2
version: 2.1.2 version: 2.1.2
@ -605,6 +614,9 @@ importers:
'@testing-library/react-hooks': '@testing-library/react-hooks':
specifier: ^8.0.1 specifier: ^8.0.1
version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/html-to-text': '@types/html-to-text':
specifier: ^9.0.0 specifier: ^9.0.0
version: 9.0.0 version: 9.0.0
@ -741,6 +753,9 @@ importers:
'@graphql-typed-document-node/core': '@graphql-typed-document-node/core':
specifier: 3.2.0 specifier: 3.2.0
version: 3.2.0(graphql@16.7.1) version: 3.2.0(graphql@16.7.1)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/react': '@types/react':
specifier: 18.2.5 specifier: 18.2.5
version: 18.2.5 version: 18.2.5
@ -868,6 +883,9 @@ importers:
'@graphql-typed-document-node/core': '@graphql-typed-document-node/core':
specifier: 3.2.0 specifier: 3.2.0
version: 3.2.0(graphql@16.7.1) version: 3.2.0(graphql@16.7.1)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/react': '@types/react':
specifier: 18.2.5 specifier: 18.2.5
version: 18.2.5 version: 18.2.5
@ -1025,6 +1043,9 @@ importers:
'@testing-library/react-hooks': '@testing-library/react-hooks':
specifier: ^8.0.1 specifier: ^8.0.1
version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/react': '@types/react':
specifier: 18.2.5 specifier: 18.2.5
version: 18.2.5 version: 18.2.5
@ -1158,6 +1179,9 @@ importers:
'@graphql-typed-document-node/core': '@graphql-typed-document-node/core':
specifier: 3.2.0 specifier: 3.2.0
version: 3.2.0(graphql@16.7.1) version: 3.2.0(graphql@16.7.1)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/react': '@types/react':
specifier: 18.2.5 specifier: 18.2.5
version: 18.2.5 version: 18.2.5
@ -1309,6 +1333,9 @@ importers:
'@testing-library/react-hooks': '@testing-library/react-hooks':
specifier: ^8.0.1 specifier: ^8.0.1
version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/react': '@types/react':
specifier: 18.2.5 specifier: 18.2.5
version: 18.2.5 version: 18.2.5
@ -1427,6 +1454,9 @@ importers:
'@graphql-typed-document-node/core': '@graphql-typed-document-node/core':
specifier: 3.2.0 specifier: 3.2.0
version: 3.2.0(graphql@16.7.1) version: 3.2.0(graphql@16.7.1)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/react': '@types/react':
specifier: 18.2.5 specifier: 18.2.5
version: 18.2.5 version: 18.2.5
@ -1584,6 +1614,9 @@ importers:
'@testing-library/react-hooks': '@testing-library/react-hooks':
specifier: ^8.0.1 specifier: ^8.0.1
version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/react': '@types/react':
specifier: 18.2.5 specifier: 18.2.5
version: 18.2.5 version: 18.2.5
@ -1611,6 +1644,9 @@ importers:
'@saleor/app-sdk': '@saleor/app-sdk':
specifier: 0.43.1 specifier: 0.43.1
version: 0.43.1(graphql@16.7.1)(next@13.4.8)(react-dom@18.2.0)(react@18.2.0) version: 0.43.1(graphql@16.7.1)(next@13.4.8)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
dotenv: dotenv:
specifier: ^16.3.1 specifier: ^16.3.1
version: 16.3.1 version: 16.3.1
@ -1623,6 +1659,9 @@ importers:
packages/eslint-config-saleor: packages/eslint-config-saleor:
devDependencies: devDependencies:
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
eslint: eslint:
specifier: 8.46.0 specifier: 8.46.0
version: 8.46.0 version: 8.46.0
@ -1681,6 +1720,9 @@ importers:
'@storybook/testing-library': '@storybook/testing-library':
specifier: ^0.0.14-next.2 specifier: ^0.0.14-next.2
version: 0.0.14-next.2 version: 0.0.14-next.2
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/react': '@types/react':
specifier: 18.2.5 specifier: 18.2.5
version: 18.2.5 version: 18.2.5
@ -1748,6 +1790,9 @@ importers:
'@saleor/macaw-ui': '@saleor/macaw-ui':
specifier: 0.8.0-pre.127 specifier: 0.8.0-pre.127
version: 0.8.0-pre.127(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) version: 0.8.0-pre.127(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/react': '@types/react':
specifier: 18.2.5 specifier: 18.2.5
version: 18.2.5 version: 18.2.5
@ -1821,6 +1866,9 @@ importers:
'@saleor/app-sdk': '@saleor/app-sdk':
specifier: 0.43.1 specifier: 0.43.1
version: 0.43.1(graphql@16.7.1)(next@13.4.8)(react-dom@18.2.0)(react@18.2.0) version: 0.43.1(graphql@16.7.1)(next@13.4.8)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
eslint: eslint:
specifier: 8.46.0 specifier: 8.46.0
version: 8.46.0 version: 8.46.0
@ -1849,6 +1897,9 @@ importers:
'@saleor/macaw-ui': '@saleor/macaw-ui':
specifier: 0.8.0-pre.127 specifier: 0.8.0-pre.127
version: 0.8.0-pre.127(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) version: 0.8.0-pre.127(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
'@types/react': '@types/react':
specifier: 18.2.5 specifier: 18.2.5
version: 18.2.5 version: 18.2.5
@ -10675,6 +10726,10 @@ packages:
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
/@total-typescript/ts-reset@0.5.1:
resolution: {integrity: sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==}
dev: true
/@trpc/client@10.34.0(@trpc/server@10.34.0): /@trpc/client@10.34.0(@trpc/server@10.34.0):
resolution: {integrity: sha512-nqtDTIqSY/9syo2EjSy4WWWXPU9GsamEh9Tsg698gLAh1nhgFc5+/YYeb+Ne1pbvWGZ5/3t9Dcz3h4wMyyJ9gQ==} resolution: {integrity: sha512-nqtDTIqSY/9syo2EjSy4WWWXPU9GsamEh9Tsg698gLAh1nhgFc5+/YYeb+Ne1pbvWGZ5/3t9Dcz3h4wMyyJ9gQ==}
peerDependencies: peerDependencies: