diff --git a/.github/workflows/development.yml b/.github/workflows/development.yml index 6416da7..98bee1c 100644 --- a/.github/workflows/development.yml +++ b/.github/workflows/development.yml @@ -41,48 +41,34 @@ jobs: env: CI: true - name: code coverage + if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' uses: coverallsapp/github-action@master with: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: ./coverage/lcov.info env: CI: true - - name: publish code coverage to code climate - if: matrix.os == 'ubuntu-latest' - uses: paambaati/codeclimate-action@v2.3.0 - env: - CI: true - CC_TEST_REPORTER_ID: ${{ secrets.CODE_CLIMATE }} - with: - coverageCommand: npm run test - debug: true - - name: npm run it - if: matrix.os == 'ubuntu-latest' + - name: npm run e2e + if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' run: | sudo apt-get update sudo apt-get install xvfb - xvfb-run --auto-servernum -- bash -c "npm run it" + xvfb-run --auto-servernum -- bash -c "npm run e2e" env: GITHUB_BRANCH: ${{ github.ref }} GITHUB_COMMIT: ${{ github.sha }} PACKAGE_JSON: ${{ steps.projectinfo.outputs.context }} - - name: npm run it - if: matrix.os == 'macos-latest' + - name: npm run e2e + if: matrix.os == 'macos-latest' && matrix.node-version == '14.x' run: | - npm run it + npm run e2e env: GITHUB_BRANCH: ${{ github.ref }} GITHUB_COMMIT: ${{ github.sha }} PACKAGE_JSON: ${{ steps.projectinfo.outputs.context }} - name: archive e2e screenshots uses: actions/upload-artifact@v1 - if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' - with: - name: Screenshots - path: it/screenshots - - name: archive e2e diff - uses: actions/upload-artifact@v1 - if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' + if: ( matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' ) && matrix.node-version == '14.x' with: - name: Screenshots Diff - path: it/__image_snapshots__ + name: Screenshots Development ${{ matrix.os }} ${{ matrix.node-version }} + path: e2e/screenshots diff --git a/.github/workflows/feature.yml b/.github/workflows/feature.yml index 1b0e755..34b2a25 100644 --- a/.github/workflows/feature.yml +++ b/.github/workflows/feature.yml @@ -40,19 +40,12 @@ jobs: npm test env: CI: true - - name: code coverage - uses: coverallsapp/github-action@master - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - path-to-lcov: ./coverage/lcov.info - env: - CI: true - - name: npm run it - if: matrix.os == 'ubuntu-latest' + - name: npm run e2e + if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' run: | sudo apt-get update sudo apt-get install xvfb - xvfb-run --auto-servernum -- bash -c "npm run it" + xvfb-run --auto-servernum -- bash -c "npm run e2e" env: GITHUB_BRANCH: ${{ github.ref }} GITHUB_COMMIT: ${{ github.sha }} @@ -61,11 +54,5 @@ jobs: uses: actions/upload-artifact@v1 if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' with: - name: Screenshots - path: it/screenshots - - name: archive e2e diff - uses: actions/upload-artifact@v1 - if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' - with: - name: Screenshots Diff - path: it/__image_snapshots__ + name: Screenshots Feature ${{ matrix.os }} ${{ matrix.node-version }} + path: e2e/screenshots diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index b5bee4c..b5850a0 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -42,6 +42,7 @@ jobs: env: CI: true - name: code coverage + if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' uses: coverallsapp/github-action@master with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -49,7 +50,7 @@ jobs: env: CI: true - name: publish code coverage to code climate - if: matrix.os == 'ubuntu-latest' + if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' uses: paambaati/codeclimate-action@v2.3.0 env: CI: true @@ -57,37 +58,32 @@ jobs: with: coverageCommand: npm run test debug: true - - name: npm run it - if: matrix.os == 'ubuntu-latest' + - name: npm run e2e + if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' run: | sudo apt-get update sudo apt-get install xvfb - xvfb-run --auto-servernum -- bash -c "npm run it" + xvfb-run --auto-servernum -- bash -c "npm run e2e" env: GITHUB_BRANCH: ${{ github.ref }} GITHUB_COMMIT: ${{ github.sha }} PACKAGE_JSON: ${{ steps.projectinfo.outputs.context }} - - name: npm run it - if: matrix.os == 'macos-latest' + - name: npm run e2e + if: matrix.os == 'macos-latest' && matrix.node-version == '14.x' run: | - npm run it + npm run e2e env: GITHUB_BRANCH: ${{ github.ref }} GITHUB_COMMIT: ${{ github.sha }} PACKAGE_JSON: ${{ steps.projectinfo.outputs.context }} - name: archive e2e screenshots uses: actions/upload-artifact@v1 - if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' - with: - name: Screenshots - path: it/screenshots - - name: archive e2e diff - uses: actions/upload-artifact@v1 - if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' + if: ( matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' ) && matrix.node-version == '14.x' with: - name: Screenshots Diff - path: it/__image_snapshots__ + name: Screenshots Master ${{ matrix.os }} ${{ matrix.node-version }} + path: e2e/screenshots - name: create release + if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' id: createrelease uses: gregoranders/nodejs-create-release@v0.0.6 env: @@ -95,27 +91,7 @@ jobs: PACKAGE_JSON: ${{ steps.projectinfo.outputs.context }} with: tag: v${{ steps.projectinfo.outputs.version }} - name: ${{ steps.projectinfo.outputs.name }} - ${{ steps.projectinfo.outputs.version }} + name: ${{ steps.projectinfo.outputs.version }} Release body: ${{ steps.projectinfo.outputs.name }} - ${{ steps.projectinfo.outputs.version }} Release target: ${{ github.ref }} draft: false - - name: update storybook docs - if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' - run: | - cd docs/public - git config --global user.email "${{ secrets.EMAIL }}" - git config --global user.name "Gregor Anders" - git status - git checkout master - cd ../.. - npm run build-storybook - cd docs/public - git status - git add -f . - git commit -m "Updated storybook" . - git push - env: - NODE_ENV: production - GITHUB_BRANCH: ${{ github.ref }} - GITHUB_COMMIT: ${{ github.sha }} - PACKAGE_JSON: ${{ steps.projectinfo.outputs.context }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 577b40c..aa0644a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,7 @@ name: Release CI on: release: types: - - edited + - created jobs: build: @@ -11,8 +11,8 @@ jobs: strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - node-version: [10.x, 12.x, 13.x, 14.x] + os: [ubuntu-latest] + node-version: [14.x] steps: - uses: actions/checkout@v2 @@ -40,71 +40,36 @@ jobs: npm test env: CI: true - - name: code coverage - uses: coverallsapp/github-action@master - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - path-to-lcov: ./coverage/lcov.info - env: - CI: true - - name: publish code coverage to code climate - if: matrix.os == 'ubuntu-latest' - uses: paambaati/codeclimate-action@v2.3.0 - env: - CI: true - CC_TEST_REPORTER_ID: ${{ secrets.CODE_CLIMATE }} - with: - coverageCommand: npm run test - debug: true - - name: npm run it - if: matrix.os == 'ubuntu-latest' + - name: npm run e2e run: | sudo apt-get update sudo apt-get install xvfb - xvfb-run --auto-servernum -- bash -c "npm run it" - env: - GITHUB_BRANCH: ${{ github.ref }} - GITHUB_COMMIT: ${{ github.sha }} - PACKAGE_JSON: ${{ steps.projectinfo.outputs.context }} - - name: npm run it - if: matrix.os == 'macos-latest' - run: | - npm run it + xvfb-run --auto-servernum -- bash -c "npm run e2e" env: GITHUB_BRANCH: ${{ github.ref }} GITHUB_COMMIT: ${{ github.sha }} PACKAGE_JSON: ${{ steps.projectinfo.outputs.context }} - name: archive e2e screenshots uses: actions/upload-artifact@v1 - if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' - with: - name: Screenshots - path: it/screenshots - - name: archive e2e diff - uses: actions/upload-artifact@v1 - if: matrix.os == 'ubuntu-latest' && matrix.node-version == '14.x' with: - name: Screenshots Diff - path: it/__image_snapshots__ - - name: create release - id: createrelease - uses: gregoranders/nodejs-create-release@v0.0.6 + name: Screenshots Release ${{ matrix.os }} ${{ matrix.node-version }} + path: e2e/screenshots + - name: update storybook docs + run: | + cd docs/public + git config --global user.email "${{ secrets.EMAIL }}" + git config --global user.name "Gregor Anders" + git status + git checkout master + cd ../.. + npm run build-storybook + cd docs/public + git status + git add -f . + git commit -m "${{ steps.projectinfo.outputs.name }} - v${{ steps.projectinfo.outputs.version }}" . + git push env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NODE_ENV: production + GITHUB_BRANCH: ${{ github.ref }} + GITHUB_COMMIT: ${{ github.sha }} PACKAGE_JSON: ${{ steps.projectinfo.outputs.context }} - with: - tag: v${{ steps.projectinfo.outputs.version }} - name: ${{ steps.projectinfo.outputs.name }} - ${{ steps.projectinfo.outputs.version }} - body: ${{ steps.projectinfo.outputs.name }} - ${{ steps.projectinfo.outputs.version }} Release - target: ${{ github.ref }} - draft: false - # - name: upload asset - # if: matrix.os == 'ubuntu-latest' && matrix.node-version == '12.x' - # id: uploadasset - # uses: gregoranders/nodejs-upload-asset@v0.0.6 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # id: ${{ steps.createrelease.outputs.id }} - # path: dist/index.js - # name: index.js diff --git a/.gitignore b/.gitignore index 149a200..57bd2c0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,7 @@ dist/ coverage/ -coverage-it/ -public-it/ +coverage-e2e/ node_modules/ -storybook-static/ package-lock.json junit.xml diff --git a/.gitmodules b/.gitmodules index c13cc40..d2465a3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "docs/public"] path = docs/public url = git@github.com:gregoranders/ts-react-playground-docs.git -[submodule "it/__image_snapshots__"] - path = it/__image_snapshots__ +[submodule "e2e/screenshots"] + path = e2e/screenshots url = git@github.com:gregoranders/ts-react-playground-test-data.git diff --git a/README.md b/README.md index 11e772f..5a94f55 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,15 @@ -# ts-react-playground - TypeScript React Playground +# ts-react-playground - [TypeScript](http://www.typescriptlang.org/) [React](https://reactjs.org/) Playground -## [TypeScript](http://www.typescriptlang.org/) [React](https://reactjs.org/) Playground +#### [Storybook](https://gregoranders.github.io/ts-react-playground-docs) + +[![Dependency Status][daviddm-image]][daviddm-url] +[![License][license-image]][license-url] +[![Issues][issues-image]][issues-url] +[![Code maintainability][code-maintainability-image]][code-maintainability-url] [![Code issues][code-issues-image]][code-issues-url] [![Code Technical Debt][code-tech-debt-image]][code-tech-debt-url] + +[![Main Language](https://img.shields.io/github/languages/top/gregoranders/ts-react-playground)][code-metric-url] [![Languages](https://img.shields.io/github/languages/count/gregoranders/ts-react-playground)][code-metric-url] [![Code Size](https://img.shields.io/github/languages/code-size/gregoranders/ts-react-playground)][code-metric-url] [![Repo-Size](https://img.shields.io/github/repo-size/gregoranders/ts-react-playground)][code-metric-url] + +## Features * TypeScript * React + React-Router + Recoil @@ -16,23 +25,12 @@ * Code Quality via Code Climate * Docker Container (nginx with ssl) -[Storybook](https://gregoranders.github.io/ts-react-playground-docs) - -[![Dependency Status][daviddm-image]][daviddm-url] -[![License][license-image]][license-url] -[![Issues][issues-image]][issues-url] +| | | | +|-|-|-| +|[![Release Build][release-build-image]][release-url]||| +|[![Master Build][master-build-image]][master-url]|[![Master Coverage][master-coveralls-image]][master-coveralls-url]|[![Master Version][master-version-image]][master-version-url]| +|[![Development Build][development-build-image]][development-url]|[![Test Coverage][development-coveralls-image]][development-coveralls-url]|[![Development Version][development-version-image]][development-version-url]| -[![Release Build][release-build-image]][release-url] - -[![Master Build][master-build-image]][master-url] [![Master Coverage][master-coveralls-image]][master-coveralls-url] [![Master Version][master-version-image]][master-version-url] - -[![Development Build][development-build-image]][development-url] [![Test Coverage][development-coveralls-image]][development-coveralls-url] [![Development Version][development-version-image]][development-version-url] - -[![Master Build][master-circleci-image]][master-circleci-url] [![Development Build][development-circleci-image]][development-circleci-url] - -[![Code maintainability][code-maintainability-image]][code-maintainability-url] [![Code issues][code-issues-image]][code-issues-url] [![Code Technical Debt][code-tech-debt-image]][code-tech-debt-url] - -[![Main Language](https://img.shields.io/github/languages/top/gregoranders/ts-react-playground)][code-metric-url] [![Languages](https://img.shields.io/github/languages/count/gregoranders/ts-react-playground)][code-metric-url] [![Code Size](https://img.shields.io/github/languages/code-size/gregoranders/ts-react-playground)][code-metric-url] [![Repo-Size](https://img.shields.io/github/repo-size/gregoranders/ts-react-playground)][code-metric-url] ### Clone repository @@ -48,8 +46,13 @@ npm install ### Build +#### Webpack +``` +npm run build:webpack +``` +#### ESM ``` -npm run build +npm run build:esm ``` ### Testing @@ -63,14 +66,14 @@ npm test #### E2E Test using [Jest](https://jestjs.io/) and [Puppeteer](https://pptr.dev/) ``` -npm run it +npm run e2e ``` ### Development #### Webpack ``` -npm dev +npm start ``` #### ESM ``` diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..795a552 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,11 @@ +# Security Policy +​ +## Supported Versions +​ +| Version | Supported | +| ------- | ------------------ | +| 0.0.1 | :white_check_mark: | +​ +## Reporting a Vulnerability + +[Create Issue](https://github.com/gregoranders/ts-react-playground/issues/new?labels=bug&template=bug_report.md&title=Security+Issue) diff --git a/docs/Intro.stories.mdx b/docs/Intro.stories.mdx index 9b3a597..cead18e 100644 --- a/docs/Intro.stories.mdx +++ b/docs/Intro.stories.mdx @@ -2,9 +2,16 @@ import { Meta } from '@storybook/addon-docs/blocks'; -# ts-react-playground - TypeScript React Playground v0.0.1 +# ts-react-playground - [TypeScript](http://www.typescriptlang.org/) [React](https://reactjs.org/) Playground v0.0.2 -## [TypeScript](http://www.typescriptlang.org/) [React](https://reactjs.org/) Playground +[![Dependency Status][daviddm-image]][daviddm-url] +[![License][license-image]][license-url] +[![Issues][issues-image]][issues-url] +[![Code maintainability][code-maintainability-image]][code-maintainability-url] [![Code issues][code-issues-image]][code-issues-url] [![Code Technical Debt][code-tech-debt-image]][code-tech-debt-url] + +[![Main Language](https://img.shields.io/github/languages/top/gregoranders/ts-react-playground)][code-metric-url] [![Languages](https://img.shields.io/github/languages/count/gregoranders/ts-react-playground)][code-metric-url] [![Code Size](https://img.shields.io/github/languages/code-size/gregoranders/ts-react-playground)][code-metric-url] [![Repo-Size](https://img.shields.io/github/repo-size/gregoranders/ts-react-playground)][code-metric-url] + +## Features * TypeScript * React + React-Router + Recoil @@ -20,23 +27,12 @@ import { Meta } from '@storybook/addon-docs/blocks'; * Code Quality via Code Climate * Docker Container (nginx with ssl) -[Storybook](https://gregoranders.github.io/ts-react-playground-docs) - -[![Dependency Status][daviddm-image]][daviddm-url] -[![License][license-image]][license-url] -[![Issues][issues-image]][issues-url] - -[![Release Build][release-build-image]][release-url] - -[![Master Build][master-build-image]][master-url] [![Master Coverage][master-coveralls-image]][master-coveralls-url] [![Master Version][master-version-image]][master-version-url] - -[![Development Build][development-build-image]][development-url] [![Test Coverage][development-coveralls-image]][development-coveralls-url] [![Development Version][development-version-image]][development-version-url] +| | | | +|-|-|-| +|[![Release Build][release-build-image]][release-url]||| +|[![Master Build][master-build-image]][master-url]|[![Master Coverage][master-coveralls-image]][master-coveralls-url]|[![Master Version][master-version-image]][master-version-url]| +|[![Development Build][development-build-image]][development-url]|[![Test Coverage][development-coveralls-image]][development-coveralls-url]|[![Development Version][development-version-image]][development-version-url]| -[![Master Build][master-circleci-image]][master-circleci-url] [![Development Build][development-circleci-image]][development-circleci-url] - -[![Code maintainability][code-maintainability-image]][code-maintainability-url] [![Code issues][code-issues-image]][code-issues-url] [![Code Technical Debt][code-tech-debt-image]][code-tech-debt-url] - -[![Main Language](https://img.shields.io/github/languages/top/gregoranders/ts-react-playground)][code-metric-url] [![Languages](https://img.shields.io/github/languages/count/gregoranders/ts-react-playground)][code-metric-url] [![Code Size](https://img.shields.io/github/languages/code-size/gregoranders/ts-react-playground)][code-metric-url] [![Repo-Size](https://img.shields.io/github/repo-size/gregoranders/ts-react-playground)][code-metric-url] ### Clone repository @@ -52,8 +48,13 @@ npm install ### Build +#### Webpack +``` +npm run build:webpack +``` +#### ESM ``` -npm run build +npm run build:esm ``` ### Testing @@ -67,14 +68,14 @@ npm test #### E2E Test using [Jest](https://jestjs.io/) and [Puppeteer](https://pptr.dev/) ``` -npm run it +npm run e2e ``` ### Development #### Webpack ``` -npm dev +npm start ``` #### ESM ``` diff --git a/docs/public b/docs/public index 4181814..8a5c45c 160000 --- a/docs/public +++ b/docs/public @@ -1 +1 @@ -Subproject commit 4181814f3f92641c080cfcfb1eacce925abc04d1 +Subproject commit 8a5c45c23bc687ed5a39071e6c9509d14335b577 diff --git a/it/index.spec.ts b/e2e/index.spec.ts similarity index 53% rename from it/index.spec.ts rename to e2e/index.spec.ts index ac7b1e8..065c1b8 100644 --- a/it/index.spec.ts +++ b/e2e/index.spec.ts @@ -1,27 +1,12 @@ import { Browser, devices } from 'puppeteer'; -import { configureToMatchImageSnapshot } from 'jest-image-snapshot'; -import 'expect-puppeteer'; -import fs from 'fs'; +import { mkdir, timeout, url, customSnapshotsDir, customDiffDir } from './setup'; declare const browser: Browser; -const customConfig = { threshold: 0.5 }; -const toMatchImageSnapshot = configureToMatchImageSnapshot({ - customDiffConfig: customConfig, -}); - -expect.extend({ toMatchImageSnapshot }); - -const timeout = 10000; -const url = 'http://127.0.0.1:7683/ts-react-playground/'; - -const mkdir = (path: string) => { - if (!fs.existsSync(path)) fs.mkdirSync(path); -}; - describe('Index', () => { beforeAll(async () => { - mkdir('./it/screenshots'); + mkdir(customSnapshotsDir); + mkdir(customDiffDir); }); Object.keys(devices).forEach((key) => { @@ -44,8 +29,7 @@ describe('Index', () => { await page.goto(url); await page.waitForSelector('.w3-margin'); - mkdir('./it/screenshots/index/'); - const image = await page.screenshot({ path: `./it/screenshots/index/${device.name}.png`, type: 'png' }); + const image = await page.screenshot(); expect(image).toMatchImageSnapshot(); page.close(); diff --git a/it/journey.spec.ts b/e2e/journey.spec.ts similarity index 94% rename from it/journey.spec.ts rename to e2e/journey.spec.ts index e5d8b1d..efa5f8c 100644 --- a/it/journey.spec.ts +++ b/e2e/journey.spec.ts @@ -1,12 +1,10 @@ import { Browser, Page } from 'puppeteer'; -import 'expect-puppeteer'; +import { timeout, url } from './setup'; declare const browser: Browser; const width = 1920; const height = 1080; -const timeout = 10000; -const url = 'http://127.0.0.1:7683/ts-react-playground/'; let page: Page; diff --git a/it/__image_snapshots__ b/e2e/screenshots similarity index 100% rename from it/__image_snapshots__ rename to e2e/screenshots diff --git a/e2e/setup.ts b/e2e/setup.ts new file mode 100644 index 0000000..71784ed --- /dev/null +++ b/e2e/setup.ts @@ -0,0 +1,26 @@ +import { configureToMatchImageSnapshot } from 'jest-image-snapshot'; +import 'expect-puppeteer'; +import fs from 'fs'; +import path from 'path'; +import { version } from '../package.json'; +// eslint-disable-next-line @typescript-eslint/no-var-requires +const jestPuppeteerConfig = require('../jest-puppeteer.config.js'); + +export const timeout = 10000; +export const url = `http://127.0.0.1:${jestPuppeteerConfig.server.port}`; + +export const customSnapshotsDir = path.join('e2e', 'screenshots', version); +export const customDiffDir = path.join(customSnapshotsDir, 'diff'); + +const customConfig = { threshold: 0.5 }; +const toMatchImageSnapshot = configureToMatchImageSnapshot({ + customDiffConfig: customConfig, + customSnapshotsDir, + customDiffDir, +}); + +expect.extend({ toMatchImageSnapshot }); + +export const mkdir = (path: string): void => { + if (!fs.existsSync(path)) fs.mkdirSync(path); +}; diff --git a/e2e/webpack.config.js b/e2e/webpack.config.js new file mode 100644 index 0000000..94e5b12 --- /dev/null +++ b/e2e/webpack.config.js @@ -0,0 +1,140 @@ +'use strict'; +const path = require('path'); +const CaseSensitivePlugin = require('case-sensitive-paths-webpack-plugin'); +const CleanPlugin = require('clean-webpack-plugin').CleanWebpackPlugin; +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const webpack = require('webpack'); +const plugins = [ + new CaseSensitivePlugin(), + new CleanPlugin(), + new HtmlWebpackPlugin({ + filename: 'index.html', + title: 'TypeScript React Redux Webpack Demo', + template: path.join('./public', 'webpack.html'), + }), + new MiniCssExtractPlugin({ + filename: 'css/[name].css', + chunkFilename: 'css/[name].css', + }), + new webpack.ProgressPlugin(), +]; +const cssLoaders = [ + { + loader: 'css-loader', + }, + { + loader: 'sass-loader', + options: { + sassOptions: { includePaths: ['node_modules'] }, + }, + }, +]; +const sassLoaders = cssLoaders.concat([ + { + loader: 'sass-loader', + options: { + sassOptions: { includePaths: ['node_modules'] }, + }, + }, +]); + +module.exports = { + mode: 'production', + entry: { + index: path.resolve(path.join('src', 'script', 'index.tsx')), + styles: path.resolve(path.join('src', 'style', 'styles.scss')), + }, + output: { + path: path.resolve('./dist'), + filename: 'js/[name].bundle.js', + }, + optimization: { + minimize: false, + runtimeChunk: { + name: 'runtime', + }, + splitChunks: { + cacheGroups: { + commons: { + chunks: 'initial', + minChunks: 2, + maxInitialRequests: 5, + minSize: 0, + }, + vendor: { + test: /node_modules/, + chunks: 'initial', + name: 'vendor', + priority: 10, + enforce: true, + }, + }, + }, + }, + performance: { + maxEntrypointSize: 2000000, + maxAssetSize: 2000000, + }, + resolve: { + extensions: ['.ts', '.tsx', '.scss', '.js'], + alias: { + '@models': path.resolve('src/script/models'), + '@atoms': path.resolve('src/script/components/atoms'), + '@organisms': path.resolve('src/script/components/organisms'), + '@molecules': path.resolve('src/script/components/molecules'), + '@pages': path.resolve('src/script/components/pages'), + '@components': path.resolve('src/script/components'), + '@app': path.resolve('src/script'), + './fonts': 'node_modules/@fortawesome/fontawesome-free/webfonts', + }, + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'ts-loader', + }, + { + test: /\.s[a|c]ss$/, + use: [MiniCssExtractPlugin.loader].concat(sassLoaders), + }, + { + test: /\.css$/, + use: [MiniCssExtractPlugin.loader].concat(cssLoaders), + }, + { + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: 'images/[name].[ext]', + }, + }, + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: 'media/[name].[ext]', + }, + }, + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: 'fonts/[name].[ext]', + }, + }, + ], + }, + devServer: { + historyApiFallback: true, + host: '0.0.0.0', + port: 7683, + hot: false, + inline: false, + }, + plugins: plugins, +}; diff --git a/it/screenshots/.gitignore b/it/screenshots/.gitignore deleted file mode 100644 index 593bcf0..0000000 --- a/it/screenshots/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -!.gitignore -* diff --git a/jest-puppeteer.config.js b/jest-puppeteer.config.js index 8788dec..5462eec 100644 --- a/jest-puppeteer.config.js +++ b/jest-puppeteer.config.js @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const webpackConfig = require('./e2e/webpack.config.js'); module.exports = { browser: 'chromium', browserContext: 'default', @@ -6,8 +8,8 @@ module.exports = { headless: process.env.HEADLESS !== 'false', }, server: { - command: `npm run serve`, - port: 7683, + command: `npm run e2e:serve`, + port: webpackConfig.devServer.port, launchTimeout: 10000, debug: false, }, diff --git a/minify.ts b/minify.ts index e7f0d3d..3010d84 100644 --- a/minify.ts +++ b/minify.ts @@ -1,10 +1,9 @@ /* eslint-disable @typescript-eslint/no-var-requires */ import { join } from 'path'; -import { readdirSync, statSync, writeFileSync } from 'fs'; +import { readdirSync, statSync, writeFileSync, Stats } from 'fs'; const minify = require('minify'); const basePath = './public'; -const promises = [] as Promise[]; const options = { js: { ecma: 2016, @@ -29,45 +28,41 @@ const options = { }, }, }; -let sizeBefore = 0; -let sizeAfter = 0; + +const zerofill = (text: string) => { + const idx = text.indexOf('.'); + if (idx == 1) { + return `0${text}`; + } + return text; +}; + +const compressFile = async (path: string, stat: Stats) => { + const data = await minify(path, options); + writeFileSync(path, data); + const nstat = statSync(path); + return { before: stat.size, after: nstat.size }; +}; const minifyDir = (parent: string) => { const files = readdirSync(parent); - files.forEach((file) => { + files.forEach(async (file) => { const full = join(parent, file); const stat = statSync(full); if (stat.isDirectory()) { minifyDir(full); } else { - if (full.endsWith('.js') || full.endsWith('.css')) { - sizeBefore += stat.size; - minify(full, options) - .then((result: string) => { - writeFileSync(full, result); - const nstat = statSync(full); - sizeAfter += nstat.size; - console.log( - `Compressed ${join(parent, file)} ${stat.size} ${nstat.size} ${stat.size - nstat.size} [${( - (nstat.size / stat.size) * - 100.0 - ).toFixed(2)}%]`, - ); - }) - .catch(console.error); + if (file.endsWith('.js') || file.endsWith('.css')) { + const result = await compressFile(full, stat); + const ratio = (100.0 - (result.after / result.before) * 100.0).toFixed(2); + console.log( + `Compressed [${zerofill(ratio)}%] ${full} ${stat.size} ${result.after} ${stat.size - result.after}`, + ); } } }); }; minifyDir(basePath); - -Promise.all(promises) - .then((results) => { - results.forEach((result) => console.log(result)); - }) - .finally(() => { - console.log(sizeBefore, sizeAfter, sizeBefore - sizeAfter); - }); diff --git a/package.json b/package.json index bbb6ed4..6eb799a 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,22 @@ { "name": "ts-react-playground", - "version": "0.0.1", + "version": "0.0.2", "description": "TypeScript React Playground", - "main": "dist/index.js", "scripts": { - "dev": "webpack-dev-server --config webpack.config.js", - "clear": "rimraf junit.xml ./it/screenshots/index ./node_modules ./dist ./coverage ./coverage-it ./package-lock.json ./public/vendor ./public/script ./public/styles.css .jest-test-results.json", - "clear:snapshots": "rimraf ./**/__snapshots__", - "start": "livereloadx -a ./public", - "build": "npm run vendor && npm run script && npm run scss", - "postbuild": "ts-node minify.ts", + "start": "webpack-dev-server --open --progress --config webpack.config.js", + "clear": "npm run prebuild && rimraf ./node_modules ./dist ./coverage ./coverage-e2e ./package-lock.json .jest-test-results.json junit.xml", + "prebuild": "npm run prebuild:webpack", + "build": "npm run build:webpack", + "prebuild:esc": "npm run prevendor && npm run prescript && npm run prescss", + "build:esm": "npm run vendor && npm run script && npm run scss", + "postbuild:esm": "ts-node minify.ts", + "prebuild:webpack": "rimraf ./dist", + "build:webpack": "cross-env NODE_ENV=production webpack --config webpack.config.js", "test": "jest --runInBand --env=enzyme --setupFilesAfterEnv=jest-enzyme --reporters=jest-spec-reporter jest-junit --coverage --coverageDirectory ../coverage --rootDir ./src", "test:update": "npm run test -- -u", - "preit": "rimraf public-it && node prepareit.js", - "it": "jest --runInBand --preset=jest-puppeteer --coverage --coverageDirectory ../coverage-it --rootDir ./it", - "postit": "rimraf public-it", - "preesmoduleshims": "rimraf ./public/es-module-shims.js", - "esmoduleshims": "tsc --project ./src/vendor/es-module-shims", + "e2e:serve": "cross-env NODE_ENV=production webpack-dev-server --silent --quiet --liveReload false --inline false --config ./e2e/webpack.config.js", + "e2e": "jest --testTimeout=60000 --runInBand --preset=jest-puppeteer --coverage --coverageDirectory ../coverage-e2e --rootDir ./e2e", + "livereload": "livereloadx -a ./public", "prescript": "rimraf ./public/script", "script": "tsc --project ./src/script --outDir ./public/script", "prewatch-script": "npm run script", @@ -25,20 +25,20 @@ "scss": "node-sass --output-style compressed --output ./public ./src/style/styles.scss", "prewatch-scss": "npm run scss", "watch-scss": "node-sass --output-style compressed --watch --output ./public ./src/style/styles.scss", - "prevendor": "rimraf ./public/vendor", - "vendor": "rimraf ./public/vendor && npm run vendor:base && npm run vendor:faker && npm run vendor:fontawesome && npm run vendor:react && npm run vendor:recharts", + "prevendor": "rimraf ./public/vendor ./public/es-module-shims.js", + "vendor": "rimraf ./public/vendor && npm run vendor:base && npm run vendor:faker && npm run vendor:fontawesome && npm run vendor:react && npm run vendor:recharts && npm run vendor:esmoduleshims", "vendor:base": "cross-env NODE_ENV=production rollup -c ./src/vendor/rollup-base.config.js", "vendor:faker": "cross-env NODE_ENV=production rollup -c ./src/vendor/rollup-faker.config.js", "vendor:fontawesome": "cross-env NODE_ENV=production rollup -c ./src/vendor/rollup-fontawesome.config.js", "vendor:react": "cross-env NODE_ENV=production rollup -c ./src/vendor/rollup-react.config.js", "vendor:recharts": "cross-env NODE_ENV=production rollup -c ./src/vendor/rollup-recharts.config.js", - "postvendor": "npm run esmoduleshims", + "vendor:esmoduleshims": "tsc --project ./src/vendor/es-module-shims", + "predocker:build": "npm run build", "docker:build": "cross-env NODE_ENV=production docker-compose build --force-rm --no-cache --parallel --pull", "docker:up": "docker-compose up -d", "docker:down": "docker-compose down", - "serve": "http-serve ./public-it --cors -p 7683", "prestorybook": "jest --runInBand --json --outputFile=.jest-test-results.json --env=enzyme --setupFilesAfterEnv=jest-enzyme --reporters=jest-spec-reporter jest-junit --coverage --coverageDirectory ../coverage --rootDir ./src", - "storybook": "cross-env NODE_ENV=production start-storybook -p 6006", + "storybook": "cross-env NODE_ENV=production start-storybook", "prebuild-storybook": "jest --runInBand --json --outputFile=.jest-test-results.json --env=enzyme --setupFilesAfterEnv=jest-enzyme --reporters=jest-spec-reporter jest-junit --coverage --coverageDirectory ../coverage --rootDir ./src", "build-storybook": "rimraf ./docs/public/docs/* && cross-env NODE_ENV=production build-storybook -c .storybook --quiet -o ./docs/public/docs" }, @@ -53,6 +53,7 @@ "jest", "livereload", "prop-types", + "puppeteer", "react", "react-dom", "react-router-dom", @@ -63,12 +64,21 @@ ], "husky": { "hooks": { - "pre-commit": "tsc --noEmit --project ./src/script && eslint './src/script/**/*.{js,ts,tsx}' --quiet && npm run test" + "pre-commit": "lint-staged && npm run test", + "pre-push": "npm run e2e" } }, + "lint-staged": { + "*.{ts,tsx}": [ + "eslint --fix --quiet", + "git add" + ] + }, "jest": { "collectCoverage": true, "collectCoverageFrom": [ + "!setup.ts", + "!webpack.config.js", "!**/tsconfig.json", "!**/tsconfig.*.json", "!**/*.tsx.snap", @@ -87,7 +97,6 @@ ], "coverageReporters": [ "lcovonly", - "html", "text", "text-summary" ], @@ -112,7 +121,6 @@ ], "moduleNameMapper": { "^@models/(.*)$": "../src/script/models/$1", - "^@states/(.*)$": "../src/script/states/$1", "^@atoms/(.*)$": "../src/script/components/atoms/$1", "^@organisms/(.*)$": "../src/script/components/organisms/$1", "^@molecules/(.*)$": "../src/script/components/molecules/$1", @@ -241,7 +249,6 @@ "faker": "4.1.0", "file-loader": "6.0.0", "html-webpack-plugin": "4.3.0", - "http-serve": "1.0.1", "husky": "4.2.5", "identity-obj-proxy": "3.0.0", "jest": "26.0.1", @@ -252,6 +259,7 @@ "jest-junit": "10.0.0", "jest-puppeteer": "4.4.0", "jest-spec-reporter": "1.0.13", + "lint-staged": "10.2.9", "livereloadx": "0.3.10", "mini-css-extract-plugin": "0.9.0", "minify": "5.1.1", diff --git a/prepareit.js b/prepareit.js deleted file mode 100644 index becdbc3..0000000 --- a/prepareit.js +++ /dev/null @@ -1,8 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const fs = require('fs'); -const copydir = require('copy-dir'); - -fs.mkdirSync('./public-it'); -fs.mkdirSync('./public-it/ts-react-playground'); - -copydir.sync('public', 'public-it/ts-react-playground'); diff --git a/public/index.html b/public/index.html index 4e3e829..6f5ceb5 100644 --- a/public/index.html +++ b/public/index.html @@ -55,8 +55,6 @@ "@models/user": "/ts-react-playground/script/models/user.js", - "@states/user": "/ts-react-playground/script/states/user.js", - "@components/layout": "/ts-react-playground/script/components/layout/index.js", "@atoms/button": "/ts-react-playground/script/components/atoms/button/index.js", diff --git a/src/script/application.spec.tsx b/src/script/application.spec.tsx index 1a7cd62..c40399e 100644 --- a/src/script/application.spec.tsx +++ b/src/script/application.spec.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import * as TestSubject from './application'; +import * as TestSubject from '@app/application'; describe(`${TestSubject.Application.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/atoms/button/button.stories.mdx b/src/script/components/atoms/button/button.stories.mdx index 5ddd1cd..e520657 100644 --- a/src/script/components/atoms/button/button.stories.mdx +++ b/src/script/components/atoms/button/button.stories.mdx @@ -1,5 +1,6 @@ import { Meta, Story, Preview, Props } from '@storybook/addon-docs/blocks'; import { action } from '@storybook/addon-actions'; +import { text, boolean } from '@storybook/addon-knobs'; import { Button } from './index'; @@ -22,7 +23,7 @@ import { Button } from './index'; - + diff --git a/src/script/components/atoms/button/index.spec.tsx b/src/script/components/atoms/button/index.spec.tsx index 381aa20..dfc664b 100644 --- a/src/script/components/atoms/button/index.spec.tsx +++ b/src/script/components/atoms/button/index.spec.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@atoms/button'; describe(`${TestSubject.Button.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/atoms/navLink/index.spec.tsx b/src/script/components/atoms/navLink/index.spec.tsx index 63585a9..d39ed98 100644 --- a/src/script/components/atoms/navLink/index.spec.tsx +++ b/src/script/components/atoms/navLink/index.spec.tsx @@ -3,7 +3,7 @@ import { MemoryRouter } from 'react-router-dom'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@atoms/navLink'; describe(`${TestSubject.NavLink.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/atoms/navLink/navLink.stories.mdx b/src/script/components/atoms/navLink/navLink.stories.mdx index ea39309..8e449e8 100644 --- a/src/script/components/atoms/navLink/navLink.stories.mdx +++ b/src/script/components/atoms/navLink/navLink.stories.mdx @@ -1,4 +1,5 @@ import { Meta, Story, Preview, Props } from '@storybook/addon-docs/blocks'; +import { text } from '@storybook/addon-knobs'; import { NavLink } from './index'; @@ -24,6 +25,13 @@ import { NavLink } from './index'; + + + {text('Content', 'Link')} + + + + ## Props diff --git a/src/script/components/atoms/user/index.spec.tsx b/src/script/components/atoms/user/index.spec.tsx index 4eea9a3..b137594 100644 --- a/src/script/components/atoms/user/index.spec.tsx +++ b/src/script/components/atoms/user/index.spec.tsx @@ -4,7 +4,7 @@ import { mount } from 'enzyme'; import { DefaultUser } from '@models/user'; -import * as TestSubject from './index'; +import * as TestSubject from '@atoms/user'; describe(`${TestSubject.UserView.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/layout/index.spec.tsx b/src/script/components/layout/index.spec.tsx index b8a1cdb..cf75ccf 100644 --- a/src/script/components/layout/index.spec.tsx +++ b/src/script/components/layout/index.spec.tsx @@ -3,7 +3,7 @@ import { MemoryRouter } from 'react-router-dom'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@components/layout'; describe(`${TestSubject.Layout.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/molecules/users/index.spec.tsx b/src/script/components/molecules/users/index.spec.tsx index 3525119..9dfe67b 100644 --- a/src/script/components/molecules/users/index.spec.tsx +++ b/src/script/components/molecules/users/index.spec.tsx @@ -4,7 +4,7 @@ import { mount } from 'enzyme'; import { DefaultUser } from '@models/user'; -import * as TestSubject from './index'; +import * as TestSubject from '@molecules/users'; describe(`${TestSubject.UsersView.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/organisms/footer/index.spec.tsx b/src/script/components/organisms/footer/index.spec.tsx index 346f1e6..bcf25a8 100644 --- a/src/script/components/organisms/footer/index.spec.tsx +++ b/src/script/components/organisms/footer/index.spec.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@organisms/footer'; describe(`${TestSubject.Footer.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/organisms/header/index.spec.tsx b/src/script/components/organisms/header/index.spec.tsx index 349255e..2fc3a51 100644 --- a/src/script/components/organisms/header/index.spec.tsx +++ b/src/script/components/organisms/header/index.spec.tsx @@ -3,7 +3,7 @@ import { MemoryRouter } from 'react-router-dom'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@organisms/header'; describe(`${TestSubject.Header.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/organisms/main/index.spec.tsx b/src/script/components/organisms/main/index.spec.tsx index 0cac9cc..97a21cf 100644 --- a/src/script/components/organisms/main/index.spec.tsx +++ b/src/script/components/organisms/main/index.spec.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@organisms/main'; describe(`${TestSubject.Main.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/organisms/nav/index.spec.tsx b/src/script/components/organisms/nav/index.spec.tsx index df74002..4200bb4 100644 --- a/src/script/components/organisms/nav/index.spec.tsx +++ b/src/script/components/organisms/nav/index.spec.tsx @@ -3,7 +3,7 @@ import { MemoryRouter } from 'react-router-dom'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@organisms/nav'; describe(`${TestSubject.Nav.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/organisms/users/index.spec.tsx b/src/script/components/organisms/users/index.spec.tsx index 54e52a9..55abaf2 100644 --- a/src/script/components/organisms/users/index.spec.tsx +++ b/src/script/components/organisms/users/index.spec.tsx @@ -3,7 +3,7 @@ import { RecoilRoot } from 'recoil'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@organisms/users'; describe(`${TestSubject.UsersModelView.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/organisms/users/index.tsx b/src/script/components/organisms/users/index.tsx index 63654d0..285dabb 100644 --- a/src/script/components/organisms/users/index.tsx +++ b/src/script/components/organisms/users/index.tsx @@ -1,13 +1,11 @@ import React, { FunctionComponent, memo } from 'react'; import { useRecoilState, useRecoilValue } from 'recoil'; -import { generate } from '@models/user'; +import { generate, UsersAtom, UsersLength } from '@models/user'; import Button from '@atoms/button'; import UsersView from '@molecules/users'; -import { UsersAtom, UsersLength } from '@states/user'; - export const UsersModelView: FunctionComponent = () => { const [users, setUsers] = useRecoilState(UsersAtom); const usersLength = useRecoilValue(UsersLength); diff --git a/src/script/components/pages/about/index.spec.tsx b/src/script/components/pages/about/index.spec.tsx index e71109a..f792f82 100644 --- a/src/script/components/pages/about/index.spec.tsx +++ b/src/script/components/pages/about/index.spec.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@pages/about'; describe(`${TestSubject.AboutPage.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/pages/home/index.spec.tsx b/src/script/components/pages/home/index.spec.tsx index f4a8cad..49e93d3 100644 --- a/src/script/components/pages/home/index.spec.tsx +++ b/src/script/components/pages/home/index.spec.tsx @@ -3,7 +3,7 @@ import { RecoilRoot } from 'recoil'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@pages/home'; describe(`${TestSubject.HomePage.displayName}`, () => { it('exports default', () => { diff --git a/src/script/components/pages/index/index.spec.tsx b/src/script/components/pages/index/index.spec.tsx index ed4a878..e57ceb3 100644 --- a/src/script/components/pages/index/index.spec.tsx +++ b/src/script/components/pages/index/index.spec.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './index'; +import * as TestSubject from '@pages/index'; describe(`${TestSubject.IndexPage.displayName}`, () => { it('exports default', () => { diff --git a/src/script/loading.spec.tsx b/src/script/loading.spec.tsx index 7af5669..3c97c04 100644 --- a/src/script/loading.spec.tsx +++ b/src/script/loading.spec.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { create } from 'react-test-renderer'; import { mount } from 'enzyme'; -import * as TestSubject from './loading'; +import * as TestSubject from '@app/loading'; describe(`${TestSubject.Loading.displayName}`, () => { it('exports default', () => { diff --git a/src/script/models/user.spec.tsx b/src/script/models/user.spec.tsx index ca5cf58..1aae0c4 100644 --- a/src/script/models/user.spec.tsx +++ b/src/script/models/user.spec.tsx @@ -1,4 +1,4 @@ -import * as TestSubject from './user'; +import * as TestSubject from '@models/user'; describe(`models/user`, () => { it('exports generate', () => { @@ -17,6 +17,18 @@ describe(`models/user`, () => { expect(TestSubject.UserPropTypes).toBeDefined(); }); + it('exports default', () => { + expect(TestSubject.default).toStrictEqual(TestSubject.UsersAtom); + }); + + it('exports Atom', () => { + expect(TestSubject.UsersAtom).toBeDefined(); + }); + + it('exports Selector', () => { + expect(TestSubject.UsersLength).toBeDefined(); + }); + it('generate default number of users', async () => { const result = TestSubject.generate(); expect(result.length).toBe(100); diff --git a/src/script/models/user.tsx b/src/script/models/user.tsx index 0201d59..06cebfb 100644 --- a/src/script/models/user.tsx +++ b/src/script/models/user.tsx @@ -1,3 +1,4 @@ +import { atom, selector } from 'recoil'; import { number as IsNumber, shape as IsShape, string as IsString } from 'prop-types'; import faker from 'faker'; @@ -45,18 +46,24 @@ export const generate = (count = 100): User[] => { }; export const generateAsync = async (count = 100): Promise => { - const users = [] as User[]; + return generate(count); +}; - for (let idx = 0; idx < count; idx++) { - users.push({ - id: idx, - firstName: faker.name.firstName(), - lastName: faker.name.lastName(), - eMail: faker.internet.email(), - }); - } +const USERS_KEY = 'userAtom'; - return users; -}; +export const UsersAtom = atom({ + key: USERS_KEY, + default: [] as User[], +}); + +const USERS_LENGTH_KEY = 'usersLengthSelector'; + +export const UsersLength = selector({ + key: USERS_LENGTH_KEY, + get: ({ get }) => { + const users = get(UsersAtom); + return users.length; + }, +}); -export default User; +export default UsersAtom; diff --git a/src/script/states/user.spec.tsx b/src/script/states/user.spec.tsx deleted file mode 100644 index 6c03d0e..0000000 --- a/src/script/states/user.spec.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import * as TestSubject from './user'; - -describe(`models/user`, () => { - it('exports default', () => { - expect(TestSubject.UsersAtom).toBeDefined(); - }); - - it('exports Atom', () => { - expect(TestSubject.UsersAtom).toBeDefined(); - }); - - it('exports Selector', () => { - expect(TestSubject.UsersLength).toBeDefined(); - }); -}); diff --git a/src/script/states/user.tsx b/src/script/states/user.tsx deleted file mode 100644 index 3428f24..0000000 --- a/src/script/states/user.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { User } from '@models/user'; - -import { atom, selector } from 'recoil'; - -const USERS_KEY = 'userAtom'; - -export const UsersAtom = atom({ - key: USERS_KEY, - default: [] as User[], -}); - -const USERS_LENGTH_KEY = 'usersLengthSelector'; - -export const UsersLength = selector({ - key: USERS_LENGTH_KEY, - get: ({ get }) => { - const users = get(UsersAtom); - return users.length; - }, -}); - -export default UsersAtom; diff --git a/src/script/tsconfig.json b/src/script/tsconfig.json index c6d49c5..65978d2 100644 --- a/src/script/tsconfig.json +++ b/src/script/tsconfig.json @@ -33,7 +33,6 @@ "outDir": "../../public/script", "paths": { "@models/*": ["./models/*"], - "@states/*": ["./states/*"], "@atoms/*": ["./components/atoms/*"], "@organisms/*": ["./components/organisms/*"], "@molecules/*": ["./components/molecules/*"], diff --git a/src/script/tsconfig.spec.json b/src/script/tsconfig.spec.json index bfcfa27..383b9e7 100644 --- a/src/script/tsconfig.spec.json +++ b/src/script/tsconfig.spec.json @@ -33,7 +33,6 @@ "outDir": "../../public/script", "paths": { "@models/*": ["./models/*"], - "@states/*": ["./states/*"], "@atoms/*": ["./components/atoms/*"], "@organisms/*": ["./components/organisms/*"], "@molecules/*": ["./components/molecules/*"], diff --git a/webpack.config.js b/webpack.config.js index 72ef230..2171700 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -133,7 +133,7 @@ module.exports = { devServer: { historyApiFallback: true, host: '0.0.0.0', - port: 9000, + port: 7683, }, plugins: plugins, };