@covector/files
Advanced tools
Comparing version 0.6.0 to 0.6.1
# Changelog | ||
## \[0.6.1] | ||
### Dependencies | ||
- [`7b6201c`](https://www.github.com/jbolda/covector/commit/7b6201c2e7e0d9120610a2a882c0b4523f4ab6dc)([#264](https://www.github.com/jbolda/covector/pull/264)) Bump Typescript to v4.9, and deeply update types in the lower level functions to start. | ||
### New Features | ||
- [`84c9d9d`](https://www.github.com/jbolda/covector/commit/84c9d9dd8f9bfbb0e0116fc5b8bfc1f62fd2b5bd)([#268](https://www.github.com/jbolda/covector/pull/268)) Handle Rust projects with versions handled with workspace inheritance. | ||
## \[0.6.0] | ||
@@ -4,0 +14,0 @@ |
/// <reference types="node" /> | ||
import { PathLike } from "fs"; | ||
import { Operation } from "effection"; | ||
import type { File, PackageFile, PreFile, ConfigFile } from "@covector/types"; | ||
export declare function loadFile(file: PathLike, cwd: string): Generator<any, File | void, any>; | ||
export declare function saveFile(file: File, cwd: string): Generator<any, File, any>; | ||
import type { File, PackageFile, PreFile, ConfigFile, Pkg } from "@covector/types"; | ||
export declare function loadFile(file: PathLike, cwd: string): Operation<File | void>; | ||
export declare function saveFile(file: File, cwd: string): Operation<File>; | ||
export declare function readAllPkgFiles({ config, cwd, }: { | ||
@@ -24,10 +24,10 @@ config: ConfigFile; | ||
cwd: string; | ||
}): Generator<any, File, any>; | ||
}): Operation<File>; | ||
export declare function readPreFile({ cwd, changeFolder, }: { | ||
cwd: string; | ||
changeFolder?: string; | ||
}): Generator<any, PreFile | null, any>; | ||
}): Operation<PreFile | null>; | ||
export declare const getPackageFileVersion: ({ pkg, property, dep, }: { | ||
pkg: PackageFile; | ||
property?: string | undefined; | ||
property?: keyof Pkg | undefined; | ||
dep?: string | undefined; | ||
@@ -38,3 +38,3 @@ }) => string; | ||
version: string; | ||
property?: string | undefined; | ||
property?: keyof Pkg | undefined; | ||
dep?: string | undefined; | ||
@@ -45,3 +45,3 @@ }) => PackageFile; | ||
cwd: string; | ||
}): Generator<any, File, any>; | ||
}): Operation<File>; | ||
export declare const testSerializePkgFile: ({ packageFile, }: { | ||
@@ -53,3 +53,3 @@ packageFile: PackageFile; | ||
changeFolder?: string; | ||
}): Generator<any, ConfigFile, any>; | ||
}): Operation<ConfigFile>; | ||
export declare const checkFileOrDirectory: ({ cwd, config, }: { | ||
@@ -66,7 +66,7 @@ cwd: string; | ||
paths: string[]; | ||
}): Generator<any, File[], any>; | ||
export declare const changeFilesRemove: ({ cwd, paths, }: { | ||
}): Operation<File[]>; | ||
export declare function changeFilesRemove({ cwd, paths, }: { | ||
cwd: string; | ||
paths: string[]; | ||
}) => Promise<void>; | ||
}): Operation<string>; | ||
export declare function readChangelog({ cwd, packagePath, create, }: { | ||
@@ -76,7 +76,7 @@ cwd: string; | ||
create?: boolean; | ||
}): Generator<any, File, any>; | ||
}): Operation<File>; | ||
export declare function writeChangelog({ changelog, cwd, }: { | ||
changelog: File; | ||
cwd: string; | ||
}): Generator<any, void | Error, any>; | ||
}): Operation<void | Error>; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -77,2 +77,3 @@ "use strict"; | ||
const parsePkg = (file) => { | ||
var _a, _b, _c, _d, _e, _f; | ||
if (!file.content) | ||
@@ -83,4 +84,15 @@ throw new Error(`${file.path} does not have any content`); | ||
const parsedTOML = toml_1.default.parse(file.content); | ||
// @ts-ignore | ||
const { version } = parsedTOML.package; | ||
let version; | ||
if (((_a = parsedTOML === null || parsedTOML === void 0 ? void 0 : parsedTOML.package) === null || _a === void 0 ? void 0 : _a.version) && | ||
typeof ((_b = parsedTOML === null || parsedTOML === void 0 ? void 0 : parsedTOML.package) === null || _b === void 0 ? void 0 : _b.version) === "string") { | ||
version = parsedTOML.package.version; | ||
} | ||
else if (((_d = (_c = parsedTOML === null || parsedTOML === void 0 ? void 0 : parsedTOML.workspace) === null || _c === void 0 ? void 0 : _c.package) === null || _d === void 0 ? void 0 : _d.version) && | ||
typeof ((_f = (_e = parsedTOML === null || parsedTOML === void 0 ? void 0 : parsedTOML.workspace) === null || _e === void 0 ? void 0 : _e.package) === null || _f === void 0 ? void 0 : _f.version) === "string") { | ||
version = parsedTOML.workspace.package.version; | ||
} | ||
if (!version) | ||
throw new Error(`package version is not set in ./${file.path}`); | ||
if (!semver_1.default.valid(version)) | ||
throw new Error(`package version is not valid in ./${file.path}`); | ||
return { | ||
@@ -93,3 +105,2 @@ version: version, | ||
deps: keyDeps(parsedTOML), | ||
// @ts-ignore | ||
pkg: parsedTOML, | ||
@@ -111,3 +122,2 @@ }; | ||
const parsedYAML = js_yaml_1.default.load(file.content); | ||
// type narrow: | ||
if (typeof parsedYAML === "string" || | ||
@@ -118,3 +128,2 @@ typeof parsedYAML === "number" || | ||
throw new Error(`file improperly structured`); | ||
//@ts-ignore version is not on object? | ||
if (parsedYAML && (!parsedYAML.name || !parsedYAML.version)) | ||
@@ -148,6 +157,12 @@ throw new Error(`missing version`); | ||
const keyDeps = (parsed) => { | ||
let deps = {}; | ||
["dependencies", "devDependencies", "dev-dependencies"].forEach((depType) => { | ||
if (parsed[depType] && typeof parsed[depType] === "object") { | ||
Object.entries(parsed[depType]).forEach(([dep, version]) => { | ||
const deps = {}; | ||
const depTypes = [ | ||
"dependencies", | ||
"devDependencies", | ||
"dev-dependencies", | ||
]; | ||
depTypes.forEach((depType) => { | ||
let pkgFileDeps = parsed[depType]; | ||
if (pkgFileDeps && typeof pkgFileDeps === "object") { | ||
Object.entries(pkgFileDeps).forEach(([dep, version]) => { | ||
if (!(deps === null || deps === void 0 ? void 0 : deps[dep])) | ||
@@ -255,76 +270,48 @@ deps[dep] = []; | ||
const getPackageFileVersion = ({ pkg, property = "version", dep, }) => { | ||
if (pkg.file && pkg.pkg) { | ||
if (property === "version") { | ||
if (pkg.file.extname === ".json") { | ||
return pkg.pkg.version; | ||
} | ||
else if (pkg.file.extname === ".toml") { | ||
// @ts-ignore | ||
return pkg.pkg.package.version; | ||
} | ||
else { | ||
// covers yaml and generic | ||
return pkg.pkg.version; | ||
} | ||
} | ||
else if (property === "dependencies") { | ||
// same for every supported package file | ||
if (!dep || !pkg.pkg.dependencies) | ||
return ""; | ||
if (typeof pkg.pkg.dependencies[dep] === "object") { | ||
//@ts-ignore | ||
if (!pkg.pkg.dependencies[dep].version) { | ||
throw new Error(`${pkg.name} has a dependency on ${dep}, and ${dep} does not have a version number. ` + | ||
`This cannot be published. ` + | ||
`Please pin it to a MAJOR.MINOR.PATCH reference.`); | ||
var _a, _b; | ||
if (!!(pkg === null || pkg === void 0 ? void 0 : pkg.file) && "pkg" in pkg && !!pkg.pkg) { | ||
switch (property) { | ||
case "version": | ||
if (pkg.file.extname === ".json" && pkg.pkg.version) { | ||
return pkg.pkg.version; | ||
} | ||
//@ts-ignore | ||
return pkg.pkg.dependencies[dep].version; | ||
} | ||
else { | ||
return pkg.pkg.dependencies[dep]; | ||
} | ||
} | ||
else if (property === "devDependencies") { | ||
// same for every supported package file | ||
if (!dep || !pkg.pkg.devDependencies) | ||
return ""; | ||
if (typeof pkg.pkg.devDependencies[dep] === "object") { | ||
//@ts-ignore | ||
if (!pkg.pkg.devDependencies[dep].version) { | ||
throw new Error(`${pkg.name} has a devDependency on ${dep}, and ${dep} does not have a version number. ` + | ||
`This cannot be published. ` + | ||
`Please pin it to a MAJOR.MINOR.PATCH reference.`); | ||
else if (pkg.file.extname === ".toml" && ((_b = (_a = pkg === null || pkg === void 0 ? void 0 : pkg.pkg) === null || _a === void 0 ? void 0 : _a.package) === null || _b === void 0 ? void 0 : _b.version)) { | ||
return pkg.pkg.package.version; | ||
} | ||
//@ts-ignore | ||
return pkg.pkg.devDependencies[dep].version; | ||
} | ||
else { | ||
return pkg.pkg.devDependencies[dep]; | ||
} | ||
} | ||
else if (property === "dev-dependencies") { | ||
// same for every supported package file | ||
//@ts-ignore | ||
if (!dep || !pkg.pkg[property]) | ||
return ""; | ||
//@ts-ignore | ||
if (typeof pkg.pkg[property][dep] === "object") { | ||
//@ts-ignore | ||
if (!pkg.pkg[property][dep].version) { | ||
throw new Error(`${pkg.name} has a devDependency on ${dep}, and ${dep} does not have a version number. ` + | ||
`This cannot be published. ` + | ||
`Please pin it to a MAJOR.MINOR.PATCH reference.`); | ||
else if (!pkg.pkg.version) { | ||
return ""; | ||
} | ||
//@ts-ignore | ||
return pkg.pkg[property][dep].version; | ||
} | ||
else { | ||
//@ts-ignore | ||
return pkg.pkg[property][dep]; | ||
} | ||
else { | ||
// covers yaml and generic | ||
return pkg.pkg.version; | ||
} | ||
case "dependencies": | ||
case "devDependencies": | ||
case "dev-dependencies": | ||
const currentPkgDeps = pkg.pkg[property]; | ||
if (currentPkgDeps === undefined) | ||
return ""; | ||
if (typeof pkg.pkg[property] !== "object") | ||
return ""; | ||
if (!dep) | ||
return ""; | ||
if (!("dependencies" in pkg.pkg)) | ||
return ""; | ||
if (pkg.pkg[property] && typeof pkg.pkg[property] === "object") { | ||
if (property in pkg.pkg) { | ||
const depDefinition = currentPkgDeps[dep]; | ||
switch (typeof depDefinition) { | ||
case "string": | ||
return depDefinition; | ||
case "object": | ||
if (!depDefinition.version) { | ||
throw new Error(`${pkg.name} has a dependency on ${dep}, and ${dep} does not have a version number. ` + | ||
`This cannot be published. ` + | ||
`Please pin it to a MAJOR.MINOR.PATCH reference.`); | ||
} | ||
return depDefinition.version; | ||
} | ||
} | ||
} | ||
} | ||
else { | ||
return ""; | ||
} | ||
} | ||
@@ -335,3 +322,5 @@ return ""; | ||
const setPackageFileVersion = ({ pkg, version, property = "version", dep, }) => { | ||
var _a, _b, _c; | ||
if (pkg.file && pkg.pkg) { | ||
const currentPkg = pkg.pkg; | ||
if (property === "version") { | ||
@@ -341,6 +330,9 @@ if (pkg.file.extname === ".json") { | ||
} | ||
else if (pkg.file.extname === ".toml") { | ||
// @ts-ignore | ||
else if (pkg.file.extname === ".toml" && ((_a = pkg.pkg.package) === null || _a === void 0 ? void 0 : _a.version)) { | ||
pkg.pkg.package.version = version; | ||
} | ||
else if (pkg.file.extname === ".toml" && | ||
((_c = (_b = pkg.pkg.workspace) === null || _b === void 0 ? void 0 : _b.package) === null || _c === void 0 ? void 0 : _c.version)) { | ||
pkg.pkg.workspace.package.version = version; | ||
} | ||
else { | ||
@@ -354,41 +346,19 @@ // covers yaml and generic | ||
property === "dev-dependencies") { | ||
if (property === "dependencies") { | ||
// same for every supported package file | ||
if (!dep || !pkg.pkg.dependencies) | ||
return pkg; | ||
if (typeof pkg.pkg.dependencies[dep] === "object") { | ||
// @ts-ignore TODO deal with nest toml | ||
pkg.pkg.dependencies[dep].version = version; | ||
} | ||
else { | ||
pkg.pkg.dependencies[dep] = version; | ||
} | ||
const currentPkg = pkg.pkg; | ||
const currentProperty = currentPkg[property]; | ||
if (currentProperty === undefined) | ||
// throw as this definitely shouldn't happen | ||
throw new Error(`Expected ${property} not found in package:\n${JSON.stringify(pkg, null, 2)}`); | ||
if (!dep) | ||
return pkg; | ||
const currentDepVersion = currentProperty[dep]; | ||
if (typeof currentDepVersion === "string") { | ||
//@ts-expect-error TS struggles to type narrow, but we are confident it should be defined | ||
pkg.pkg[property][dep] = version; | ||
} | ||
else if (property === "devDependencies") { | ||
// same for every supported package file | ||
if (!dep || !pkg.pkg.devDependencies) | ||
return pkg; | ||
if (typeof pkg.pkg.devDependencies[dep] === "object") { | ||
// @ts-ignore TODO deal with nest toml | ||
pkg.pkg.devDependencies[dep].version = version; | ||
} | ||
else { | ||
pkg.pkg.devDependencies[dep] = version; | ||
} | ||
} | ||
else if (property === "dev-dependencies") { | ||
// same for every supported package file | ||
//@ts-ignore | ||
if (!dep || !pkg.pkg[property]) | ||
return pkg; | ||
//@ts-ignore | ||
if (typeof pkg.pkg[property][dep] === "object") { | ||
//@ts-ignore | ||
// @ts-ignore TODO deal with nest toml | ||
else if (typeof currentDepVersion === "object") { | ||
if ("version" in currentDepVersion) { | ||
//@ts-expect-error TS struggles to type narrow, but we are confident it should be defined | ||
pkg.pkg[property][dep].version = version; | ||
} | ||
else { | ||
//@ts-ignore | ||
pkg.pkg[property][dep] = version; | ||
} | ||
} | ||
@@ -473,11 +443,9 @@ } | ||
exports.loadChangeFiles = loadChangeFiles; | ||
// redo this into a generator | ||
const changeFilesRemove = ({ cwd, paths, }) => { | ||
return Promise.all(paths.map((changeFilePath) => __awaiter(void 0, void 0, void 0, function* () { | ||
function* changeFilesRemove({ cwd, paths, }) { | ||
return yield (0, effection_1.all)(paths.map(function* (changeFilePath) { | ||
yield fs.unlink(path_1.default.posix.join(cwd, changeFilePath)); | ||
console.info(`${changeFilePath} was deleted`); | ||
return changeFilePath; | ||
}))).then((deletedPaths) => { | ||
deletedPaths.forEach((changeFilePath) => console.info(`${changeFilePath} was deleted`)); | ||
}); | ||
}; | ||
})); | ||
} | ||
exports.changeFilesRemove = changeFilesRemove; | ||
@@ -484,0 +452,0 @@ function* readChangelog({ cwd, packagePath = "", create = true, }) { |
{ | ||
"name": "@covector/files", | ||
"version": "0.6.0", | ||
"version": "0.6.1", | ||
"license": "Apache-2.0", | ||
@@ -23,3 +23,3 @@ "homepage": "https://github.com/jbolda/covector#readme", | ||
"js-yaml": "^4.0.0", | ||
"semver": "^7.3.7" | ||
"semver": "^7.3.8" | ||
}, | ||
@@ -29,7 +29,7 @@ "devDependencies": { | ||
"@types/js-yaml": "^4.0.0", | ||
"@types/node": "^14.18.13", | ||
"@types/semver": "^7.3.4", | ||
"@types/node": "^16.18.12", | ||
"@types/semver": "^7.3.13", | ||
"fixturez": "^1.1.0", | ||
"tslib": "^2.4.0", | ||
"typescript": "^4.6.3" | ||
"tslib": "^2.5.0", | ||
"typescript": "^4.9.5" | ||
}, | ||
@@ -36,0 +36,0 @@ "volta": { |
283
src/index.ts
@@ -19,8 +19,7 @@ import { default as fsDefault, PathLike, statSync } from "fs"; | ||
DepsKeyed, | ||
DepTypes, | ||
Pkg, | ||
} from "@covector/types"; | ||
export function* loadFile( | ||
file: PathLike, | ||
cwd: string | ||
): Generator<any, File | void, any> { | ||
export function* loadFile(file: PathLike, cwd: string): Operation<File | void> { | ||
if (typeof file === "string") { | ||
@@ -43,3 +42,3 @@ const content = yield fs.readFile(path.join(cwd, file), { | ||
export function* saveFile(file: File, cwd: string): Generator<any, File, any> { | ||
export function* saveFile(file: File, cwd: string): Operation<File> { | ||
if (typeof file.path !== "string") | ||
@@ -57,5 +56,20 @@ throw new Error(`Unable to handle saving of ${file}`); | ||
case ".toml": | ||
const parsedTOML = TOML.parse(file.content); | ||
// @ts-ignore | ||
const { version } = parsedTOML.package; | ||
const parsedTOML = TOML.parse(file.content) as unknown as Pkg; | ||
let version; | ||
if ( | ||
parsedTOML?.package?.version && | ||
typeof parsedTOML?.package?.version === "string" | ||
) { | ||
version = parsedTOML.package.version; | ||
} else if ( | ||
parsedTOML?.workspace?.package?.version && | ||
typeof parsedTOML?.workspace?.package?.version === "string" | ||
) { | ||
version = parsedTOML.workspace.package.version; | ||
} | ||
if (!version) | ||
throw new Error(`package version is not set in ./${file.path}`); | ||
if (!semver.valid(version)) | ||
throw new Error(`package version is not valid in ./${file.path}`); | ||
return { | ||
@@ -68,3 +82,2 @@ version: version, | ||
deps: keyDeps(parsedTOML), | ||
// @ts-ignore | ||
pkg: parsedTOML, | ||
@@ -85,4 +98,3 @@ }; | ||
case ".yaml": | ||
const parsedYAML = yaml.load(file.content); | ||
// type narrow: | ||
const parsedYAML = yaml.load(file.content) as Pkg; | ||
if ( | ||
@@ -95,3 +107,2 @@ typeof parsedYAML === "string" || | ||
throw new Error(`file improperly structured`); | ||
//@ts-ignore version is not on object? | ||
if (parsedYAML && (!parsedYAML.name || !parsedYAML.version)) | ||
@@ -125,27 +136,29 @@ throw new Error(`missing version`); | ||
const keyDeps = (parsed: any): DepsKeyed => { | ||
let deps: DepsKeyed = {}; | ||
const keyDeps = (parsed: Pkg): DepsKeyed => { | ||
const deps: DepsKeyed = {}; | ||
const depTypes: DepTypes[] = [ | ||
"dependencies", | ||
"devDependencies", | ||
"dev-dependencies", | ||
]; | ||
["dependencies", "devDependencies", "dev-dependencies"].forEach( | ||
(depType: any) => { | ||
if (parsed[depType] && typeof parsed[depType] === "object") { | ||
Object.entries(parsed[depType]).forEach( | ||
([dep, version]: [string, any]) => { | ||
if (!deps?.[dep]) deps[dep] = []; | ||
if (typeof version === "string") { | ||
deps[dep].push({ | ||
type: depType, | ||
version, | ||
}); | ||
} else if (typeof version === "object" && version.version) { | ||
deps[dep].push({ | ||
type: depType, | ||
version: version.version, | ||
}); | ||
} | ||
} | ||
); | ||
} | ||
depTypes.forEach((depType: DepTypes) => { | ||
let pkgFileDeps = parsed[depType]; | ||
if (pkgFileDeps && typeof pkgFileDeps === "object") { | ||
Object.entries(pkgFileDeps).forEach(([dep, version]) => { | ||
if (!deps?.[dep]) deps[dep] = []; | ||
if (typeof version === "string") { | ||
deps[dep].push({ | ||
type: depType, | ||
version, | ||
}); | ||
} else if (typeof version === "object" && version.version) { | ||
deps[dep].push({ | ||
type: depType, | ||
version: version.version, | ||
}); | ||
} | ||
}); | ||
} | ||
); | ||
}); | ||
return deps; | ||
@@ -259,3 +272,3 @@ }; | ||
cwd: string; | ||
}): Generator<any, File, any> { | ||
}): Operation<File> { | ||
if (!packageFile.file) | ||
@@ -278,3 +291,3 @@ throw new Error(`no vfile present for ${packageFile.name}`); | ||
changeFolder?: string; | ||
}): Generator<any, PreFile | null, any> { | ||
}): Operation<PreFile | null> { | ||
try { | ||
@@ -298,72 +311,46 @@ const inputFile = yield loadFile(path.join(changeFolder, "pre.json"), cwd); | ||
pkg: PackageFile; | ||
property?: string; | ||
property?: keyof Pkg; | ||
dep?: string; | ||
}): string => { | ||
if (pkg.file && pkg.pkg) { | ||
if (property === "version") { | ||
if (pkg.file.extname === ".json") { | ||
return pkg.pkg.version; | ||
} else if (pkg.file.extname === ".toml") { | ||
// @ts-ignore | ||
return pkg.pkg.package.version; | ||
} else { | ||
// covers yaml and generic | ||
return pkg.pkg.version; | ||
} | ||
} else if (property === "dependencies") { | ||
// same for every supported package file | ||
if (!dep || !pkg.pkg.dependencies) return ""; | ||
if (typeof pkg.pkg.dependencies[dep] === "object") { | ||
//@ts-ignore | ||
if (!pkg.pkg.dependencies[dep].version) { | ||
throw new Error( | ||
`${pkg.name} has a dependency on ${dep}, and ${dep} does not have a version number. ` + | ||
`This cannot be published. ` + | ||
`Please pin it to a MAJOR.MINOR.PATCH reference.` | ||
); | ||
if (!!pkg?.file && "pkg" in pkg && !!pkg.pkg) { | ||
switch (property) { | ||
case "version": | ||
if (pkg.file.extname === ".json" && pkg.pkg.version) { | ||
return pkg.pkg.version; | ||
} else if (pkg.file.extname === ".toml" && pkg?.pkg?.package?.version) { | ||
return pkg.pkg.package.version; | ||
} else if (!pkg.pkg.version) { | ||
return ""; | ||
} else { | ||
// covers yaml and generic | ||
return pkg.pkg.version; | ||
} | ||
//@ts-ignore | ||
return pkg.pkg.dependencies[dep].version; | ||
} else { | ||
return pkg.pkg.dependencies[dep]; | ||
} | ||
} else if (property === "devDependencies") { | ||
// same for every supported package file | ||
if (!dep || !pkg.pkg.devDependencies) return ""; | ||
if (typeof pkg.pkg.devDependencies[dep] === "object") { | ||
//@ts-ignore | ||
if (!pkg.pkg.devDependencies[dep].version) { | ||
throw new Error( | ||
`${pkg.name} has a devDependency on ${dep}, and ${dep} does not have a version number. ` + | ||
`This cannot be published. ` + | ||
`Please pin it to a MAJOR.MINOR.PATCH reference.` | ||
); | ||
case "dependencies": | ||
case "devDependencies": | ||
case "dev-dependencies": | ||
const currentPkgDeps = pkg.pkg[property]; | ||
if (currentPkgDeps === undefined) return ""; | ||
if (typeof pkg.pkg[property] !== "object") return ""; | ||
if (!dep) return ""; | ||
if (!("dependencies" in pkg.pkg)) return ""; | ||
if (pkg.pkg[property] && typeof pkg.pkg[property] === "object") { | ||
if (property in pkg.pkg) { | ||
const depDefinition = currentPkgDeps[dep]; | ||
switch (typeof depDefinition) { | ||
case "string": | ||
return depDefinition; | ||
case "object": | ||
if (!depDefinition.version) { | ||
throw new Error( | ||
`${pkg.name} has a dependency on ${dep}, and ${dep} does not have a version number. ` + | ||
`This cannot be published. ` + | ||
`Please pin it to a MAJOR.MINOR.PATCH reference.` | ||
); | ||
} | ||
return depDefinition.version; | ||
} | ||
} | ||
} | ||
//@ts-ignore | ||
return pkg.pkg.devDependencies[dep].version; | ||
} else { | ||
return pkg.pkg.devDependencies[dep]; | ||
} | ||
} else if (property === "dev-dependencies") { | ||
// same for every supported package file | ||
//@ts-ignore | ||
if (!dep || !pkg.pkg[property]) return ""; | ||
//@ts-ignore | ||
if (typeof pkg.pkg[property][dep] === "object") { | ||
//@ts-ignore | ||
if (!pkg.pkg[property][dep].version) { | ||
throw new Error( | ||
`${pkg.name} has a devDependency on ${dep}, and ${dep} does not have a version number. ` + | ||
`This cannot be published. ` + | ||
`Please pin it to a MAJOR.MINOR.PATCH reference.` | ||
); | ||
} | ||
//@ts-ignore | ||
return pkg.pkg[property][dep].version; | ||
} else { | ||
//@ts-ignore | ||
return pkg.pkg[property][dep]; | ||
} | ||
} else { | ||
return ""; | ||
} | ||
@@ -382,12 +369,17 @@ } | ||
version: string; | ||
property?: string; | ||
property?: keyof Pkg; | ||
dep?: string; | ||
}): PackageFile => { | ||
if (pkg.file && pkg.pkg) { | ||
const currentPkg = pkg.pkg; | ||
if (property === "version") { | ||
if (pkg.file.extname === ".json") { | ||
pkg.pkg.version = version; | ||
} else if (pkg.file.extname === ".toml") { | ||
// @ts-ignore | ||
} else if (pkg.file.extname === ".toml" && pkg.pkg.package?.version) { | ||
pkg.pkg.package.version = version; | ||
} else if ( | ||
pkg.file.extname === ".toml" && | ||
pkg.pkg.workspace?.package?.version | ||
) { | ||
pkg.pkg.workspace.package.version = version; | ||
} else { | ||
@@ -402,32 +394,23 @@ // covers yaml and generic | ||
) { | ||
if (property === "dependencies") { | ||
// same for every supported package file | ||
if (!dep || !pkg.pkg.dependencies) return pkg; | ||
if (typeof pkg.pkg.dependencies[dep] === "object") { | ||
// @ts-ignore TODO deal with nest toml | ||
pkg.pkg.dependencies[dep].version = version; | ||
} else { | ||
pkg.pkg.dependencies[dep] = version; | ||
} | ||
} else if (property === "devDependencies") { | ||
// same for every supported package file | ||
if (!dep || !pkg.pkg.devDependencies) return pkg; | ||
if (typeof pkg.pkg.devDependencies[dep] === "object") { | ||
// @ts-ignore TODO deal with nest toml | ||
pkg.pkg.devDependencies[dep].version = version; | ||
} else { | ||
pkg.pkg.devDependencies[dep] = version; | ||
} | ||
} else if (property === "dev-dependencies") { | ||
// same for every supported package file | ||
//@ts-ignore | ||
if (!dep || !pkg.pkg[property]) return pkg; | ||
//@ts-ignore | ||
if (typeof pkg.pkg[property][dep] === "object") { | ||
//@ts-ignore | ||
// @ts-ignore TODO deal with nest toml | ||
const currentPkg = pkg.pkg; | ||
const currentProperty = currentPkg[property]; | ||
if (currentProperty === undefined) | ||
// throw as this definitely shouldn't happen | ||
throw new Error( | ||
`Expected ${property} not found in package:\n${JSON.stringify( | ||
pkg, | ||
null, | ||
2 | ||
)}` | ||
); | ||
if (!dep) return pkg; | ||
const currentDepVersion = currentProperty[dep]; | ||
if (typeof currentDepVersion === "string") { | ||
//@ts-expect-error TS struggles to type narrow, but we are confident it should be defined | ||
pkg.pkg[property][dep] = version; | ||
} else if (typeof currentDepVersion === "object") { | ||
if ("version" in currentDepVersion) { | ||
//@ts-expect-error TS struggles to type narrow, but we are confident it should be defined | ||
pkg.pkg[property][dep].version = version; | ||
} else { | ||
//@ts-ignore | ||
pkg.pkg[property][dep] = version; | ||
} | ||
@@ -446,3 +429,3 @@ } | ||
cwd: string; | ||
}): Generator<any, File, any> { | ||
}): Operation<File> { | ||
if (!preFile.file) | ||
@@ -488,3 +471,3 @@ throw new Error(`We could not find the pre.json to update.`); | ||
changeFolder?: string; | ||
}): Generator<any, ConfigFile, any> { | ||
}): Operation<ConfigFile> { | ||
const inputFile = yield loadFile(path.join(changeFolder, "config.json"), cwd); | ||
@@ -555,3 +538,3 @@ const parsed = JSON.parse(inputFile.content); | ||
paths: string[]; | ||
}): Generator<any, File[], any> { | ||
}): Operation<File[]> { | ||
const files = paths.map((file) => loadFile(file, cwd)); | ||
@@ -561,4 +544,3 @@ return yield all(files); | ||
// redo this into a generator | ||
export const changeFilesRemove = ({ | ||
export function* changeFilesRemove({ | ||
cwd, | ||
@@ -569,14 +551,11 @@ paths, | ||
paths: string[]; | ||
}) => { | ||
return Promise.all( | ||
paths.map(async (changeFilePath) => { | ||
await fs.unlink(path.posix.join(cwd, changeFilePath)); | ||
}): Operation<string> { | ||
return yield all( | ||
paths.map(function* (changeFilePath) { | ||
yield fs.unlink(path.posix.join(cwd, changeFilePath)); | ||
console.info(`${changeFilePath} was deleted`); | ||
return changeFilePath; | ||
}) | ||
).then((deletedPaths) => { | ||
deletedPaths.forEach((changeFilePath) => | ||
console.info(`${changeFilePath} was deleted`) | ||
); | ||
}); | ||
}; | ||
); | ||
} | ||
@@ -591,3 +570,3 @@ export function* readChangelog({ | ||
create?: boolean; | ||
}): Generator<any, File, any> { | ||
}): Operation<File> { | ||
let file = null; | ||
@@ -614,4 +593,4 @@ try { | ||
cwd: string; | ||
}): Generator<any, void | Error, any> { | ||
}): Operation<void | Error> { | ||
return yield saveFile(changelog, cwd); | ||
} |
@@ -8,2 +8,3 @@ import { | ||
loadChangeFiles, | ||
changeFilesRemove, | ||
} from "../src"; | ||
@@ -86,2 +87,18 @@ import { it } from "@effection/jest"; | ||
}); | ||
it("deletes files", function* () { | ||
const restoreConsole = mockConsole(["info"]); | ||
const changesFolder = f.copy("integration.general-file"); | ||
const changeFilesToDelete = [ | ||
"./.changes/first-change.md", | ||
"./.changes/second-change.md", | ||
]; | ||
const filesRemoved = yield changeFilesRemove({ | ||
cwd: changesFolder, | ||
paths: changeFilesToDelete, | ||
}); | ||
expect(filesRemoved).toEqual(changeFilesToDelete); | ||
}); | ||
}); |
Sorry, the diff of this file is not supported yet
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
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
74901
1380
Updatedsemver@^7.3.8