🎯 MapView v2.0 - Global Deployment Ready

 MAJOR FEATURES:
• Auto-zoom intelligence với smart bounds fitting
• Enhanced 3D GPS markers với pulsing effects
• Professional route display với 6-layer rendering
• Status-based parking icons với availability indicators
• Production-ready build optimizations

🗺️ AUTO-ZOOM FEATURES:
• Smart bounds fitting cho GPS + selected parking
• Adaptive padding (50px) cho visual balance
• Max zoom control (level 16) để tránh quá gần
• Dynamic centering khi không có selection

🎨 ENHANCED VISUALS:
• 3D GPS marker với multi-layer pulse effects
• Advanced parking icons với status colors
• Selection highlighting với animation
• Dimming system cho non-selected items

🛣️ ROUTE SYSTEM:
• OpenRouteService API integration
• Multi-layer route rendering (glow, shadow, main, animated)
• Real-time distance & duration calculation
• Visual route info trong popup

📱 PRODUCTION READY:
• SSR safe với dynamic imports
• Build errors resolved
• Global deployment via Vercel
• Optimized performance

🌍 DEPLOYMENT:
• Vercel: https://whatever-ctk2auuxr-phong12hexdockworks-projects.vercel.app
• Bundle size: 22.8 kB optimized
• Global CDN distribution
• HTTPS enabled

