├── packages └── universal │ ├── jest │ └── setupTests.ts │ ├── .prettierrc │ ├── src │ └── components │ │ ├── Button │ │ ├── lib │ │ │ ├── Button.d.ts │ │ │ ├── Button.js.map │ │ │ └── Button.js │ │ ├── tsconfig.json │ │ ├── src │ │ │ ├── Button.stories.tsx │ │ │ └── Button.tsx │ │ └── package.json │ │ └── Welcome │ │ ├── lib │ │ ├── Welcome.d.ts │ │ ├── Welcome.js.map │ │ └── Welcome.js │ │ ├── tsconfig.json │ │ ├── src │ │ ├── Welcome.tsx │ │ └── Welcome.stories.tsx │ │ └── package.json │ ├── universal.ts │ ├── README.md │ ├── templates │ └── component │ │ ├── component.tsx.hbs │ │ ├── tsconfig.json.hbs │ │ ├── component.stories.tsx.hbs │ │ └── package.json.hbs │ ├── lib │ ├── universal.js.map │ └── universal.js │ ├── .stylelintrc │ ├── tsconfig.json │ ├── jest.config.js │ ├── babel.config.js │ ├── .storybook │ └── main.js │ ├── .eslintrc │ ├── plopfile.js │ └── package.json ├── lerna.json ├── package.json ├── .gitignore └── README.md /packages/universal/jest/setupTests.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/universal/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } 5 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "independent", 3 | "npmClient": "yarn", 4 | "useWorkspaces": true, 5 | "packages": ["packages/**"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/universal/src/components/Button/lib/Button.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare function Button(): JSX.Element; 3 | export default Button; 4 | -------------------------------------------------------------------------------- /packages/universal/src/components/Welcome/lib/Welcome.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare function Welcome(): JSX.Element; 3 | export default Welcome; 4 | -------------------------------------------------------------------------------- /packages/universal/universal.ts: -------------------------------------------------------------------------------- 1 | /* INJECT_IMPORT */ 2 | export { default as Button } from './src/components/Button'; 3 | export { default as Welcome } from './src/components/Welcome'; 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "root", 3 | "private": true, 4 | "devDependencies": { 5 | "lerna": "^3.13.4" 6 | }, 7 | "workspaces": [ 8 | "packages/**" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /packages/universal/README.md: -------------------------------------------------------------------------------- 1 | # `universal` 2 | 3 | > TODO: description 4 | 5 | ## Usage 6 | 7 | ``` 8 | const universal = require('universal'); 9 | 10 | // TODO: DEMONSTRATE API 11 | ``` 12 | -------------------------------------------------------------------------------- /packages/universal/templates/component/component.tsx.hbs: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | function {{pascalCase name}}() { 4 | return
{{pascalCase name}}
; 5 | } 6 | 7 | export default {{pascalCase name}}; 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vscode/ 3 | node_modules/ 4 | build 5 | .DS_Store 6 | *.tgz 7 | my-app* 8 | template/src/__tests__/__snapshots__/ 9 | lerna-debug.log 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | /.changelog 14 | .npm/ 15 | -------------------------------------------------------------------------------- /packages/universal/src/components/Button/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "rootDir": "src", 6 | "outDir": "lib", 7 | "declarationDir": "lib" 8 | }, 9 | "include": ["src"] 10 | } 11 | -------------------------------------------------------------------------------- /packages/universal/templates/component/tsconfig.json.hbs: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "rootDir": "src", 6 | "outDir": "lib", 7 | "declarationDir": "lib" 8 | }, 9 | "include": ["src"] 10 | } -------------------------------------------------------------------------------- /packages/universal/src/components/Welcome/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json", 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "rootDir": "src", 6 | "outDir": "lib", 7 | "declarationDir": "lib" 8 | }, 9 | "include": ["src"] 10 | } 11 | -------------------------------------------------------------------------------- /packages/universal/templates/component/component.stories.tsx.hbs: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { storiesOf } from '@storybook/react'; 3 | import {{pascalCase name}} from './{{pascalCase name}}'; 4 | 5 | storiesOf('{{pascalCase name}}', module).add('Storybook', () => <{{pascalCase name}} />); 6 | -------------------------------------------------------------------------------- /packages/universal/lib/universal.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../universal.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA;;AACA","sourcesContent":["/* INJECT_IMPORT */\nexport { default as Button } from './src/components/Button';\nexport { default as Welcome } from './src/components/Welcome';\n"],"file":"universal.js"} -------------------------------------------------------------------------------- /packages/universal/src/components/Welcome/src/Welcome.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styled from 'styled-components/native'; 3 | 4 | const StyledText = styled.Text` 5 | color: black; 6 | `; 7 | 8 | function Welcome() { 9 | return Welcome; 10 | } 11 | 12 | export default Welcome; 13 | -------------------------------------------------------------------------------- /packages/universal/src/components/Welcome/src/Welcome.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Welcome from './Welcome'; 3 | 4 | export default { 5 | title: 'Welcome', 6 | component: Welcome, 7 | }; 8 | 9 | export const ToStorybook = () => ; 10 | 11 | ToStorybook.story = { 12 | name: 'to Storybook', 13 | }; 14 | -------------------------------------------------------------------------------- /packages/universal/src/components/Button/src/Button.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { action } from '@storybook/addon-actions'; 3 | import Button from './Button'; 4 | 5 | export default { 6 | title: 'Button', 7 | component: Button, 8 | }; 9 | 10 | export const Text = () => ; 11 | -------------------------------------------------------------------------------- /packages/universal/.stylelintrc: -------------------------------------------------------------------------------- 1 | { 2 | "processors": ["stylelint-processor-styled-components"], 3 | "extends": [ 4 | "stylelint-config-recommended", 5 | "stylelint-config-styled-components", 6 | "stylelint-config-prettier" 7 | ], 8 | "plugins": ["stylelint-order"], 9 | "rules": { 10 | "order/properties-alphabetical-order": true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/universal/src/components/Button/src/Button.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react'; 2 | 3 | interface Props { 4 | onClick?: () => void; 5 | children: ReactNode; 6 | } 7 | 8 | function Button({ onClick, children }: Props) { 9 | return ( 10 | 13 | ); 14 | } 15 | 16 | export default Button; 17 | -------------------------------------------------------------------------------- /packages/universal/src/components/Welcome/lib/Welcome.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/Welcome.tsx"],"names":["StyledText","styled","Text","Welcome"],"mappings":";;;;;;;AAAA;;AACA;;;;AAEA,MAAMA,UAAU,GAAGC,gBAAOC,IAAV;AAAA;AAAA;AAAA,0CAAhB;;AAKA,SAASC,OAAT,GAAmB;AACjB,SAAO,6BAAC,UAAD,kBAAP;AACD;;eAEcA,O","sourcesContent":["import React from 'react';\nimport styled from 'styled-components/native';\n\nconst StyledText = styled.Text`\n background-color: gray;\n color: black;\n`;\n\nfunction Welcome() {\n return Welcome;\n}\n\nexport default Welcome;\n"],"file":"Welcome.js"} -------------------------------------------------------------------------------- /packages/universal/src/components/Button/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@universal/button", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "main": "lib/Button.js", 6 | "types": "lib/Button.d.ts", 7 | "scripts": { 8 | "build:es": "BABEL_ENV=build babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", 9 | "build:es:watch": "BABEL_ENV=build babel src --root-mode upward --watch --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", 10 | "build:types": "tsc --project tsconfig.json --noEmit false --emitDeclarationOnly" 11 | }, 12 | "files": [ 13 | "lib" 14 | ] 15 | } -------------------------------------------------------------------------------- /packages/universal/src/components/Welcome/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@universal/welcome", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "main": "lib/Welcome.js", 6 | "types": "lib/Welcome.d.ts", 7 | "scripts": { 8 | "build:es": "BABEL_ENV=build babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", 9 | "build:es:watch": "BABEL_ENV=build babel src --root-mode upward --watch --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", 10 | "build:types": "tsc --project tsconfig.json --noEmit false --emitDeclarationOnly" 11 | }, 12 | "files": [ 13 | "lib" 14 | ] 15 | } -------------------------------------------------------------------------------- /packages/universal/src/components/Button/lib/Button.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../src/Button.tsx"],"names":["StyledText","styled","Text","Button"],"mappings":";;;;;;;AACA;;AACA;;;;AAEA,MAAMA,UAAU,GAAGC,gBAAOC,IAAV;AAAA;AAAA;AAAA,kBAAhB;;AAIA,SAASC,MAAT,GAA+B;AAC7B,SACE;AAAQ,IAAA,IAAI,EAAC;AAAb,KACE,6BAAC,UAAD,mBADF,CADF;AAKD;;eAEcA,M","sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport React from 'react';\nimport styled from 'styled-components/native';\n\nconst StyledText = styled.Text`\n color: red;\n`;\n\nfunction Button(): JSX.Element {\n return (\n \n );\n}\n\nexport default Button;\n"],"file":"Button.js"} -------------------------------------------------------------------------------- /packages/universal/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "skipLibCheck": true, 6 | "jsx": "react-native", 7 | "declaration": true, 8 | "noEmit": true, 9 | "strict": true, 10 | "moduleResolution": "node", 11 | "allowSyntheticDefaultImports": true, 12 | "removeComments": true, 13 | "baseUrl": ".", 14 | "esModuleInterop": true 15 | }, 16 | "include": ["src"], 17 | "exclude": [ 18 | "**/*.stories.tsx", 19 | "**/*.story.tsx", 20 | "**/*.test.tsx", 21 | "**/*.d.ts" 22 | ], 23 | "awesomeTypescriptLoaderOptions": { 24 | "useBabel": true, 25 | "babelCore": "@babel/core" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /packages/universal/templates/component/package.json.hbs: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@universal/{{dashCase name}}", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "main": "lib/{{pascalCase name}}.js", 6 | "types": "lib/{{pascalCase name}}.d.ts", 7 | "scripts": { 8 | "build:es": "BABEL_ENV=build babel src --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", 9 | "build:es:watch": "BABEL_ENV=build babel src --root-mode upward --watch --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", 10 | "build:types": "tsc --project tsconfig.json --noEmit false --emitDeclarationOnly" 11 | }, 12 | "files": [ 13 | "lib" 14 | ] 15 | } -------------------------------------------------------------------------------- /packages/universal/lib/universal.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | Object.defineProperty(exports, "Button", { 7 | enumerable: true, 8 | get: function () { 9 | return _Button.default; 10 | } 11 | }); 12 | Object.defineProperty(exports, "Welcome", { 13 | enumerable: true, 14 | get: function () { 15 | return _Welcome.default; 16 | } 17 | }); 18 | 19 | var _Button = _interopRequireDefault(require("./src/components/Button")); 20 | 21 | var _Welcome = _interopRequireDefault(require("./src/components/Welcome")); 22 | 23 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 24 | //# sourceMappingURL=universal.js.map -------------------------------------------------------------------------------- /packages/universal/src/components/Welcome/lib/Welcome.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.default = void 0; 7 | 8 | var _react = _interopRequireDefault(require("react")); 9 | 10 | var _native = _interopRequireDefault(require("styled-components/native")); 11 | 12 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 13 | 14 | const StyledText = _native.default.Text.withConfig({ 15 | displayName: "Welcome__StyledText", 16 | componentId: "sc-13g6phe-0" 17 | })(["background-color:gray;color:black;"]); 18 | 19 | function Welcome() { 20 | return _react.default.createElement(StyledText, null, "Welcome"); 21 | } 22 | 23 | var _default = Welcome; 24 | exports.default = _default; 25 | //# sourceMappingURL=Welcome.js.map -------------------------------------------------------------------------------- /packages/universal/src/components/Button/lib/Button.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.default = void 0; 7 | 8 | var _react = _interopRequireDefault(require("react")); 9 | 10 | var _native = _interopRequireDefault(require("styled-components/native")); 11 | 12 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 13 | 14 | const StyledText = _native.default.Text.withConfig({ 15 | displayName: "Button__StyledText", 16 | componentId: "jsb92n-0" 17 | })(["color:red;"]); 18 | 19 | function Button() { 20 | return _react.default.createElement("button", { 21 | type: "button" 22 | }, _react.default.createElement(StyledText, null, "Click me")); 23 | } 24 | 25 | var _default = Button; 26 | exports.default = _default; 27 | //# sourceMappingURL=Button.js.map -------------------------------------------------------------------------------- /packages/universal/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | clearMocks: true, 3 | coverageDirectory: 'coverage', 4 | coverageReporters: ['text', 'clover'], 5 | coverageThreshold: { 6 | global: { 7 | branches: 80, 8 | functions: 80, 9 | lines: 80, 10 | statements: 80, 11 | }, 12 | }, 13 | globals: { 14 | 'ts-jest': { 15 | extends: './babel.config.js', 16 | }, 17 | }, 18 | moduleFileExtensions: ['ts', 'tsx', 'js'], 19 | modulePathIgnorePatterns: ['dist'], 20 | moduleNameMapper: { 21 | '@universal/(.+)$': 'packages/universal/src/$1/src', 22 | }, 23 | notify: true, 24 | notifyMode: 'always', 25 | roots: ['packages'], 26 | testMatch: ['**/__tests__/*.+(ts|tsx|js)', '**/*.test.+(ts|tsx|js)'], 27 | transform: { 28 | '^.+\\.(ts|tsx)$': 'ts-jest', 29 | }, 30 | setupFilesAfterEnv: ['jest/setupTests.ts'], 31 | }; 32 | -------------------------------------------------------------------------------- /packages/universal/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = api => { 2 | api.cache(true); 3 | return { 4 | presets: [ 5 | [ 6 | '@babel/env', 7 | { 8 | targets: { 9 | browsers: 'Last 2 Chrome versions, Firefox ESR', 10 | node: 'current', 11 | }, 12 | }, 13 | ], 14 | [ 15 | '@babel/preset-react', 16 | { 17 | development: process.env.BABEL_ENV !== 'build', 18 | }, 19 | ], 20 | '@babel/preset-typescript', 21 | ], 22 | plugins: [ 23 | ['react-native-web', { commonjs: true }], 24 | 'babel-plugin-styled-components', 25 | ], 26 | env: { 27 | build: { 28 | ignore: [ 29 | '**/*.test.tsx', 30 | '**/*.test.ts', 31 | '**/*.story.tsx', 32 | '**/*.stories.tsx', 33 | '__snapshots__', 34 | '__tests__', 35 | '__stories__', 36 | ], 37 | }, 38 | }, 39 | ignore: ['node_modules'], 40 | }; 41 | }; 42 | -------------------------------------------------------------------------------- /packages/universal/.storybook/main.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | stories: ['../src/**/*.stories.(ts|tsx)'], 3 | addons: [ 4 | // '@storybook/addon-a11y/register', 5 | '@storybook/addon-actions/register', 6 | '@storybook/addon-backgrounds/register', 7 | // '@storybook/addon-jest/register', 8 | '@storybook/addon-knobs/register', 9 | '@storybook/addon-links/register', 10 | '@storybook/addon-options/register', 11 | // '@storybook/addon-storysource/register', 12 | // '@storybook/addon-viewport/register', 13 | { 14 | name: '@storybook/addon-docs/register', 15 | options: { configureJSX: true }, 16 | }, 17 | ], 18 | webpackFinal: async config => { 19 | config.module.rules.push({ 20 | test: /\.(ts|tsx)$/, 21 | use: [ 22 | { 23 | loader: require.resolve('awesome-typescript-loader'), 24 | }, 25 | { 26 | loader: require.resolve('react-docgen-typescript-loader'), 27 | }, 28 | ], 29 | }); 30 | config.resolve.alias = { 31 | 'react-native': 'react-native-web', 32 | }; 33 | config.resolve.extensions.push('.ts', '.tsx'); 34 | return config; 35 | }, 36 | }; 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![lerna](https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg)](https://lerna.js.org/) 2 | 3 | # react-native-web-design-system-starter-kit 4 | 5 | ## Work in progress. 6 | 7 | Fork this monorepo starter kit to create your own design system and use react-native primitives to build components in isolation and use them across your mobile and web apps. 8 | 9 | - lerna 10 | - storybook 11 | - react-native-web 12 | - babel 13 | - jest 14 | - eslint 15 | - styled-components 16 | - stylelint 17 | - prettier 18 | 19 | ## How? 20 | 21 | - `lerna boostrap` at the root of the repo to install dependencies 22 | - `cd packages/universal && yarn run storybook` to launch storybook. 23 | - Check the `package.json` to see all the scripts you can run. Better docs coming soon. ;-) 24 | 25 | ## TODO 26 | 27 | - [ ] Configure jest and storybook addons. 28 | 29 | - [ ] Examples for unit tests. 30 | 31 | - [ ] Structural Testing (StoryShots). 32 | 33 | - [x] Component files creation script using `plop` to create a new component without having to write any boilerplate. `yarn run generate component HelloWorld` 34 | 35 | - [ ] Real react-native components examples working on both mobile and web. 36 | -------------------------------------------------------------------------------- /packages/universal/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "@typescript-eslint/parser", 3 | "parserOptions": { 4 | "ecmaVersion": 2018, 5 | "sourceType": "module", 6 | "ecmaFeatures": { 7 | "jsx": true 8 | } 9 | }, 10 | "env": { 11 | "browser": true, 12 | "node": true, 13 | "es6": true, 14 | "jest": true 15 | }, 16 | "plugins": ["react", "jsx-a11y", "import", "prettier", "@typescript-eslint"], 17 | "extends": [ 18 | "airbnb", 19 | "plugin:@typescript-eslint/eslint-recommended", 20 | "prettier", 21 | "prettier/react", 22 | "prettier/@typescript-eslint" 23 | ], 24 | "settings": { 25 | "import/resolver": { 26 | "node": { 27 | "paths": ["src"], 28 | "extensions": [".ts", ".tsx"] 29 | } 30 | }, 31 | "react": { 32 | "pragma": "React", 33 | "version": "detect" 34 | } 35 | }, 36 | "rules": { 37 | "prettier/prettier": ["error"], 38 | "react/jsx-filename-extension": ["error", { "extensions": [".tsx"] }], 39 | "@typescript-eslint/no-unused-vars": ["error"], 40 | "no-unused-vars": "off", 41 | "comma-dangle": "error", 42 | "import/extensions": [ 43 | "error", 44 | "ignorePackages", 45 | { 46 | "js": "never", 47 | "ts": "never", 48 | "mjs": "never", 49 | "jsx": "never", 50 | "tsx": "never" 51 | } 52 | ], 53 | "import/no-extraneous-dependencies": [ 54 | "warn", 55 | { "packageDir": "./packages/universal" } 56 | ] 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /packages/universal/plopfile.js: -------------------------------------------------------------------------------- 1 | module.exports = plop => { 2 | plop.setGenerator('component', { 3 | description: 'Create a component', 4 | // User input prompts provided as arguments to the template 5 | prompts: [ 6 | { 7 | // Raw text input 8 | type: 'input', 9 | // Variable name for this input 10 | name: 'name', 11 | // Prompt to display on command line 12 | message: 'What is your component name?', 13 | }, 14 | ], 15 | actions: [ 16 | { 17 | // Add a new file 18 | type: 'add', 19 | // Path for the new file 20 | path: 'src/components/{{pascalCase name}}/src/{{pascalCase name}}.tsx', 21 | // Handlebars template used to generate content of new file 22 | templateFile: 'templates/component/component.tsx.hbs', 23 | }, 24 | { 25 | // Add a new file 26 | type: 'add', 27 | // Path for the new file 28 | path: 29 | 'src/components/{{pascalCase name}}/src/{{pascalCase name}}.stories.tsx', 30 | // Handlebars template used to generate content of new file 31 | templateFile: 'templates/component/component.stories.tsx.hbs', 32 | }, 33 | { 34 | // Add a new file 35 | type: 'add', 36 | // Path for the new file 37 | path: 'src/components/{{pascalCase name}}/package.json', 38 | // Handlebars template used to generate content of new file 39 | templateFile: 'templates/component/package.json.hbs', 40 | }, 41 | { 42 | // Add a new file 43 | type: 'add', 44 | // Path for the new file 45 | path: 'src/components/{{pascalCase name}}/tsconfig.json', 46 | // Handlebars template used to generate content of new file 47 | templateFile: 'templates/component/tsconfig.json.hbs', 48 | }, 49 | { 50 | // Action type 'append' injects a template into an existing file 51 | type: 'append', 52 | path: 'universal.ts', 53 | // Pattern tells plop where in the file to inject the template 54 | pattern: `/* INJECT_IMPORT */`, 55 | template: `export { default as {{pascalCase name}} } from './src/components/{{pascalCase name}}';`, 56 | }, 57 | ], 58 | }); 59 | }; 60 | -------------------------------------------------------------------------------- /packages/universal/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "universal", 3 | "version": "1.0.0", 4 | "description": "Universal components library", 5 | "keywords": [ 6 | "react", 7 | "react-native", 8 | "react-native-web", 9 | "storybook", 10 | "babel", 11 | "typescript", 12 | "eslint", 13 | "styled-components" 14 | ], 15 | "author": "Gab Labelle ", 16 | "homepage": "https://github.com/gablabelle/", 17 | "license": "MIT", 18 | "main": "lib/universal.js", 19 | "directories": { 20 | "lib": "lib", 21 | "test": "__tests__" 22 | }, 23 | "files": [ 24 | "lib" 25 | ], 26 | "scripts": { 27 | "build": "lerna run --parallel 'build:es'", 28 | "watch": "lerna run --parallel 'build:es:watch'", 29 | "build:es": "BABEL_ENV=build babel universal.ts --root-mode upward --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", 30 | "build:es:watch": "BABEL_ENV=build babel universal.ts --root-mode upward --watch --out-dir lib --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments", 31 | "postbuild": "lerna run --parallel 'build:types'", 32 | "type-check": "tsc --noEmit", 33 | "type-check:watch": "yarn run type-check -- --watch", 34 | "test": "echo \"Error: run tests from root\" && exit 1", 35 | "lint:ts": "eslint 'src/**/*.ts{,x}'", 36 | "storybook": "start-storybook -p 6006", 37 | "build-storybook": "build-storybook", 38 | "generate": "plop" 39 | }, 40 | "dependencies": { 41 | "lerna": "^3.13.4", 42 | "react": "^16.10.2", 43 | "react-dom": "^16.10.2", 44 | "react-native-web": "^0.11.7", 45 | "styled-components": "^5.0.0-beta.9" 46 | }, 47 | "devDependencies": { 48 | "@babel/cli": "^7.6.4", 49 | "@babel/core": "^7.6.4", 50 | "@babel/plugin-proposal-class-properties": "^7.5.5", 51 | "@babel/plugin-proposal-numeric-separator": "^7.2.0", 52 | "@babel/plugin-proposal-object-rest-spread": "^7.6.2", 53 | "@babel/preset-env": "^7.6.3", 54 | "@babel/preset-react": "^7.6.3", 55 | "@babel/preset-typescript": "^7.6.0", 56 | "@storybook/addon-a11y": "^5.3.9", 57 | "@storybook/addon-actions": "^5.3.9", 58 | "@storybook/addon-backgrounds": "^5.3.9", 59 | "@storybook/addon-docs": "^5.3.9", 60 | "@storybook/addon-jest": "^5.3.9", 61 | "@storybook/addon-knobs": "^5.3.9", 62 | "@storybook/addon-links": "^5.3.9", 63 | "@storybook/addon-options": "^5.3.9", 64 | "@storybook/addon-storysource": "^5.3.9", 65 | "@storybook/addon-viewport": "^5.3.9", 66 | "@storybook/addons": "^5.3.9", 67 | "@storybook/react": "^5.3.9", 68 | "@testing-library/jest-dom": "^4.1.2", 69 | "@testing-library/react": "^9.3.0", 70 | "@types/enzyme": "^3.10.3", 71 | "@types/enzyme-adapter-react-16": "^1.0.5", 72 | "@types/jest": "^24.0.18", 73 | "@types/node": "^12.7.12", 74 | "@types/react": "^16.9.5", 75 | "@types/react-dom": "^16.9.1", 76 | "@types/react-native": "^0.60.19", 77 | "@types/styled-components": "^4.1.19", 78 | "@typescript-eslint/eslint-plugin": "^2.4.0", 79 | "@typescript-eslint/parser": "^2.4.0", 80 | "awesome-typescript-loader": "^5.2.1", 81 | "babel-loader": "^8.0.6", 82 | "babel-plugin-react-native-web": "^0.11.7", 83 | "babel-plugin-styled-components": "^1.10.6", 84 | "enzyme": "^3.10.0", 85 | "enzyme-adapter-react-16": "^1.15.1", 86 | "enzyme-to-json": "^3.0.0-beta6", 87 | "eslint": "^6.5.1", 88 | "eslint-config-airbnb": "^18.0.1", 89 | "eslint-config-prettier": "^6.4.0", 90 | "eslint-plugin-import": "^2.18.2", 91 | "eslint-plugin-jsx-a11y": "^6.2.3", 92 | "eslint-plugin-prettier": "^3.1.1", 93 | "eslint-plugin-react": "^7.16.0", 94 | "eslint-plugin-react-hooks": "^2.1.2", 95 | "jest": "^24.9.0", 96 | "plop": "^2.5.2", 97 | "prettier": "^1.18.2", 98 | "react-docgen-typescript-loader": "^3.3.0", 99 | "stylelint": "^11.1.1", 100 | "stylelint-config-prettier": "^6.0.0", 101 | "stylelint-config-recommended": "^3.0.0", 102 | "stylelint-config-styled-components": "^0.1.1", 103 | "stylelint-order": "^3.1.1", 104 | "stylelint-processor-styled-components": "^1.8.0", 105 | "ts-jest": "^24.1.0", 106 | "typescript": "^3.6.4" 107 | } 108 | } --------------------------------------------------------------------------------