resume-cli 3.1.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,19 +1,15 @@
1
1
  # resume-cli
2
2
 
3
- [![matrix](https://img.shields.io/badge/matrix-join%20chat-%230dbd8b)](https://matrix.to/#/#json-resume:one.ems.host)
4
- [![Build status](https://img.shields.io/github/actions/workflow/status/jsonresume/resume-cli/test.yml?branch=master)](https://github.com/jsonresume/resume-cli/actions)
5
3
  [![npm package](https://badge.fury.io/js/resume-cli.svg)](https://www.npmjs.org/package/resume-cli)
6
4
 
7
5
  This is the command line tool for [JSON Resume](https://jsonresume.org), the open-source initiative to create a JSON-based standard for resumes.
8
6
 
9
- ## Project Status
10
-
11
- This repository is not actively maintained. It's recommended to use one of the third-party clients that support the JSON Resume standard instead:
12
-
13
- * [Resumed](https://github.com/rbardini/resumed)
7
+ > **Note:** `resume-cli` has been revived and now lives in the [jsonresume.org monorepo](https://github.com/jsonresume/jsonresume.org) as `packages/cli` (modernized for Node.js 18+). It keeps its npm identity as [`resume-cli`](https://www.npmjs.com/package/resume-cli) and is published from this workspace. The old standalone [jsonresume/resume-cli](https://github.com/jsonresume/resume-cli) repository is archived — please open issues and PRs against the monorepo.
14
8
 
15
9
  ## Getting Started
16
10
 
11
+ Requires Node.js 18 or newer.
12
+
17
13
  Install the command-line tool:
18
14
 
19
15
  ```
@@ -91,6 +87,17 @@ Supported resume data MIME types are:
91
87
  - `application/json`
92
88
  - `text/yaml`
93
89
 
90
+ ## Development
91
+
92
+ This package is part of the [jsonresume.org monorepo](https://github.com/jsonresume/jsonresume.org). From `packages/cli`:
93
+
94
+ ```
95
+ pnpm dev # run the CLI from source (babel-node lib/main.js)
96
+ pnpm build # compile lib/ to build/ with Babel
97
+ pnpm test # run the Jest test suite
98
+ pnpm lint # run ESLint
99
+ ```
100
+
94
101
  ## License
95
102
 
96
103
  Available under [the MIT license](http://mths.be/mit).
package/build/builder.js CHANGED
@@ -28,7 +28,7 @@ module.exports = function resumeBuilder(theme, dir, resumeFilename, cb) {
28
28
  if (err) {
29
29
  console.log(chalk.yellow('Could not find:'), resumeFilename);
30
30
  console.log(chalk.cyan('Using example resume.json from resume-schema instead...'));
31
- resumeJson = require('resume-schema').resumeJson;
31
+ resumeJson = require('@jsonresume/schema/sample.resume.json');
32
32
  } else {
33
33
  try {
34
34
  // todo: test resume schema
@@ -3,7 +3,7 @@
3
3
  var _renderHtml = _interopRequireDefault(require("./render-html"));
4
4
  var _util = require("util");
5
5
  var _fs = _interopRequireDefault(require("fs"));
6
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
7
  const writeFile = (0, _util.promisify)(_fs.default.writeFile);
8
8
  const path = require('path');
9
9
  const puppeteer = require('puppeteer');
@@ -11,7 +11,7 @@ var _quaff = _interopRequireDefault(require("quaff"));
11
11
  var _streamToString = _interopRequireDefault(require("stream-to-string"));
12
12
  var _yamlJs = _interopRequireDefault(require("yaml-js"));
13
13
  var _util = require("util");
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
15
  const {
16
16
  createReadStream
17
17
  } = _fs.default;
@@ -3,7 +3,7 @@
3
3
  var _waait = _interopRequireDefault(require("waait"));
4
4
  var _getResume = _interopRequireDefault(require("./get-resume"));
5
5
  var _mockStdin = require("mock-stdin");
6
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
7
  jest.mock('fs', () => {
8
8
  const build = require('./test-utils/mocked-volume-builder');
9
9
  const {
@@ -17,8 +17,8 @@ describe('get-resume', () => {
17
17
  expect(await (0, _getResume.default)({
18
18
  path: '/resume.yaml'
19
19
  })).toMatchInlineSnapshot(`
20
- Object {
21
- "basics": Object {
20
+ {
21
+ "basics": {
22
22
  "email": "thomas@example.com",
23
23
  "name": "thomas",
24
24
  },
@@ -29,25 +29,25 @@ describe('get-resume', () => {
29
29
  expect(await (0, _getResume.default)({
30
30
  path: '/resume.json'
31
31
  })).toMatchInlineSnapshot(`
32
- Object {
33
- "basics": Object {
34
- "email": "thomas@example.com",
35
- "name": "thomas",
36
- },
37
- }
38
- `);
32
+ {
33
+ "basics": {
34
+ "email": "thomas@example.com",
35
+ "name": "thomas",
36
+ },
37
+ }
38
+ `);
39
39
  });
40
40
  it('should consume an entire directory as if it were a json object', async () => {
41
41
  expect(await (0, _getResume.default)({
42
42
  path: '/quaff'
43
43
  })).toMatchInlineSnapshot(`
44
- Object {
45
- "basics": Object {
44
+ {
45
+ "basics": {
46
46
  "email": "thomas@example.com",
47
47
  "name": "thomas",
48
48
  },
49
- "work": Array [
50
- Object {
49
+ "work": [
50
+ {
51
51
  "company": "Pied Piper",
52
52
  "endDate": "2014-12-01",
53
53
  "position": "CEO/President",
@@ -71,8 +71,8 @@ describe('get-resume', () => {
71
71
  }));
72
72
  stdin.send(null);
73
73
  expect(await gotResume).toMatchInlineSnapshot(`
74
- Object {
75
- "basics": Object {
74
+ {
75
+ "basics": {
76
76
  "email": "thomas@example.com",
77
77
  "name": "thomas",
78
78
  },
@@ -12,7 +12,7 @@ var _default = async ({
12
12
  } = {}) => {
13
13
  let path = pathArg;
14
14
  if (!path) {
15
- path = require.resolve('resume-schema/schema.json');
15
+ path = require.resolve('@jsonresume/schema/schema.json');
16
16
  }
17
17
  return JSON.parse(await readFile(path, {
18
18
  encoding: 'utf-8'
package/build/init.js CHANGED
@@ -11,10 +11,10 @@ var _yesno = _interopRequireDefault(require("yesno"));
11
11
  var _objectPathImmutable = require("object-path-immutable");
12
12
  var _fileExists = _interopRequireDefault(require("file-exists"));
13
13
  var _read = _interopRequireDefault(require("read"));
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
15
  const writeFile = (0, _util.promisify)(_fs.default.writeFile);
16
16
  const read = (0, _util.promisify)(_read.default);
17
- const resume = require('resume-schema/sample.resume.json');
17
+ const resume = require('@jsonresume/schema/sample.resume.json');
18
18
  var _default = async ({
19
19
  resumePath
20
20
  }) => {
package/build/main.js CHANGED
@@ -6,7 +6,7 @@ var _init = _interopRequireDefault(require("./init"));
6
6
  var _getResume = _interopRequireDefault(require("./get-resume"));
7
7
  var _getSchema = _interopRequireDefault(require("./get-schema"));
8
8
  var _validate = _interopRequireDefault(require("./validate"));
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
10
  const pkg = require('../package.json');
11
11
  const exportResume = require('./export-resume');
12
12
  const serve = require('./serve');
@@ -22,7 +22,7 @@ const normalizeTheme = (value, defaultValue) => {
22
22
  return theme.match('jsonresume-theme-.*') ? theme : `jsonresume-theme-${theme}`;
23
23
  };
24
24
  (async () => {
25
- program.name('resume').usage('[command] [options]').version(pkg.version).option('-F, --force', 'Used by `publish` and `export` - bypasses schema testing.').option('-t, --theme <theme name>', 'Specify theme used by `export` and `serve` or specify a path starting with . (use . for current directory or ../some/other/dir)', normalizeTheme, 'jsonresume-theme-even').option('-f, --format <file type extension>', 'Used by `export`.').option('-r, --resume <resume filename>', "path to the resume in json format. Use '-' to read from stdin", 'resume.json').option('-p, --port <port>', 'Used by `serve` (default: 4000)', 4000).option('-s, --silent', 'Used by `serve` to tell it if open browser auto or not.', false).option('-d, --dir <path>', 'Used by `serve` to indicate a public directory path.', 'public').option('--schema <relativePath>', 'Used by `validate` to validate against a custom schema.');
25
+ program.name('resume').usage('[command] [options]').version(pkg.version).option('-F, --force', 'Used by `publish` and `export` - bypasses schema testing.').option('-t, --theme <theme name>', 'Specify theme used by `export` and `serve` or specify a path starting with . (use . for current directory or ../some/other/dir)', normalizeTheme, 'jsonresume-theme-elegant').option('-f, --format <file type extension>', 'Used by `export`.').option('-r, --resume <resume filename>', "path to the resume in json format. Use '-' to read from stdin", 'resume.json').option('-p, --port <port>', 'Used by `serve` (default: 4000)', 4000).option('-s, --silent', 'Used by `serve` to tell it if open browser auto or not.', false).option('-d, --dir <path>', 'Used by `serve` to indicate a public directory path.', 'public').option('--schema <relativePath>', 'Used by `validate` to validate against a custom schema.');
26
26
  program.command('init').description('Initialize a resume.json file').action(async () => {
27
27
  await (0, _init.default)({
28
28
  resumePath: program.resume
@@ -4,7 +4,7 @@ var _child_process = require("child_process");
4
4
  var _streamToString = _interopRequireDefault(require("stream-to-string"));
5
5
  var _util = require("util");
6
6
  var _package = _interopRequireDefault(require("../package.json"));
7
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
7
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
8
  const exec = (0, _util.promisify)(_child_process.exec);
9
9
  const run = async (argv, {
10
10
  waitForVolumeExport = true,
@@ -57,17 +57,17 @@ describe('cli configuration', () => {
57
57
  \`serve\` or specify a path starting with .
58
58
  (use . for current directory or
59
59
  ../some/other/dir) (default:
60
- \\"jsonresume-theme-even\\")
60
+ "jsonresume-theme-elegant")
61
61
  -f, --format <file type extension> Used by \`export\`.
62
62
  -r, --resume <resume filename> path to the resume in json format. Use
63
63
  '-' to read from stdin (default:
64
- \\"resume.json\\")
64
+ "resume.json")
65
65
  -p, --port <port> Used by \`serve\` (default: 4000) (default:
66
66
  4000)
67
67
  -s, --silent Used by \`serve\` to tell it if open
68
68
  browser auto or not. (default: false)
69
69
  -d, --dir <path> Used by \`serve\` to indicate a public
70
- directory path. (default: \\"public\\")
70
+ directory path. (default: "public")
71
71
  --schema <relativePath> Used by \`validate\` to validate against a
72
72
  custom schema.
73
73
  -h, --help display help for command
@@ -105,8 +105,12 @@ describe('cli configuration', () => {
105
105
  const {
106
106
  stdout,
107
107
  volume
108
- } = await run(['export', '/test-resumes/exported-resume-from-stdin.html', '--resume', '-' // this is the dash
109
- ], {
108
+ } = await run(['export', '/test-resumes/exported-resume-from-stdin.html', '--resume', '-',
109
+ // this is the dash
110
+ // The default theme (elegant) throws on resumes missing a
111
+ // `basics.location`; `even` renders minimal resumes, and this test
112
+ // only exercises the export plumbing, not a specific theme.
113
+ '--theme', 'even'], {
110
114
  stdin: JSON.stringify({
111
115
  basics: {
112
116
  name: 'thomas-from-stdin'
@@ -124,7 +128,10 @@ describe('cli configuration', () => {
124
128
  it('should export a resume from the path specified by --resume to the path specified immediately after the export command', async () => {
125
129
  const {
126
130
  stdout
127
- } = await run(['export', '/test-resumes/exported-resume.html', '--resume', '/test-resumes/resume.json']);
131
+ } = await run(['export', '/test-resumes/exported-resume.html', '--resume', '/test-resumes/resume.json',
132
+ // See note above: `even` renders minimal resumes; the default
133
+ // `elegant` theme requires a `basics.location`.
134
+ '--theme', 'even']);
128
135
  expect(stdout).toMatchInlineSnapshot(`
129
136
  "
130
137
  Done! Find your new .html resume at:
@@ -39,7 +39,7 @@ var _default = async ({
39
39
  throw new Error(`theme path ${themePath} could not be resolved from current working directory`);
40
40
  }
41
41
  const theme = require(path);
42
- if (typeof (theme === null || theme === void 0 ? void 0 : theme.render) !== 'function') {
42
+ if (typeof theme?.render !== 'function') {
43
43
  throw new Error('theme.render is not a function');
44
44
  }
45
45
  return theme.render(resume);
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  var _renderHtml = _interopRequireDefault(require("./render-html"));
4
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
4
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
5
5
  describe('renderHTML', () => {
6
6
  beforeAll(() => {
7
7
  const originalRequireResolve = require.resolve;
package/build/serve.js CHANGED
@@ -6,6 +6,12 @@ const readline = require('readline');
6
6
  const bs = require('browser-sync').create();
7
7
  const builder = require('./builder');
8
8
  const reBuildResume = (theme, dir, resumeFilename, cb) => {
9
+ console.log({
10
+ theme,
11
+ dir,
12
+ resumeFilename,
13
+ cb
14
+ });
9
15
  builder(theme, dir, resumeFilename, (err, html) => {
10
16
  if (err) {
11
17
  readline.cursorTo(process.stdout, 0);
@@ -4,9 +4,8 @@ var _mockedVolumeBuilder = _interopRequireDefault(require("./mocked-volume-build
4
4
  var _fsMonkey = require("fs-monkey");
5
5
  var _unionfs = require("unionfs");
6
6
  var fs = _interopRequireWildcard(require("fs"));
7
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
8
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
7
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
9
  const mockVolume = (0, _mockedVolumeBuilder.default)({
11
10
  mount: '/test-resumes'
12
11
  });
@@ -14,8 +14,9 @@ module.exports = ({
14
14
  }),
15
15
  'only-number.json': '123',
16
16
  'invalid-resume.json': JSON.stringify({
17
- notAValidKey: {
18
- foo: 'bar'
17
+ basics: {
18
+ // name must be a string per the JSON Resume schema
19
+ name: 123
19
20
  }
20
21
  }),
21
22
  'resume.json': JSON.stringify({
package/build/validate.js CHANGED
@@ -4,25 +4,35 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _util = require("util");
8
- var _zSchema = _interopRequireDefault(require("z-schema"));
9
- var _zSchemaErrors = _interopRequireDefault(require("z-schema-errors"));
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
- const reporter = _zSchemaErrors.default.init();
12
- const validator = new _zSchema.default();
13
- const validate = (0, _util.promisify)((...args) => validator.validate(...args)); // maintains context
7
+ var _ajv = _interopRequireDefault(require("ajv"));
8
+ var _ajvFormats = _interopRequireDefault(require("ajv-formats"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ // Format a single Ajv error into a readable `field message` line.
11
+ const formatError = error => {
12
+ // instancePath is like "/basics/name"; the root is an empty string.
13
+ const field = error.instancePath ? `data${error.instancePath}` : 'data';
14
+ if (error.keyword === 'additionalProperties') {
15
+ return `${field} ${error.message} (${error.params.additionalProperty})`;
16
+ }
17
+ return `${field} ${error.message}`;
18
+ };
14
19
  var _default = async ({
15
20
  resume,
16
21
  schema
17
22
  }) => {
18
- try {
19
- return await validate(resume, schema);
20
- } catch (errors) {
21
- throw new Error(reporter.extractMessage({
22
- report: {
23
- errors
24
- }
25
- }));
23
+ // strict:false is required: the JSON Resume schema is an externally authored
24
+ // draft-07 document that uses keywords (e.g. additionalItems without an
25
+ // array `items`) that Ajv's strict mode would otherwise reject.
26
+ const ajv = new _ajv.default({
27
+ allErrors: true,
28
+ strict: false
29
+ });
30
+ (0, _ajvFormats.default)(ajv);
31
+ const validateFn = ajv.compile(schema);
32
+ if (validateFn(resume)) {
33
+ return true;
26
34
  }
35
+ const details = (validateFn.errors || []).map(formatError).join('\n ');
36
+ throw new Error(`Invalid resume:\n ${details}`);
27
37
  };
28
38
  exports.default = _default;
@@ -2,7 +2,7 @@
2
2
 
3
3
  var _validate = _interopRequireDefault(require("./validate"));
4
4
  var _getSchema = _interopRequireDefault(require("./get-schema"));
5
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
5
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
6
6
  describe('validate', () => {
7
7
  let defaultSchema;
8
8
  beforeEach(async () => {
@@ -16,13 +16,18 @@ describe('validate', () => {
16
16
  schema: defaultSchema
17
17
  });
18
18
  });
19
- it('should throw an error for an invalid resume object', async () => {
19
+ it('should throw a per-field error for an invalid resume object', async () => {
20
20
  await expect((0, _validate.default)({
21
21
  resume: {
22
- notInTheSchema: true
22
+ basics: {
23
+ name: 123
24
+ }
23
25
  },
24
26
  schema: defaultSchema
25
- })).rejects.toMatchInlineSnapshot(`[Error: An error occurred 'Additional properties not allowed: notInTheSchema'.]`);
27
+ })).rejects.toMatchInlineSnapshot(`
28
+ [Error: Invalid resume:
29
+ data/basics/name must be string]
30
+ `);
26
31
  });
27
32
  it('should accept a schema override', async () => {
28
33
  await (0, _validate.default)({
@@ -36,6 +41,9 @@ describe('validate', () => {
36
41
  schema: {
37
42
  type: 'number'
38
43
  }
39
- })).rejects.toMatchInlineSnapshot(`[Error: An error occurred 'Expected type number but found type string'.]`);
44
+ })).rejects.toMatchInlineSnapshot(`
45
+ [Error: Invalid resume:
46
+ data must be number]
47
+ `);
40
48
  });
41
49
  });
package/package.json CHANGED
@@ -1,25 +1,16 @@
1
1
  {
2
2
  "name": "resume-cli",
3
- "version": "3.1.1",
3
+ "version": "3.2.0",
4
4
  "description": "The JSON Resume command line interface",
5
- "main": "index.js",
5
+ "main": "build/main.js",
6
6
  "engines": {
7
- "node": ">=12 <18"
7
+ "node": ">=18"
8
8
  },
9
9
  "files": [
10
10
  "build/*",
11
11
  "!test-utils",
12
12
  "!*.test.js"
13
13
  ],
14
- "scripts": {
15
- "dev": "babel-node lib/main.js",
16
- "lint": "eslint --ignore-path .gitignore .",
17
- "_postinstall": "husky install",
18
- "prepublishOnly": "pinst --disable",
19
- "postpublish": "pinst --enable",
20
- "prepare": "babel lib -d build --copy-files",
21
- "test": "jest"
22
- },
23
14
  "repository": {
24
15
  "type": "git",
25
16
  "url": "https://github.com/jsonresume/resume-cli.git"
@@ -29,6 +20,8 @@
29
20
  "resume": "build/main.js"
30
21
  },
31
22
  "dependencies": {
23
+ "ajv": "^8.17.1",
24
+ "ajv-formats": "^3.0.1",
32
25
  "async": "^3.2.0",
33
26
  "browser-sync": "^2.29.3",
34
27
  "btoa": "^1.2.1",
@@ -37,29 +30,26 @@
37
30
  "dotenv": "^8.2.0",
38
31
  "file-exists": "^5.0.1",
39
32
  "jest-extended": "^0.11.5",
40
- "jsonresume-theme-even": "^0.6.0",
33
+ "jsonresume-theme-elegant": "^1.16.1",
34
+ "jsonresume-theme-even": "0.6.0",
41
35
  "mime-types": "^2.1.27",
42
36
  "object-path-immutable": "^4.1.1",
43
- "puppeteer": "^18.2.1",
37
+ "puppeteer": "^23.0.0",
44
38
  "quaff": "^4.2.0",
45
39
  "read": "^1.0.7",
46
- "resume-schema": "^1.0.0",
47
40
  "stream-to-string": "^1.2.1",
48
41
  "superagent": "^6.0.0",
49
42
  "yaml-js": "^0.2.3",
50
43
  "yesno": "^0.3.1",
51
- "z-schema": "^5.0.0",
52
- "z-schema-errors": "^0.2.1"
44
+ "@jsonresume/schema": "1.2.1"
53
45
  },
54
46
  "devDependencies": {
55
- "@babel/cli": "7.12.10",
56
- "@babel/core": "7.12.10",
57
- "@babel/eslint-parser": "7.12.1",
58
- "@babel/node": "7.12.10",
59
- "@babel/plugin-proposal-optional-chaining": "7.12.7",
60
- "@babel/preset-env": "7.12.11",
61
- "babel-eslint": "10.1.0",
62
- "babel-jest": "28.1.2",
47
+ "@babel/cli": "^7.25.0",
48
+ "@babel/core": "^7.25.0",
49
+ "@babel/eslint-parser": "^7.25.0",
50
+ "@babel/node": "^7.25.0",
51
+ "@babel/preset-env": "^7.25.0",
52
+ "babel-jest": "^29.7.0",
63
53
  "dedent": "0.7.0",
64
54
  "eslint": "7.15.0",
65
55
  "eslint-config-prettier": "7.0.0",
@@ -67,13 +57,17 @@
67
57
  "eslint-plugin-prettier": "3.2.0",
68
58
  "flat": "5.0.2",
69
59
  "fs-monkey": "1.0.1",
70
- "husky": "5.0.6",
71
- "jest": "28.1.2",
72
- "lint-staged": "10.5.3",
73
- "memfs": "3.2.0",
60
+ "jest": "^29.7.0",
61
+ "memfs": "3.6.0",
74
62
  "mock-stdin": "1.0.0",
75
63
  "prettier": "2.2.1",
76
64
  "unionfs": "4.4.0",
77
65
  "waait": "1.0.5"
66
+ },
67
+ "scripts": {
68
+ "dev": "babel-node lib/main.js",
69
+ "lint": "eslint --ignore-path .gitignore .",
70
+ "build": "babel lib -d build --copy-files",
71
+ "test": "jest"
78
72
  }
79
- }
73
+ }