Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build(all): use typescript project references #632

Merged
merged 13 commits into from
Feb 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
29 changes: 4 additions & 25 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ jobs:
find packages/demos -iname '*test.ts*' | xargs -n 2 yarn jest --silent
--no-cache --no-verbose --no-coverage --maxWorkers 2 --forceExit

compile:
compile-lint-verify:
runs-on: ubuntu-latest
env:
CI: true
Expand All @@ -88,32 +88,11 @@ jobs:
- name: Compile
run: yarn compile

- name: Size Limit
run: yarn size-limit

lint:
runs-on: ubuntu-latest
env:
CI: true

strategy:
matrix:
node-version: [10.x, 12.x]

steps:
- name: Checkout
uses: actions/checkout@v2

- name: Setup node
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}

- name: Install
run: yarn install

- name: Lint
run: yarn lint

- name: Verify
run: yarn verify

- name: Size Limit
run: yarn size-limit
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ packages/website/build
packages/website/i18n
todo.tasks
yarn-error.log
tsconfig.tsbuildinfo
19 changes: 10 additions & 9 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
"packages/*"
],
"scripts": {
"precompile": "lerna exec --parallel -- rimraf lib",
"compile": "lerna exec -- tsc --project tsconfig.cjs.json",
"compile:esm": "lerna exec --no-private -- tsc --project tsconfig.esm.json",
"clean": "tsc --build --clean && lerna exec --parallel -- rimraf lib",
"compile": "tsc --build --pretty",
"compile:esm": "lerna exec --no-private -- tsc --build tsconfig.esm.json",
"format": "prettier --write '**/*.{js,json,md,ts,tsx,yml}'",
"generate:api-docs": "typedoc --options typedoc.js .",
"generate:api-docs": "node --max_old_space_size=8048 $(npm bin)/typedoc --options typedoc.js .",
"postgenerate:api-docs": "node scripts/process-api-docs.js",
"lint": "cross-env FORCE_COLOR=1 lerna exec --parallel -- tslint --config tslint.json --project tsconfig.json --format stylish",
"size-limit": "lerna exec --no-private --ignore @feature-hub/module-loader-commonjs --parallel -- size-limit",
Expand All @@ -24,8 +24,8 @@
"verify:install": "git diff --exit-code yarn.lock",
"preverify:sort-package-jsons": "yarn sort-package-jsons",
"verify:sort-package-jsons": "git diff --exit-code package.json packages/*/package.json",
"watch:compile": "lerna exec --parallel -- tsc --project tsconfig.cjs.json --watch --preserveWatchOutput --pretty",
"watch:demo": "lerna exec --scope @feature-hub/demos -- ts-node -r tsconfig-paths/register src/watch-demo.ts",
"watch:compile": "yarn compile --watch",
"watch:demo": "lerna exec --scope @feature-hub/demos -- node src/watch-demo.js",
"watch:test": "yarn test --watch --no-coverage --no-verbose",
"watch:test:integration": "yarn watch:test --testPathPattern packages/demos",
"watch:test:unit": "yarn watch:test --testPathIgnorePatterns packages/demos",
Expand All @@ -39,7 +39,8 @@
"@babel/preset-typescript": "^7.12.1",
"@commitlint/cli": "^11.0.0",
"@commitlint/config-angular": "^11.0.0",
"@strictsoftware/typedoc-plugin-monorepo": "^0.3.1",
"@size-limit/preset-small-lib": "^4.9.2",
"@strictsoftware/typedoc-plugin-monorepo": "^0.4.0",
"@types/cheerio": "^0.22.9",
"@types/expect-puppeteer": "^3.3.0",
"@types/git-rev-sync": "^2.0.0",
Expand All @@ -64,11 +65,11 @@
"react": "^16.8.6",
"react-dom": "^16.8.6",
"rimraf": "^3.0.0",
"size-limit": "^1.0.0",
"size-limit": "^4.9.2",
"sort-package-json": "^1.16.0",
"ts-config": "^20.9.0",
"tslint": "^6.1.3",
"typedoc": "^0.19.2",
"typedoc": "^0.20.23",
"typedoc-plugin-remove-references": "^0.0.5",
"typedoc-plugin-sourcefile-url": "^1.0.6",
"typescript": "^4.0.5",
Expand Down
8 changes: 0 additions & 8 deletions packages/async-ssr-manager/tsconfig.cjs.json

This file was deleted.

1 change: 0 additions & 1 deletion packages/async-ssr-manager/tsconfig.esm.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "esnext",
"paths": {},
"outDir": "lib/esm",
"rootDir": "src"
}
Expand Down
9 changes: 7 additions & 2 deletions packages/async-ssr-manager/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
{
"extends": "../../tsconfig.json",
"include": ["src/**/*"]
"extends": "../../tsconfig.settings.json",
"include": ["src/**/*"],
"compilerOptions": {
"outDir": "lib/cjs",
"rootDir": "src"
},
"references": [{"path": "../core"}, {"path": "../logger"}]
}
4 changes: 2 additions & 2 deletions packages/core/.size-limit.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

module.exports = [
{
path: 'lib/cjs/index.js',
limit: '8 KB',
path: ['lib/cjs/index.js'],
limit: '11 KB',
},
];
8 changes: 0 additions & 8 deletions packages/core/tsconfig.cjs.json

This file was deleted.

