oneportal-scripts 3.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/oneportal-scripts.js +44 -0
- package/config/createTypeFolder.js +27 -0
- package/config/downloadAndExtract.js +48 -0
- package/config/dynamicPublicPath.js +58 -0
- package/config/env.js +67 -0
- package/config/getCopyPatterns.js +32 -0
- package/config/getHttpsConfig.js +50 -0
- package/config/glasses.json +52 -0
- package/config/paths.js +68 -0
- package/config/readme.md +315 -0
- package/config/webpack.config.js +326 -0
- package/config/webpackDevServer.config.js +67 -0
- package/package.json +83 -0
- package/scripts/build.js +92 -0
- package/scripts/start.js +144 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
process.on("unhandledRejection", (err) => {
|
|
4
|
+
throw err;
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
const spawn = require("react-dev-utils/crossSpawn");
|
|
8
|
+
const args = process.argv.slice(2);
|
|
9
|
+
|
|
10
|
+
const scriptIndex = args.findIndex(
|
|
11
|
+
(x) => x === "build" || x === "eject" || x === "start" || x === "test",
|
|
12
|
+
);
|
|
13
|
+
const script = scriptIndex === -1 ? args[0] : args[scriptIndex];
|
|
14
|
+
const nodeArgs = scriptIndex > 0 ? args.slice(0, scriptIndex) : [];
|
|
15
|
+
|
|
16
|
+
if (["build", "eject", "start", "test"].includes(script)) {
|
|
17
|
+
const result = spawn.sync(
|
|
18
|
+
process.execPath,
|
|
19
|
+
nodeArgs
|
|
20
|
+
.concat(require.resolve("../scripts/" + script))
|
|
21
|
+
.concat(args.slice(scriptIndex + 1)),
|
|
22
|
+
{ stdio: "inherit" },
|
|
23
|
+
);
|
|
24
|
+
if (result.signal) {
|
|
25
|
+
if (result.signal === "SIGKILL") {
|
|
26
|
+
console.log(
|
|
27
|
+
"The build failed because the process exited too early. " +
|
|
28
|
+
"This probably means the system ran out of memory or someone called " +
|
|
29
|
+
"`kill -9` on the process.",
|
|
30
|
+
);
|
|
31
|
+
} else if (result.signal === "SIGTERM") {
|
|
32
|
+
console.log(
|
|
33
|
+
"The build failed because the process exited too early. " +
|
|
34
|
+
"Someone might have called `kill` or `killall`, or the system could " +
|
|
35
|
+
"be shutting down.",
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
process.exit(result.status);
|
|
41
|
+
} else {
|
|
42
|
+
console.log('Unknown script "' + script + '".');
|
|
43
|
+
console.log("Perhaps you need to update react-scripts?");
|
|
44
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const fs = require("node:fs");
|
|
2
|
+
const path = require("node:path");
|
|
3
|
+
const paths = require("./paths");
|
|
4
|
+
|
|
5
|
+
const plugin = { name: "CreateFolderPlugin" };
|
|
6
|
+
|
|
7
|
+
class CreateFolderPlugin {
|
|
8
|
+
constructor(opts = {}) {
|
|
9
|
+
this.folderPaths = opts.folderPaths;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
apply(compiler) {
|
|
13
|
+
compiler.hooks.emit.tap(plugin, () => {
|
|
14
|
+
if (!fs.existsSync(paths.appBuild)) {
|
|
15
|
+
fs.mkdirSync(paths.appBuild);
|
|
16
|
+
}
|
|
17
|
+
for (const folderPath of this.folderPaths) {
|
|
18
|
+
const fullPath = path.join(paths.appBuild, folderPath);
|
|
19
|
+
if (!fs.existsSync(fullPath)) {
|
|
20
|
+
fs.mkdirSync(fullPath);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.CreateFolderPlugin = CreateFolderPlugin;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const axios = require("axios");
|
|
2
|
+
const tar = require("tar");
|
|
3
|
+
const fs = require("node:fs");
|
|
4
|
+
const path = require("node:path");
|
|
5
|
+
const paths = require("./paths");
|
|
6
|
+
const { promisify } = require("node:util");
|
|
7
|
+
const { pipeline: streamPipeline } = require("node:stream");
|
|
8
|
+
|
|
9
|
+
const pipeline = promisify(streamPipeline);
|
|
10
|
+
|
|
11
|
+
class DownloadAndExtractPlugin {
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
this.options = opts;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async downloadAndExtractLib(lib, destDir) {
|
|
17
|
+
const { fontdoorUrl, oneenv } = this.options;
|
|
18
|
+
const libPath = lib.lib ? lib.name : `apps/${lib.name}`;
|
|
19
|
+
const url = `${fontdoorUrl}/${oneenv}/${libPath}/${lib.name}-ts.tgz?v=${Math.random()}`;
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
const response = await axios({ method: "get", url, responseType: "stream" });
|
|
23
|
+
await pipeline(response.data, tar.x({ C: destDir }));
|
|
24
|
+
} catch (err) {
|
|
25
|
+
console.error("Error downloading or extracting file:", err);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async processLibs(libs, destDir) {
|
|
30
|
+
await Promise.all(libs.map((lib) => this.downloadAndExtractLib(lib, destDir)));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
apply(compiler) {
|
|
34
|
+
compiler.hooks.beforeRun.tapAsync(
|
|
35
|
+
"DownloadAndExtractPlugin",
|
|
36
|
+
async (compilation, callback) => {
|
|
37
|
+
try {
|
|
38
|
+
await this.processLibs(this.options.libs, paths.appPath);
|
|
39
|
+
callback();
|
|
40
|
+
} catch (err) {
|
|
41
|
+
callback(err);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
exports.DownloadAndExtractPlugin = DownloadAndExtractPlugin;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
function buildPublicPath(moduleName, publicPath, fontdoorUrl) {
|
|
2
|
+
const localURL = localStorage.getItem(moduleName);
|
|
3
|
+
if (
|
|
4
|
+
localURL &&
|
|
5
|
+
(!window["oneportalextension"] || window["oneportalextension"]["debug"])
|
|
6
|
+
) {
|
|
7
|
+
return localURL + "/";
|
|
8
|
+
}
|
|
9
|
+
if (moduleName === "oneportalshellapp") {
|
|
10
|
+
return "/";
|
|
11
|
+
}
|
|
12
|
+
if (publicPath !== "/") {
|
|
13
|
+
return publicPath;
|
|
14
|
+
}
|
|
15
|
+
const temp = window["oneportalextension"];
|
|
16
|
+
if (temp) {
|
|
17
|
+
const oneenv = temp.env;
|
|
18
|
+
const version = temp[moduleName];
|
|
19
|
+
const subapps = version ? "" : "/apps";
|
|
20
|
+
return fontdoorUrl + "/" + oneenv + subapps + "/" + moduleName + "/";
|
|
21
|
+
}
|
|
22
|
+
return "/";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
class DynamicPublicPathPlugin {
|
|
26
|
+
defaultPublicPath = "";
|
|
27
|
+
|
|
28
|
+
constructor(opts = {}) {
|
|
29
|
+
this.moduleName = opts.moduleName;
|
|
30
|
+
this.publicPath = opts.publicPath;
|
|
31
|
+
this.fontdoorUrl = opts.fontdoorUrl;
|
|
32
|
+
this.port = opts.port;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
apply(compiler) {
|
|
36
|
+
compiler.hooks.make.tap("MutateRuntime", (compilation) => {
|
|
37
|
+
compilation.hooks.runtimeModule.tap("MutateRuntime", (runtimeModule) => {
|
|
38
|
+
if (runtimeModule.constructor.name !== "PublicPathRuntimeModule")
|
|
39
|
+
return;
|
|
40
|
+
|
|
41
|
+
const [prefix] = runtimeModule.getGeneratedCode().split("=");
|
|
42
|
+
this.defaultPublicPath = compiler.options.output.publicPath;
|
|
43
|
+
|
|
44
|
+
const args = [
|
|
45
|
+
JSON.stringify(this.moduleName),
|
|
46
|
+
JSON.stringify(this.publicPath),
|
|
47
|
+
JSON.stringify(this.fontdoorUrl),
|
|
48
|
+
].join(", ");
|
|
49
|
+
|
|
50
|
+
runtimeModule._cachedGeneratedCode = `${prefix} = (${buildPublicPath.toString()})(${args});`;
|
|
51
|
+
|
|
52
|
+
return runtimeModule;
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
exports.DynamicPublicPathPlugin = DynamicPublicPathPlugin;
|
package/config/env.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const fs = require("node:fs");
|
|
2
|
+
const path = require("node:path");
|
|
3
|
+
const paths = require("./paths");
|
|
4
|
+
const dotenv = require("dotenv");
|
|
5
|
+
const dotenvExpand = require("dotenv-expand");
|
|
6
|
+
|
|
7
|
+
delete require.cache[require.resolve("./paths")];
|
|
8
|
+
|
|
9
|
+
const NODE_ENV = process.env.NODE_ENV;
|
|
10
|
+
if (!NODE_ENV) {
|
|
11
|
+
throw new Error(
|
|
12
|
+
"The NODE_ENV environment variable is required but was not specified.",
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const dotenvFiles = [
|
|
17
|
+
`${paths.dotenv}.${NODE_ENV}.local`,
|
|
18
|
+
NODE_ENV !== "test" && `${paths.dotenv}.local`,
|
|
19
|
+
`${paths.dotenv}.${NODE_ENV}`,
|
|
20
|
+
paths.dotenv,
|
|
21
|
+
].filter(Boolean);
|
|
22
|
+
|
|
23
|
+
dotenvFiles.forEach((dotenvFile) => {
|
|
24
|
+
if (fs.existsSync(dotenvFile)) {
|
|
25
|
+
dotenvExpand.expand(dotenv.config({ path: dotenvFile }));
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const appDirectory = fs.realpathSync(process.cwd());
|
|
30
|
+
|
|
31
|
+
process.env.NODE_PATH = (process.env.NODE_PATH || "")
|
|
32
|
+
.split(path.delimiter)
|
|
33
|
+
.filter((p) => p && !path.isAbsolute(p))
|
|
34
|
+
.map((p) => path.resolve(appDirectory, p))
|
|
35
|
+
.join(path.delimiter);
|
|
36
|
+
|
|
37
|
+
const REACT_APP = /^REACT_APP_/i;
|
|
38
|
+
|
|
39
|
+
function getClientEnvironment(publicUrl) {
|
|
40
|
+
const raw = Object.keys(process.env)
|
|
41
|
+
.filter((key) => REACT_APP.test(key))
|
|
42
|
+
.reduce(
|
|
43
|
+
(acc, key) => {
|
|
44
|
+
acc[key] = process.env[key];
|
|
45
|
+
return acc;
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
NODE_ENV: process.env.NODE_ENV || "development",
|
|
49
|
+
PUBLIC_URL: publicUrl,
|
|
50
|
+
WDS_SOCKET_HOST: process.env.WDS_SOCKET_HOST,
|
|
51
|
+
WDS_SOCKET_PATH: process.env.WDS_SOCKET_PATH,
|
|
52
|
+
WDS_SOCKET_PORT: process.env.WDS_SOCKET_PORT,
|
|
53
|
+
FAST_REFRESH: process.env.FAST_REFRESH !== "false",
|
|
54
|
+
},
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
const stringified = {
|
|
58
|
+
"process.env": Object.keys(raw).reduce((acc, key) => {
|
|
59
|
+
acc[key] = JSON.stringify(raw[key]);
|
|
60
|
+
return acc;
|
|
61
|
+
}, {}),
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
return { raw, stringified };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = getClientEnvironment;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
let fs = require("node:fs"),
|
|
2
|
+
path = require("node:path"),
|
|
3
|
+
paths = require("./paths"),
|
|
4
|
+
foldersToCheck = [
|
|
5
|
+
{
|
|
6
|
+
from: "extension.json",
|
|
7
|
+
to: paths.appBuild,
|
|
8
|
+
parentPath: paths.appPath,
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
from: "src/i18n",
|
|
12
|
+
to: paths.appBuild + "/i18n",
|
|
13
|
+
parentPath: paths.appPath,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
from: "static",
|
|
17
|
+
to: "" + paths.appBuild,
|
|
18
|
+
parentPath: paths.appPath,
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
function getCopyPatterns() {
|
|
23
|
+
return foldersToCheck
|
|
24
|
+
.filter((folder) =>
|
|
25
|
+
fs.existsSync(path.resolve(folder.parentPath, folder.from)),
|
|
26
|
+
)
|
|
27
|
+
.map((folder) => ({
|
|
28
|
+
from: folder.from,
|
|
29
|
+
to: folder.to,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
module.exports = getCopyPatterns;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const fs = require("node:fs");
|
|
2
|
+
const path = require("node:path");
|
|
3
|
+
const crypto = require("node:crypto");
|
|
4
|
+
const chalk = require("react-dev-utils/chalk");
|
|
5
|
+
const paths = require("./paths");
|
|
6
|
+
|
|
7
|
+
function validateKeyAndCerts({ cert, key, keyFile, crtFile }) {
|
|
8
|
+
let encrypted;
|
|
9
|
+
try {
|
|
10
|
+
encrypted = crypto.publicEncrypt(cert, Buffer.from("test"));
|
|
11
|
+
} catch (err) {
|
|
12
|
+
throw new Error(`The certificate "${chalk.yellow(crtFile)}" is invalid.\n${err.message}`);
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
crypto.privateDecrypt(key, encrypted);
|
|
16
|
+
} catch (err) {
|
|
17
|
+
throw new Error(`The certificate key "${chalk.yellow(keyFile)}" is invalid.\n${err.message}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function readEnvFile(filePath, envVarName) {
|
|
22
|
+
if (fs.existsSync(filePath)) {
|
|
23
|
+
return fs.readFileSync(filePath);
|
|
24
|
+
}
|
|
25
|
+
throw new Error(
|
|
26
|
+
`You specified ${chalk.cyan(envVarName)} in your env, but the file "${chalk.yellow(filePath)}" can't be found.`,
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function getHttpsConfig() {
|
|
31
|
+
const { SSL_CRT_FILE, SSL_KEY_FILE, HTTPS } = process.env;
|
|
32
|
+
const httpsEnabled = HTTPS === "true";
|
|
33
|
+
|
|
34
|
+
let result = httpsEnabled;
|
|
35
|
+
|
|
36
|
+
if (httpsEnabled && SSL_CRT_FILE && SSL_KEY_FILE) {
|
|
37
|
+
const crtFile = path.resolve(paths.appPath, SSL_CRT_FILE);
|
|
38
|
+
const keyFile = path.resolve(paths.appPath, SSL_KEY_FILE);
|
|
39
|
+
const certConfig = {
|
|
40
|
+
cert: readEnvFile(crtFile, "SSL_CRT_FILE"),
|
|
41
|
+
key: readEnvFile(keyFile, "SSL_KEY_FILE"),
|
|
42
|
+
};
|
|
43
|
+
validateKeyAndCerts({ ...certConfig, keyFile, crtFile });
|
|
44
|
+
result = certConfig;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
module.exports = getHttpsConfig;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "oneportal-app",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"publicPath": "/",
|
|
5
|
+
"port": 3000,
|
|
6
|
+
"libs": [],
|
|
7
|
+
"remotelibs": [],
|
|
8
|
+
"activeshared": true,
|
|
9
|
+
"eager": false,
|
|
10
|
+
"contenthash": true,
|
|
11
|
+
"enabledts": false,
|
|
12
|
+
"exposes": {
|
|
13
|
+
"./App": "./src/App"
|
|
14
|
+
},
|
|
15
|
+
"environmentVariables": {
|
|
16
|
+
"ONEPORTAL_FRONT_DOOR": "https://localhost:3000",
|
|
17
|
+
"ONEPORTAL_ENV": "dev"
|
|
18
|
+
},
|
|
19
|
+
"sharedlibrary": {
|
|
20
|
+
"development": {
|
|
21
|
+
"href": "https://sharenet.blob.core.windows.net/sharedlibrary"
|
|
22
|
+
},
|
|
23
|
+
"staging": {
|
|
24
|
+
"href": "https://sharenet.blob.core.windows.net/sharedlibrary"
|
|
25
|
+
},
|
|
26
|
+
"production": {
|
|
27
|
+
"href": "https://sharenet.blob.core.windows.net/sharedlibrary"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"oneportalutilities": {
|
|
31
|
+
"development": {
|
|
32
|
+
"href": "https://sharenet.blob.core.windows.net/oneportalutilities"
|
|
33
|
+
},
|
|
34
|
+
"staging": {
|
|
35
|
+
"href": "https://sharenet.blob.core.windows.net/oneportalutilities"
|
|
36
|
+
},
|
|
37
|
+
"production": {
|
|
38
|
+
"href": "https://sharenet.blob.core.windows.net/oneportalutilities"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"oneportalcore": {
|
|
42
|
+
"development": {
|
|
43
|
+
"href": "https://sharenet.blob.core.windows.net/oneportalcore"
|
|
44
|
+
},
|
|
45
|
+
"staging": {
|
|
46
|
+
"href": "https://sharenet.blob.core.windows.net/oneportalcore"
|
|
47
|
+
},
|
|
48
|
+
"production": {
|
|
49
|
+
"href": "https://sharenet.blob.core.windows.net/oneportalcore"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
package/config/paths.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const path = require("node:path");
|
|
2
|
+
const fs = require("node:fs");
|
|
3
|
+
const getPublicUrlOrPath = require("react-dev-utils/getPublicUrlOrPath");
|
|
4
|
+
|
|
5
|
+
const appDirectory = fs.realpathSync(process.cwd());
|
|
6
|
+
|
|
7
|
+
const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath);
|
|
8
|
+
|
|
9
|
+
const publicUrlOrPath = getPublicUrlOrPath(
|
|
10
|
+
process.env.NODE_ENV === "development",
|
|
11
|
+
require(resolveApp("package.json")).homepage,
|
|
12
|
+
process.env.PUBLIC_URL,
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
const buildPath = process.env.BUILD_PATH || "build";
|
|
16
|
+
|
|
17
|
+
const moduleFileExtensions = [
|
|
18
|
+
"web.mjs",
|
|
19
|
+
"mjs",
|
|
20
|
+
"web.js",
|
|
21
|
+
"js",
|
|
22
|
+
"web.ts",
|
|
23
|
+
"ts",
|
|
24
|
+
"web.tsx",
|
|
25
|
+
"tsx",
|
|
26
|
+
"json",
|
|
27
|
+
"web.jsx",
|
|
28
|
+
"jsx",
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const resolveModule = (resolveFn, filePath, useTypeScript = true) => {
|
|
32
|
+
const ext = moduleFileExtensions.find((extension) =>
|
|
33
|
+
fs.existsSync(resolveFn(`${filePath}.${extension}`)),
|
|
34
|
+
);
|
|
35
|
+
const fallbackExt = useTypeScript ? "ts" : "js";
|
|
36
|
+
return resolveFn(ext ? `${filePath}.${ext}` : `${filePath}.${fallbackExt}`);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const resolveOwn = (relativePath) =>
|
|
40
|
+
path.resolve(__dirname, "..", relativePath);
|
|
41
|
+
|
|
42
|
+
module.exports = {
|
|
43
|
+
dotenv: resolveApp(".env"),
|
|
44
|
+
appPath: resolveApp("."),
|
|
45
|
+
appBuild: resolveApp(buildPath),
|
|
46
|
+
appPublic: resolveApp("public"),
|
|
47
|
+
appHtml: resolveApp("public/index.html"),
|
|
48
|
+
appIndexJs: resolveModule(resolveApp, "src/index"),
|
|
49
|
+
extension: resolveApp("config/glasses.json"),
|
|
50
|
+
appPackageJson: resolveApp("package.json"),
|
|
51
|
+
appSrc: resolveApp("src"),
|
|
52
|
+
appTsConfig: resolveApp("tsconfig.json"),
|
|
53
|
+
appJsConfig: resolveApp("jsconfig.json"),
|
|
54
|
+
yarnLockFile: resolveApp("yarn.lock"),
|
|
55
|
+
testsSetup: resolveModule(resolveApp, "src/setupTests"),
|
|
56
|
+
proxySetup: resolveApp("src/setupProxy.js"),
|
|
57
|
+
appNodeModules: resolveApp("node_modules"),
|
|
58
|
+
appWebpackCache: resolveApp("node_modules/.cache"),
|
|
59
|
+
appTsBuildInfoFile: resolveApp("node_modules/.cache/tsconfig.tsbuildinfo"),
|
|
60
|
+
swSrc: resolveModule(resolveApp, "src/service-worker"),
|
|
61
|
+
publicUrlOrPath,
|
|
62
|
+
ownPath: resolveOwn("."),
|
|
63
|
+
ownNodeModules: resolveOwn("node_modules"),
|
|
64
|
+
appTypeDeclarations: resolveApp("src/react-app-env.d.ts"),
|
|
65
|
+
ownTypeDeclarations: resolveOwn("lib/react-app.d.ts"),
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
module.exports.moduleFileExtensions = moduleFileExtensions;
|