-
Notifications
You must be signed in to change notification settings - Fork 300
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: https support for dev reverse proxy (#1572)
- rel-v11-20240705
- rel-v11-20240605
- rel-v11-20240307
- rel-v11-20240108
- rel-v11-20240103
- rel-v11-20231025
- rel-v11-20230907
- rel-v11-20230727
- rel-v11-20230717
- rel-v11-20230611
- rel-v11-20230508
- rel-v11-20230505
- rel-v11-20230320
- rel-v11-20230306
- rel-v11-20230303
- rel-v11-20230302
- rel-v11-20230119
- rel-v11-20230118
- rel-v11-20230117
- rel-v11-20221021
- rel-v11-20220811
- rel-v11-20220714
- rel-v11-09192024
- rel-v11-09062024
- rel-v10-beta-20210316
- rel-v10-beta-20210307
- rel-v10-beta-20210304
- rel-v10-beta-20210304b
- rel-v10-20220308
- rel-v10-20220119
- rel-v10-20211201
- rel-v10-20211122
- rel-v10-20210712
- rel-v10-20210625
- rel-v10-20210615
- rel-v10-20210428
- rel-v10-20210427
- rel-v10-20210426
- rel-v10-20210420
- rel-v10-20210408
- rel-v10-20210329
- rel-v10-20210325
- rel-v9-20210324
- rel-v9-20210301
- rel-v9-20210219
- rel-v9-20210218
- rel-v9-20210215
- rel-v9-20210208
- rel-v9-20210203
- rel-v8-beta-20200519
- rel-v8-20210128
- rel-v8-20210127
- rel-v8-20210119
- rel-v8-20210114
- rel-v8-20210107
- rel-v8-20210106
- rel-v8-20201207
- rel-v8-20201204
- rel-v8-20201202
- rel-v8-20201201
- rel-v8-20201115
- rel-v8-20201030
- rel-v8-20201030-b
- rel-v8-20201022
- rel-v8-20201021
- rel-v8-20201014
- rel-v8-20201012
- rel-v8-20201008
- rel-v8-20200928
- rel-v8-20200924
- rel-v8-20200904
- rel-v8-20200903
- rel-v8-20200830
- rel-v8-20200814
- rel-v8-20200811
- rel-v8-20200722
- rel-v8-20200716
- rel-v8-20200710
- rel-v8-20200617
- rel-v8-20200611
- rel-v8-20200610
- rel-v8-20200521
- rel-v8-20200519
- rel-v8-20200517
- rel-v8-20200429
- rel-v8-20200427
- rel-v8-20200427-b
- rel-v8-20200423
- rel-v8-20200420
- rel-v8-20200414
- rel-v8-20200409
- rel-v8-20200408
- rel-v8-20200408-b
- rel-v8-20200406
- rel-v8-20200402
- rel-v8-20200330
- rel-v8-20200325
- rel-v8-20200323
- rel-v8-10192020
- rel-v8-05072020
Showing
28 changed files
with
888 additions
and
443 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
# Localhost HTTPS Setup | ||
|
||
These instructions are for MacOS, verified on macOS Mojave version 10.14.6 | ||
|
||
## SSL Key and Certificate | ||
|
||
1. Generate SSL key and cert | ||
|
||
Copy and paste these commands in the terminal to run them. | ||
|
||
> Make sure to change the hostname `dev.mydomain.com` in both places to your desired value. | ||
```bash | ||
openssl req -new -x509 -nodes -sha256 -days 3650 \ | ||
-newkey rsa:2048 -out dev-proxy.crt -keyout dev-proxy.key \ | ||
-extensions SAN -reqexts SAN -subj /CN=dev.mydomain.com \ | ||
-config <(cat /etc/ssl/openssl.cnf \ | ||
<(printf '[ext]\nbasicConstraints=critical,CA:TRUE,pathlen:0\n') \ | ||
<(printf '[SAN]\nsubjectAltName=DNS:dev.mydomain.com,IP:127.0.0.1\n')) | ||
``` | ||
|
||
2. Add cert to your system keychain | ||
|
||
```bash | ||
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain dev-proxy.crt | ||
``` | ||
|
||
3. Put the files `dev-proxy.key` and `dev-proxy.crt` in your app's dir. | ||
|
||
> Alternatively, you can put them in one of the directories listed below: | ||
- `src` | ||
- `test` | ||
- `config` | ||
|
||
## Development in HTTPS | ||
|
||
After everything's setup, you can start development in HTTPS with the following steps: | ||
|
||
1. Using your favorite editor, add this line to your `/etc/hosts` file. | ||
|
||
> Change the hostname `dev.mydomain.com` accordingly if you used a different one. | ||
``` | ||
127.0.0.1 dev.mydomain.com | ||
``` | ||
|
||
2. Now to run app dev in HTTPS, set the env `ELECTRODE_DEV_HTTPS` to `8443` and `HOST` to the domain name you created your cert for. | ||
|
||
- Example: `HOST=dev.mydomain.com ELECTRODE_DEV_HTTPS=8443 npm run dev` | ||
|
||
- And point your browser to `https://dev.mydomain.com:8443` | ||
|
||
- If you have access to listen on the standard HTTPS port `443`, then you can set it to `443` or `true`, and use the URL `https://dev.mydomain.com` directly. | ||
|
||
- Another way to trigger HTTPS is with the env `PORT`. If that is set to `443` exactly, then the dev proxy will enter HTTPS mode even if env `ELECTRODE_DEV_HTTPS` is not set. | ||
|
||
## Elevated Privilege | ||
|
||
Generally, normal users can't run program to listen on network port below 1024. | ||
|
||
> but that seems to have changed for MacOS Mojave https://news.ycombinator.com/item?id=18302380 | ||
So if you want to set the dev proxy to listen on the standard HTTP port 80 or HTTPS port 443, you might need to give it elevated access. | ||
|
||
The recommended approach to achieve this is to run the dev proxy in a separate terminal with elevated access: | ||
|
||
```bash | ||
sudo HOST=dev.mydomain.com PORT=443 npx clap dev-proxy | ||
``` | ||
|
||
And then start normal development in another terminal: | ||
|
||
```bash | ||
HOST=dev.mydomain.com npm run dev | ||
``` | ||
|
||
### Automatic Elevating (optional) | ||
|
||
Optional: for best result, please use the manual approach recommended above. | ||
|
||
If your machine requires elevated access for the proxy to listen at a port, then a dialog will pop up to ask you for your password. This is achieved with the module https://www.npmjs.com/package/sudo-prompt | ||
|
||
This requirement is automatically detected, but if you want to explicitly trigger the elevated access, you can set the env `ELECTRODE_DEV_ELEVATED` to `true`. | ||
|
||
> However, due to restrictions with acquiring elevated access, this automatic acquisition has quirks. For example, the logs from the dev proxy can't be shown in your console. | ||
## Custom Proxy Rules | ||
|
||
The dev proxy is using a slightly modified version of [redbird] with some fixes and enhancements that are pending PR merge. | ||
|
||
You can provide your own proxy rules with a file `dev-proxy-rules.js` in one of these directories: | ||
|
||
- `src` | ||
- `test` | ||
- `config` | ||
|
||
The file should export a function `setupRules`, like the example below: | ||
|
||
```js | ||
export function setupRules(proxy, options) { | ||
const { host, port, protocol } = options; | ||
proxy.register( | ||
`${protocol}://${host}:${port}/myapi/foo-api`, | ||
`https://api.myserver.com/myapi/foo-api` | ||
); | ||
} | ||
``` | ||
|
||
Where: | ||
|
||
- `proxy` - the redbird proxy instance. | ||
- `options` - all configuration for the proxy: | ||
|
||
- `host` - hostname proxy is using. | ||
- `port` - primary port proxy is listening on. | ||
- `appPort` - app server's port the proxy forward to. | ||
- `httpPort` - HTTP port proxy is listening on. | ||
- `httpsPort` - Port for HTTPS if it is enabled. | ||
- `https` - `true`/`false` to indicate if proxy is running in HTTPS mode. | ||
- `webpackDev` - `true`/`false` to indicate if running with webpack dev. | ||
- `webpackDevPort` - webpack dev server's port the proxy is forwarding to. | ||
- `webpackDevPort` - webpack dev server's host the proxy is forwarding to. | ||
- `protocol` - primary protocol: `"http"` or `"https"`. | ||
- `elevated` - `true`/`false` to indicate if proxy should acquire elevate access. | ||
|
||
- The primary protocol is `https` if HTTPS is enabled, else it's `http`. | ||
|
||
- `appPort` is the port your app server is expected to listen on. It's determined as follows: | ||
|
||
1. env `APP_SERVER_PORT` or `APP_PORT_FOR_PROXY` if it's a valid number. | ||
2. fallback to `3100`. | ||
|
||
- Even if HTTPS is enabled, the proxy always listens on HTTP also. In that case, `httpPort` is determined as follows: | ||
|
||
1. env `PORT` if it's defined | ||
2. if `appPort` is not `3000`, then fallback to `3000`. | ||
3. finally fallback to `3300`. | ||
|
||
The primary API to register your proxy rule is [`proxy.register`](https://www.npmjs.com/package/redbird#redbirdregistersrc-target-opts). | ||
|
||
[redbird]: https://www.npmjs.com/package/redbird |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
"use strict"; | ||
|
||
const Path = require("path"); | ||
const Fs = require("fs"); | ||
|
||
const envWebpack = require("./env-webpack"); | ||
const envApp = require("./env-app"); | ||
const envProxy = require("./env-proxy"); | ||
|
||
function searchSSLCerts() { | ||
const searchDirs = ["", "config", "test", "src"]; | ||
for (const f of searchDirs) { | ||
const key = Path.resolve(f, "dev-proxy.key"); | ||
const cert = Path.resolve(f, "dev-proxy.crt"); | ||
if (Fs.existsSync(key) && Fs.existsSync(cert)) { | ||
return { key, cert }; | ||
} | ||
} | ||
return {}; | ||
} | ||
|
||
const { host, portForProxy: appPort } = envApp; | ||
const { webpackDev, devPort: webpackDevPort, devHostname: webpackDevHost } = envWebpack; | ||
|
||
let protocol; | ||
let port; | ||
let httpPort = envApp.port; | ||
let { httpsPort } = envProxy; | ||
const { elevated } = envProxy; | ||
const useDevProxy = appPort > 0; | ||
|
||
if (httpsPort) { | ||
port = httpsPort; | ||
protocol = "https"; | ||
} else if (httpPort === 443) { | ||
port = httpsPort = httpPort; | ||
httpPort = appPort !== 3000 ? 3000 : 3300; | ||
protocol = "https"; | ||
} else { | ||
port = httpPort; | ||
protocol = "http"; | ||
} | ||
|
||
const settings = { | ||
host, | ||
port, | ||
appPort, | ||
httpPort, | ||
httpsPort, | ||
https: protocol === "https", | ||
webpackDev, | ||
webpackDevPort, | ||
webpackDevHost, | ||
protocol, | ||
elevated, | ||
useDevProxy | ||
}; | ||
|
||
const adminPath = `/__proxy_admin`; | ||
const hmrPath = `/__webpack_hmr`; // this is webpack-hot-middleware's default | ||
const devPath = `/__electrode_dev`; | ||
|
||
const controlPaths = { | ||
admin: adminPath, | ||
hmr: hmrPath, | ||
dev: devPath, | ||
status: `${adminPath}/status`, | ||
exit: `${adminPath}/exit`, | ||
restart: `${adminPath}/restart`, | ||
appLog: `${devPath}/log`, | ||
reporter: `${devPath}/reporter` | ||
}; | ||
|
||
module.exports = { | ||
settings, | ||
devServer: useDevProxy | ||
? // when using dev proxy, all routes and assets are unified at the same protocol/host/port | ||
// so we can just use path to load assets and let browser figure out protocol/host/port | ||
// from the location. | ||
{ protocol: "", host: "", port: "" } | ||
: // no dev proxy, so webpack dev server is running at a different port, so need to form | ||
// full URL with protocol/host/port to get the assets. | ||
{ protocol: "http", host: webpackDevHost, port: webpackDevPort, https: false }, | ||
fullDevServer: { protocol, host, port }, | ||
// If using dev proxy in HTTPS, then it's also listening on a HTTP port also: | ||
httpDevServer: { protocol: "http", host, port: httpPort, https: false }, | ||
controlPaths, | ||
searchSSLCerts, | ||
certs: searchSSLCerts() | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
"use strict"; | ||
|
||
const xenvConfig = require("xenv-config"); | ||
const { merge } = require("lodash"); | ||
|
||
const appConfigSpec = { | ||
host: { env: ["HOST"], default: "localhost" }, | ||
port: { env: ["PORT"], default: 3000 }, | ||
portForProxy: { | ||
env: ["APP_PORT_FOR_PROXY", "APP_SERVER_PORT"], | ||
default: 0, | ||
envMap: { false: 0, true: 3100 }, | ||
post: x => x || 0 | ||
} | ||
}; | ||
|
||
module.exports = xenvConfig(appConfigSpec, {}, { merge }); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
"use strict"; | ||
|
||
const xenvConfig = require("xenv-config"); | ||
const { merge } = require("lodash"); | ||
|
||
const userConfig = require("./user-config"); | ||
const { options } = userConfig; | ||
|
||
const babelConfigSpec = { | ||
enableTypeScript: { env: "ENABLE_BABEL_TYPESCRIPT", default: options.typescript || false }, | ||
enableDynamicImport: { env: "ENABLE_DYNAMIC_IMPORT", default: false }, | ||
enableFlow: { env: "ENABLE_BABEL_FLOW", default: true }, | ||
// require the @flow directive in source to enable FlowJS type stripping | ||
flowRequireDirective: { env: "FLOW_REQUIRE_DIRECTIVE", default: false }, | ||
proposalDecorators: { env: "BABEL_PROPOSAL_DECORATORS", default: false }, | ||
legacyDecorators: { env: "BABEL_LEGACY_DECORATORS", default: true }, | ||
transformClassProps: { env: "BABEL_CLASS_PROPS", default: false }, | ||
looseClassProps: { env: "BABEL_CLASS_PROPS_LOOSE", default: true }, | ||
envTargets: { | ||
env: "BABEL_ENV_TARGETS", | ||
type: "json", | ||
default: { | ||
//`default` and `node` targets object is required | ||
default: { | ||
ie: "8" | ||
}, | ||
node: process.versions.node.split(".")[0] | ||
} | ||
}, | ||
target: { | ||
env: "ENV_TARGET", | ||
type: "string", | ||
default: "default" | ||
}, | ||
// `extendLoader` is used to override `babel-loader` only when `hasMultiTargets=true` | ||
extendLoader: { | ||
type: "json", | ||
default: {} | ||
} | ||
}; | ||
|
||
module.exports = xenvConfig(babelConfigSpec, userConfig.babel, { merge }); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
"use strict"; | ||
|
||
const xenvConfig = require("xenv-config"); | ||
const { merge } = require("lodash"); | ||
const userConfig = require("./user-config"); | ||
|
||
const karmaConfigSpec = { | ||
browser: { env: "KARMA_BROWSER", default: "chrome" } | ||
}; | ||
|
||
module.exports = xenvConfig(karmaConfigSpec, userConfig.karma, { merge }); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
"use strict"; | ||
|
||
const xenvConfig = require("xenv-config"); | ||
const { merge } = require("lodash"); | ||
|
||
const proxyConfigSpec = { | ||
httpsPort: { | ||
env: ["ELECTRODE_DEV_HTTPS", "XARC_DEV_HTTPS"], | ||
default: 0, | ||
envMap: { true: 443, false: 0 }, | ||
post: x => x || 0 | ||
}, | ||
elevated: { env: ["ELECTRODE_DEV_ELEVATED"], default: false } | ||
}; | ||
|
||
module.exports = xenvConfig(proxyConfigSpec, {}, { merge }); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
"use strict"; | ||
|
||
const userConfig = require("./user-config"); | ||
const xenvConfig = require("xenv-config"); | ||
const { merge } = require("lodash"); | ||
|
||
const webpackConfigSpec = { | ||
webpackDev: { env: "WEBPACK_DEV", default: false }, | ||
devHostname: { env: ["WEBPACK_HOST", "WEBPACK_DEV_HOST", "HOST"], default: "localhost" }, | ||
devPort: { env: "WEBPACK_DEV_PORT", default: 2992 }, | ||
// Using a built-in reverse proxy, the webpack dev assets are served from the | ||
// same host and port as the app. In that case, the URLs to assets are relative | ||
// without protocol, host, port. | ||
// However, user can simulate CDN server with the proxy and have assets URLs | ||
// specifying different host/port from the app. To do that, the following | ||
// should be defined. | ||
cdnProtocol: { env: ["WEBPACK_DEV_CDN_PROTOCOL"], type: "string", default: null }, | ||
cdnHostname: { env: ["WEBPACK_DEV_CDN_HOST"], type: "string", default: null }, | ||
cdnPort: { env: ["WEBPACK_DEV_CDN_PORT"], default: 0 }, | ||
// | ||
// in dev mode, all webpack output are saved to memory only, but some files like | ||
// stats.json are needed by different uses and the stats partial saves a copy to | ||
// disk. It will use this as the path to save the file. | ||
devArtifactsPath: { env: "WEBPACK_DEV_ARTIFACTS_PATH", default: ".etmp" }, | ||
cssModuleSupport: { env: "CSS_MODULE_SUPPORT", type: "boolean", default: undefined }, | ||
enableBabelPolyfill: { env: "ENABLE_BABEL_POLYFILL", default: false }, | ||
enableNodeSourcePlugin: { env: "ENABLE_NODESOURCE_PLUGIN", default: false }, | ||
enableHotModuleReload: { env: "WEBPACK_HOT_MODULE_RELOAD", default: true }, | ||
enableWarningsOverlay: { env: "WEBPACK_DEV_WARNINGS_OVERLAY", default: true }, | ||
woffFontInlineLimit: { env: "WOFF_FONT_INLINE_LIMIT", default: 1000 }, | ||
preserveSymlinks: { | ||
env: ["WEBPACK_PRESERVE_SYMLINKS", "NODE_PRESERVE_SYMLINKS"], | ||
default: false | ||
}, | ||
enableShortenCSSNames: { env: "ENABLE_SHORTEN_CSS_NAMES", default: true }, | ||
minimizeSubappChunks: { env: "MINIMIZE_SUBAPP_CHUNKS", default: false }, | ||
optimizeCssOptions: { | ||
env: "OPTIMIZE_CSS_OPTIONS", | ||
type: "json", | ||
default: { | ||
cssProcessorOptions: { | ||
zindex: false | ||
} | ||
} | ||
}, | ||
loadDlls: { env: "ELECTRODE_LOAD_DLLS", type: "json", default: {} }, | ||
minify: { env: "WEBPACK_MINIFY", default: true } | ||
}; | ||
|
||
module.exports = xenvConfig(webpackConfigSpec, userConfig.webpack, { merge }); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
"use strict"; | ||
|
||
const Path = require("path"); | ||
const { merge } = require("lodash") | ||
|
||
const optionalRequire = require("optional-require")(require); | ||
module.exports = merge({ options: {} }, optionalRequire(Path.resolve("archetype/config"))); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,20 @@ | ||
"use strict"; | ||
const Url = require("url"); | ||
|
||
const getOptRequire = require("@xarc/webpack/lib/util/get-opt-require"); | ||
|
||
const formUrl = ({ protocol = "http", host = "", port = "", path = "" }) => { | ||
const proto = protocol.toString().toLowerCase(); | ||
const sp = port.toString(); | ||
const host2 = | ||
host && port && !(sp === "80" && proto === "http") && !(sp === "443" && proto === "https") | ||
? `${host}:${port}` | ||
: host; | ||
|
||
return Url.format({ protocol: proto, host: host2, pathname: path }); | ||
}; | ||
|
||
module.exports = { | ||
getOptArchetypeRequire: getOptRequire | ||
getOptArchetypeRequire: getOptRequire, | ||
formUrl | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
require("electrode-archetype-njs-module-dev")(); | ||
require("@xarc/module-dev")(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters