From f4e42e9e011284a48e2236d35ba5e48a98debe1c Mon Sep 17 00:00:00 2001 From: Will Lynch Date: Fri, 17 Feb 2023 10:46:52 -0500 Subject: [PATCH] Update readme and add test --- README.md | 4 ++ example/src/use-from-ts/index.ts | 5 --- {example => examples/example}/custom-fs.js | 0 {example => examples/example}/src/index.ts | 0 .../example}/src/mapped/bar/file1.ts | 0 .../example}/src/mapped/foo/index.ts | 0 .../star/browser-field-package/browser.ts | 0 .../mapped/star/browser-field-package/node.ts | 0 .../star/browser-field-package/package.json | 0 .../mapped/star/main-field-package/node.ts | 0 .../star/main-field-package/package.json | 0 .../star/no-main-field-package/index.ts | 0 .../star/no-main-field-package/package.json | 0 .../src/mapped/star/star-bar/index.ts | 0 examples/example/src/use-from-ts/index.ts | 5 +++ {example => examples/example}/tsconfig.json | 3 +- .../example}/webpack.config.js | 0 examples/referenceExample/custom-fs.js | 25 +++++++++++ examples/referenceExample/src/index.ts | 16 +++++++ .../referenceExample/src/mapped/bar/file1.ts | 1 + .../referenceExample/src/mapped/foo/index.ts | 1 + .../star/browser-field-package/browser.ts | 1 + .../mapped/star/browser-field-package/node.ts | 1 + .../star/browser-field-package/package.json | 5 +++ .../mapped/star/main-field-package/node.ts | 1 + .../star/main-field-package/package.json | 4 ++ .../star/no-main-field-package/index.ts | 1 + .../star/no-main-field-package/package.json | 3 ++ .../src/mapped/star/star-bar/index.ts | 1 + .../referenceExample/src/use-from-ts/index.ts | 5 +++ examples/referenceExample/tsconfig.json | 19 +++++++++ examples/referenceExample/webpack.config.js | 37 ++++++++++++++++ package.json | 4 +- src/__tests__/plugins.test.ts | 42 +++++++++++++++++-- 34 files changed, 172 insertions(+), 12 deletions(-) delete mode 100644 example/src/use-from-ts/index.ts rename {example => examples/example}/custom-fs.js (100%) rename {example => examples/example}/src/index.ts (100%) rename {example => examples/example}/src/mapped/bar/file1.ts (100%) rename {example => examples/example}/src/mapped/foo/index.ts (100%) rename {example => examples/example}/src/mapped/star/browser-field-package/browser.ts (100%) rename {example => examples/example}/src/mapped/star/browser-field-package/node.ts (100%) rename {example => examples/example}/src/mapped/star/browser-field-package/package.json (100%) rename {example => examples/example}/src/mapped/star/main-field-package/node.ts (100%) rename {example => examples/example}/src/mapped/star/main-field-package/package.json (100%) rename {example => examples/example}/src/mapped/star/no-main-field-package/index.ts (100%) rename {example => examples/example}/src/mapped/star/no-main-field-package/package.json (100%) rename {example => examples/example}/src/mapped/star/star-bar/index.ts (100%) create mode 100644 examples/example/src/use-from-ts/index.ts rename {example => examples/example}/tsconfig.json (90%) rename {example => examples/example}/webpack.config.js (100%) create mode 100644 examples/referenceExample/custom-fs.js create mode 100644 examples/referenceExample/src/index.ts create mode 100644 examples/referenceExample/src/mapped/bar/file1.ts create mode 100644 examples/referenceExample/src/mapped/foo/index.ts create mode 100644 examples/referenceExample/src/mapped/star/browser-field-package/browser.ts create mode 100644 examples/referenceExample/src/mapped/star/browser-field-package/node.ts create mode 100644 examples/referenceExample/src/mapped/star/browser-field-package/package.json create mode 100644 examples/referenceExample/src/mapped/star/main-field-package/node.ts create mode 100644 examples/referenceExample/src/mapped/star/main-field-package/package.json create mode 100644 examples/referenceExample/src/mapped/star/no-main-field-package/index.ts create mode 100644 examples/referenceExample/src/mapped/star/no-main-field-package/package.json create mode 100644 examples/referenceExample/src/mapped/star/star-bar/index.ts create mode 100644 examples/referenceExample/src/use-from-ts/index.ts create mode 100644 examples/referenceExample/tsconfig.json create mode 100644 examples/referenceExample/webpack.config.js diff --git a/README.md b/README.md index e9f357f..3b10784 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,10 @@ This is important if you read from stdout or stderr and for proper error handling. The default value ensures that you can read from stdout e.g. via pipes or you use webpack -j to generate json output. +#### references _(string[]) (default=undefined) + +Support for [Typescript Project References](https://www.typescriptlang.org/docs/handbook/project-references.html). + ## Typescript support This package has typescript typings included. If your webpack config is using typescript, you can use this syntax to import the default export: diff --git a/example/src/use-from-ts/index.ts b/example/src/use-from-ts/index.ts deleted file mode 100644 index a84afef..0000000 --- a/example/src/use-from-ts/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { TsconfigPathsPlugin } from "../../../src/index"; -import TsconfigPathsPluginDefault from "../../../src/index"; - -const plugin1 = new TsconfigPathsPlugin(); -const plugin2 = new TsconfigPathsPluginDefault(); diff --git a/example/custom-fs.js b/examples/example/custom-fs.js similarity index 100% rename from example/custom-fs.js rename to examples/example/custom-fs.js diff --git a/example/src/index.ts b/examples/example/src/index.ts similarity index 100% rename from example/src/index.ts rename to examples/example/src/index.ts diff --git a/example/src/mapped/bar/file1.ts b/examples/example/src/mapped/bar/file1.ts similarity index 100% rename from example/src/mapped/bar/file1.ts rename to examples/example/src/mapped/bar/file1.ts diff --git a/example/src/mapped/foo/index.ts b/examples/example/src/mapped/foo/index.ts similarity index 100% rename from example/src/mapped/foo/index.ts rename to examples/example/src/mapped/foo/index.ts diff --git a/example/src/mapped/star/browser-field-package/browser.ts b/examples/example/src/mapped/star/browser-field-package/browser.ts similarity index 100% rename from example/src/mapped/star/browser-field-package/browser.ts rename to examples/example/src/mapped/star/browser-field-package/browser.ts diff --git a/example/src/mapped/star/browser-field-package/node.ts b/examples/example/src/mapped/star/browser-field-package/node.ts similarity index 100% rename from example/src/mapped/star/browser-field-package/node.ts rename to examples/example/src/mapped/star/browser-field-package/node.ts diff --git a/example/src/mapped/star/browser-field-package/package.json b/examples/example/src/mapped/star/browser-field-package/package.json similarity index 100% rename from example/src/mapped/star/browser-field-package/package.json rename to examples/example/src/mapped/star/browser-field-package/package.json diff --git a/example/src/mapped/star/main-field-package/node.ts b/examples/example/src/mapped/star/main-field-package/node.ts similarity index 100% rename from example/src/mapped/star/main-field-package/node.ts rename to examples/example/src/mapped/star/main-field-package/node.ts diff --git a/example/src/mapped/star/main-field-package/package.json b/examples/example/src/mapped/star/main-field-package/package.json similarity index 100% rename from example/src/mapped/star/main-field-package/package.json rename to examples/example/src/mapped/star/main-field-package/package.json diff --git a/example/src/mapped/star/no-main-field-package/index.ts b/examples/example/src/mapped/star/no-main-field-package/index.ts similarity index 100% rename from example/src/mapped/star/no-main-field-package/index.ts rename to examples/example/src/mapped/star/no-main-field-package/index.ts diff --git a/example/src/mapped/star/no-main-field-package/package.json b/examples/example/src/mapped/star/no-main-field-package/package.json similarity index 100% rename from example/src/mapped/star/no-main-field-package/package.json rename to examples/example/src/mapped/star/no-main-field-package/package.json diff --git a/example/src/mapped/star/star-bar/index.ts b/examples/example/src/mapped/star/star-bar/index.ts similarity index 100% rename from example/src/mapped/star/star-bar/index.ts rename to examples/example/src/mapped/star/star-bar/index.ts diff --git a/examples/example/src/use-from-ts/index.ts b/examples/example/src/use-from-ts/index.ts new file mode 100644 index 0000000..1299aad --- /dev/null +++ b/examples/example/src/use-from-ts/index.ts @@ -0,0 +1,5 @@ +import { TsconfigPathsPlugin } from "../../../../src/index"; +import TsconfigPathsPluginDefault from "../../../../src/index"; + +const plugin1 = new TsconfigPathsPlugin(); +const plugin2 = new TsconfigPathsPluginDefault(); diff --git a/example/tsconfig.json b/examples/example/tsconfig.json similarity index 90% rename from example/tsconfig.json rename to examples/example/tsconfig.json index 9f0a467..e5162e1 100644 --- a/example/tsconfig.json +++ b/examples/example/tsconfig.json @@ -9,6 +9,7 @@ "foo": ["./src/mapped/foo"], "bar/*": ["./src/mapped/bar/*"], "*": ["./src/mapped/star/*"] - } + }, + "composite": true } } diff --git a/example/webpack.config.js b/examples/example/webpack.config.js similarity index 100% rename from example/webpack.config.js rename to examples/example/webpack.config.js diff --git a/examples/referenceExample/custom-fs.js b/examples/referenceExample/custom-fs.js new file mode 100644 index 0000000..c1f0179 --- /dev/null +++ b/examples/referenceExample/custom-fs.js @@ -0,0 +1,25 @@ +const fs = require("fs"); +const webpack = require("webpack"); + +const config = require("./webpack.config"); + +const compiler = webpack(config); + +compiler.inputFileSystem = fs; + +compiler.run(function (error, stats) { + if (error) { + console.error(error); + return process.exit(1); + } + + if (stats.compilation.errors.length) { + stats.compilation.errors.forEach((compilationError) => { + console.error(compilationError); + }); + + return process.exit(1); + } + + console.log("Successfully compiled"); +}); diff --git a/examples/referenceExample/src/index.ts b/examples/referenceExample/src/index.ts new file mode 100644 index 0000000..25397c4 --- /dev/null +++ b/examples/referenceExample/src/index.ts @@ -0,0 +1,16 @@ +import * as foo from "src/mapped/buzz"; +import * as bar from "src/mapped/fizz/file1"; +import * as myStar from "star-bar"; +import * as packagedBrowser from "browser-field-package"; +import * as packagedMain from "main-field-package"; +import * as packagedIndex from "no-main-field-package"; + +console.log( + "HELLO WORLD!", + foo.message, + bar.message, + myStar.message, + packagedBrowser.message, + packagedMain.message, + packagedIndex.message +); diff --git a/examples/referenceExample/src/mapped/bar/file1.ts b/examples/referenceExample/src/mapped/bar/file1.ts new file mode 100644 index 0000000..8f20433 --- /dev/null +++ b/examples/referenceExample/src/mapped/bar/file1.ts @@ -0,0 +1 @@ +export const message = "fizz"; diff --git a/examples/referenceExample/src/mapped/foo/index.ts b/examples/referenceExample/src/mapped/foo/index.ts new file mode 100644 index 0000000..37cffa8 --- /dev/null +++ b/examples/referenceExample/src/mapped/foo/index.ts @@ -0,0 +1 @@ +export const message = "GOODBYE!"; diff --git a/examples/referenceExample/src/mapped/star/browser-field-package/browser.ts b/examples/referenceExample/src/mapped/star/browser-field-package/browser.ts new file mode 100644 index 0000000..411a3cc --- /dev/null +++ b/examples/referenceExample/src/mapped/star/browser-field-package/browser.ts @@ -0,0 +1 @@ +export const message = "browser"; diff --git a/examples/referenceExample/src/mapped/star/browser-field-package/node.ts b/examples/referenceExample/src/mapped/star/browser-field-package/node.ts new file mode 100644 index 0000000..f535458 --- /dev/null +++ b/examples/referenceExample/src/mapped/star/browser-field-package/node.ts @@ -0,0 +1 @@ +export const message = "node"; diff --git a/examples/referenceExample/src/mapped/star/browser-field-package/package.json b/examples/referenceExample/src/mapped/star/browser-field-package/package.json new file mode 100644 index 0000000..f016657 --- /dev/null +++ b/examples/referenceExample/src/mapped/star/browser-field-package/package.json @@ -0,0 +1,5 @@ +{ + "name": "browser-field", + "main": "node.ts", + "browser": "browser.ts" +} diff --git a/examples/referenceExample/src/mapped/star/main-field-package/node.ts b/examples/referenceExample/src/mapped/star/main-field-package/node.ts new file mode 100644 index 0000000..f535458 --- /dev/null +++ b/examples/referenceExample/src/mapped/star/main-field-package/node.ts @@ -0,0 +1 @@ +export const message = "node"; diff --git a/examples/referenceExample/src/mapped/star/main-field-package/package.json b/examples/referenceExample/src/mapped/star/main-field-package/package.json new file mode 100644 index 0000000..6dea594 --- /dev/null +++ b/examples/referenceExample/src/mapped/star/main-field-package/package.json @@ -0,0 +1,4 @@ +{ + "name": "main-field", + "main": "node.ts" +} diff --git a/examples/referenceExample/src/mapped/star/no-main-field-package/index.ts b/examples/referenceExample/src/mapped/star/no-main-field-package/index.ts new file mode 100644 index 0000000..f7bc95c --- /dev/null +++ b/examples/referenceExample/src/mapped/star/no-main-field-package/index.ts @@ -0,0 +1 @@ +export const message = "index"; diff --git a/examples/referenceExample/src/mapped/star/no-main-field-package/package.json b/examples/referenceExample/src/mapped/star/no-main-field-package/package.json new file mode 100644 index 0000000..7077904 --- /dev/null +++ b/examples/referenceExample/src/mapped/star/no-main-field-package/package.json @@ -0,0 +1,3 @@ +{ + "name": "no-main-field" +} diff --git a/examples/referenceExample/src/mapped/star/star-bar/index.ts b/examples/referenceExample/src/mapped/star/star-bar/index.ts new file mode 100644 index 0000000..1a9c8b4 --- /dev/null +++ b/examples/referenceExample/src/mapped/star/star-bar/index.ts @@ -0,0 +1 @@ +export const message = "Hello Star!"; diff --git a/examples/referenceExample/src/use-from-ts/index.ts b/examples/referenceExample/src/use-from-ts/index.ts new file mode 100644 index 0000000..1299aad --- /dev/null +++ b/examples/referenceExample/src/use-from-ts/index.ts @@ -0,0 +1,5 @@ +import { TsconfigPathsPlugin } from "../../../../src/index"; +import TsconfigPathsPluginDefault from "../../../../src/index"; + +const plugin1 = new TsconfigPathsPlugin(); +const plugin2 = new TsconfigPathsPluginDefault(); diff --git a/examples/referenceExample/tsconfig.json b/examples/referenceExample/tsconfig.json new file mode 100644 index 0000000..c981de8 --- /dev/null +++ b/examples/referenceExample/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + // Output + "module": "commonjs", + "target": "es5", + "outDir": "./js_out", + "baseUrl": ".", + "paths": { + "foo": ["src/mapped/bar"], + "bar/*": ["src/mapped/foo/*"], + "*": ["./src/mapped/star/*"] + } + }, + "references": [ + { + "path": "../example/tsconfig.json" + } + ] +} diff --git a/examples/referenceExample/webpack.config.js b/examples/referenceExample/webpack.config.js new file mode 100644 index 0000000..f29f992 --- /dev/null +++ b/examples/referenceExample/webpack.config.js @@ -0,0 +1,37 @@ +const path = require("path"); +const TsconfigPathsPlugin = require("../"); + +module.exports = { + mode: "development", + context: path.resolve(__dirname, "src"), + entry: "./index", + output: { + path: path.join(__dirname, "temp"), + filename: "bundle.js", + }, + module: { + rules: [ + { + test: /\\.tsx?$/, + exclude: /^node_modules/, + loader: "ts-loader", + options: { + configFile: "./example/tsconfig.json", + }, + }, + ], + }, + resolve: { + extensions: [".ts", ".tsx", ".js"], + plugins: [ + new TsconfigPathsPlugin({ + configFile: "./tsconfig.json", + logLevel: "info", + extensions: [".ts", ".tsx"], + mainFields: ["browser", "main"], + references: ["../example/tsconfig.json"] + // baseUrl: "/foo" + }), + ], + }, +}; diff --git a/package.json b/package.json index 4ed74df..6afa577 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ }, "scripts": { "prepare": "husky install", - "compile:example": "tsc -p example", - "example": "yarn build && cd example && webpack && node custom-fs.js", + "compile:example": "tsc -p examples/example", + "example": "yarn build && cd examples/example && webpack && node custom-fs.js", "build": "rimraf lib && tsc -p .", "lint": "eslint \"./{src,tests}/**/*.ts{,x}\" --ext .js,.ts,.tsx -f visualstudio", "test": "jest", diff --git a/src/__tests__/plugins.test.ts b/src/__tests__/plugins.test.ts index 3b8e837..d3b868b 100644 --- a/src/__tests__/plugins.test.ts +++ b/src/__tests__/plugins.test.ts @@ -7,7 +7,7 @@ describe(`TsconfigPathsPlugin`, () => { const SETTINGS: Configuration = { mode: "development", context: path.resolve(__dirname, "src"), - entry: `${__dirname}/../../example/src/index.ts`, + entry: `${__dirname}/../../examples/example/src/index.ts`, output: { path: path.join(__dirname, "../../temp"), filename: "bundle.js", @@ -31,7 +31,7 @@ describe(`TsconfigPathsPlugin`, () => { it(`Can initialize the plugin`, (done) => { const testPlugin = new TsconfigPathsPlugin({ - configFile: `${__dirname}/../../example/tsconfig.json`, + configFile: `${__dirname}/../../examples/example/tsconfig.json`, logLevel: "INFO", extensions: [".ts", ".tsx"], mainFields: ["browser", "main"], @@ -63,7 +63,7 @@ describe(`TsconfigPathsPlugin`, () => { it(`Test to ensure Apply exists and is working`, (done) => { const webpackSettings: Configuration = { - entry: `${__dirname}/../../example/src/index.ts`, + entry: `${__dirname}/../../examples/example/src/index.ts`, target: "web", output: { path: path.join(__dirname, "../../temp"), @@ -86,7 +86,7 @@ describe(`TsconfigPathsPlugin`, () => { ], plugins: [ new TsconfigPathsPlugin({ - configFile: `${__dirname}/../../example/tsconfig.json`, + configFile: `${__dirname}/../../examples/example/tsconfig.json`, }), ], }, @@ -117,4 +117,38 @@ describe(`TsconfigPathsPlugin`, () => { done(); }); }); + + it(`Resolves project references`, (done) => { + const testPlugin = new TsconfigPathsPlugin({ + configFile: `${__dirname}/../../examples/referenceExample/tsconfig.json`, + logLevel: "INFO", + extensions: [".ts", ".tsx"], + mainFields: ["browser", "main"], + references: [`${__dirname}/../../examples/example/tsconfig.json`], + }); + expect(testPlugin).toBeInstanceOf(TsconfigPathsPlugin); + + const testSettings: Configuration = { + ...SETTINGS, + resolve: { + extensions: [".ts", ".tsx", ".js"], + plugins: [testPlugin], + }, + }; + + const compiler = webpack(testSettings); + + compiler.run((err, stats) => { + if (err) { + done(err); + return; + } + expect(stats).toBeDefined(); + + const details = stats?.toJson(); + expect(details?.errorsCount).toEqual(0); + // TODO There should probably be a test that verifies the stats match what is expected + done(); + }); + }); });