woocommerce/plugins/woocommerce-blocks/bin/webpack-entries.js

257 lines
7.5 KiB
JavaScript

/**
* External dependencies
*/
const { omit } = require( 'lodash' );
const glob = require( 'glob' );
// List of blocks that should be used as webpack entry points. They are expected
// to be in `/assets/js/blocks/[BLOCK_NAME]`. If they are not, their relative
// path should be defined in the `customDir` property. The scripts below will
// take care of looking for `index.js`, `frontend.js` and `*.scss` files in each
// block directory.
// If a block is experimental, it should be marked with the `isExperimental`
// property.
const blocks = {
'active-filters': {},
'add-to-cart-form': {},
'all-products': {
customDir: 'products/all-products',
},
'all-reviews': {
customDir: 'reviews/all-reviews',
},
'attribute-filter': {},
breadcrumbs: {},
cart: {},
'catalog-sorting': {},
checkout: {},
'customer-account': {},
'featured-category': {
customDir: 'featured-items/featured-category',
},
'featured-product': {
customDir: 'featured-items/featured-product',
},
'filter-wrapper': {},
'handpicked-products': {},
// We need to keep the legacy-template id, so we need to add a custom config to point to the renamed classic-template folder
'legacy-template': {
customDir: 'classic-template',
},
'classic-shortcode': {},
'mini-cart': {},
'mini-cart-contents': {
customDir: 'mini-cart/mini-cart-contents',
},
'store-notices': {},
'page-content-wrapper': {},
'price-filter': {},
'product-best-sellers': {},
'product-category': {},
'product-categories': {},
'product-collection': {},
'product-collection-no-results': {
customDir: 'product-collection/inner-blocks/no-results',
},
'product-gallery': {
isExperimental: true,
},
'product-gallery-large-image': {
customDir: 'product-gallery/inner-blocks/product-gallery-large-image',
isExperimental: true,
},
'product-gallery-large-image-next-previous': {
customDir:
'product-gallery/inner-blocks/product-gallery-large-image-next-previous',
isExperimental: true,
},
'product-gallery-pager': {
customDir: 'product-gallery/inner-blocks/product-gallery-pager',
isExperimental: true,
},
'product-gallery-thumbnails': {
customDir: 'product-gallery/inner-blocks/product-gallery-thumbnails',
isExperimental: true,
},
'product-new': {},
'product-on-sale': {},
'product-query': {},
'product-results-count': {},
'product-search': {},
'product-tag': {},
'product-template': {},
'product-top-rated': {},
'products-by-attribute': {},
'rating-filter': {},
'product-average-rating': {},
'product-rating-stars': {},
'product-rating-counter': {},
'reviews-by-category': {
customDir: 'reviews/reviews-by-category',
},
'reviews-by-product': {
customDir: 'reviews/reviews-by-product',
},
'single-product': {},
'stock-filter': {},
'collection-filters': {
isExperimental: true,
},
'collection-stock-filter': {
isExperimental: true,
customDir: 'collection-filters/inner-blocks/stock-filter',
},
'collection-price-filter': {
customDir: 'collection-filters/inner-blocks/price-filter',
isExperimental: true,
},
'collection-attribute-filter': {
customDir: 'collection-filters/inner-blocks/attribute-filter',
isExperimental: true,
},
'order-confirmation-summary': {
customDir: 'order-confirmation/summary',
},
'order-confirmation-totals-wrapper': {
customDir: 'order-confirmation/totals-wrapper',
},
'order-confirmation-totals': {
customDir: 'order-confirmation/totals',
},
'order-confirmation-downloads-wrapper': {
customDir: 'order-confirmation/downloads-wrapper',
},
'order-confirmation-downloads': {
customDir: 'order-confirmation/downloads',
},
'order-confirmation-billing-address': {
customDir: 'order-confirmation/billing-address',
},
'order-confirmation-shipping-address': {
customDir: 'order-confirmation/shipping-address',
},
'order-confirmation-billing-wrapper': {
customDir: 'order-confirmation/billing-wrapper',
},
'order-confirmation-shipping-wrapper': {
customDir: 'order-confirmation/shipping-wrapper',
},
'order-confirmation-status': {
customDir: 'order-confirmation/status',
},
'order-confirmation-additional-information': {
customDir: 'order-confirmation/additional-information',
},
};
// Returns the entries for each block given a relative path (ie: `index.js`,
// `**/*.scss`...).
// It also filters out elements with undefined props and experimental blocks.
const getBlockEntries = ( relativePath ) => {
const experimental =
! parseInt( process.env.WOOCOMMERCE_BLOCKS_PHASE, 10 ) < 3;
return Object.fromEntries(
Object.entries( blocks )
.filter(
( [ , config ] ) =>
! config.isExperimental ||
config.isExperimental === experimental
)
.map( ( [ blockCode, config ] ) => {
const filePaths = glob.sync(
`./assets/js/blocks/${ config.customDir || blockCode }/` +
relativePath
);
if ( filePaths.length > 0 ) {
return [ blockCode, filePaths ];
}
return null;
} )
.filter( Boolean )
);
};
const entries = {
styling: {
// Packages styles
'packages-style': glob.sync( './packages/**/index.{t,j}s' ),
// Shared blocks code
'wc-blocks': './assets/js/index.js',
// Blocks
'product-image-gallery':
'./assets/js/atomic/blocks/product-elements/product-image-gallery/index.ts',
'product-reviews':
'./assets/js/atomic/blocks/product-elements/product-reviews/index.tsx',
'product-details':
'./assets/js/atomic/blocks/product-elements/product-details/index.tsx',
'add-to-cart-form':
'./assets/js/atomic/blocks/product-elements/add-to-cart-form/index.tsx',
...getBlockEntries( '{index,block,frontend}.{t,j}s{,x}' ),
// Templates
'wc-blocks-classic-template-revert-button-style':
'./assets/js/templates/revert-button/index.tsx',
},
core: {
wcBlocksRegistry: './assets/js/blocks-registry/index.js',
wcSettings: './assets/js/settings/shared/index.ts',
wcBlocksData: './assets/js/data/index.ts',
wcBlocksMiddleware: './assets/js/middleware/index.js',
wcBlocksSharedContext: './assets/js/shared/context/index.js',
wcBlocksSharedHocs: './assets/js/shared/hocs/index.js',
priceFormat: './packages/prices/index.js',
blocksCheckout: './packages/checkout/index.js',
blocksComponents: './packages/components/index.ts',
// interactivity components, exported as separate entries for now
'wc-interactivity-dropdown':
'./packages/interactivity-components/dropdown/index.ts',
},
main: {
// Shared blocks code
'wc-blocks': './assets/js/index.js',
// Blocks
...getBlockEntries( 'index.{t,j}s{,x}' ),
},
frontend: {
reviews: './assets/js/blocks/reviews/frontend.ts',
...getBlockEntries( 'frontend.{t,j}s{,x}' ),
'mini-cart-component':
'./assets/js/blocks/mini-cart/component-frontend.tsx',
'product-button-interactivity':
'./assets/js/atomic/blocks/product-elements/button/frontend.tsx',
},
payments: {
'wc-payment-method-cheque':
'./assets/js/extensions/payment-methods/cheque/index.js',
'wc-payment-method-paypal':
'./assets/js/extensions/payment-methods/paypal/index.js',
'wc-payment-method-bacs':
'./assets/js/extensions/payment-methods/bacs/index.js',
'wc-payment-method-cod':
'./assets/js/extensions/payment-methods/cod/index.js',
},
extensions: {
'wc-blocks-google-analytics':
'./assets/js/extensions/google-analytics/index.ts',
'wc-shipping-method-pickup-location':
'./assets/js/extensions/shipping-methods/pickup-location/index.js',
},
editor: {
'wc-blocks-classic-template-revert-button':
'./assets/js/templates/revert-button/index.tsx',
},
};
const getEntryConfig = ( type = 'main', exclude = [] ) => {
return omit( entries[ type ], exclude );
};
module.exports = {
getEntryConfig,
};