@forsakringskassan/commitlint-config 1.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/dist/parser.js ADDED
@@ -0,0 +1,491 @@
1
+ var __getOwnPropNames = Object.getOwnPropertyNames;
2
+ var __commonJS = (cb, mod) => function __require() {
3
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
4
+ };
5
+
6
+ // node_modules/conventional-changelog-conventionalcommits/parser-opts.js
7
+ var require_parser_opts = __commonJS({
8
+ "node_modules/conventional-changelog-conventionalcommits/parser-opts.js"(exports2, module2) {
9
+ "use strict";
10
+ module2.exports = function(config) {
11
+ config = defaultConfig(config);
12
+ return {
13
+ headerPattern: /^(\w*)(?:\((.*)\))?!?: (.*)$/,
14
+ breakingHeaderPattern: /^(\w*)(?:\((.*)\))?!: (.*)$/,
15
+ headerCorrespondence: [
16
+ "type",
17
+ "scope",
18
+ "subject"
19
+ ],
20
+ noteKeywords: ["BREAKING CHANGE", "BREAKING-CHANGE"],
21
+ revertPattern: /^(?:Revert|revert:)\s"?([\s\S]+?)"?\s*This reverts commit (\w*)\./i,
22
+ revertCorrespondence: ["header", "hash"],
23
+ issuePrefixes: config.issuePrefixes
24
+ };
25
+ };
26
+ function defaultConfig(config) {
27
+ config = config || {};
28
+ config.issuePrefixes = config.issuePrefixes || ["#"];
29
+ return config;
30
+ }
31
+ }
32
+ });
33
+
34
+ // node_modules/conventional-changelog-conventionalcommits/add-bang-notes.js
35
+ var require_add_bang_notes = __commonJS({
36
+ "node_modules/conventional-changelog-conventionalcommits/add-bang-notes.js"(exports2, module2) {
37
+ var { breakingHeaderPattern } = require_parser_opts()();
38
+ module2.exports = (commit) => {
39
+ const match = commit.header.match(breakingHeaderPattern);
40
+ if (match && commit.notes.length === 0) {
41
+ const noteText = match[3];
42
+ commit.notes.push({
43
+ text: noteText
44
+ });
45
+ }
46
+ };
47
+ }
48
+ });
49
+
50
+ // node_modules/array-ify/index.js
51
+ var require_array_ify = __commonJS({
52
+ "node_modules/array-ify/index.js"(exports2, module2) {
53
+ "use strict";
54
+ module2.exports = function(val) {
55
+ return Array.isArray(val) ? val : [val];
56
+ };
57
+ }
58
+ });
59
+
60
+ // node_modules/is-obj/index.js
61
+ var require_is_obj = __commonJS({
62
+ "node_modules/is-obj/index.js"(exports2, module2) {
63
+ "use strict";
64
+ module2.exports = (value) => {
65
+ const type = typeof value;
66
+ return value !== null && (type === "object" || type === "function");
67
+ };
68
+ }
69
+ });
70
+
71
+ // node_modules/dot-prop/index.js
72
+ var require_dot_prop = __commonJS({
73
+ "node_modules/dot-prop/index.js"(exports2, module2) {
74
+ "use strict";
75
+ var isObj = require_is_obj();
76
+ var disallowedKeys = [
77
+ "__proto__",
78
+ "prototype",
79
+ "constructor"
80
+ ];
81
+ var isValidPath = (pathSegments) => !pathSegments.some((segment) => disallowedKeys.includes(segment));
82
+ function getPathSegments(path) {
83
+ const pathArray = path.split(".");
84
+ const parts = [];
85
+ for (let i = 0; i < pathArray.length; i++) {
86
+ let p = pathArray[i];
87
+ while (p[p.length - 1] === "\\" && pathArray[i + 1] !== void 0) {
88
+ p = p.slice(0, -1) + ".";
89
+ p += pathArray[++i];
90
+ }
91
+ parts.push(p);
92
+ }
93
+ if (!isValidPath(parts)) {
94
+ return [];
95
+ }
96
+ return parts;
97
+ }
98
+ module2.exports = {
99
+ get(object, path, value) {
100
+ if (!isObj(object) || typeof path !== "string") {
101
+ return value === void 0 ? object : value;
102
+ }
103
+ const pathArray = getPathSegments(path);
104
+ if (pathArray.length === 0) {
105
+ return;
106
+ }
107
+ for (let i = 0; i < pathArray.length; i++) {
108
+ if (!Object.prototype.propertyIsEnumerable.call(object, pathArray[i])) {
109
+ return value;
110
+ }
111
+ object = object[pathArray[i]];
112
+ if (object === void 0 || object === null) {
113
+ if (i !== pathArray.length - 1) {
114
+ return value;
115
+ }
116
+ break;
117
+ }
118
+ }
119
+ return object;
120
+ },
121
+ set(object, path, value) {
122
+ if (!isObj(object) || typeof path !== "string") {
123
+ return object;
124
+ }
125
+ const root = object;
126
+ const pathArray = getPathSegments(path);
127
+ for (let i = 0; i < pathArray.length; i++) {
128
+ const p = pathArray[i];
129
+ if (!isObj(object[p])) {
130
+ object[p] = {};
131
+ }
132
+ if (i === pathArray.length - 1) {
133
+ object[p] = value;
134
+ }
135
+ object = object[p];
136
+ }
137
+ return root;
138
+ },
139
+ delete(object, path) {
140
+ if (!isObj(object) || typeof path !== "string") {
141
+ return false;
142
+ }
143
+ const pathArray = getPathSegments(path);
144
+ for (let i = 0; i < pathArray.length; i++) {
145
+ const p = pathArray[i];
146
+ if (i === pathArray.length - 1) {
147
+ delete object[p];
148
+ return true;
149
+ }
150
+ object = object[p];
151
+ if (!isObj(object)) {
152
+ return false;
153
+ }
154
+ }
155
+ },
156
+ has(object, path) {
157
+ if (!isObj(object) || typeof path !== "string") {
158
+ return false;
159
+ }
160
+ const pathArray = getPathSegments(path);
161
+ if (pathArray.length === 0) {
162
+ return false;
163
+ }
164
+ for (let i = 0; i < pathArray.length; i++) {
165
+ if (isObj(object)) {
166
+ if (!(pathArray[i] in object)) {
167
+ return false;
168
+ }
169
+ object = object[pathArray[i]];
170
+ } else {
171
+ return false;
172
+ }
173
+ }
174
+ return true;
175
+ }
176
+ };
177
+ }
178
+ });
179
+
180
+ // node_modules/compare-func/index.js
181
+ var require_compare_func = __commonJS({
182
+ "node_modules/compare-func/index.js"(exports2, module2) {
183
+ "use strict";
184
+ var arrayify = require_array_ify();
185
+ var dotPropGet = require_dot_prop().get;
186
+ function compareFunc(prop) {
187
+ return function(a, b) {
188
+ var ret = 0;
189
+ arrayify(prop).some(function(el) {
190
+ var x;
191
+ var y;
192
+ if (typeof el === "function") {
193
+ x = el(a);
194
+ y = el(b);
195
+ } else if (typeof el === "string") {
196
+ x = dotPropGet(a, el);
197
+ y = dotPropGet(b, el);
198
+ } else {
199
+ x = a;
200
+ y = b;
201
+ }
202
+ if (x === y) {
203
+ ret = 0;
204
+ return;
205
+ }
206
+ if (typeof x === "string" && typeof y === "string") {
207
+ ret = x.localeCompare(y);
208
+ return ret !== 0;
209
+ }
210
+ ret = x < y ? -1 : 1;
211
+ return true;
212
+ });
213
+ return ret;
214
+ };
215
+ }
216
+ module2.exports = compareFunc;
217
+ }
218
+ });
219
+
220
+ // node_modules/conventional-changelog-conventionalcommits/writer-opts.js
221
+ var require_writer_opts = __commonJS({
222
+ "node_modules/conventional-changelog-conventionalcommits/writer-opts.js"(exports2, module2) {
223
+ "use strict";
224
+ var addBangNotes = require_add_bang_notes();
225
+ var compareFunc = require_compare_func();
226
+ var { readFile } = require("fs").promises;
227
+ var { resolve } = require("path");
228
+ var releaseAsRe = /release-as:\s*\w*@?([0-9]+\.[0-9]+\.[0-9a-z]+(-[0-9a-z.]+)?)\s*/i;
229
+ var owner = "{{#if this.owner}}{{~this.owner}}{{else}}{{~@root.owner}}{{/if}}";
230
+ var host = "{{~@root.host}}";
231
+ var repository = "{{#if this.repository}}{{~this.repository}}{{else}}{{~@root.repository}}{{/if}}";
232
+ module2.exports = async (config) => {
233
+ config = defaultConfig(config);
234
+ const commitUrlFormat = expandTemplate(config.commitUrlFormat, {
235
+ host,
236
+ owner,
237
+ repository
238
+ });
239
+ const compareUrlFormat = expandTemplate(config.compareUrlFormat, {
240
+ host,
241
+ owner,
242
+ repository
243
+ });
244
+ const issueUrlFormat = expandTemplate(config.issueUrlFormat, {
245
+ host,
246
+ owner,
247
+ repository,
248
+ id: "{{this.issue}}",
249
+ prefix: "{{this.prefix}}"
250
+ });
251
+ const [
252
+ template,
253
+ header,
254
+ commit,
255
+ footer
256
+ ] = await Promise.all([
257
+ readFile(resolve(__dirname, "./templates/template.hbs"), "utf-8"),
258
+ readFile(resolve(__dirname, "./templates/header.hbs"), "utf-8"),
259
+ readFile(resolve(__dirname, "./templates/commit.hbs"), "utf-8"),
260
+ readFile(resolve(__dirname, "./templates/footer.hbs"), "utf-8")
261
+ ]);
262
+ const writerOpts = getWriterOpts(config);
263
+ writerOpts.mainTemplate = template;
264
+ writerOpts.headerPartial = header.replace(/{{compareUrlFormat}}/g, compareUrlFormat);
265
+ writerOpts.commitPartial = commit.replace(/{{commitUrlFormat}}/g, commitUrlFormat).replace(/{{issueUrlFormat}}/g, issueUrlFormat);
266
+ writerOpts.footerPartial = footer;
267
+ return writerOpts;
268
+ };
269
+ function findTypeEntry(types, commit) {
270
+ const typeKey = (commit.revert ? "revert" : commit.type || "").toLowerCase();
271
+ return types.find((entry) => {
272
+ if (entry.type !== typeKey) {
273
+ return false;
274
+ }
275
+ if (entry.scope && entry.scope !== commit.scope) {
276
+ return false;
277
+ }
278
+ return true;
279
+ });
280
+ }
281
+ function getWriterOpts(config) {
282
+ config = defaultConfig(config);
283
+ const commitGroupOrder = config.types.flatMap((t) => t.section).filter((t) => t);
284
+ return {
285
+ transform: (commit, context) => {
286
+ let discard = true;
287
+ const issues = [];
288
+ const entry = findTypeEntry(config.types, commit);
289
+ addBangNotes(commit);
290
+ if (commit.footer && releaseAsRe.test(commit.footer) || commit.body && releaseAsRe.test(commit.body)) {
291
+ discard = false;
292
+ }
293
+ commit.notes.forEach((note) => {
294
+ note.title = "BREAKING CHANGES";
295
+ discard = false;
296
+ });
297
+ if (discard && (entry === void 0 || entry.hidden))
298
+ return;
299
+ if (entry)
300
+ commit.type = entry.section;
301
+ if (commit.scope === "*") {
302
+ commit.scope = "";
303
+ }
304
+ if (typeof commit.hash === "string") {
305
+ commit.shortHash = commit.hash.substring(0, 7);
306
+ }
307
+ if (typeof commit.subject === "string") {
308
+ config.issuePrefixes.join("|");
309
+ const issueRegEx = "(" + config.issuePrefixes.join("|") + ")([0-9]+)";
310
+ const re = new RegExp(issueRegEx, "g");
311
+ commit.subject = commit.subject.replace(re, (_, prefix, issue) => {
312
+ issues.push(prefix + issue);
313
+ const url = expandTemplate(config.issueUrlFormat, {
314
+ host: context.host,
315
+ owner: context.owner,
316
+ repository: context.repository,
317
+ id: issue,
318
+ prefix
319
+ });
320
+ return `[${prefix}${issue}](${url})`;
321
+ });
322
+ commit.subject = commit.subject.replace(/\B@([a-z0-9](?:-?[a-z0-9/]){0,38})/g, (_, user) => {
323
+ if (user.includes("/")) {
324
+ return `@${user}`;
325
+ }
326
+ const usernameUrl = expandTemplate(config.userUrlFormat, {
327
+ host: context.host,
328
+ owner: context.owner,
329
+ repository: context.repository,
330
+ user
331
+ });
332
+ return `[@${user}](${usernameUrl})`;
333
+ });
334
+ }
335
+ commit.references = commit.references.filter((reference) => {
336
+ if (issues.indexOf(reference.prefix + reference.issue) === -1) {
337
+ return true;
338
+ }
339
+ return false;
340
+ });
341
+ return commit;
342
+ },
343
+ groupBy: "type",
344
+ // the groupings of commit messages, e.g., Features vs., Bug Fixes, are
345
+ // sorted based on their probable importance:
346
+ commitGroupsSort: (a, b) => {
347
+ const gRankA = commitGroupOrder.indexOf(a.title);
348
+ const gRankB = commitGroupOrder.indexOf(b.title);
349
+ return gRankA - gRankB;
350
+ },
351
+ commitsSort: ["scope", "subject"],
352
+ noteGroupsSort: "title",
353
+ notesSort: compareFunc
354
+ };
355
+ }
356
+ function defaultConfig(config) {
357
+ config = config || {};
358
+ config.types = config.types || [
359
+ { type: "feat", section: "Features" },
360
+ { type: "feature", section: "Features" },
361
+ { type: "fix", section: "Bug Fixes" },
362
+ { type: "perf", section: "Performance Improvements" },
363
+ { type: "revert", section: "Reverts" },
364
+ { type: "docs", section: "Documentation", hidden: true },
365
+ { type: "style", section: "Styles", hidden: true },
366
+ { type: "chore", section: "Miscellaneous Chores", hidden: true },
367
+ { type: "refactor", section: "Code Refactoring", hidden: true },
368
+ { type: "test", section: "Tests", hidden: true },
369
+ { type: "build", section: "Build System", hidden: true },
370
+ { type: "ci", section: "Continuous Integration", hidden: true }
371
+ ];
372
+ config.issueUrlFormat = config.issueUrlFormat || "{{host}}/{{owner}}/{{repository}}/issues/{{id}}";
373
+ config.commitUrlFormat = config.commitUrlFormat || "{{host}}/{{owner}}/{{repository}}/commit/{{hash}}";
374
+ config.compareUrlFormat = config.compareUrlFormat || "{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}";
375
+ config.userUrlFormat = config.userUrlFormat || "{{host}}/{{user}}";
376
+ config.issuePrefixes = config.issuePrefixes || ["#"];
377
+ return config;
378
+ }
379
+ function expandTemplate(template, context) {
380
+ let expanded = template;
381
+ Object.keys(context).forEach((key) => {
382
+ expanded = expanded.replace(new RegExp(`{{${key}}}`, "g"), context[key]);
383
+ });
384
+ return expanded;
385
+ }
386
+ }
387
+ });
388
+
389
+ // node_modules/conventional-changelog-conventionalcommits/conventional-changelog.js
390
+ var require_conventional_changelog = __commonJS({
391
+ "node_modules/conventional-changelog-conventionalcommits/conventional-changelog.js"(exports2, module2) {
392
+ "use strict";
393
+ var parserOpts = require_parser_opts();
394
+ var writerOpts = require_writer_opts();
395
+ module2.exports = function(config) {
396
+ return Promise.all([parserOpts(config), writerOpts(config)]).then(([parserOpts2, writerOpts2]) => ({
397
+ parserOpts: parserOpts2,
398
+ writerOpts: writerOpts2
399
+ }));
400
+ };
401
+ }
402
+ });
403
+
404
+ // node_modules/conventional-changelog-conventionalcommits/conventional-recommended-bump.js
405
+ var require_conventional_recommended_bump = __commonJS({
406
+ "node_modules/conventional-changelog-conventionalcommits/conventional-recommended-bump.js"(exports2, module2) {
407
+ "use strict";
408
+ var addBangNotes = require_add_bang_notes();
409
+ var parserOpts = require_parser_opts();
410
+ module2.exports = function(config) {
411
+ return {
412
+ parserOpts: parserOpts(config),
413
+ whatBump: (commits) => {
414
+ let level = 2;
415
+ let breakings = 0;
416
+ let features = 0;
417
+ commits.forEach((commit) => {
418
+ addBangNotes(commit);
419
+ if (commit.notes.length > 0) {
420
+ breakings += commit.notes.length;
421
+ level = 0;
422
+ } else if (commit.type === "feat" || commit.type === "feature") {
423
+ features += 1;
424
+ if (level === 2) {
425
+ level = 1;
426
+ }
427
+ }
428
+ });
429
+ if (config.preMajor && level < 2) {
430
+ level++;
431
+ }
432
+ return {
433
+ level,
434
+ reason: breakings === 1 ? `There is ${breakings} BREAKING CHANGE and ${features} features` : `There are ${breakings} BREAKING CHANGES and ${features} features`
435
+ };
436
+ }
437
+ };
438
+ };
439
+ }
440
+ });
441
+
442
+ // node_modules/conventional-changelog-conventionalcommits/index.js
443
+ var require_conventional_changelog_conventionalcommits = __commonJS({
444
+ "node_modules/conventional-changelog-conventionalcommits/index.js"(exports2, module2) {
445
+ "use strict";
446
+ var conventionalChangelog = require_conventional_changelog();
447
+ var parserOpts = require_parser_opts();
448
+ var recommendedBumpOpts = require_conventional_recommended_bump();
449
+ var writerOpts = require_writer_opts();
450
+ module2.exports = function(parameter) {
451
+ if (typeof parameter === "function") {
452
+ const config = {};
453
+ Promise.all([
454
+ conventionalChangelog(config),
455
+ parserOpts(config),
456
+ recommendedBumpOpts(config),
457
+ writerOpts(config)
458
+ ]).then(([conventionalChangelog2, parserOpts2, recommendedBumpOpts2, writerOpts2]) => {
459
+ parameter(null, {
460
+ gitRawCommitsOpts: {
461
+ noMerges: null
462
+ },
463
+ conventionalChangelog: conventionalChangelog2,
464
+ parserOpts: parserOpts2,
465
+ recommendedBumpOpts: recommendedBumpOpts2,
466
+ writerOpts: writerOpts2
467
+ });
468
+ });
469
+ } else {
470
+ const config = parameter || {};
471
+ return presetOpts(config);
472
+ }
473
+ };
474
+ function presetOpts(config) {
475
+ return Promise.all([
476
+ conventionalChangelog(config),
477
+ parserOpts(config),
478
+ recommendedBumpOpts(config),
479
+ writerOpts(config)
480
+ ]).then(([conventionalChangelog2, parserOpts2, recommendedBumpOpts2, writerOpts2]) => ({
481
+ conventionalChangelog: conventionalChangelog2,
482
+ parserOpts: parserOpts2,
483
+ recommendedBumpOpts: recommendedBumpOpts2,
484
+ writerOpts: writerOpts2
485
+ }));
486
+ }
487
+ }
488
+ });
489
+
490
+ // src/parser.js
491
+ module.exports = require_conventional_changelog_conventionalcommits();
package/gitmessage ADDED
@@ -0,0 +1,52 @@
1
+
2
+
3
+ #
4
+ # Our commit message format is as follows:
5
+ #
6
+ # type: short summary (fixes XYZ-1234)
7
+ #
8
+ # Longer description here if necessary
9
+ #
10
+ # The first line of the commit message (the commit title) must have a specific format. This format is checked by our build tools.
11
+ #
12
+ # The type is one of the following:
13
+ #
14
+ # * feat - for a new feature.
15
+ # * fix - for a bug fix
16
+ # * build - changes to build process only.
17
+ # * ci - changes to ci/cd configuration only.
18
+ # * docs - changes to documentation only..
19
+ # * perf - for a performance improvement.
20
+ # * refactor - code refactor without change in behaviour.
21
+ # * revert - for reverting a commit.
22
+ # * style - cosmetic changes only.
23
+ # * test - changes to test cases only.
24
+ # * chore - changes not fitting any other description.
25
+ #
26
+ # Breaking changes must include "BREAKING CHANGE: " in the longer description.
27
+ #
28
+ # The message summary should be a one-sentence description of the change, and it must be 72 characters in length or shorter.
29
+ # If the pull request addresses an issue, then the issue number should be mentioned at the end. If the commit doesn’t completely
30
+ # fix the issue, then use (refs XYZ-1234) instead of (fixes XYZ-1234).
31
+ #
32
+ # Here are some good commit message summary examples:
33
+ #
34
+ # * build: update Travis to only test Node 0.10 (refs XYZ-1234)
35
+ #
36
+ # Travis did not work properly with last upgrade
37
+ # to 0.11. To ensure that we execute all our tests
38
+ # Travis is downgraded to the last working Node version.
39
+ #
40
+ # * fix: semi rule incorrectly flagging extra semicolon (fixes XYZ-1234)
41
+ #
42
+ # In a few edge cases the semi rule wanted an extra
43
+ # semicolon.
44
+ #
45
+ # Update code to work with these edge cases and add tests
46
+ # for the edge cases.
47
+ #
48
+ # * chore(deps): esprima to 1.2, switch to using Esprima comment attachment (fixes XYZ-1234)
49
+ #
50
+ # The commit message format is important because these messages are used to create a changelog for each release. The tag and issue
51
+ # number help to create more consistent and useful changelogs.
52
+ #
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@forsakringskassan/commitlint-config",
3
+ "version": "1.2.0",
4
+ "description": "FK commitlint shareable config",
5
+ "keywords": [
6
+ "commitlint"
7
+ ],
8
+ "homepage": "https://github.com/Forsakringskassan/commitlint-config",
9
+ "bugs": "https://github.com/Forsakringskassan/commitlint-config/issues",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/Forsakringskassan/commitlint-config.git"
13
+ },
14
+ "license": "MIT",
15
+ "author": "Försäkringskassan",
16
+ "exports": {
17
+ ".": "./dist/config/default.js",
18
+ "./default": "./dist/config/default.js",
19
+ "./no-jira": "./dist/config/no-jira.js"
20
+ },
21
+ "main": "dist/config/default.js",
22
+ "bin": {
23
+ "commitlint": "bin/cli.js",
24
+ "commitlint-config": "bin/install.js"
25
+ },
26
+ "files": [
27
+ "bin",
28
+ "dist",
29
+ "gitmessage"
30
+ ],
31
+ "scripts": {
32
+ "prebuild": "rimraf dist",
33
+ "build": "run-s build:*",
34
+ "build:cli": "esbuild --bundle --platform=node --target=node16.0 --external:ts-node --outdir=dist/cli src/commitlint.js",
35
+ "build:config": "esbuild --bundle --platform=node --target=node16.0 --external:@forsakringskassan/commitlint-config --outdir=dist/config src/config/default.js src/config/no-jira.js",
36
+ "build:install": "esbuild --bundle --platform=node --target=node16.0 --outdir=dist src/install.js",
37
+ "build:format": "esbuild --bundle --platform=node --target=node16.0 --outdir=dist src/format.js",
38
+ "build:parser": "esbuild --bundle --platform=node --target=node16.0 --outdir=dist src/parser.js",
39
+ "postbuild": "run-s postbuild:*",
40
+ "postbuild:cli": "cp -R node_modules/conventional-changelog-angular/templates/ dist/cli",
41
+ "postbuild:config": "cp -R node_modules/conventional-changelog-conventionalcommits/templates/ dist/config",
42
+ "prepack": "run-s pkg:mangle",
43
+ "postpack": "run-s pkg:restore",
44
+ "prepublishOnly": "run-s pkg:mangle",
45
+ "eslint": "eslint .",
46
+ "eslint:fix": "eslint --fix .",
47
+ "pkg:mangle": "run-s pkg:mangle:*",
48
+ "pkg:mangle:pack": "release-prepack package.json --bundle --retain-scripts",
49
+ "pkg:mangle:add": "npm pkg set scripts.postinstall=\"node bin/install.js\"",
50
+ "pkg:restore": "release-postpack package.json",
51
+ "prepare": "husky && git config commit.template gitmessage",
52
+ "prettier:check": "prettier . --check",
53
+ "prettier:write": "prettier . --write",
54
+ "pretest": "run-s eslint prettier:check",
55
+ "test": "jest",
56
+ "postinstall": "node bin/install.js"
57
+ },
58
+ "peerDependencies": {
59
+ "ts-node": "^10"
60
+ },
61
+ "engines": {
62
+ "node": ">= 16"
63
+ }
64
+ }