💾 VERSION CONTROL:
• MapView-v2.0.tsx backup created
• MAPVIEW_VERSIONS.md documentation
• Full version history tracking
This commit is contained in:
2025-07-20 19:52:16 +07:00
parent 3203463a6a
commit c65cc97a33
64624 changed files with 7199453 additions and 6462 deletions

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,55 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var logger_1 = require("../logger");
var chalk = require("chalk");
var jest_mock_process_1 = require("jest-mock-process");
// jest.mock("Console", () => {
// return jest.fn();
// });
describe("Logger", function () {
var mockStdout = (0, jest_mock_process_1.mockProcessStdout)();
var mockStderr = (0, jest_mock_process_1.mockProcessStderr)();
beforeEach(function () {
jest.clearAllMocks();
});
test("Can create a logger instance to process.stdout", function () {
var result = (0, logger_1.makeLogger)({
baseUrl: undefined,
colors: false,
configFile: "",
context: undefined,
extensions: [],
logInfoToStdOut: true,
logLevel: "INFO",
mainFields: [],
silent: false,
references: undefined,
}, new chalk.Instance());
expect(result).toBeDefined();
result.logInfo("Test logInfo");
result.logWarning("Test logWarning");
result.logError("Test logError");
result.log("Test external logger");
expect(mockStdout).toHaveBeenCalledTimes(2);
expect(mockStderr).toHaveBeenCalledTimes(2);
});
test("Can create a logger instance to process.stderr", function () {
var result = (0, logger_1.makeLogger)({
baseUrl: undefined,
colors: false,
configFile: "",
context: undefined,
extensions: [],
logInfoToStdOut: false,
logLevel: "INFO",
mainFields: [],
silent: false,
references: undefined,
}, new chalk.Instance());
expect(result).toBeDefined();
result.log("Test external logger");
expect(mockStderr).toHaveBeenCalledTimes(1);
expect(mockStdout).not.toHaveBeenCalled();
});
});
//# sourceMappingURL=logger.test.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../src/__tests__/logger.test.ts"],"names":[],"mappings":";;AAAA,oCAAuC;AACvC,6BAA+B;AAC/B,uDAAyE;AAEzE,+BAA+B;AAC/B,sBAAsB;AACtB,MAAM;AAEN,QAAQ,CAAC,QAAQ,EAAE;IACjB,IAAM,UAAU,GAAG,IAAA,qCAAiB,GAAE,CAAC;IACvC,IAAM,UAAU,GAAG,IAAA,qCAAiB,GAAE,CAAC;IAEvC,UAAU,CAAC;QACT,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE;QACrD,IAAM,MAAM,GAAG,IAAA,mBAAU,EACvB;YACE,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,EAAE;YACd,eAAe,EAAE,IAAI;YACrB,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,SAAS;SACtB,EACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CACrB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAE7B,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/B,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAEnC,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE;QACrD,IAAM,MAAM,GAAG,IAAA,mBAAU,EACvB;YACE,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,EAAE;YACd,eAAe,EAAE,KAAK;YACtB,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,SAAS;SACtB,EACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CACrB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAE7B,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAEnC,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,148 @@
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var webpack = require("webpack");
var path = require("path");
var plugin_1 = require("../plugin");
describe("TsconfigPathsPlugin", function () {
var SETTINGS = {
mode: "development",
context: path.resolve(__dirname, "src"),
entry: "".concat(__dirname, "/../../examples/example/src/index.ts"),
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"],
},
};
it("Can initialize the plugin", function (done) {
var testPlugin = new plugin_1.TsconfigPathsPlugin({
configFile: "".concat(__dirname, "/../../examples/example/tsconfig.json"),
logLevel: "INFO",
extensions: [".ts", ".tsx"],
mainFields: ["browser", "main"],
});
expect(testPlugin).toBeInstanceOf(plugin_1.TsconfigPathsPlugin);
var testSettings = __assign(__assign({}, SETTINGS), { resolve: {
extensions: [".ts", ".tsx", ".js"],
plugins: [testPlugin],
} });
var compiler = webpack(testSettings);
compiler.run(function (err, stats) {
if (err) {
done(err);
return;
}
expect(stats).toBeDefined();
var details = stats === null || stats === void 0 ? void 0 : stats.toJson();
expect(details === null || details === void 0 ? void 0 : details.errorsCount).toEqual(0);
// TODO There should probably be a test that verifies the stats match what is expected
done();
});
});
it("Test to ensure Apply exists and is working", function (done) {
var _a, _b, _c;
var webpackSettings = {
entry: "".concat(__dirname, "/../../examples/example/src/index.ts"),
target: "web",
output: {
path: path.join(__dirname, "../../temp"),
filename: "[name].js",
},
mode: "development",
resolve: {
extensions: [
".ts",
".tsx",
".js",
".jsx",
"ttf",
"eot",
"otf",
"svg",
"png",
"woff",
"woff2",
],
plugins: [
new plugin_1.TsconfigPathsPlugin({
configFile: "".concat(__dirname, "/../../examples/example/tsconfig.json"),
}),
],
},
module: {
rules: [],
},
};
// Build compiler
var compiler = webpack(webpackSettings);
var pluginInstance = (_c = (_b = (_a = compiler === null || compiler === void 0 ? void 0 : compiler.options) === null || _a === void 0 ? void 0 : _a.resolve) === null || _b === void 0 ? void 0 : _b.plugins) === null || _c === void 0 ? void 0 : _c.find(function (plugin) { return plugin instanceof plugin_1.TsconfigPathsPlugin; });
if (!pluginInstance) {
return done("TsconfigPathsPlugin not loaded in webpack settings");
}
expect(pluginInstance instanceof plugin_1.TsconfigPathsPlugin).toBeTruthy();
expect(pluginInstance.apply).toBeDefined();
// Run compiler
compiler.run(function (err, stats) {
if (err) {
done(err);
return;
}
expect(stats).toBeDefined();
var details = stats === null || stats === void 0 ? void 0 : stats.toJson();
expect(details === null || details === void 0 ? void 0 : details.errorsCount).toEqual(0);
done();
});
});
it("Resolves project references", function (done) {
var testPlugin = new plugin_1.TsconfigPathsPlugin({
configFile: "".concat(__dirname, "/../../examples/referenceExample/tsconfig.json"),
logLevel: "INFO",
extensions: [".ts", ".tsx"],
mainFields: ["browser", "main"],
references: ["".concat(__dirname, "/../../examples/example/tsconfig.json")],
});
expect(testPlugin).toBeInstanceOf(plugin_1.TsconfigPathsPlugin);
var testSettings = __assign(__assign({}, SETTINGS), { resolve: {
extensions: [".ts", ".tsx", ".js"],
plugins: [testPlugin],
} });
var compiler = webpack(testSettings);
compiler.run(function (err, stats) {
if (err) {
done(err);
return;
}
expect(stats).toBeDefined();
var details = stats === null || stats === void 0 ? void 0 : stats.toJson();
expect(details === null || details === void 0 ? void 0 : details.errorsCount).toEqual(0);
// TODO There should probably be a test that verifies the stats match what is expected
done();
});
});
});
//# sourceMappingURL=plugins.test.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"plugins.test.js","sourceRoot":"","sources":["../../src/__tests__/plugins.test.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,3 @@
export { TsconfigPathsPlugin } from "./plugin";
import { TsconfigPathsPlugin } from "./plugin";
export default TsconfigPathsPlugin;

