Socket
Socket
Sign inDemoInstall

elm-review

Package Overview
Dependencies
Maintainers
1
Versions
83
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

elm-review - npm Package Compare versions

Comparing version 2.10.3 to 2.11.0-beta.3

lib/dependency-provider.js

35

lib/build.js

@@ -162,9 +162,3 @@ const fs = require('fs');

getElmBinary(options),
createTemplateProject(
options,
reviewElmJsonPath,
userSrc,
buildFolder,
reviewElmJson
)
createTemplateProject(options, userSrc, buildFolder, reviewElmJson)
]).then(([elmBinary]) => {

@@ -261,3 +255,2 @@ Debug.log('Compiling review application');

options,
reviewElmJsonPath,
buildFolder,

@@ -289,3 +282,3 @@ path.join(buildFolder, 'project'),

return {
appHash: commit,
appHash: `${template.pathToFolder}/${commit}`,
elmModulePath,

@@ -300,3 +293,2 @@ reviewElmJsonPath: null,

* @param {Options} options
* @param {Path} reviewElmJsonPath
* @param {Path} userSrc

@@ -309,3 +301,2 @@ * @param {Path} projectFolder

options,
reviewElmJsonPath,
userSrc,

@@ -320,13 +311,10 @@ projectFolder,

// Load review project's elm.json file contents
const [dependencies, previousElmJson] = await Promise.all([
TemplateDependencies.get(
options,
reviewElmJson.dependencies,
reviewElmJsonPath
),
FS.readFile(elmJsonPath).catch(() => null)
const [previousElmJson, dependencies] = await Promise.all([
FS.readFile(elmJsonPath).catch(() => null),
TemplateDependencies.get(options, reviewElmJson)
]);
const finalElmJson = updateSourceDirectories(options, userSrc, {
...reviewElmJson,
dependencies
dependencies,
['test-dependencies']: {direct: {}, indirect: {}}
});

@@ -597,4 +585,4 @@ const finalElmJsonAsString = JSON.stringify(finalElmJson, null, 4);

buildFolder,
reviewElmJson['elm-version'],
parseElmElmJson,
parseElmElmJsonPath,
elmSyntaxVersion

@@ -625,9 +613,9 @@ ),

buildFolder,
elmVersion,
parseElmElmJson,
parseElmElmJsonPath,
elmSyntaxVersion
) {
const dependencies = await TemplateDependencies.addElmSyntax(
const dependencies = TemplateDependencies.addElmSyntax(
options,
parseElmElmJsonPath,
elmVersion,
elmSyntaxVersion

@@ -642,2 +630,3 @@ );

...parseElmElmJson,
'elm-version': elmVersion,
dependencies,

@@ -644,0 +633,0 @@ 'source-directories': parseElmElmJson['source-directories'].map((dir) =>

@@ -383,2 +383,7 @@ const chalk = require('chalk');

},
{
name: 'offline',
boolean: true,
sections: null
},
gitHubAuthFlag,

@@ -385,0 +390,0 @@ {

@@ -147,22 +147,10 @@ const fs = require('fs');

const elmJson = {
type: 'application',
'source-directories': ['src'],
'elm-version': elmVersion || '0.19.1',
dependencies: {
direct: {},
indirect: {}
},
'test-dependencies': {
direct: {},
indirect: {}
}
};
const pathToElmJson = path.join(directory, 'elm.json');
fs.writeFileSync(pathToElmJson, JSON.stringify(elmJson, null, 4));
await TemplateDependencies.add(options, pathToElmJson);
const elmJsonWithDeps = FS.readJsonFileSync(pathToElmJson);
fs.writeFileSync(pathToElmJson, JSON.stringify(elmJsonWithDeps, null, 4));
fs.writeFileSync(
path.join(directory, 'elm.json'),
JSON.stringify(
TemplateDependencies.createNewReviewElmJson(options, elmVersion),
null,
4
)
);
}

@@ -169,0 +157,0 @@

@@ -19,2 +19,3 @@ const path = require('path');

validate,
minimalVersion,
supportedRange

@@ -21,0 +22,0 @@ };

@@ -202,2 +202,3 @@ const path = require('path');

forceBuild: args['force-build'],
offline: args.offline,
report: args.report === 'json' || args.report === 'ndjson' ? 'json' : null,

@@ -274,5 +275,16 @@ reportOnOneLine: args.report === 'ndjson',

},
dependenciesCachePath: () =>
path.join(elmStuffFolder(), 'dependencies-cache'),
/** Cache in which we'll store information related Elm depencies, computed by elm-solve-deps-wasm.
*
* @param {string} elmVersion
* @return {string}
*/
dependenciesCachePath: (elmVersion) =>
path.join(
elmStuffFolder(),
'dependencies-cache',
elmVersion,
'versions-cache.json'
),
// PATHS - THINGS TO REVIEW

@@ -279,0 +291,0 @@ elmJsonPath,

@@ -38,5 +38,10 @@ const path = require('path');

);
return FS.readJsonFile(cacheLocation).catch(() =>
return FS.readJsonFile(cacheLocation).catch((error) => {
// Finally, try to download it from the packages website
readFromPackagesWebsite(
if (options.offline) {
// Unless we're in offline mode
throw error;
}
return readFromPackagesWebsite(
cacheLocation,

@@ -46,4 +51,4 @@ name,

'elm.json'
)
);
);
});
})

