@brytdesigns/shopify-ajax-client 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AjaxClientResponse.ts"],"names":[],"mappings":";;AAWO,MAAM,kBAAA,SAAwC,KAAK,KAExD,CAAA;AAAC;AAEI,MAAM,OAAO,CAClB,IAAA,KACG,IAAK,CAAA,IAAA,GAAkC,IAAI","file":"AjaxClientResponse.js","sourcesContent":["import * as Data from \"effect/Data\";\n\ninterface IAjaxClientResponse<TData = any> {\n data?: TData;\n error?: {\n status: number;\n message: string;\n description?: string;\n };\n}\n\nexport class AjaxClientResponse<TData = any> extends Data.Class<\n IAjaxClientResponse<TData>\n> {}\n\nexport const make = <TData = undefined>(\n data: Parameters<ReturnType<typeof Data.case<AjaxClientResponse<TData>>>>[0],\n) => Data.case<AjaxClientResponse<TData>>()(data);\n"]}
1
+ {"version":3,"sources":["../../src/AjaxClientResponse.ts"],"names":[],"mappings":";;AAuCO,MAAM,kBAAA,SAAwC,KAAK,KAExD,CAAA;AAAC;AASI,MAAM,OAAO,CAClB,IAAA,KACG,IAAK,CAAA,IAAA,GAAkC,IAAI","file":"AjaxClientResponse.js","sourcesContent":["import * as Data from \"effect/Data\";\n\n/**\n * Represents a response from an AJAX client.\n *\n * @template TData - The type of data expected in the response.\n */\ninterface IAjaxClientResponse<TData = any> {\n /**\n * The data received from the server.\n */\n data?: TData;\n\n /**\n * An error object if the request failed.\n */\n error?: {\n /**\n * The HTTP status code of the error response.\n */\n status: number;\n\n /**\n * A brief description of the error.\n */\n message: string;\n\n /**\n * A more detailed description of the error.\n */\n description?: string;\n };\n}\n\n/**\n * A class representing an AJAX client response.\n *\n * @template TData - The type of data expected in the response.\n */\nexport class AjaxClientResponse<TData = any> extends Data.Class<\n IAjaxClientResponse<TData>\n> {}\n\n/**\n * Creates an instance of AjaxClientResponse.\n *\n * @template TData - The type of data expected in the response.\n * @param data - The data to initialize the response with.\n * @returns An instance of AjaxClientResponse.\n */\nexport const make = <TData = undefined>(\n data: Parameters<ReturnType<typeof Data.case<AjaxClientResponse<TData>>>>[0]\n) => Data.case<AjaxClientResponse<TData>>()(data);\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/LoggerUtils.ts"],"names":[],"mappings":";;AAEO,MAAM,wBAAwB,OAAQ,CAAA,qBAAA;AAAA,EAC3C;AACF;AAEO,MAAM,qBAAqB,OAAQ,CAAA","file":"LoggerUtils.js","sourcesContent":["import { Logging } from \"@brytdesigns/shopify-utils/effect\";\n\nexport const withNamespacedLogSpan = Logging.makeNamespacedLogSpan(\n \"[@brytdesigns/shopify-ajax-client]\",\n);\n\nexport const filterLevelOrNever = Logging.filterLevelOrNever;\n"]}
1
+ {"version":3,"sources":["../../src/LoggerUtils.ts"],"names":[],"mappings":";;AAcO,MAAM,wBAAwB,OAAQ,CAAA,qBAAA;AAAA,EAC3C;AACF;AAeO,MAAM,qBAAqB,OAAQ,CAAA","file":"LoggerUtils.js","sourcesContent":["import { Logging } from \"@brytdesigns/shopify-utils/effect\";\n\n/**\n * Creates a function that adds a namespaced prefix to log messages.\n *\n * @param namespace - The prefix to be added to log messages.\n * @returns A function that takes a log message and returns the message with the namespace prefix.\n *\n * @example\n * ```typescript\n * const namespacedLog = withNamespacedLogSpan(\"[MyApp]\");\n * console.log(namespacedLog(\"Hello, world!\")); // Output: \"[MyApp] Hello, world!\"\n * ```\n */\nexport const withNamespacedLogSpan = Logging.makeNamespacedLogSpan(\n \"[@brytdesigns/shopify-ajax-client]\"\n);\n\n/**\n * Filters log messages based on a specified log level.\n *\n * @param level - The log level to filter messages by.\n * @returns A function that takes a log message and returns the message if its level is greater than or equal to the specified level.\n *\n * @example\n * ```typescript\n * const filteredLog = filterLevelOrNever(LogLevel.INFO);\n * console.log(filteredLog(LogLevel.DEBUG, \"This message will be filtered\")); // Output: (nothing)\n * console.log(filteredLog(LogLevel.INFO, \"This message will be logged\")); // Output: \"This message will be logged\"\n * ```\n */\nexport const filterLevelOrNever = Logging.filterLevelOrNever;\n"]}
@@ -7,6 +7,9 @@ class CartError extends Data.TaggedError(
7
7
  class InvalidAjaxMethodError extends Data.TaggedError(
8
8
  "@brytdesigns/ajax-client/InvalidAjaxMethodError"
9
9
  ) {
10
+ /**
11
+ * Constructs a new instance of InvalidAjaxMethodError with a default error message.
12
+ */
10
13
  constructor() {
11
14
  super({ message: "Invalid HTTP method | Allowed: 'get' or 'post'" });
12
15
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/errors.ts"],"names":[],"mappings":";;AAMO,MAAM,kBAAkB,IAAK,CAAA,WAAA;AAAA,EAClC;AACF,CAIG,CAAA;AAAC;AAMG,MAAM,+BAA+B,IAAK,CAAA,WAAA;AAAA,EAC/C;AACF,CAEG,CAAA;AAAA,EACD,WAAc,GAAA;AACZ,IAAM,KAAA,CAAA,EAAE,OAAS,EAAA,gDAAA,EAAkD,CAAA;AAAA;AAEvE","file":"errors.js","sourcesContent":["import * as Data from \"effect/Data\";\n\n/**\n * @internal\n *\n */\nexport class CartError extends Data.TaggedError(\n \"@brytdesigns/ajax-client/CartError\",\n)<{\n status: number;\n message: string;\n description: string;\n}> {}\n\n/**\n * @internal\n *\n */\nexport class InvalidAjaxMethodError extends Data.TaggedError(\n \"@brytdesigns/ajax-client/InvalidAjaxMethodError\",\n)<{\n message: string;\n}> {\n constructor() {\n super({ message: \"Invalid HTTP method | Allowed: 'get' or 'post'\" });\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/errors.ts"],"names":[],"mappings":";;AAQO,MAAM,kBAAkB,IAAK,CAAA,WAAA;AAAA,EAClC;AACF,CAIG,CAAA;AAAC;AAQG,MAAM,+BAA+B,IAAK,CAAA,WAAA;AAAA,EAC/C;AACF,CAEG,CAAA;AAAA;AAAA;AAAA;AAAA,EAID,WAAc,GAAA;AACZ,IAAM,KAAA,CAAA,EAAE,OAAS,EAAA,gDAAA,EAAkD,CAAA;AAAA;AAEvE","file":"errors.js","sourcesContent":["import * as Data from \"effect/Data\";\n\n/**\n * Represents an error related to a cart operation.\n *\n * @extends Data.TaggedError\n * @template T - The type of the error data.\n */\nexport class CartError extends Data.TaggedError(\n \"@brytdesigns/ajax-client/CartError\"\n)<{\n status: number;\n message: string;\n description: string;\n}> {}\n\n/**\n * Represents an error when an invalid HTTP method is used.\n *\n * @extends Data.TaggedError\n * @template T - The type of the error data.\n */\nexport class InvalidAjaxMethodError extends Data.TaggedError(\n \"@brytdesigns/ajax-client/InvalidAjaxMethodError\"\n)<{\n message: string;\n}> {\n /**\n * Constructs a new instance of InvalidAjaxMethodError with a default error message.\n */\n constructor() {\n super({ message: \"Invalid HTTP method | Allowed: 'get' or 'post'\" });\n }\n}\n"]}
@@ -63,11 +63,31 @@ declare namespace Sections {
63
63
  declare namespace Ajax {
64
64
  export { Sections, Window$1 as Window$1 };
65
65
  }
66
+ /**
67
+ * Represents a response from an AJAX client.
68
+ *
69
+ * @template TData - The type of data expected in the response.
70
+ */
66
71
  export interface IAjaxClientResponse<TData = any> {
72
+ /**
73
+ * The data received from the server.
74
+ */
67
75
  data?: TData;
76
+ /**
77
+ * An error object if the request failed.
78
+ */
68
79
  error?: {
80
+ /**
81
+ * The HTTP status code of the error response.
82
+ */
69
83
  status: number;
84
+ /**
85
+ * A brief description of the error.
86
+ */
70
87
  message: string;
88
+ /**
89
+ * A more detailed description of the error.
90
+ */
71
91
  description?: string;
72
92
  };
73
93
  }
@@ -82,6 +102,24 @@ declare const ProductInputSchema: Schema.extend<Schema.Struct<{
82
102
  }>>;
83
103
  export declare const Default: import("effect/Layer").Layer<HttpClient.HttpClient, never, never>;
84
104
  export type ValidAjaxRoutes = keyof Pick<Ajax.Window.ShopifyRoutes.ShopifyRoutes, "product_url" | "products_url" | "predictive_search_url" | "product_recommendations_url" | "cart_add_url" | "cart_update_url" | "cart_url" | "cart_change_url" | "cart_clear_url">;
105
+ /**
106
+ * A factory function that creates an Effect to make AJAX requests to Shopify routes.
107
+ *
108
+ * @template RouteName - The type of Shopify route to make the request to.
109
+ * @template A - The type of input data for the request.
110
+ * @template I - The type of input data after decoding.
111
+ * @template R - The type of input data after decoding, but with additional information.
112
+ * @template B - The type of output data expected from the request.
113
+ * @template J - The type of output data after decoding.
114
+ * @template S - The type of output data after decoding, but with additional information.
115
+ *
116
+ * @param {object} params - The parameters for creating the factory function.
117
+ * @param {RouteName} params.routeName - The name of the Shopify route to make the request to.
118
+ * @param {Schema<A, I, R>} params.inputSchema - The schema for validating and decoding the input data.
119
+ * @param {Schema<B, J, S>} params.outputSchema - The schema for validating and decoding the output data.
120
+ *
121
+ * - A function that takes input data and options, and returns an Effect to make the AJAX request.
122
+ */
85
123
  export declare const makeFactory: <RouteName extends ValidAjaxRoutes, A extends RouteName extends "product_url" ? typeof ProductInputSchema.Type : typeof Ajax.Sections.Input.Type, I, R, B extends typeof BaseOutputSchema.Type, J, S>({ routeName, inputSchema, outputSchema, }: {
86
124
  routeName: RouteName;
87
125
  inputSchema: Schema.Schema<A, I, R>;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"names":["output","json","clientResponse"],"mappings":"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","file":"index.js","sourcesContent":["import * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\nimport * as Function from \"effect/Function\";\nimport * as HttpClient from \"@effect/platform/HttpClient\";\nimport * as HttpClientResponse from \"@effect/platform/HttpClientResponse\";\nimport * as HttpClientRequest from \"@effect/platform/HttpClientRequest\";\nimport * as FetchHttpClient from \"@effect/platform/FetchHttpClient\";\n\nimport { Ajax } from \"@brytdesigns/shopify-utils/effect\";\n\nimport * as LoggerUtils from \"./LoggerUtils.js\";\nimport { type CartError, InvalidAjaxMethodError } from \"./errors.js\";\nimport * as AjaxClientResponse from \"./AjaxClientResponse.js\";\n\nconst BaseOutputSchema = Schema.Struct({});\nconst ProductInputSchema = Schema.extend(\n Ajax.Sections.Input,\n Schema.Struct({\n handle: Schema.String,\n }),\n);\n\nexport const Default = FetchHttpClient.layer;\n\nconst METHOD = {\n GET: \"get\",\n POST: \"post\",\n};\n\nconst METHODS_BY_URL = {\n products_url: METHOD.GET,\n product_url: METHOD.GET,\n predictive_search_url: METHOD.GET,\n product_recommendations_url: METHOD.GET,\n cart_add_url: METHOD.POST,\n cart_update_url: METHOD.POST,\n cart_url: METHOD.GET,\n cart_change_url: METHOD.POST,\n cart_clear_url: METHOD.POST,\n};\n\ntype ValidAjaxRoutes = keyof Pick<\n Ajax.Window.ShopifyRoutes.ShopifyRoutes,\n | \"product_url\"\n | \"products_url\"\n | \"predictive_search_url\"\n | \"product_recommendations_url\"\n | \"cart_add_url\"\n | \"cart_update_url\"\n | \"cart_url\"\n | \"cart_change_url\"\n | \"cart_clear_url\"\n>;\n\nexport const makeFactory =\n <\n RouteName extends ValidAjaxRoutes,\n A extends RouteName extends \"product_url\"\n ? typeof ProductInputSchema.Type\n : typeof Ajax.Sections.Input.Type,\n I,\n R,\n B extends typeof BaseOutputSchema.Type,\n J,\n S,\n >({\n routeName,\n inputSchema,\n outputSchema,\n }: {\n routeName: RouteName;\n inputSchema: Schema.Schema<A, I, R>;\n outputSchema: Schema.Schema<B, J, S>;\n }) =>\n (\n input?: Schema.Schema<A, I, R>[\"Encoded\"],\n options?: { headers?: Record<string, string> },\n ) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const decodedInput = yield* Schema.decodeUnknown(inputSchema)(\n input || {},\n );\n const routes = Ajax.Window.ShopifyRoutes.make();\n\n let route: string;\n\n if (routeName === \"product_url\" && \"handle\" in decodedInput) {\n route = routes[routeName].replace(\":handle\", decodedInput.handle);\n } else {\n route = routes[routeName];\n }\n\n const url = `${window.location.origin}${route}`;\n const method = METHODS_BY_URL[routeName];\n\n let request: HttpClientRequest.HttpClientRequest;\n\n if (method === \"post\") {\n request = yield* HttpClientRequest.post(url, {\n acceptJson: true,\n headers: {\n \"X-SDK-Variant\": \"brytdesigns\",\n \"X-SDK-Variant-Source\": \"shopify-ajax-client\",\n ...(options?.headers || {}),\n },\n }).pipe(HttpClientRequest.bodyJson(decodedInput));\n } else if (method === \"get\") {\n request = HttpClientRequest.get(url, {\n acceptJson: true,\n headers: {\n \"X-SDK-Variant\": \"brytdesigns\",\n \"X-SK-Variant-Source\": \"shopify-ajax-client\",\n ...(options?.headers || {}),\n },\n }).pipe(HttpClientRequest.setUrlParams(decodedInput));\n } else {\n return yield* Effect.fail(new InvalidAjaxMethodError());\n }\n\n const response = yield* client.execute(request);\n\n if (response.status !== 200) {\n const data = (yield* response.json) as CartError;\n return AjaxClientResponse.make({\n error: {\n description: data.description,\n status: data.status,\n message: data.message,\n },\n });\n }\n\n if (decodedInput.sections) {\n const output = outputSchema.pipe(\n Schema.extend(\n Schema.Struct({\n sections: Ajax.Sections.makeResponseSchema(decodedInput.sections),\n }),\n ),\n );\n\n const json = yield* Function.pipe(\n response,\n HttpClientResponse.schemaBodyJson(output),\n );\n\n const clientResponse = AjaxClientResponse.make({\n data: json,\n });\n\n yield* Effect.annotateLogsScoped({\n method,\n route,\n input: decodedInput,\n output: clientResponse,\n });\n\n return clientResponse;\n }\n\n const output = outputSchema;\n\n const json = yield* Function.pipe(\n response,\n HttpClientResponse.schemaBodyJson(output),\n );\n\n const clientResponse = AjaxClientResponse.make({\n data: json,\n });\n\n yield* Effect.annotateLogsScoped({\n method,\n route,\n input: decodedInput,\n output: clientResponse,\n });\n\n yield* Effect.logInfo(\"Request\");\n\n return clientResponse;\n }).pipe(\n Effect.scoped,\n LoggerUtils.withNamespacedLogSpan(\n routeName.replace(\"_url\", \"\").replace(\"_\", \":\"),\n ),\n Effect.catchAll((error) => {\n if (\n error._tag === \"ParseError\" ||\n error._tag === \"RequestError\" ||\n error._tag === \"ResponseError\" ||\n error._tag === \"@brytdesigns/ajax-client/InvalidAjaxMethodError\"\n ) {\n return Effect.fail(\n new Error(error.message, {\n cause: error.cause,\n }),\n );\n }\n if (error._tag === \"HttpBodyError\") {\n const reason = error.reason;\n if (reason._tag === \"JsonError\") {\n return Effect.fail(new Error(\"Failed to parse JSON response\"));\n }\n if (reason._tag === \"SchemaError\") {\n return Effect.fail(\n new Error(reason.error.message, {\n cause: reason.error.cause,\n }),\n );\n }\n }\n return Effect.fail(new Error(error.toString()));\n }),\n );\n"]}
1
+ {"version":3,"sources":["../../src/index.ts"],"names":["output","json","clientResponse"],"mappings":"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","file":"index.js","sourcesContent":["import * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\nimport * as Function from \"effect/Function\";\nimport * as HttpClient from \"@effect/platform/HttpClient\";\nimport * as HttpClientResponse from \"@effect/platform/HttpClientResponse\";\nimport * as HttpClientRequest from \"@effect/platform/HttpClientRequest\";\nimport * as FetchHttpClient from \"@effect/platform/FetchHttpClient\";\n\nimport { Ajax } from \"@brytdesigns/shopify-utils/effect\";\n\nimport * as LoggerUtils from \"./LoggerUtils.js\";\nimport { type CartError, InvalidAjaxMethodError } from \"./errors.js\";\nimport * as AjaxClientResponse from \"./AjaxClientResponse.js\";\n\nconst BaseOutputSchema = Schema.Struct({});\nconst ProductInputSchema = Schema.extend(\n Ajax.Sections.Input,\n Schema.Struct({\n handle: Schema.String,\n })\n);\n\nexport const Default = FetchHttpClient.layer;\n\nconst METHOD = {\n GET: \"get\",\n POST: \"post\",\n};\n\nconst METHODS_BY_URL = {\n products_url: METHOD.GET,\n product_url: METHOD.GET,\n predictive_search_url: METHOD.GET,\n product_recommendations_url: METHOD.GET,\n cart_add_url: METHOD.POST,\n cart_update_url: METHOD.POST,\n cart_url: METHOD.GET,\n cart_change_url: METHOD.POST,\n cart_clear_url: METHOD.POST,\n};\n\ntype ValidAjaxRoutes = keyof Pick<\n Ajax.Window.ShopifyRoutes.ShopifyRoutes,\n | \"product_url\"\n | \"products_url\"\n | \"predictive_search_url\"\n | \"product_recommendations_url\"\n | \"cart_add_url\"\n | \"cart_update_url\"\n | \"cart_url\"\n | \"cart_change_url\"\n | \"cart_clear_url\"\n>;\n\n/**\n * A factory function that creates an Effect to make AJAX requests to Shopify routes.\n *\n * @template RouteName - The type of Shopify route to make the request to.\n * @template A - The type of input data for the request.\n * @template I - The type of input data after decoding.\n * @template R - The type of input data after decoding, but with additional information.\n * @template B - The type of output data expected from the request.\n * @template J - The type of output data after decoding.\n * @template S - The type of output data after decoding, but with additional information.\n *\n * @param {object} params - The parameters for creating the factory function.\n * @param {RouteName} params.routeName - The name of the Shopify route to make the request to.\n * @param {Schema<A, I, R>} params.inputSchema - The schema for validating and decoding the input data.\n * @param {Schema<B, J, S>} params.outputSchema - The schema for validating and decoding the output data.\n *\n * - A function that takes input data and options, and returns an Effect to make the AJAX request.\n */\nexport const makeFactory =\n <\n RouteName extends ValidAjaxRoutes,\n A extends RouteName extends \"product_url\"\n ? typeof ProductInputSchema.Type\n : typeof Ajax.Sections.Input.Type,\n I,\n R,\n B extends typeof BaseOutputSchema.Type,\n J,\n S,\n >({\n routeName,\n inputSchema,\n outputSchema,\n }: {\n routeName: RouteName;\n inputSchema: Schema.Schema<A, I, R>;\n outputSchema: Schema.Schema<B, J, S>;\n }) =>\n (\n input?: Schema.Schema<A, I, R>[\"Encoded\"],\n options?: { headers?: Record<string, string> }\n ) =>\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const decodedInput = yield* Schema.decodeUnknown(inputSchema)(\n input || {}\n );\n const routes = Ajax.Window.ShopifyRoutes.make();\n\n let route: string;\n\n if (routeName === \"product_url\" && \"handle\" in decodedInput) {\n route = routes[routeName].replace(\":handle\", decodedInput.handle);\n } else {\n route = routes[routeName];\n }\n\n const url = `${window.location.origin}${route}`;\n const method = METHODS_BY_URL[routeName];\n\n let request: HttpClientRequest.HttpClientRequest;\n\n if (method === \"post\") {\n request = yield* HttpClientRequest.post(url, {\n acceptJson: true,\n headers: {\n \"X-SDK-Variant\": \"brytdesigns\",\n \"X-SDK-Variant-Source\": \"shopify-ajax-client\",\n ...(options?.headers || {}),\n },\n }).pipe(HttpClientRequest.bodyJson(decodedInput));\n } else if (method === \"get\") {\n request = HttpClientRequest.get(url, {\n acceptJson: true,\n headers: {\n \"X-SDK-Variant\": \"brytdesigns\",\n \"X-SK-Variant-Source\": \"shopify-ajax-client\",\n ...(options?.headers || {}),\n },\n }).pipe(HttpClientRequest.setUrlParams(decodedInput));\n } else {\n return yield* Effect.fail(new InvalidAjaxMethodError());\n }\n\n const response = yield* client.execute(request);\n\n if (response.status !== 200) {\n const data = (yield* response.json) as CartError;\n return AjaxClientResponse.make({\n error: {\n description: data.description,\n status: data.status,\n message: data.message,\n },\n });\n }\n\n if (decodedInput.sections) {\n const output = outputSchema.pipe(\n Schema.extend(\n Schema.Struct({\n sections: Ajax.Sections.makeResponseSchema(decodedInput.sections),\n })\n )\n );\n\n const json = yield* Function.pipe(\n response,\n HttpClientResponse.schemaBodyJson(output)\n );\n\n const clientResponse = AjaxClientResponse.make({\n data: json,\n });\n\n yield* Effect.annotateLogsScoped({\n method,\n route,\n input: decodedInput,\n output: clientResponse,\n });\n\n return clientResponse;\n }\n\n const output = outputSchema;\n\n const json = yield* Function.pipe(\n response,\n HttpClientResponse.schemaBodyJson(output)\n );\n\n const clientResponse = AjaxClientResponse.make({\n data: json,\n });\n\n yield* Effect.annotateLogsScoped({\n method,\n route,\n input: decodedInput,\n output: clientResponse,\n });\n\n yield* Effect.logInfo(\"Request\");\n\n return clientResponse;\n }).pipe(\n Effect.scoped,\n LoggerUtils.withNamespacedLogSpan(\n routeName.replace(\"_url\", \"\").replace(\"_\", \":\")\n ),\n Effect.catchAll((error) => {\n if (\n error._tag === \"ParseError\" ||\n error._tag === \"RequestError\" ||\n error._tag === \"ResponseError\" ||\n error._tag === \"@brytdesigns/ajax-client/InvalidAjaxMethodError\"\n ) {\n return Effect.fail(\n new Error(error.message, {\n cause: error.cause,\n })\n );\n }\n if (error._tag === \"HttpBodyError\") {\n const reason = error.reason;\n if (reason._tag === \"JsonError\") {\n return Effect.fail(new Error(\"Failed to parse JSON response\"));\n }\n if (reason._tag === \"SchemaError\") {\n return Effect.fail(\n new Error(reason.error.message, {\n cause: reason.error.cause,\n })\n );\n }\n }\n return Effect.fail(new Error(error.toString()));\n })\n );\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brytdesigns/shopify-ajax-client",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "An AJAX cart that integrates with ALL shopify ajax apis",
5
5
  "main": "./dist/main/index.js",
6
6
  "types": "./dist/main/index.d.ts",
@@ -29,10 +29,10 @@
29
29
  "vitest": "^3.0.6"
30
30
  },
31
31
  "dependencies": {
32
- "@effect/platform": "0.90.0",
33
- "effect": "3.17.2",
32
+ "@effect/platform": "0.93.3",
33
+ "effect": "3.19.6",
34
34
  "lz-string": "^1.5.0",
35
- "@brytdesigns/shopify-utils": "1.2.17"
35
+ "@brytdesigns/shopify-utils": "1.2.19"
36
36
  },
37
37
  "scripts": {
38
38
  "build": "tsup --clean",