View File

@@ -0,0 +1,16 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TsconfigPathsPlugin = void 0;
var plugin_1 = require("./plugin");
Object.defineProperty(exports, "TsconfigPathsPlugin", { enumerable: true, get: function () { return plugin_1.TsconfigPathsPlugin; } });
var plugin_2 = require("./plugin");
exports.default = plugin_2.TsconfigPathsPlugin;
// This is to make it importable in all these ways
// const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
// import TsconfigPathsPlugin from "tsconfig-paths-webpack-plugin";
// import { TsconfigPathsPlugin } from "tsconfig-paths-webpack-plugin";
var theClass = require("./plugin").TsconfigPathsPlugin;
theClass.TsconfigPathsPlugin = plugin_2.TsconfigPathsPlugin;
theClass.default = plugin_2.TsconfigPathsPlugin;
module.exports = theClass;
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAA+C;AAAtC,6GAAA,mBAAmB,OAAA;AAC5B,mCAA+C;AAC/C,kBAAe,4BAAmB,CAAC;AAEnC,kDAAkD;AAClD,wEAAwE;AACxE,mEAAmE;AACnE,uEAAuE;AACvE,IAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,mBAAmB,CAAC;AACzD,QAAQ,CAAC,mBAAmB,GAAG,4BAAmB,CAAC;AACnD,QAAQ,CAAC,OAAO,GAAG,4BAAmB,CAAC;AACvC,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC"}

View File

@@ -0,0 +1,10 @@
import { Options } from "./options";
import { Chalk } from "chalk";
export type LoggerFunc = (message: string) => void;
export interface Logger {
log: LoggerFunc;
logInfo: LoggerFunc;
logWarning: LoggerFunc;
logError: LoggerFunc;
}
export declare function makeLogger(options: Options, colors: Chalk): Logger;

View File

