diff --git a/packages/opencommerce/.env.template b/packages/opencommerce/.env.template new file mode 100644 index 000000000..424ac8ff2 --- /dev/null +++ b/packages/opencommerce/.env.template @@ -0,0 +1,3 @@ +COMMERCE_PROVIDER=shopify + +OPENCOMMERCE_STOREFRONT_API_URL= \ No newline at end of file diff --git a/packages/opencommerce/.prettierignore b/packages/opencommerce/.prettierignore new file mode 100644 index 000000000..f06235c46 --- /dev/null +++ b/packages/opencommerce/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/opencommerce/.prettierrc b/packages/opencommerce/.prettierrc new file mode 100644 index 000000000..e1076edfa --- /dev/null +++ b/packages/opencommerce/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/opencommerce/package.json b/packages/opencommerce/package.json new file mode 100644 index 000000000..6cfa24bd5 --- /dev/null +++ b/packages/opencommerce/package.json @@ -0,0 +1,79 @@ +{ + "name": "@vercel/commerce-opencommerce", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write ." + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/commerce": "^0.0.1", + "@vercel/fetch": "^6.1.1" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/opencommerce/src/api/endpoints/cart.ts b/packages/opencommerce/src/api/endpoints/cart.ts new file mode 100644 index 000000000..d09c976c3 --- /dev/null +++ b/packages/opencommerce/src/api/endpoints/cart.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/opencommerce/src/api/index.ts b/packages/opencommerce/src/api/index.ts new file mode 100644 index 000000000..09ecf45c2 --- /dev/null +++ b/packages/opencommerce/src/api/index.ts @@ -0,0 +1,40 @@ +import { + CommerceAPI, + CommerceAPIConfig, + getCommerceApi as commerceApi, +} from '@vercel/commerce/api' +import createFetchGraphqlApi from './utils/fetch-grapql-api' + +const API_URL = process.env.OPENCOMMERCE_STOREFRONT_API_URL + +if (!API_URL) { + throw new Error( + `The environment variable OPENCOMMERCE_STOREFRONT_API_URL is missing and it's required to access your store` + ) +} + +export interface OpenCommerceConfig extends CommerceAPIConfig {} + +const ONE_DAY = 60 * 60 * 24 + +const config: OpenCommerceConfig = { + commerceUrl: `${API_URL}/graphql`, + apiToken: '', + customerCookie: 'opencommerce_customerToken', + cartCookie: 'opencommerce_cartId', + cartCookieMaxAge: ONE_DAY * 30, + fetch: createFetchGraphqlApi(() => getCommerceApi().getConfig()), +} + +const operations = {} +export const provider = { config, operations } + +export type Provider = typeof provider + +export type OpenCommerceAPI
= CommerceAPI
+ +export function getCommerceApi
( + customProvider: P = provider as any +): OpenCommerceAPI
{
+ return commerceApi(customProvider)
+}
diff --git a/packages/opencommerce/src/api/operations/get-all-products.ts b/packages/opencommerce/src/api/operations/get-all-products.ts
new file mode 100644
index 000000000..e0491f3b9
--- /dev/null
+++ b/packages/opencommerce/src/api/operations/get-all-products.ts
@@ -0,0 +1,59 @@
+import type {
+ OperationContext,
+ OperationOptions,
+} from '@vercel/commerce/api/operations'
+import { GetAllProductsOperation } from '../../types/product'
+import {
+ GetAllProductsQuery,
+ GetAllProductsQueryVariables,
+ Product as ShopifyProduct,
+} from '../../../schema'
+import type { ShopifyConfig, Provider } from '..'
+import getAllProductsQuery from '../../utils/queries/get-all-products-query'
+import { normalizeProduct } from '../../utils'
+
+export default function getAllProductsOperation({
+ commerce,
+}: OperationContext