diff --git a/.changeset/brown-bags-complain.md b/.changeset/brown-bags-complain.md new file mode 100644 index 000000000..b32cd0be3 --- /dev/null +++ b/.changeset/brown-bags-complain.md @@ -0,0 +1,5 @@ +--- +'@bigcommerce/big-design-patterns': major +--- + +Releases `@bigcommerce/big-design-pattern`, a collections of useful patterns for BigDesign. diff --git a/.circleci/config.yml b/.circleci/config.yml index 5f11285ff..5700aa141 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -126,6 +126,13 @@ jobs: paths: - packages/docs/.next + build-patterns: + <<: *default_executor + + steps: + - pre-setup + - run: pnpm build --filter @bigcommerce/big-design-patterns + commitlint: <<: *default_executor @@ -207,6 +214,11 @@ workflows: requires: - build-icons + - build-patterns: + <<: *filter_branch + requires: + - build-icons + - build-examples: <<: *filter_branch requires: diff --git a/commitlint.config.js b/commitlint.config.js index d129dbc5b..f832f1878 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -17,6 +17,7 @@ module.exports = { 'examples', 'icons', 'pack', + 'patterns', 'release', 'theme', ], diff --git a/packages/big-design-patterns/.eslintrc.js b/packages/big-design-patterns/.eslintrc.js new file mode 100644 index 000000000..6801d147d --- /dev/null +++ b/packages/big-design-patterns/.eslintrc.js @@ -0,0 +1,5 @@ +/** @type {import('eslint').Linter.Config} */ +module.exports = { + root: true, + extends: [require.resolve('@bigcommerce/configs/eslint/base.js')], +}; diff --git a/packages/big-design-patterns/README.md b/packages/big-design-patterns/README.md new file mode 100644 index 000000000..bdec4720d --- /dev/null +++ b/packages/big-design-patterns/README.md @@ -0,0 +1,11 @@ +# BigDesign Patterns [![npm version](https://img.shields.io/npm/v/@bigcommerce/big-design-patterns.svg?style=flat)](https://www.npmjs.com/package/@bigcommerce/big-design-patterns) [![CircleCI](https://circleci.com/gh/bigcommerce/big-design.svg?style=shield)](https://circleci.com/gh/bigcommerce/big-design) + +BigDesign React Patterns. + +### Documentation + +You can find documentation and examples on our [docs page](https://bigcommerce.github.io/big-design). + +### Quick start guide + +TODO: Write the quick start guide. diff --git a/packages/big-design-patterns/babel.config.js b/packages/big-design-patterns/babel.config.js new file mode 100644 index 000000000..03db3a4ac --- /dev/null +++ b/packages/big-design-patterns/babel.config.js @@ -0,0 +1 @@ +module.exports = require('@bigcommerce/configs/babel'); diff --git a/packages/big-design-patterns/jest.config.js b/packages/big-design-patterns/jest.config.js new file mode 100644 index 000000000..e2eeb479c --- /dev/null +++ b/packages/big-design-patterns/jest.config.js @@ -0,0 +1,14 @@ +const defaultJestConfig = require('@bigcommerce/configs/jest'); + +module.exports = { + ...defaultJestConfig, + setupFilesAfterEnv: ['/setupTests.ts'], + coverageThreshold: { + global: { + statements: 100, + branches: 100, + functions: 100, + lines: 100, + }, + }, +}; diff --git a/packages/big-design-patterns/package.json b/packages/big-design-patterns/package.json new file mode 100644 index 000000000..522a37b67 --- /dev/null +++ b/packages/big-design-patterns/package.json @@ -0,0 +1,85 @@ +{ + "name": "@bigcommerce/big-design-patterns", + "version": "0.1.0", + "sideEffects": false, + "main": "src/index.ts", + "author": "BigCommerce Inc", + "repository": { + "type": "git", + "url": "https://github.com/bigcommerce/big-design.git", + "directory": "packages/big-design-patterns" + }, + "license": "(MIT AND CC-BY-3.0)", + "files": [ + "dist" + ], + "scripts": { + "build": "pnpm run build:cjs && pnpm run build:es && pnpm run build:dt", + "build:cjs": "NODE_ENV=production BABEL_ENV=cjs babel --extensions \".ts,.tsx\" ./src --out-dir ./dist/cjs", + "build:es": "NODE_ENV=production BABEL_ENV=es babel --extensions \".ts,.tsx\" ./src --out-dir ./dist/es", + "build:dt": "tsc -p tsconfig.declarations.json --emitDeclarationOnly", + "lint": "eslint . --max-warnings 0", + "test": "jest", + "test:watch": "pnpm run test --watch", + "prepack": "big-design-prepack", + "postpack": "big-design-postpack", + "typecheck": "tsc --noEmit" + }, + "publishConfig": { + "access": "public", + "main": "dist/cjs/index.js", + "module": "dist/es/index.js", + "typings": "dist/index.d.ts" + }, + "prettier": "@bigcommerce/eslint-config/prettier", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "peerDependencies": { + "@bigcommerce/big-design": "workspace:^", + "@bigcommerce/big-design-icons": "workspace:^", + "@bigcommerce/big-design-theme": "workspace:^", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "styled-components": "^5.3.5" + }, + "devDependencies": { + "@babel/cli": "^7.24.1", + "@babel/core": "^7.24.4", + "@babel/plugin-transform-runtime": "^7.24.3", + "@babel/preset-env": "^7.24.4", + "@babel/preset-react": "^7.24.7", + "@babel/preset-typescript": "^7.24.7", + "@bigcommerce/big-design": "workspace:^", + "@bigcommerce/big-design-icons": "workspace:^", + "@bigcommerce/big-design-theme": "workspace:^", + "@bigcommerce/configs": "workspace:^", + "@bigcommerce/pack": "workspace:^", + "@styled/typescript-styled-plugin": "^1.0.1", + "@swc/core": "^1.4.14", + "@swc/jest": "^0.2.36", + "@swc/plugin-styled-components": "^2.0.6", + "@testing-library/dom": "^10.3.1", + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.3.0", + "@types/jest": "^29.4.0", + "@types/node": "^20.12.7", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/react-test-renderer": "^18.0.7", + "@types/styled-components": "^5.1.34", + "babel-jest": "^29.0.2", + "babel-plugin-styled-components": "^2.0.7", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.4.1", + "jest-fail-on-console": "^3.2.0", + "jest-styled-components": "^7.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-test-renderer": "^18.2.0", + "rimraf": "^6.0.1", + "styled-components": "^5.3.11", + "typescript": "^5.4.5" + } +} diff --git a/packages/big-design-patterns/setupTests.ts b/packages/big-design-patterns/setupTests.ts new file mode 100644 index 000000000..5b070a7d2 --- /dev/null +++ b/packages/big-design-patterns/setupTests.ts @@ -0,0 +1,13 @@ +import '@testing-library/jest-dom'; +import failOnConsole from 'jest-fail-on-console'; + +failOnConsole(); + +jest.mock('./src/utils', () => ({ + ...jest.requireActual('./src/utils'), + warning: jest.fn(), +})); + +afterEach(() => { + jest.clearAllMocks(); +}); diff --git a/packages/big-design-patterns/src/index.ts b/packages/big-design-patterns/src/index.ts new file mode 100644 index 000000000..e69de29bb diff --git a/packages/big-design-patterns/src/utils/env.ts b/packages/big-design-patterns/src/utils/env.ts new file mode 100644 index 000000000..cd6b0bf95 --- /dev/null +++ b/packages/big-design-patterns/src/utils/env.ts @@ -0,0 +1 @@ +export const isProduction = process.env.NODE_ENV === 'production'; diff --git a/packages/big-design-patterns/src/utils/index.ts b/packages/big-design-patterns/src/utils/index.ts new file mode 100644 index 000000000..492c894ac --- /dev/null +++ b/packages/big-design-patterns/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './env'; +export * from './warning'; diff --git a/packages/big-design-patterns/src/utils/warning/index.ts b/packages/big-design-patterns/src/utils/warning/index.ts new file mode 100644 index 000000000..2909efce6 --- /dev/null +++ b/packages/big-design-patterns/src/utils/warning/index.ts @@ -0,0 +1 @@ +export { warning } from './warning'; diff --git a/packages/big-design-patterns/src/utils/warning/spec.ts b/packages/big-design-patterns/src/utils/warning/spec.ts new file mode 100644 index 000000000..de49f8fea --- /dev/null +++ b/packages/big-design-patterns/src/utils/warning/spec.ts @@ -0,0 +1,18 @@ +import { warning } from './warning'; + +jest.mock('./warning', () => ({ + ...jest.requireActual('./warning'), +})); + +test('warning should throw a console.error', () => { + jest.spyOn(console, 'warn').mockImplementation(); + warning('test error'); + + // eslint-disable-next-line no-console + expect(console.warn).toHaveBeenCalledTimes(1); + + warning('test error'); + + // eslint-disable-next-line no-console + expect(console.warn).toHaveBeenCalledTimes(2); +}); diff --git a/packages/big-design-patterns/src/utils/warning/warning.ts b/packages/big-design-patterns/src/utils/warning/warning.ts new file mode 100644 index 000000000..d26924e4e --- /dev/null +++ b/packages/big-design-patterns/src/utils/warning/warning.ts @@ -0,0 +1,32 @@ +import { isProduction } from '../env'; + +// Ported from tiny-warning: +// https://github.com/alexreardon/tiny-warning/blob/master/src/index.js +// -------------------------------------------- +// Since we don't care about whether or not there is a condition passed +// we modified the original to account for that. + +export const warning = (message: string): void => { + // don't do anything in production + // wrapping in production check for better dead code elimination + if (!isProduction) { + // Condition not passed + const text = `Warning: ${message}`; + + // check console for IE9 support which provides console + // only with open devtools + if (typeof console !== 'undefined') { + // eslint-disable-next-line no-console + console.warn(text); + } + + // Throwing an error and catching it immediately + // to improve debugging + // A consumer can use 'pause on caught exceptions' + // https://github.com/facebook/react/issues/4216 + try { + throw Error(text); + // eslint-disable-next-line no-empty + } catch (x) {} + } +}; diff --git a/packages/big-design-patterns/tsconfig.declarations.json b/packages/big-design-patterns/tsconfig.declarations.json new file mode 100644 index 000000000..8866ceaf2 --- /dev/null +++ b/packages/big-design-patterns/tsconfig.declarations.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"], + "exclude": [ + "node_modules", + "dist", + "tests", + "src/**/spec.ts", + "src/**/spec.tsx" + ] +} diff --git a/packages/big-design-patterns/tsconfig.json b/packages/big-design-patterns/tsconfig.json new file mode 100644 index 000000000..86a944bff --- /dev/null +++ b/packages/big-design-patterns/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@bigcommerce/configs/ts", + "compilerOptions": { + "baseUrl": ".", + "declaration": true, + "declarationDir": "dist", + "declarationMap": true, + "paths": {} + }, + "include": ["src", "setupTests.ts", "tests"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f69a335e1..b3f5468f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -278,6 +278,124 @@ importers: specifier: ^5.4.5 version: 5.5.4 + packages/big-design-patterns: + dependencies: + '@babel/runtime': + specifier: ^7.24.4 + version: 7.25.0 + devDependencies: + '@babel/cli': + specifier: ^7.24.1 + version: 7.24.1(@babel/core@7.25.2) + '@babel/core': + specifier: ^7.24.4 + version: 7.25.2 + '@babel/plugin-transform-runtime': + specifier: ^7.24.3 + version: 7.24.3(@babel/core@7.25.2) + '@babel/preset-env': + specifier: ^7.24.4 + version: 7.25.3(@babel/core@7.25.2) + '@babel/preset-react': + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) + '@babel/preset-typescript': + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) + '@bigcommerce/big-design': + specifier: workspace:^ + version: link:../big-design + '@bigcommerce/big-design-icons': + specifier: workspace:^ + version: link:../big-design-icons + '@bigcommerce/big-design-theme': + specifier: workspace:^ + version: link:../big-design-theme + '@bigcommerce/configs': + specifier: workspace:^ + version: link:../configs + '@bigcommerce/pack': + specifier: workspace:^ + version: link:../pack + '@styled/typescript-styled-plugin': + specifier: ^1.0.1 + version: 1.0.1 + '@swc/core': + specifier: ^1.4.14 + version: 1.4.14 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.14) + '@swc/plugin-styled-components': + specifier: ^2.0.6 + version: 2.0.6 + '@testing-library/dom': + specifier: ^10.3.1 + version: 10.4.0 + '@testing-library/jest-dom': + specifier: ^6.4.2 + version: 6.4.2(@types/jest@29.5.12)(jest@29.7.0) + '@testing-library/react': + specifier: ^16.0.0 + version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.23)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@testing-library/user-event': + specifier: ^14.3.0 + version: 14.5.2(@testing-library/dom@10.4.0) + '@types/jest': + specifier: ^29.4.0 + version: 29.5.12 + '@types/node': + specifier: ^20.12.7 + version: 20.14.11 + '@types/react': + specifier: ^18.2.73 + version: 18.2.73 + '@types/react-dom': + specifier: ^18.2.23 + version: 18.2.23 + '@types/react-test-renderer': + specifier: ^18.0.7 + version: 18.3.0 + '@types/styled-components': + specifier: ^5.1.34 + version: 5.1.34 + babel-jest: + specifier: ^29.0.2 + version: 29.7.0(@babel/core@7.25.2) + babel-plugin-styled-components: + specifier: ^2.0.7 + version: 2.1.4(@babel/core@7.25.2)(styled-components@5.3.11)(supports-color@5.5.0) + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.14.11) + jest-environment-jsdom: + specifier: ^29.4.1 + version: 29.7.0 + jest-fail-on-console: + specifier: ^3.2.0 + version: 3.2.0 + jest-styled-components: + specifier: ^7.1.1 + version: 7.2.0(styled-components@5.3.11) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-test-renderer: + specifier: ^18.2.0 + version: 18.3.1(react@18.2.0) + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + styled-components: + specifier: ^5.3.11 + version: 5.3.11(@babel/core@7.25.2)(react-dom@18.2.0)(react-is@18.3.1)(react@18.2.0) + typescript: + specifier: ^5.4.5 + version: 5.5.4 + packages/big-design-theme: dependencies: '@babel/runtime': @@ -618,7 +736,7 @@ packages: dependencies: '@babel/compat-data': 7.25.2 '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.2 + browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 @@ -5603,16 +5721,6 @@ packages: dependencies: fill-range: 7.1.1 - /browserslist@4.23.2: - resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001651 - electron-to-chromium: 1.5.13 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.2) - /browserslist@4.23.3: resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -5622,7 +5730,6 @@ packages: electron-to-chromium: 1.5.13 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) - dev: true /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -12894,16 +13001,6 @@ packages: engines: {node: '>=4'} dev: true - /update-browserslist-db@1.1.0(browserslist@4.23.2): - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.23.2 - escalade: 3.1.2 - picocolors: 1.0.1 - /update-browserslist-db@1.1.0(browserslist@4.23.3): resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true @@ -12913,7 +13010,6 @@ packages: browserslist: 4.23.3 escalade: 3.1.2 picocolors: 1.0.1 - dev: true /uri-js@4.2.2: resolution: {integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==}