@@ -0,0 +1,53 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeLogger = void 0;
var console_1 = require("console");
var LogLevel;
(function (LogLevel) {
LogLevel[LogLevel["INFO"] = 1] = "INFO";
LogLevel[LogLevel["WARN"] = 2] = "WARN";
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
})(LogLevel || (LogLevel = {}));
var stderrConsole = new console_1.Console(process.stderr);
var stdoutConsole = new console_1.Console(process.stdout);
var doNothingLogger = function (_message) {
/* Do nothing */
};
var makeLoggerFunc = function (options) {
return options.silent
? function (_whereToLog, _message) {
/* Do nothing */
}
: function (whereToLog, message) { return whereToLog.log(message); };
};
var makeExternalLogger = function (loaderOptions, logger) { return function (message) {
return logger(loaderOptions.logInfoToStdOut ? stdoutConsole : stderrConsole, message);
}; };
var makeLogInfo = function (options, logger, green) {
return LogLevel[options.logLevel] <= LogLevel.INFO
? function (message) {
return logger(options.logInfoToStdOut ? stdoutConsole : stderrConsole, green(message));
}
: doNothingLogger;
};
var makeLogError = function (options, logger, red) {
return LogLevel[options.logLevel] <= LogLevel.ERROR
? function (message) { return logger(stderrConsole, red(message)); }
: doNothingLogger;
};
var makeLogWarning = function (options, logger, yellow) {
return LogLevel[options.logLevel] <= LogLevel.WARN
? function (message) { return logger(stderrConsole, yellow(message)); }
: doNothingLogger;
};
function makeLogger(options, colors) {
var logger = makeLoggerFunc(options);
return {
log: makeExternalLogger(options, logger),
logInfo: makeLogInfo(options, logger, colors.green),
logWarning: makeLogWarning(options, logger, colors.yellow),
logError: makeLogError(options, logger, colors.red),
};
}
exports.makeLogger = makeLogger;
//# sourceMappingURL=logger.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAgBlC,IAAK,QAIJ;AAJD,WAAK,QAAQ;IACX,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EAJI,QAAQ,KAAR,QAAQ,QAIZ;AAED,IAAM,aAAa,GAAG,IAAI,iBAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAClD,IAAM,aAAa,GAAG,IAAI,iBAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAElD,IAAM,eAAe,GAAG,UAAC,QAAgB;IACvC,gBAAgB;AAClB,CAAC,CAAC;AAEF,IAAM,cAAc,GAAG,UAAC,OAAgB;IACtC,OAAA,OAAO,CAAC,MAAM;QACZ,CAAC,CAAC,UAAC,WAAoB,EAAE,QAAgB;YACrC,gBAAgB;QAClB,CAAC;QACH,CAAC,CAAC,UAAC,UAAmB,EAAE,OAAe,IAAK,OAAA,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAvB,CAAuB;AAJrE,CAIqE,CAAC;AAExE,IAAM,kBAAkB,GAAG,UACzB,aAAsB,EACtB,MAA0B,IACX,OAAA,UAAC,OAAe;IAC/B,OAAA,MAAM,CACJ,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAC7D,OAAO,CACR;AAHD,CAGC,EAJc,CAId,CAAC;AAEJ,IAAM,WAAW,GAAG,UAClB,OAAgB,EAChB,MAA0B,EAC1B,KAAY;IAEZ,OAAA,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI;QACzC,CAAC,CAAC,UAAC,OAAe;YACd,OAAA,MAAM,CACJ,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EACvD,KAAK,CAAC,OAAO,CAAC,CACf;QAHD,CAGC;QACL,CAAC,CAAC,eAAe;AANnB,CAMmB,CAAC;AAEtB,IAAM,YAAY,GAAG,UACnB,OAAgB,EAChB,MAA0B,EAC1B,GAAU;IAEV,OAAA,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK;QAC1C,CAAC,CAAC,UAAC,OAAe,IAAK,OAAA,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAnC,CAAmC;QAC1D,CAAC,CAAC,eAAe;AAFnB,CAEmB,CAAC;AAEtB,IAAM,cAAc,GAAG,UACrB,OAAgB,EAChB,MAA0B,EAC1B,MAAa;IAEb,OAAA,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI;QACzC,CAAC,CAAC,UAAC,OAAe,IAAK,OAAA,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAtC,CAAsC;QAC7D,CAAC,CAAC,eAAe;AAFnB,CAEmB,CAAC;AAEtB,SAAgB,UAAU,CAAC,OAAgB,EAAE,MAAa;IACxD,IAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO;QACL,GAAG,EAAE,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC;QACxC,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QACnD,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QAC1D,QAAQ,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;KACpD,CAAC;AACJ,CAAC;AARD,gCAQC"}

View File