1 change: 0 additions & 1 deletion packages/core/tsconfig.esm.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "esnext",
"paths": {},
"outDir": "lib/esm",
"rootDir": "src"
}
Expand Down
6 changes: 5 additions & 1 deletion packages/core/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
{
"extends": "../../tsconfig.json",
"extends": "../../tsconfig.settings.json",
"compilerOptions": {
"outDir": "lib/cjs",
"rootDir": "src"
},
"include": ["src/**/*"]
}
5 changes: 1 addition & 4 deletions packages/demos/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,7 @@
"react-router": "^5.0.1",
"style-loader": "^1.0.0",
"styled-components": "^5.2.0",
"ts-loader": "^6.0.0",
"ts-node": "^8.0.0",
"tsconfig-paths": "^3.7.0",
"tsconfig-paths-webpack-plugin": "^3.2.0",
"ts-loader": "^8.0.16",
"url-loader": "^2.0.0",
"webpack": "^4.46.0",
"webpack-cli": "^4.5.0",
Expand Down
18 changes: 18 additions & 0 deletions packages/demos/src/app-renderer.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import {Css} from '@feature-hub/react';
import express from 'express';

export interface AppRendererOptions {
readonly port: number;
readonly req: express.Request;
}

export interface AppRendererResult {
readonly html: string;
readonly serializedStates?: string;
readonly stylesheetsForSsr?: Map<string, Css>;
readonly urlsForHydration?: Set<string>;
}

export type AppRenderer = (
options: AppRendererOptions
) => Promise<AppRendererResult>;
2 changes: 1 addition & 1 deletion packages/demos/src/custom-logging/integrator.node.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {FeatureHubContextProvider} from '@feature-hub/react';
import pino from 'pino';
import * as React from 'react';
import * as ReactDOM from 'react-dom/server';
import {AppRendererOptions, AppRendererResult} from '../node-integrator';
import {AppRendererOptions, AppRendererResult} from '../app-renderer';
import {App} from './app';

export default async function renderApp({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {createCommonJsModuleLoader} from '@feature-hub/module-loader-commonjs';
import {FeatureAppLoader, FeatureHubContextProvider} from '@feature-hub/react';
import * as React from 'react';
import * as ReactDOM from 'react-dom/server';
import {AppRendererOptions, AppRendererResult} from '../node-integrator';
import {AppRendererOptions, AppRendererResult} from '../app-renderer';
import {externals} from './externals';

export default async function renderApp({
Expand Down
2 changes: 1 addition & 1 deletion packages/demos/src/get-pkg-version.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ function getPkgVersion(pkgName) {
return require(pkgJsonPath).version;
}

exports.getPkgVersion = getPkgVersion;
module.exports = {getPkgVersion};
2 changes: 1 addition & 1 deletion packages/demos/src/history-service/integrator.node.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {defineHistoryService} from '@feature-hub/history-service';
import {defineServerRequest} from '@feature-hub/server-request';
import * as React from 'react';
import * as ReactDOM from 'react-dom/server';
import {AppRendererOptions, AppRendererResult} from '../node-integrator';
import {AppRendererOptions, AppRendererResult} from '../app-renderer';
import {App} from './app';
import {rootLocationTransformer} from './root-location-transformer';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {loadCommonJsModule} from '@feature-hub/module-loader-commonjs';
import {FeatureAppLoader, FeatureHubContextProvider} from '@feature-hub/react';
import * as React from 'react';
import * as ReactDOM from 'react-dom/server';
import {AppRendererOptions, AppRendererResult} from '../node-integrator';
import {AppRendererOptions, AppRendererResult} from '../app-renderer';

export default async function renderApp({
port,
Expand Down
64 changes: 64 additions & 0 deletions packages/demos/src/node-integrator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// @ts-check

/**
* @param {string} source
* @return {unknown}
*/
function evalNodeSource(source) {
const mod = {exports: {}};

// tslint:disable-next-line:function-constructor
Function('module', 'exports', 'require', source)(mod, mod.exports, require);

return mod.exports;
}

/**
* @param {unknown} value
* @return {value is Record<string, unknown>}
*/
function isObject(value) {
return typeof value === 'object' && value !== null;
}

/**
* @param {unknown} value
* @return {value is {default: Function}}
*/
function hasDefaultFunction(value) {
return isObject(value) && typeof value.default === 'function';
}

/**
* @param {import('express').Response} res
* @param {string} nodeIntegratorFilename
* @return {import('./app-renderer').AppRenderer | undefined}
*/
function loadNodeIntegrator(res, nodeIntegratorFilename) {
try {
/** @type {import('webpack').InputFileSystem & import('webpack').OutputFileSystem} */
const outputFileSystem = res.locals.webpack.devMiddleware.outputFileSystem;

/** @type {import('webpack').Stats.ToJsonOutput} */
const {outputPath} = res.locals.webpack.devMiddleware.stats.toJson();

if (!outputPath) {
return undefined;
}

const source = outputFileSystem
.readFileSync(outputFileSystem.join(outputPath, nodeIntegratorFilename))
.toString();

const evaluatedModule = evalNodeSource(source);

return hasDefaultFunction(evaluatedModule)
? /** @type {import('./app-renderer').AppRenderer} */
(evaluatedModule.default)
: undefined;
} catch {
return undefined;
}
}

module.exports = {loadNodeIntegrator};
49 changes: 0 additions & 49 deletions packages/demos/src/node-integrator.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
} from '@feature-hub/serialized-state-manager';
import * as React from 'react';
import * as ReactDOM from 'react-dom/server';
import {AppRendererOptions, AppRendererResult} from '../node-integrator';
import {AppRendererOptions, AppRendererResult} from '../app-renderer';
import {App} from './app';

export default async function renderApp({
Expand Down