Skip to content

Commit

Permalink
Update master to work with multiple Vercel projects (vercel#237)
Browse files Browse the repository at this point in the history
* Moved configs

* Delete with-config.js

* Added log for configs

* Update TS config based on the selected provider

* set tsconfig to bigcommerce

* Updated readme instructions on provider config

* Added new commerce variable

* Change the default of updateTSConfig

Co-authored-by: B <[email protected]>
  • Loading branch information
lfades and okbel authored Mar 29, 2021
1 parent b5ba5e7 commit f770ad7
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 65 deletions.
3 changes: 3 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Available providers: bigcommerce, shopify
COMMERCE_PROVIDER=bigcommerce

BIGCOMMERCE_STOREFRONT_API_URL=
BIGCOMMERCE_STOREFRONT_API_TOKEN=
BIGCOMMERCE_STORE_API_URL=
Expand Down
21 changes: 1 addition & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,25 +71,7 @@ Next.js Commerce provides a set of utilities and functions to create new provide

### How to change providers

First, update the provider selected in `commerce.config.json`:

```json
{
"provider": "bigcommerce",
"features": {
"wishlist": true
}
}
```

Then, change the paths defined in `tsconfig.json` and update the `@framework` paths to point to the right folder provider:

```json
"@framework": ["framework/bigcommerce"],
"@framework/*": ["framework/bigcommerce/*"]
```

Make sure to add the environment variables required by the new provider.
Open `.env.local` and change the value of `COMMERCE_PROVIDER` to the provider you would like to use, then set the environment variables for that provider (use `.env.template` as the base).

### Features

Expand All @@ -103,7 +85,6 @@ Every provider defines the features that it supports under `framework/{provider}
- You'll see a config file like this:
```json
{
"provider": "bigcommerce",
"features": {
"wishlist": false
}
Expand Down
1 change: 0 additions & 1 deletion commerce.config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
{
"provider": "bigcommerce",
"features": {
"wishlist": true,
"customCheckout": false
Expand Down
66 changes: 66 additions & 0 deletions framework/commerce/config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/**
* This file is expected to be used in next.config.js only
*/

const path = require('path')
const fs = require('fs')
const merge = require('deepmerge')
const prettier = require('prettier')

const PROVIDERS = ['bigcommerce', 'shopify']

function getProviderName() {
return (
process.env.COMMERCE_PROVIDER ||
(process.env.BIGCOMMERCE_STOREFRONT_API_URL
? 'bigcommerce'
: process.env.NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN
? 'shopify'
: null)
)
}

function withCommerceConfig(nextConfig = {}) {
const commerce = nextConfig.commerce || {}
const name = commerce.provider || getProviderName()

if (!name) {
throw new Error(
`The commerce provider is missing, please add a valid provider name or its environment variables`
)
}
if (!PROVIDERS.includes(name)) {
throw new Error(
`The commerce provider "${name}" can't be found, please use one of "${PROVIDERS.join(
', '
)}"`
)
}

const commerceNextConfig = require(path.join('../', name, 'next.config'))
const config = merge(commerceNextConfig, nextConfig)

config.env = config.env || {}

Object.entries(config.commerce.features).forEach(([k, v]) => {
if (v) config.env[`COMMERCE_${k.toUpperCase()}_ENABLED`] = true
})

// Update paths in `tsconfig.json` to point to the selected provider
if (config.commerce.updateTSConfig !== false) {
const tsconfigPath = path.join(process.cwd(), 'tsconfig.json')
const tsconfig = require(tsconfigPath)

tsconfig.compilerOptions.paths['@framework'] = [`framework/${name}`]
tsconfig.compilerOptions.paths['@framework/*'] = [`framework/${name}/*`]

fs.writeFileSync(
tsconfigPath,
prettier.format(JSON.stringify(tsconfig), { parser: 'json' })
)
}

return config
}

module.exports = { withCommerceConfig, getProviderName }
41 changes: 0 additions & 41 deletions framework/commerce/with-config.js

This file was deleted.

13 changes: 10 additions & 3 deletions next.config.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
const commerce = require('./commerce.config.json')
const withCommerceConfig = require('./framework/commerce/with-config')
const {
withCommerceConfig,
getProviderName,
} = require('./framework/commerce/config')

const isBC = commerce.provider === 'bigcommerce'
const isShopify = commerce.provider === 'shopify'
const provider = commerce.provider || getProviderName()
const isBC = provider === 'bigcommerce'
const isShopify = provider === 'shopify'

module.exports = withCommerceConfig({
commerce,
Expand Down Expand Up @@ -39,3 +43,6 @@ module.exports = withCommerceConfig({
].filter((x) => x)
},
})

// Don't delete this console log, useful to see the commerce config in Vercel deployments
console.log('next.config.js', JSON.stringify(module.exports, null, 2))

0 comments on commit f770ad7

Please sign in to comment.