@@ -63,10 +68,8 @@ );

const directory = path.join(
elmRoot,
const elmJsonPath = getElmJsonFromElmHomePath(
elmVersion,
'packages',
name,
packageVersion
);
promise = FS.readJsonFile(path.join(directory, 'elm.json'));
promise = FS.readJsonFile(elmJsonPath);
elmJsonInElmHomePromises.set(key, promise);

@@ -76,2 +79,14 @@ return promise;

function getElmJsonFromElmHomePath(elmVersion, name, packageVersion) {
return path.join(
getPackagePathInElmHome(elmVersion, name),
packageVersion,
'elm.json'
);
}
function getPackagePathInElmHome(elmVersion, name) {
return path.join(elmRoot, elmVersion, 'packages', name);
}
/** Get the docs.json file for a dependency.

@@ -166,4 +181,8 @@ *

getElmJson,
getPackagePathInElmHome,
getElmJsonFromElmHomePath,
getElmJsonFromElmHome,
getDocsJson
elmReviewDependencyCache,
getDocsJson,
elmRoot
};

@@ -82,3 +82,4 @@ const fs = require('fs');

const elmJson = await downloadTemplateElmJson(options, template, commit);
const elmJson = await downloadTemplateElmJson(template, commit);
if (

@@ -89,6 +90,12 @@ elmJson.dependencies &&

) {
const packageVersion = elmJson.dependencies.direct['jfmengels/elm-review'];
const [major] = packageVersion.split('.');
if (Number.parseInt(major, 10) !== MinVersion.minimalVersion.major) {
// Major version for which the configuration exists is not compatible
MinVersion.validate(options, reviewElmJsonPath, packageVersion);
}
elmJson.dependencies.direct['jfmengels/elm-review'] =
MinVersion.updateToAtLeastMinimalVersion(
elmJson.dependencies.direct['jfmengels/elm-review']
);
MinVersion.updateToAtLeastMinimalVersion(packageVersion);
}

@@ -99,8 +106,6 @@

await FS.mkdirp(path.dirname(reviewElmJsonPath));
await FS.writeJson(reviewElmJsonPath, elmJson, 4);
return TemplateDependencies.update(options, reviewElmJsonPath);
return TemplateDependencies.update(options, reviewElmJsonPath, elmJson);
}
async function downloadTemplateElmJson(options, template, commit) {
async function downloadTemplateElmJson(template, commit) {
const {repoName, pathToFolder} = template;

@@ -107,0 +112,0 @@ const pathToFolderAsUrl = pathToFolder ? `/${pathToFolder}` : '';

@@ -5,9 +5,7 @@ /*

const spawnAsync = require('cross-spawn');
const Hash = require('./hash');
const Cache = require('./cache');
const FS = require('./fs-wrapper');
const ErrorMessage = require('./error-message');
const getExecutable = require('elm-tooling/getExecutable');
const MinVersion = require('./min-version');
const DependencyProvider = require('./dependency-provider');
let dependencyProvider = null;
/**

@@ -20,3 +18,3 @@ * @typedef { import("./types/options").Options } Options

get,
add,
createNewReviewElmJson,
update,

@@ -28,91 +26,93 @@ addElmSyntax

async function get(options, elmJsonDependencies, pathToElmJson) {
const dependencyHash = Hash.hash(JSON.stringify(elmJsonDependencies));
const cacheKey = `${dependencyHash}${
options.localElmReviewSrc ? '-local' : ''
}`;
return Cache.getOrCompute(options.dependenciesCachePath(), cacheKey, () =>
computeDependencies(options, pathToElmJson)
function get(options, elmJson) {
const extra = {
'elm/json': '1.0.0 <= v < 2.0.0',
'stil4m/elm-syntax': '7.0.0 <= v < 8.0.0',
'elm/project-metadata-utils': '1.0.0 <= v < 2.0.0'
};
const dependencies = solve(
options,
elmJson['elm-version'],
JSON.stringify(elmJson),
extra,
false
);
if (options.localElmReviewSrc) {
delete dependencies.direct['jfmengels/elm-review'];
delete dependencies.indirect['jfmengels/elm-review'];
}
return dependencies;
}
function computeDependencies(options, pathToElmJson) {
return spawnElmJsonAsync(
options,
[
'solve',
'--extra',
'elm/json@1',
'stil4m/elm-syntax@7',
'elm/project-metadata-utils@1',
'MartinSStewart/elm-serialize@1',
'--',
pathToElmJson
// ADD ELM-SYNTAX
function addElmSyntax(options, elmVersion, elmSyntaxVersion) {
const elmJson = `{
"type": "application",
"source-directories": [
"src",
"../ast-codec/src"
],
(error) => {
throw new ErrorMessage.CustomError(
'CONFIGURATION COMPILATION ERROR',
`I encountered a problem when solving dependencies:
${formatElmJsonError(error, options)}`,
null
);
"elm-version": "0.19.1",
"dependencies": {
"direct": {
"elm/core": "1.0.5",
"elm/json": "1.1.3"
},
"indirect": {}
},
"test-dependencies": {
"direct": {},
"indirect": {}
}
)
.then(JSON.parse)
.then((dependencies) => {
if (options.localElmReviewSrc) {
delete dependencies.direct['jfmengels/elm-review'];
delete dependencies.indirect['jfmengels/elm-review'];
}
}`;
const extra = {
'stil4m/elm-syntax': `${elmSyntaxVersion} <= v < ${nextPatchVersion(
elmSyntaxVersion
)}`
};
return dependencies;
});
return solve(options, elmVersion, elmJson, extra, false);
}
function formatElmJsonError(error, options) {
if (error.stderr === undefined) {
return error.message;
}
/**
* @param {Options} options
* @param {string} elmVersion
* @param {string} elmJson
* @param {Record<string, string>}extra
* @param {boolean} onlineFirst
* @return {{direct: Record<string, string>, indirect: Record<string, string>}}
*/
function solve(options, elmVersion, elmJson, extra, onlineFirst) {
dependencyProvider = dependencyProvider || new DependencyProvider();
const stderrMessage = error.stderr.toString().trim();
const exec = /^([^]+\n)?--\s([A-Z ]+)\s-*\n\n([^]+)$/.exec(stderrMessage);
if (exec === null) {
return `${error.message}\n\n${
stderrMessage === '' ? '(empty stderr)' : stderrMessage
}`;
try {
return JSON.parse(
onlineFirst && !options.offline
? dependencyProvider.solveOnline(options, elmVersion, elmJson, extra)
: dependencyProvider.solveOffline(options, elmVersion, elmJson, extra)
);
} catch (error) {
if (options.offline) {
throw error;
}
return JSON.parse(
onlineFirst
? dependencyProvider.solveOffline(options, elmVersion, elmJson, extra)
: dependencyProvider.solveOnline(options, elmVersion, elmJson, extra)
);
}
}
const [, before, title, message] = exec;
return ErrorMessage.formatHuman(
options.debug,
new ErrorMessage.CustomError(
title,
before === undefined ? message : `${message}\n\n${before}`
)
);
function nextMajorVersion(version) {
const [major] = version.split('.');
return `${parseInt(major, 10) + 1}.0.0`;
}
// ADD ELM-SYNTAX
async function addElmSyntax(options, pathToElmJson, elmSyntaxVersion) {
return spawnElmJsonAsync(
options,
[
'solve',
'--extra',
`stil4m/elm-syntax@${elmSyntaxVersion}`,
'--',
pathToElmJson
],
(error) => {
throw new ErrorMessage.CustomError(
'CONFIGURATION COMPILATION ERROR',
`I encountered a problem when solving dependencies for creating the parser application:
${formatElmJsonError(error, options)}`,
null
);
}
).then(JSON.parse);
function nextPatchVersion(version) {
const [major, minor, patch] = version.split('.');
return `${major}.${minor}.${parseInt(patch, 10) + 1}`;
}

@@ -122,68 +122,50 @@

async function add(options, pathToElmJson) {
await spawnElmJsonAsync(
options,
[
'install',
'--yes',
'elm/core@1',
'jfmengels/elm-review@2',
'stil4m/elm-syntax@7',
'--',
pathToElmJson
],
(error) => {
throw new ErrorMessage.CustomError(
'CONFIGURATION COMPILATION ERROR',
`I encountered a problem when adding base dependencies:
${formatElmJsonError(error, options)}`,
null
);
function createNewReviewElmJson(options, elmVersion) {
const elmJson = {
type: 'application',
'source-directories': ['src'],
'elm-version': elmVersion || '0.19.1',
dependencies: {
direct: {},
indirect: {}
},
'test-dependencies': {
direct: {},
indirect: {}
}
);
};
return spawnElmJsonAsync(
const testDependencies = solve(
options,
[
'install',
'--test',
'--yes',
'elm-explorations/test@2',
'--',
pathToElmJson
],
(error) => {
throw new ErrorMessage.CustomError(
'CONFIGURATION COMPILATION ERROR',
`I encountered a problem when adding test dependencies:
${formatElmJsonError(error, options)}`,
null
);
}
elmJson['elm-version'],
JSON.stringify(elmJson),
{
'elm/core': '1.0.0 <= v < 2.0.0',
'elm-explorations/test': '2.0.0 <= v < 3.0.0'
},
false
);
}
// UPDATE
async function update(options, pathToElmJson) {
await spawnElmJsonAsync(
elmJson.dependencies = solve(
options,
['upgrade', '--yes', pathToElmJson],
(error) => {
throw new ErrorMessage.CustomError(
'CONFIGURATION COMPILATION ERROR',
`I encountered a problem when attempting to update the dependencies:
elmJson['elm-version'],
JSON.stringify(elmJson),
{
'elm/core': '1.0.0 <= v < 2.0.0',
'stil4m/elm-syntax': '7.0.0 <= v < 8.0.0',
'jfmengels/elm-review': MinVersion.supportedRange
},
true
);
${formatElmJsonError(error, options)}`,
null
);
}
elmJson['test-dependencies'].direct = filterOutDuplicateDependencies(
testDependencies.direct,
elmJson.dependencies.direct
);
elmJson['test-dependencies'].indirect = filterOutDuplicateDependencies(
testDependencies.indirect,
elmJson.dependencies.indirect
);
const elmJson = await FS.readJsonFile(pathToElmJson);
if (options.subcommand === 'init') {
await FS.writeJson(pathToElmJson, elmJson, 4);
}
teardownDependenciesProvider();

@@ -193,122 +175,42 @@ return elmJson;

// SPAWNING
function filterOutDuplicateDependencies(testDependencies, regularDependencies) {
return Object.fromEntries(
Object.entries(testDependencies).filter(
([pkg, _]) => !regularDependencies[pkg]
)
);
}
let elmJsonPromise;
// UPDATE
/**
* Run elm-json
* @param {Options} options
* @param {string[]} args
* @param {(Error) => Error} onError
* @returns {Promise<string>}
*/
function spawnElmJsonAsync(options, args, onError) {
if (elmJsonPromise === undefined) {
elmJsonPromise = getExecutable({
name: 'elm-json',
version: '^0.2.10',
onProgress: (percentage) => {
const message = `Downloading elm-json... ${Math.round(
percentage * 100
)}%`;
async function update(options, pathToElmJson, elmJson) {
const extra = {
'stil4m/elm-syntax': '7.0.0 <= v < 8.0.0',
'jfmengels/elm-review': MinVersion.supportedRange
};
if (options.report !== 'json' || options.debug) {
process.stderr.write(
percentage >= 1
? `${'Working...'.padEnd(message.length, ' ')}\r`
: `${message}\r`
);
}
}
}).catch((error) => {
throw new ErrorMessage.CustomError(
// prettier-ignore
'PROBLEM INSTALLING elm-json',
// prettier-ignore
`I need a tool called elm-json for some of my inner workings,
but there was some trouble installing it. This is what we know:
Object.entries(elmJson.dependencies.direct).forEach(([pkg, version]) => {
extra[pkg] = `${version} <= v < ${nextMajorVersion(version)}`;
});
${error.message}`
);
});
}
delete elmJson.dependencies.direct['jfmengels/elm-review'];
delete elmJson.dependencies.direct['stil4m/elm-syntax'];
return elmJsonPromise
.then(
(elmJsonCLI) =>
new Promise((resolve, reject) => {
const child = spawnAsync(elmJsonCLI, args, {
silent: true,
env: process.env
});
let stdout = '';
let stderr = '';
// TODO Upgrade test dependencies too for init or new-package
elmJson.dependencies = solve(
options,
elmJson['elm-version'],
JSON.stringify({...elmJson, dependencies: {direct: {}, indirect: {}}}),
extra,
true
);
child.on('error', reject);
teardownDependenciesProvider();
child.stdout.on('data', (chunk) => {
stdout += chunk.toString();
});
child.stderr.on('data', (chunk) => {
stderr += chunk.toString();
});
child.on('close', (code, signal) => {
if (code === 0) {
resolve(stdout);
} else {
/** @type {TemplateDependenciesError} */
const error = new Error(
`elm-json exited with ${exitReason(
code,
signal
)}\n\n${stdout}\n\n${stderr}`
);
error.stderr = stderr;
reject(error);
}
});
})
)
.catch((error) => {
if (
error &&
error.message &&
error.message.startsWith('phase: retrieve')
) {
return Promise.reject(
new ErrorMessage.CustomError(
// prettier-ignore
'MISSING INTERNET ACCESS',
// prettier-ignore
`I’m sorry, but it looks like you don’t have Internet access at the moment.
I require it for some of my inner workings.
Please connect to the Internet and try again. After that, as long as you don’t
change your configuration or remove \`elm-stuff/\`, you should be able to go
offline again.`
)
);
}
return Promise.reject(onError(error));
});
return elmJson;
}
/**
* @param {number | null} code
* @param {string | null} signal
* @returns {string}
*/
function exitReason(code, signal) {
if (code !== null) {
return `exit code ${code}`;
}
if (signal !== null) {
return `signal ${signal}`;
}
return 'unknown reason';
function teardownDependenciesProvider() {
dependencyProvider.tearDown();
dependencyProvider = null;
}
{
"name": "elm-review",
"version": "2.10.3",
"version": "2.11.0-beta.3",
"description": "Run elm-review from Node.js",

@@ -82,2 +82,3 @@ "engines": {

"cross-spawn": "^7.0.3",
"elm-solve-deps-wasm": "^1.0.2",
"elm-tooling": "^1.14.1",

@@ -84,0 +85,0 @@ "fastest-levenshtein": "^1.0.16",

@@ -10,3 +10,2 @@ {

"direct": {
"MartinSStewart/elm-serialize": "1.2.0",
"elm/core": "1.0.5",

@@ -17,7 +16,3 @@ "elm/json": "1.1.3",

"indirect": {
"bburdette/toop": "1.0.1",
"danfishgold/base64-bytes": "1.0.3",
"elm/bytes": "1.0.8",
"elm/parser": "1.1.0",
"elm/regex": "1.0.0",
"elm/time": "1.0.0",

@@ -24,0 +19,0 @@ "elm/url": "1.0.0",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc