diff --git a/packages/embark-console/src/test/console.js b/packages/embark-console/src/test/console.js index 6d9313d64..739a26e2d 100644 --- a/packages/embark-console/src/test/console.js +++ b/packages/embark-console/src/test/console.js @@ -1,9 +1,12 @@ /*globals describe, it*/ import Console from '../lib'; import Logger from 'embark-logger'; +import { joinPath, setUpEnv } from 'embark-utils'; import assert from 'assert'; import { version } from '../../package.json'; +setUpEnv(joinPath(__dirname, '../../../embark')); + describe('embark.Console', function() { let logger = new Logger({logLevel: 'error'}); let ipc = { diff --git a/packages/embark-utils/index.d.ts b/packages/embark-utils/index.d.ts index 72b59d0e2..a7f081c42 100644 --- a/packages/embark-utils/index.d.ts +++ b/packages/embark-utils/index.d.ts @@ -5,10 +5,13 @@ declare module "embark-utils" { prepareForCompilation(isCoverage?: boolean): any; } + function anchoredValue(anchor: string|null, value: string): string; + function anchoredPath(anchor: string|null, ...args: string[]): string; function compact(array: any): any; function checkIsAvailable(url: string, callback: any): void; function dockerHostSwap(host: string): string; function dappPath(...names: string[]): string; + function diagramPath(...names: string[]): string; function escapeHtml(message: any): string; function embarkPath(...names: string[]): string; function exit(code?: any): void; @@ -17,5 +20,6 @@ declare module "embark-utils" { function fuzzySearch(text: string, list: any, filter: any): any; function getExternalContractUrl(file: string, provideUrl: string): string; function recursiveMerge(target: any, source: any): any; + function pkgPath(...names: string[]): string; function removePureView(dir: string): void; } diff --git a/packages/embark-utils/src/env.js b/packages/embark-utils/src/env.js new file mode 100644 index 000000000..51e7074dd --- /dev/null +++ b/packages/embark-utils/src/env.js @@ -0,0 +1,49 @@ +import { + anchoredValue, + joinPath, + PWD, + DAPP_PATH, + DIAGRAM_PATH, + EMBARK_PATH, + PKG_PATH, + NODE_PATH +} from './pathUtils'; +import * as findUp from 'find-up'; +import { delimiter } from 'path'; + +export function setUpEnv(defaultEmbarkPath) { + const DEFAULT_PWD = process.cwd(); + anchoredValue(PWD, DEFAULT_PWD); + + const DEFAULT_DAPP_PATH = anchoredValue(PWD); + anchoredValue(DAPP_PATH, DEFAULT_DAPP_PATH); + + const DEFAULT_DIAGRAM_PATH = joinPath(anchoredValue(DAPP_PATH), 'diagram.svg'); + anchoredValue(DIAGRAM_PATH, DEFAULT_DIAGRAM_PATH); + + const DEFAULT_EMBARK_PATH = defaultEmbarkPath; + anchoredValue(EMBARK_PATH, DEFAULT_EMBARK_PATH); + + const DEFAULT_PKG_PATH = anchoredValue(PWD); + anchoredValue(PKG_PATH, DEFAULT_PKG_PATH); + + const EMBARK_NODE_MODULES_PATHS = []; + let len = 0; + let start = anchoredValue(EMBARK_PATH); + // eslint-disable-next-line no-constant-condition + while (true) { + const found = findUp.sync('node_modules', {cwd: start}); + if (!found) break; + start = joinPath(start, '..'); + if (EMBARK_NODE_MODULES_PATHS[len - 1] !== found) { + len = EMBARK_NODE_MODULES_PATHS.push(found); + } + } + + // NOTE: setting NODE_PATH at runtime won't effect lookup behavior in the + // current process, but will take effect in child processes + process.env[NODE_PATH] = EMBARK_NODE_MODULES_PATHS.join(delimiter) + + (process.env[NODE_PATH] ? delimiter : '') + + (process.env[NODE_PATH] || ''); +} + diff --git a/packages/embark-utils/src/index.js b/packages/embark-utils/src/index.js index c8bfe638e..ce584d2ed 100644 --- a/packages/embark-utils/src/index.js +++ b/packages/embark-utils/src/index.js @@ -23,7 +23,24 @@ import { import { getAddressToContract, getTransactionParams } from './transactionUtils'; import LongRunningProcessTimer from './longRunningProcessTimer'; import AccountParser from './accountParser'; -import { dappPath, embarkPath, ipcPath, joinPath, tmpDir, urlJoin } from './pathUtils'; +import { + anchoredValue, + dappPath, + diagramPath, + embarkPath, + ipcPath, + joinPath, + pkgPath, + tmpDir, + urlJoin, + PWD, + DAPP_PATH, + DIAGRAM_PATH, + EMBARK_PATH, + PKG_PATH, + NODE_PATH +} from './pathUtils'; +import { setUpEnv } from './env'; const { extendZeroAddressShorthand, replaceZeroAddressShorthand } = AddressUtils; @@ -244,6 +261,7 @@ function errorMessage(e) { const Utils = { + anchoredValue, buildUrl, buildUrlFromConfig, joinPath, @@ -257,6 +275,7 @@ const Utils = { canonicalHost, compact, copyToClipboard, + diagramPath, deconstructUrl, defaultCorsHost, defaultHost, @@ -282,6 +301,7 @@ const Utils = { getHexBalanceFromString, getExternalContractUrl, groupBy, + setUpEnv, sha512, sha3, timer, @@ -294,12 +314,19 @@ const Utils = { normalizeInput: logUtils.normalizeInput, LogHandler: require('./logHandler'), LongRunningProcessTimer, + pkgPath, prepareForCompilation, proposeAlternative, toChecksumAddress, toposort, AddressUtils, - AccountParser + AccountParser, + PWD, + DAPP_PATH, + DIAGRAM_PATH, + EMBARK_PATH, + PKG_PATH, + NODE_PATH }; module.exports = Utils; diff --git a/packages/embark-utils/src/pathUtils.js b/packages/embark-utils/src/pathUtils.js index 38b33fdcf..ec7f546ae 100644 --- a/packages/embark-utils/src/pathUtils.js +++ b/packages/embark-utils/src/pathUtils.js @@ -2,15 +2,51 @@ import * as path from 'path'; import * as os from 'os'; import { sha512 } from './web3Utils'; +export const PWD = 'PWD'; +export const DAPP_PATH = 'DAPP_PATH'; +export const DIAGRAM_PATH = 'DIAGRAM_PATH'; +export const EMBARK_PATH = 'EMBARK_PATH'; +export const PKG_PATH = 'PKG_PATH'; +export const NODE_PATH = 'NODE_PATH'; + +export function anchoredValue(anchor, value) { + if (!arguments.length) { + throw new TypeError(`anchor name '${anchor}' was not specified`); + } + if (arguments.length > 2) { + throw new TypeError(`accepts at most 2 arguments`); + } + if (typeof anchor !== 'string') { + throw new TypeError(`anchor name '${anchor}' was not a string`); + } + let _anchor = process.env[anchor]; + if (arguments.length < 2 && !_anchor) { + throw new Error(`process.env.${anchor} was not set`); + } + // don't override an existing value, e.g. if already set by bin/embark + if (!_anchor) { + _anchor = value; + process.env[anchor] = _anchor; + } + return _anchor; +} + +export function anchoredPath(anchor, ...args) { + return joinPath( + anchoredValue(anchor), + ...args.map(path => path.replace(dappPath(), '')) + ); +} + export function joinPath() { return path.join.apply(path.join, arguments); } export function tmpDir(...args) { return joinPath(os.tmpdir(), ...args); } - -export function dappPath(...names) { - return path.join(process.env.DAPP_PATH || process.cwd(), ...names); -} +export function diagramPath(...args) { return anchoredPath(DIAGRAM_PATH, ...args); } +export function pkgPath(...args) { return anchoredPath(PKG_PATH, ...args); } +export function dappPath(...args) { return anchoredPath(DAPP_PATH, ...args); } +export function embarkPath(...args) { return anchoredPath(EMBARK_PATH, ...args); } export function ipcPath(basename, usePipePathOnWindows = false) { if (!(basename && typeof basename === 'string')) { @@ -25,14 +61,6 @@ export function ipcPath(basename, usePipePathOnWindows = false) { ); } -export function embarkPath(...names) { - const EMBARK_PATH = process.env.EMBARK_PATH; - if (!EMBARK_PATH) { - throw new Error('environment variable EMBARK_PATH was not set'); - } - return path.join(EMBARK_PATH, ...names); -} - export function urlJoin(url, path) { let urlChunks = url.split('/'); let levels = path.split('../'); diff --git a/packages/embark/src/cmd/cmd.js b/packages/embark/src/cmd/cmd.js index 862f505e2..2709dd167 100644 --- a/packages/embark/src/cmd/cmd.js +++ b/packages/embark/src/cmd/cmd.js @@ -1,4 +1,5 @@ import { __, setOrDetectLocale } from 'embark-i18n'; +import { diagramPath } from 'embark-utils'; const program = require('commander'); const EmbarkController = require('./cmd_controller.js'); const fs = require('../lib/core/fs.js'); @@ -307,7 +308,7 @@ class Cmd { .option('--skip-functions', __('Graph will not include functions')) .option('--skip-events', __('Graph will not include events')) .option('--locale [locale]', __('language to use (default: en)')) - .option('--output [svgfile]', __('filepath to output SVG graph to (default: %s)', fs.diagramPath())) + .option('--output [svgfile]', __('filepath to output SVG graph to (default: %s)', diagramPath())) .description(__('generates documentation based on the smart contracts configured')) .action(function(env, options) { setOrDetectLocale(options.locale); @@ -317,7 +318,7 @@ class Cmd { skipUndeployed: options.skipUndeployed, skipFunctions: options.skipFunctions, skipEvents: options.skipEvents, - output: options.output || fs.diagramPath() + output: options.output || diagramPath() }); }); } diff --git a/packages/embark/src/lib/core/env.js b/packages/embark/src/lib/core/env.js index da8639ef8..7981e4986 100644 --- a/packages/embark/src/lib/core/env.js +++ b/packages/embark/src/lib/core/env.js @@ -1,76 +1,3 @@ -/* global __dirname module process require */ +import { joinPath, setUpEnv } from 'embark-utils'; -const {delimiter} = require('path'); -const findUp = require('find-up'); -import {joinPath} from 'embark-utils'; - -function anchoredValue(anchor, value) { - if (!arguments.length) { - throw new TypeError('anchor name was not specified'); - } - if (arguments.length > 2) { - throw new TypeError('accepts at most 2 arguments'); - } - if (typeof anchor !== 'string') { - throw new TypeError('anchor name was not a string'); - } - let _anchor = process.env[anchor]; - if (arguments.length < 2 && !_anchor) { - throw new Error(`process.env.${anchor} was not set`); - } - // don't override an existing value, e.g. if already set by bin/embark - if (!_anchor) { - _anchor = value; - process.env[anchor] = _anchor; - } - return _anchor; -} - -const PWD = 'PWD'; -const DEFAULT_PWD = process.cwd(); -anchoredValue(PWD, DEFAULT_PWD); - -const DAPP_PATH = 'DAPP_PATH'; -const DEFAULT_DAPP_PATH = anchoredValue(PWD); -anchoredValue(DAPP_PATH, DEFAULT_DAPP_PATH); - -const DIAGRAM_PATH = 'DIAGRAM_PATH'; -const DEFAULT_DIAGRAM_PATH = joinPath(anchoredValue(DAPP_PATH), 'diagram.svg'); -anchoredValue(DIAGRAM_PATH, DEFAULT_DIAGRAM_PATH); - -const EMBARK_PATH = 'EMBARK_PATH'; -const DEFAULT_EMBARK_PATH = joinPath(__dirname, '../../..'); -anchoredValue(EMBARK_PATH, DEFAULT_EMBARK_PATH); - -const PKG_PATH = 'PKG_PATH'; -const DEFAULT_PKG_PATH = anchoredValue(PWD); -anchoredValue(PKG_PATH, DEFAULT_PKG_PATH); - -const EMBARK_NODE_MODULES_PATHS = []; -let len = 0; -let start = anchoredValue(EMBARK_PATH); -// eslint-disable-next-line no-constant-condition -while (true) { - const found = findUp.sync('node_modules', {cwd: start}); - if (!found) break; - start = joinPath(start, '..'); - if (EMBARK_NODE_MODULES_PATHS[len - 1] !== found) { - len = EMBARK_NODE_MODULES_PATHS.push(found); - } -} - -const NODE_PATH = 'NODE_PATH'; -// NOTE: setting NODE_PATH at runtime won't effect lookup behavior in the -// current process, but will take effect in child processes -process.env[NODE_PATH] = EMBARK_NODE_MODULES_PATHS.join(delimiter) + - (process.env[NODE_PATH] ? delimiter : '') + - (process.env[NODE_PATH] || ''); - -module.exports = { - anchoredValue, - PWD, - DAPP_PATH, - DIAGRAM_PATH, - EMBARK_PATH, - PKG_PATH -}; +setUpEnv(joinPath(__dirname, '../../../')); diff --git a/packages/embark/src/lib/core/fs.js b/packages/embark/src/lib/core/fs.js index d0760b7fb..64feb4ca0 100644 --- a/packages/embark/src/lib/core/fs.js +++ b/packages/embark/src/lib/core/fs.js @@ -1,15 +1,11 @@ /* global module process require */ -const {DAPP_PATH, - DIAGRAM_PATH, - EMBARK_PATH, - PKG_PATH, - anchoredValue} = require('./env'); const fs = require('fs-extra'); -const os = require('os'); const parseJson = require('parse-json'); const path = require('path'); -import {joinPath, sha512} from 'embark-utils'; +import { joinPath } from 'embark-utils'; +import './env'; + require('colors'); function mkdirpSync(...args) { return fs.mkdirpSync(...args); } @@ -73,38 +69,8 @@ function access(...args) { return fs.access(...args); } function removeSync(...args) { return fs.removeSync(...args); } -function anchoredPath(anchor, ...args) { - return joinPath( - anchoredValue(anchor), - ...args.map(path => path.replace(dappPath(), '')) - ); -} - -function embarkPath(...args) { return anchoredPath(EMBARK_PATH, ...args); } - -function dappPath(...args) { return anchoredPath(DAPP_PATH, ...args); } - -function diagramPath(...args) { return anchoredPath(DIAGRAM_PATH, ...args); } - -function ipcPath(basename, usePipePathOnWindows = false) { - if (!(basename && typeof basename === 'string')) { - throw new TypeError('first argument must be a non-empty string'); - } - if (process.platform === 'win32' && usePipePathOnWindows) { - return `\\\\.\\pipe\\${basename}`; - } - return joinPath( - tmpDir(`embark-${sha512(dappPath()).slice(0, 8)}`), - basename - ); -} - -function pkgPath(...args) { return anchoredPath(PKG_PATH, ...args); } - function createWriteStream(...args) { return fs.createWriteStream(...args); } -function tmpDir(...args) { return joinPath(os.tmpdir(), ...args); } - function copyPreserve(sourceFilePath, targetFilePath) { const implementation = (sourceFilePath, targetFilePath) => { let ext = 1; @@ -135,20 +101,15 @@ module.exports = { copyPreserve, copySync, createWriteStream, - dappPath, - diagramPath, - embarkPath, existsSync, ensureFileSync, ensureDirSync, - ipcPath, mkdirp, mkdirpSync, move, moveSync, outputFileSync, outputJSONSync, - pkgPath, readFile, readFileSync, readJSONSync, @@ -159,7 +120,6 @@ module.exports = { stat, statSync, symlink, - tmpDir, writeFile, writeFileSync, writeJSONSync, diff --git a/packages/embark/src/lib/modules/codeRunner/fs.js b/packages/embark/src/lib/modules/codeRunner/fs.js index 808a1cb1f..dd011a340 100644 --- a/packages/embark/src/lib/modules/codeRunner/fs.js +++ b/packages/embark/src/lib/modules/codeRunner/fs.js @@ -1,15 +1,9 @@ /* global module process require */ - -const {DAPP_PATH, - DIAGRAM_PATH, - EMBARK_PATH, - PKG_PATH, - anchoredValue} = require('../../core/env'); const fs = require('fs-extra'); const os = require('os'); const parseJson = require('parse-json'); const path = require('path'); -import {joinPath, sha512} from 'embark-utils'; +import { dappPath, embarkPath, joinPath, pkgPath } from 'embark-utils'; require('colors'); function restrictPath(receiver, binding, count, args) { @@ -101,38 +95,8 @@ function access(...args) { return restrictPath(fs.access, fs, 1, args); } function removeSync(...args) { return restrictPath(fs.removeSync, fs, 1, args); } -function anchoredPath(anchor, ...args) { - return joinPath( - anchoredValue(anchor), - ...args.map(path => path.replace(dappPath(), '')) - ); -} - -function embarkPath(...args) { return anchoredPath(EMBARK_PATH, ...args); } - -function dappPath(...args) { return anchoredPath(DAPP_PATH, ...args); } - -function diagramPath(...args) { return anchoredPath(DIAGRAM_PATH, ...args); } - -function ipcPath(basename, usePipePathOnWindows = false) { - if (!(basename && typeof basename === 'string')) { - throw new TypeError('first argument must be a non-empty string'); - } - if (process.platform === 'win32' && usePipePathOnWindows) { - return `\\\\.\\pipe\\${basename}`; - } - return joinPath( - tmpDir(`embark-${sha512(dappPath()).slice(0, 8)}`), - basename - ); -} - -function pkgPath(...args) { return anchoredPath(PKG_PATH, ...args); } - function createWriteStream(...args) { return restrictPath(fs.createWriteStream, fs, 1, args); } -function tmpDir(...args) { return joinPath(os.tmpdir(), ...args); } - function copyPreserve(sourceFilePath, targetFilePath) { const implementation = (sourceFilePath, targetFilePath) => { let ext = 1; @@ -163,20 +127,15 @@ module.exports = { copyPreserve, copySync, createWriteStream, - dappPath, - diagramPath, - embarkPath, existsSync, ensureFileSync, ensureDirSync, - ipcPath, mkdirp, mkdirpSync, move, moveSync, outputFileSync, outputJSONSync, - pkgPath, readFile, readFileSync, readJSONSync, @@ -187,7 +146,6 @@ module.exports = { stat, statSync, symlink, - tmpDir, writeFile, writeFileSync, writeJSONSync, diff --git a/packages/embark/src/lib/modules/codeRunner/vm.ts b/packages/embark/src/lib/modules/codeRunner/vm.ts index 064b34313..36465e034 100644 --- a/packages/embark/src/lib/modules/codeRunner/vm.ts +++ b/packages/embark/src/lib/modules/codeRunner/vm.ts @@ -2,9 +2,8 @@ import { each } from "async"; import { Callback, Logger } /* supplied by @types/embark in packages/embark-typings */ from "embark"; import { NodeVM, NodeVMOptions } from "vm2"; -import { compact, recursiveMerge } from "embark-utils"; +import { compact, dappPath, recursiveMerge } from "embark-utils"; -const fs = require("./fs"); const path = require("path"); const { isEs6Module } = require("../../utils/utils"); @@ -51,7 +50,7 @@ class VM { "rxjs/operators", ], }, - sandbox: { __dirname: fs.dappPath() }, + sandbox: { __dirname: dappPath() }, }; /** diff --git a/packages/embark/src/lib/utils/template_generator.js b/packages/embark/src/lib/utils/template_generator.js index 8206974aa..3deb92c39 100644 --- a/packages/embark/src/lib/utils/template_generator.js +++ b/packages/embark/src/lib/utils/template_generator.js @@ -3,7 +3,14 @@ const findUp = require('find-up'); const fs = require('../core/fs.js'); const hostedGitInfo = require('hosted-git-info'); const utils = require('./utils.js'); -import { embarkPath, downloadFile, joinPath, runCmd, errorMessage } from 'embark-utils'; +import { + embarkPath, + downloadFile, + joinPath, + runCmd, + tmpDir as tmpDirUtil, + errorMessage +} from 'embark-utils'; const semver = require('semver'); const {promisify} = require('util'); const {execSync} = require('child_process'); @@ -58,7 +65,7 @@ class TemplateGenerator { process.exit(1); } let {url, filePath, browse} = ext; - let tmpFilePath = fs.tmpDir(filePath); + let tmpFilePath = tmpDirUtil(filePath); try { try { await this.download(url, tmpFilePath, browse); @@ -67,7 +74,7 @@ class TemplateGenerator { if (url_fallback) { console.log(__('Retrying with the default branch...').yellow); console.log((__(`It may not be compatible with your Embark version`) + ` ${embarkVersion}`).yellow); - tmpFilePath = fs.tmpDir(filePath_fallback); + tmpFilePath = tmpDirUtil(filePath_fallback); await this.download(url_fallback, tmpFilePath, browse_fallback); } else { throw new Error(); diff --git a/packages/embark/src/test/file.js b/packages/embark/src/test/file.js index 6e49f36ed..fc2b3b0a0 100644 --- a/packages/embark/src/test/file.js +++ b/packages/embark/src/test/file.js @@ -1,7 +1,9 @@ /*globals describe, it*/ -const { dappPath, File, Types } = require('embark-utils'); -const {expect} = require("chai"); -const fs = require("../lib/core/fs"); +const { dappPath, File, joinPath, setUpEnv, Types } = require('embark-utils'); +const { expect } = require("chai"); +const fs = require("fs-extra"); + +setUpEnv(joinPath(__dirname, '../../')); describe('embark.File', function () { describe('Read file contents', function () {