elm-review
Advanced tools
Comparing version 2.10.3 to 2.11.0-beta.3
@@ -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", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
435405
82
7676
21
1
6
+ Addedelm-solve-deps-wasm@^1.0.2
+ Addedelm-solve-deps-wasm@1.0.2(transitive)