copy-config
Advanced tools
Comparing version 0.2.1 to 0.3.0-0
@@ -35,5 +35,11 @@ "use strict"; | ||
pattern: '{.,.vscode,.devcontainer,config}/*.json', | ||
ignore: ['package-lock.json'], | ||
merge: mergeStrategies.jsonRemoteDefaults, | ||
}, | ||
{ | ||
pattern: '{.,.vscode,.devcontainer,config}/*.{yml,yaml}', | ||
ignore: ['**/pnpm-lock.{yaml,yml}'], | ||
merge: mergeStrategies.yamlRemoteDefaults, | ||
}, | ||
{ | ||
pattern: '*.codeworkspace', | ||
@@ -55,3 +61,7 @@ merge: mergeStrategies.jsonRemoteDefaults, | ||
{ | ||
pattern: '.github/**/*.{yml,yaml,md}', | ||
pattern: '.github/**/*.{yml,yaml}', | ||
merge: mergeStrategies.yamlRemoteDefaults, | ||
}, | ||
{ | ||
pattern: '.github/**/*.md', | ||
merge: mergeStrategies.preferLocal, | ||
@@ -67,2 +77,3 @@ }, | ||
[mergeStrategies.jsonRemoteDefaults, mergeStrategies.jsonAggressiveMerge], | ||
[mergeStrategies.yamlRemoteDefaults, mergeStrategies.yamlAggressiveMerge], | ||
[mergeStrategies.concat, mergeStrategies.replace], | ||
@@ -69,0 +80,0 @@ [mergeStrategies.preferLocal, mergeStrategies.replace], |
@@ -26,2 +26,16 @@ import type { PackageJson } from 'type-fest'; | ||
}; | ||
export declare const yamlRemoteDefaults: MergeStrategy & { | ||
jsonMergeStrategy: (params: { | ||
remoteJson: any; | ||
localJson: any; | ||
meta: Meta; | ||
}) => any; | ||
}; | ||
export declare const yamlAggressiveMerge: MergeStrategy & { | ||
jsonMergeStrategy: (params: { | ||
remoteJson: any; | ||
localJson: any; | ||
meta: Meta; | ||
}) => any; | ||
}; | ||
export declare const replace: MergeStrategy; | ||
@@ -28,0 +42,0 @@ export declare const concat: MergeStrategy; |
@@ -26,4 +26,5 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.aggressivePackageJson = exports.fairlySensiblePackageJson = exports.preferLocal = exports.concat = exports.replace = exports.jsonAggressiveMerge = exports.jsonRemoteDefaults = void 0; | ||
exports.aggressivePackageJson = exports.fairlySensiblePackageJson = exports.preferLocal = exports.concat = exports.replace = exports.yamlAggressiveMerge = exports.yamlRemoteDefaults = exports.jsonAggressiveMerge = exports.jsonRemoteDefaults = void 0; | ||
const cp = __importStar(require("child_process")); | ||
const jsYaml = __importStar(require("js-yaml")); | ||
const lodash = __importStar(require("lodash")); | ||
@@ -33,17 +34,27 @@ const os = __importStar(require("os")); | ||
const variables_1 = require("./variables"); | ||
const jsonMergeStrategy = (fn) => { | ||
const YAML = { | ||
parse: str => jsYaml.load(str), | ||
stringify: obj => jsYaml.dump(obj), | ||
}; | ||
const formatterMergeStrategy = (formatter, fn) => { | ||
const mergeStrategy = ({ remoteContent, localContent, meta }) => { | ||
const remoteJson = JSON.parse(remoteContent); | ||
const localJson = JSON.parse(localContent || '{}'); | ||
const remoteJson = formatter.parse(remoteContent); | ||
const localJson = formatter.parse(localContent || '{}'); | ||
const updated = fn({ remoteJson, localJson, meta }); | ||
return JSON.stringify(updated, null, 2) + os.EOL; | ||
return formatter.stringify(updated, null, 2) + os.EOL; | ||
}; | ||
return Object.assign(mergeStrategy, { jsonMergeStrategy: fn }); | ||
}; | ||
exports.jsonRemoteDefaults = jsonMergeStrategy(({ remoteJson, localJson }) => { | ||
exports.jsonRemoteDefaults = formatterMergeStrategy(JSON, ({ remoteJson, localJson }) => { | ||
return lodash.defaultsDeep(localJson, remoteJson); | ||
}); | ||
exports.jsonAggressiveMerge = jsonMergeStrategy(({ remoteJson, localJson }) => { | ||
exports.jsonAggressiveMerge = formatterMergeStrategy(JSON, ({ remoteJson, localJson }) => { | ||
return lodash.merge({}, localJson, remoteJson); | ||
}); | ||
exports.yamlRemoteDefaults = formatterMergeStrategy(YAML, ({ remoteJson, localJson }) => { | ||
return lodash.defaultsDeep(localJson, remoteJson); | ||
}); | ||
exports.yamlAggressiveMerge = formatterMergeStrategy(JSON, ({ remoteJson, localJson }) => { | ||
return lodash.merge({}, localJson, remoteJson); | ||
}); | ||
const replace = ({ remoteContent }) => remoteContent; | ||
@@ -72,3 +83,3 @@ exports.replace = replace; | ||
*/ | ||
exports.fairlySensiblePackageJson = jsonMergeStrategy(({ remoteJson, localJson, meta }) => { | ||
exports.fairlySensiblePackageJson = formatterMergeStrategy(JSON, ({ remoteJson, localJson, meta }) => { | ||
const remoteDevDeps = remoteJson.devDependencies || {}; | ||
@@ -89,3 +100,3 @@ // this is an (unavoidably?) confusing name. This is the name of the *git* remote for the local repo, nothing to do with the remote repo | ||
}); | ||
exports.aggressivePackageJson = jsonMergeStrategy(({ remoteJson, localJson, meta }) => { | ||
exports.aggressivePackageJson = formatterMergeStrategy(JSON, ({ remoteJson, localJson, meta }) => { | ||
const { name, version, remotePkg } = exports.fairlySensiblePackageJson.jsonMergeStrategy({ | ||
@@ -92,0 +103,0 @@ remoteJson, |
@@ -24,2 +24,3 @@ /// <reference types="node" /> | ||
'--aggressive'?: boolean | undefined; | ||
'--diff-check'?: string | undefined; | ||
} | undefined; | ||
@@ -26,0 +27,0 @@ logger?: Logger | undefined; |
@@ -62,2 +62,3 @@ "use strict"; | ||
'--aggressive': Boolean, | ||
'--diff-check': String, | ||
}; | ||
@@ -76,2 +77,3 @@ const parseArgv = (argv = process.argv.slice(2)) => { | ||
const runWithArgs = async ({ fs = realFs, cwd = process.cwd(), args = parseArgv(process.argv.slice(2)), logger = console, }) => { | ||
var _a; | ||
if (args['--help']) { | ||
@@ -87,3 +89,6 @@ // crappy markdown parser! | ||
.split('\n#')[0] | ||
.trim(); | ||
.trim() | ||
.split('\n') | ||
.map(line => ' ' + line) | ||
.join('\n'); | ||
return [{ option, doc }]; | ||
@@ -96,2 +101,12 @@ }); | ||
const outputPath = path.resolve(cwd, args['--output'] || '.'); | ||
const diffCheckCommand = (_a = args['--diff-check']) !== null && _a !== void 0 ? _a : 'git diff --exit-code'; | ||
try { | ||
if (diffCheckCommand) { | ||
cp.execSync(diffCheckCommand, { stdio: 'inherit' }); | ||
} | ||
} | ||
catch (error) { | ||
const msg = `Diff check command "${diffCheckCommand}" failed. To resolve this you can stage your working changes before rerunning, or override the command, e.g. \`--diff-check ""\``; | ||
throw Object.assign(new Error(msg), { cause: error }); | ||
} | ||
const getTempRepoDir = () => { | ||
@@ -126,3 +141,3 @@ let repo = args['--repo']; | ||
reversed.forEach(rule => { | ||
const files = globSync(rule.pattern, { cwd: copyFrom }); | ||
const files = globSync(rule.pattern, { cwd: copyFrom, ignore: rule.ignore }); | ||
const filtered = args['--filter'] ? (0, lodash_1.intersection)(files, globSync(args['--filter'], { cwd: copyFrom })) : files; | ||
@@ -129,0 +144,0 @@ filtered.forEach(relPath => { |
@@ -5,2 +5,3 @@ import type * as mergeStrategies from './merge'; | ||
pattern: string; | ||
ignore?: string | string[]; | ||
merge: mergeStrategies.MergeStrategy; | ||
@@ -7,0 +8,0 @@ } |
{ | ||
"name": "copy-config", | ||
"version": "0.2.1", | ||
"version": "0.3.0-0", | ||
"description": "Copies another repo's configuration", | ||
@@ -28,2 +28,3 @@ "main": "dist/index.js", | ||
"glob": "^10.0.0", | ||
"js-yaml": "^4.1.0", | ||
"lodash": "^4.17.21", | ||
@@ -35,2 +36,3 @@ "type-fest": "^3.5.0" | ||
"@types/jest": "29.5.1", | ||
"@types/js-yaml": "4.0.5", | ||
"@types/lodash": "4.14.195", | ||
@@ -41,5 +43,5 @@ "eslint": "8.41.0", | ||
"jest": "29.5.0", | ||
"np": "8.0.4", | ||
"ts-jest": "29.1.0", | ||
"typescript": "5.0.4", | ||
"np": "8.0.1" | ||
"typescript": "5.0.4" | ||
}, | ||
@@ -46,0 +48,0 @@ "files": [ |
@@ -88,2 +88,24 @@ # copy-config | ||
### `--diff-check` | ||
A command which will make sure there are no working-copy changes in the current repo. This will run before modifying your file system to avoid making changes that get mixed up with yours. This defaults to `git diff --exit-code`. | ||
You could set to something more fine-grained: | ||
```bash | ||
npx copy-config --repo someuser/somerepo --diff-check "git diff path/to/configs --exit-code" | ||
``` | ||
Or something else completely: | ||
```bash | ||
npx copy-config --repo someuser/somerepo --diff-check "npm run somescript" | ||
``` | ||
To disable checking completely you can set the command to empty string: | ||
```bash | ||
npx copy-config --repo someuser/somerepo --diff-check "" | ||
``` | ||
### `--help` | ||
@@ -90,0 +112,0 @@ |
45636
576
169
5
11
+ Addedjs-yaml@^4.1.0
+ Addedargparse@2.0.1(transitive)
+ Addedjs-yaml@4.1.0(transitive)