@@ -0,0 +1,18 @@
export type LogLevel = "INFO" | "WARN" | "ERROR";
export interface Options {
readonly configFile: string;
readonly extensions: ReadonlyArray<string>;
readonly baseUrl: string | undefined;
readonly silent: boolean;
readonly logLevel: LogLevel;
readonly logInfoToStdOut: boolean;
readonly context: string | undefined;
readonly colors: boolean;
readonly mainFields: (string | string[])[];
readonly references: string[] | undefined;
}
/**
* Takes raw options from the webpack config,
* validates them and adds defaults for missing options
*/
export declare function getOptions(rawOptions: {}): Options;

View File

@@ -0,0 +1,68 @@
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getOptions = void 0;
var validOptions = [
"configFile",
"extensions",
"baseUrl",
"silent",
"logLevel",
"logInfoToStdOut",
"context",
"mainFields",
"references",
];
/**
* Takes raw options from the webpack config,
* validates them and adds defaults for missing options
*/
function getOptions(rawOptions) {
validateOptions(rawOptions);
var options = makeOptions(rawOptions);
return options;
}
exports.getOptions = getOptions;
/**
* Validate the supplied loader options.
* At present this validates the option names only; in future we may look at validating the values too
*
* @param rawOptions
*/
function validateOptions(rawOptions) {
var loaderOptionKeys = Object.keys(rawOptions);
for (var i = 0; i < loaderOptionKeys.length; i++) {
var option = loaderOptionKeys[i];
var isUnexpectedOption = validOptions.indexOf(option) === -1;
if (isUnexpectedOption) {
throw new Error("tsconfig-paths-webpack-plugin was supplied with an unexpected loader option: ".concat(option, "\nPlease take a look at the options you are supplying; the following are valid options:\n").concat(validOptions.join(" / "), "\n"));
}
}
}
function makeOptions(rawOptions) {
var options = __assign(__assign({}, {
configFile: "tsconfig.json",
extensions: [".ts", ".tsx"],
baseUrl: undefined,
silent: false,
logLevel: "WARN",
logInfoToStdOut: false,
context: undefined,
colors: true,
mainFields: ["main"],
references: undefined,
}), rawOptions);
var options2 = __assign(__assign({}, options), { logLevel: options.logLevel.toUpperCase() });
return options2;
}
//# sourceMappingURL=options.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAgBA,IAAM,YAAY,GAAgC;IAChD,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,UAAU;IACV,iBAAiB;IACjB,SAAS;IACT,YAAY;IACZ,YAAY;CACb,CAAC;AAEF;;;GAGG;AACH,SAAgB,UAAU,CAAC,UAAc;IACvC,eAAe,CAAC,UAAU,CAAC,CAAC;IAE5B,IAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC;AACjB,CAAC;AAND,gCAMC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,UAAc;IACrC,IAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAChD,IAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACnC,IAAM,kBAAkB,GACrB,YAAsC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,IAAI,kBAAkB,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,uFAAgF,MAAM,sGAE1G,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OACzB,CAAC,CAAC;SACE;KACF;AACH,CAAC;AAED,SAAS,WAAW,CAAC,UAA4B;IAC/C,IAAM,OAAO,yBACP;QACF,UAAU,EAAE,eAAe;QAC3B,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QAC3B,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,MAAM;QAChB,eAAe,EAAE,KAAK;QACtB,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,CAAC,MAAM,CAAC;QACpB,UAAU,EAAE,SAAS;KACV,GACV,UAAU,CACd,CAAC;IAEF,IAAM,QAAQ,yBACT,OAAO,KACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAc,GACrD,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC"}

View File

@@ -0,0 +1,65 @@
/// <reference types="node" />
import * as TsconfigPaths from "tsconfig-paths";
import * as Options from "./options";
import * as Logger from "./logger";
import * as fs from "fs";
import { ResolvePluginInstance, Resolver } from "webpack";
import { AsyncSeriesBailHook } from "tapable";
import { ResolveContext, ResolveRequest } from "enhanced-resolve";
export interface LegacyResolverPlugin {
readonly apply: (resolver: LegacyResolver) => void;
}
export interface LegacyResolver {
readonly apply: (plugin: LegacyResolverPlugin) => void;
readonly plugin: (source: string, cb: ResolverCallbackLegacy) => void;
readonly doResolve: doResolveLegacy | doResolve;
readonly join: (relativePath: string, innerRequest: Request) => Request;
readonly fileSystem: LegacyResolverFileSystem;
readonly getHook: (hook: string) => AsyncSeriesBailHook<[
ResolveRequest,
ResolveContext
], null | ResolveRequest>;
}
export type doResolveLegacy = (target: string, req: Request, desc: string, callback: Callback) => void;
export type doResolve = (hook: AsyncSeriesBailHook<[
ResolveRequest,
ResolveContext
], null | ResolveRequest>, req: Request, message: string, resolveContext: LegacyResolveContext, callback: Callback) => void;
export type ReadJsonCallback = (error: Error | undefined | null, result?: {}) => void;
export type ReadJson = (path2: string, callback: ReadJsonCallback) => void;
export type LegacyResolverFileSystem = typeof fs & {
readJson?: ReadJson;
};
export interface LegacyResolveContext {
log?: string;
stack?: string;
missing?: string;
}
export type ResolverCallbackLegacy = (request: Request, callback: Callback) => void;
export type ResolverCallback = (request: Request, resolveContext: LegacyResolveContext, callback: Callback) => void;
export interface Request {
readonly request?: Request | string;
readonly relativePath: string;
readonly path: string;
readonly context: {
readonly issuer: string;
};
}
export interface Callback {
(err?: Error, result?: string): void;
log?: string;
stack?: string;
missing?: string;
}
export declare class TsconfigPathsPlugin implements Exclude<ResolvePluginInstance, Function> {
source: string;
target: string;
log: Logger.Logger;
baseUrl: string | undefined;
absoluteBaseUrl: string;
extensions: ReadonlyArray<string>;
referenceMatchMap: Record<string, TsconfigPaths.MatchPathAsync>;
matchPath: TsconfigPaths.MatchPathAsync;
constructor(rawOptions?: Partial<Options.Options>);
apply(resolver: Resolver): void;
}

View File

@@ -0,0 +1,238 @@
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TsconfigPathsPlugin = void 0;
var chalk = require("chalk");
var TsconfigPaths = require("tsconfig-paths");
var path = require("path");
var Options = require("./options");
var Logger = require("./logger");
// eslint-disable-next-line no-redeclare
var getInnerRequest = require("enhanced-resolve/lib/getInnerRequest");
var TsconfigPathsPlugin = /** @class */ (function () {
function TsconfigPathsPlugin(rawOptions) {
if (rawOptions === void 0) { rawOptions = {}; }
var _this = this;
this.source = "described-resolve";
this.target = "resolve";
var options = Options.getOptions(rawOptions);
this.extensions = options.extensions;
this.referenceMatchMap = {};
// const colors = new chalk.constructor({ enabled: options.colors });
this.log = Logger.makeLogger(options, new chalk.Instance({ level: options.colors ? undefined : 0 }));
var context = options.context || process.cwd();
var loadFrom = options.configFile || context;
var loadResult = loadConfig(loadFrom, this.log);
if (loadResult.resultType === "success") {
this.baseUrl = options.baseUrl || loadResult.baseUrl;
this.absoluteBaseUrl = options.baseUrl
? path.resolve(options.baseUrl)
: loadResult.absoluteBaseUrl;
this.matchPath = TsconfigPaths.createMatchPathAsync(this.absoluteBaseUrl, loadResult.paths, options.mainFields);
if (options.references) {
options.references.reduce(function (pathMap, reference) {
if (reference) {
var referenceResult = loadConfig(reference, _this.log);
if (referenceResult.resultType === "success") {
var paths = referenceResult.paths, absoluteBaseUrl = referenceResult.absoluteBaseUrl;
pathMap[absoluteBaseUrl] = TsconfigPaths.createMatchPathAsync(absoluteBaseUrl, paths, options.mainFields);
}
}
return pathMap;
}, this.referenceMatchMap);
}
}
}
TsconfigPathsPlugin.prototype.apply = function (resolver) {
if (!resolver) {
this.log.logWarning("tsconfig-paths-webpack-plugin: Found no resolver, not applying tsconfig-paths-webpack-plugin");
return;
}
// The file system only exists when the plugin is in the resolve context. This means it's also properly placed in the resolve.plugins array.
// If not, we should warn the user that this plugin should be placed in resolve.plugins and not the plugins array of the root config for example.
// This should hopefully prevent issues like: https://github.com/dividab/tsconfig-paths-webpack-plugin/issues/9
if (!("fileSystem" in resolver)) {
this.log.logWarning("tsconfig-paths-webpack-plugin: No file system found on resolver." +
" Please make sure you've placed the plugin in the correct part of the configuration." +
" This plugin is a resolver plugin and should be placed in the resolve part of the Webpack configuration.");
return;
}
// getHook will only exist in Webpack 4 & 5, if so we should comply to the Webpack 4 plugin system.
if ("getHook" in resolver && typeof resolver.getHook === "function") {
resolver
.getHook(this.source)
.tapAsync({ name: "TsconfigPathsPlugin" }, createPluginCallback(this.referenceMatchMap, this.matchPath, resolver, this.absoluteBaseUrl, resolver.getHook(this.target), this.extensions));
}
else if ("plugin" in resolver) {
// This is the legacy (Webpack < 4.0.0) way of using the plugin system.
var legacyResolver = resolver;
legacyResolver.plugin(this.source, createPluginLegacy(this.matchPath, resolver, this.absoluteBaseUrl, this.target, this.extensions));
}
};
return TsconfigPathsPlugin;
}());
exports.TsconfigPathsPlugin = TsconfigPathsPlugin;
function loadConfig(configPath, logger) {
var loadResult = TsconfigPaths.loadConfig(configPath);
if (loadResult.resultType === "failed") {
logger.logError("Failed to load ".concat(configPath, ": ").concat(loadResult.message));
}
else {
logger.logInfo("tsconfig-paths-webpack-plugin: Using config file at ".concat(loadResult.configFileAbsolutePath));
}
return loadResult;
}
function createPluginCallback(referenceMatchMap, baseMatchPath, resolver, baseAbsoluteBaseUrl, hook, extensions) {
var fileExistAsync = createFileExistAsync(resolver.fileSystem);
var readJsonAsync = createReadJsonAsync(resolver.fileSystem);
return function (request, resolveContext, callback) {
var _a, _b;
var innerRequest = getInnerRequest(resolver, request);
if (!innerRequest ||
((_a = request === null || request === void 0 ? void 0 : request.request) === null || _a === void 0 ? void 0 : _a.startsWith(".")) ||
((_b = request === null || request === void 0 ? void 0 : request.request) === null || _b === void 0 ? void 0 : _b.startsWith(".."))) {
return callback();
}
// Find the base URL and matchPath instance
// Quickly check if the request path is a known baseUrl
// Then check if the path is a child of a reference baseUrl
var absoluteBaseUrl = baseAbsoluteBaseUrl;
if (typeof request.path === "string" &&
request.path !== baseAbsoluteBaseUrl) {
if (referenceMatchMap[request.path]) {
absoluteBaseUrl = request.path;
}
else {
var referenceUrl = Object.keys(referenceMatchMap).find(function (refBaseUrl) {
var relative = path.relative(refBaseUrl, request.path || "");
return (relative &&
!relative.startsWith("..") &&
!path.isAbsolute(relative));
});
if (referenceUrl) {
absoluteBaseUrl = referenceUrl;
}
}
}
var matchPath = referenceMatchMap[absoluteBaseUrl] || baseMatchPath;
matchPath(innerRequest, readJsonAsync, fileExistAsync, extensions, function (err, foundMatch) {
if (err) {
return callback(err);
}
if (!foundMatch) {
return callback();
}
var newRequest = __assign(__assign({}, request), { request: foundMatch, path: absoluteBaseUrl });
// Only at this point we are sure we are dealing with the latest Webpack version (>= 4.0.0)
// So only now can we require the createInnerContext function.
// (It doesn't exist in legacy versions)
var createInnerContext = require("enhanced-resolve/lib/createInnerContext");
return resolver.doResolve(hook, newRequest, "Resolved request '".concat(innerRequest, "' to '").concat(foundMatch, "' using tsconfig.json paths mapping"),
// eslint-disable-next-line @typescript-eslint/no-explicit-any
createInnerContext(__assign({}, resolveContext)), function (err2, result2) {
// Pattern taken from:
// https://github.com/webpack/enhanced-resolve/blob/42ff594140582c3f8f86811f95dea7bf6774a1c8/lib/AliasPlugin.js#L44
if (err2) {
return callback(err2);
}
// Don't allow other aliasing or raw request
if (result2 === undefined) {
return callback(undefined, undefined);
}
callback(undefined, result2);
});
});
};
}
function createPluginLegacy(matchPath, resolver, absoluteBaseUrl, target, extensions) {
var fileExistAsync = createFileExistAsync(resolver.fileSystem);
var readJsonAsync = createReadJsonAsync(resolver.fileSystem);
return function (request, callback) {
var innerRequest = getInnerRequest(resolver, request);
if (!innerRequest ||
innerRequest.startsWith(".") ||
innerRequest.startsWith("..")) {
return callback();
}
matchPath(innerRequest, readJsonAsync, fileExistAsync, extensions, function (err, foundMatch) {
if (err) {
return callback(err);
}
if (!foundMatch) {
return callback();
}
var newRequest = __assign(__assign({}, request), { request: foundMatch, path: absoluteBaseUrl });
// Only at this point we are sure we are dealing with a legacy Webpack version (< 4.0.0)
// So only now can we require the createInnerCallback function.
// (It's already deprecated and might be removed down the line).
var createInnerCallback = require("enhanced-resolve/lib/createInnerCallback");
return resolver.doResolve(target, newRequest, "Resolved request '".concat(innerRequest, "' to '").concat(foundMatch, "' using tsconfig.json paths mapping"), createInnerCallback(function (err2, result2) {
// Note:
// *NOT* using an arrow function here because arguments.length implies we have "this"
// That means "this" has to be in the current function scope, and not the scope above.
// Pattern taken from:
// https://github.com/s-panferov/awesome-typescript-loader/blob/10653beff85f555f1f3b5d4bfd7d21513d0e54a4/src/paths-plugin.ts#L169
if (arguments.length > 0) {
return callback(err2, result2);
}
// don't allow other aliasing or raw request
callback(undefined, undefined);
}, callback));
});
};
}
function readJson(fileSystem, path2, callback) {
if ("readJson" in fileSystem && fileSystem.readJson) {
return fileSystem.readJson(path2, callback);
}
fileSystem.readFile(path2, function (err, buf) {
if (err) {
return callback(err);
}
var data;
try {
// @ts-ignore This will crash if buf is undefined, which I guess it can be...
data = JSON.parse(buf.toString("utf-8"));
}
catch (e) {
return callback(e);
}
return callback(undefined, data);
});
}
function createReadJsonAsync(filesystem) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return function (path2, callback2) {
readJson(filesystem, path2, function (err, json) {
// If error assume file does not exist
if (err || !json) {
callback2();
return;
}
callback2(undefined, json);
});
};
}
function createFileExistAsync(filesystem) {
return function (path2, callback2) {
filesystem.stat(path2, function (err, stats) {
// If error assume file does not exist
if (err) {
callback2(undefined, false);
return;
}
callback2(undefined, stats ? stats.isFile() : false);
});
};
}
//# sourceMappingURL=plugin.js.map

File diff suppressed because one or more lines are too long