vue-ninja 1.0.0 → 2.0.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.
@@ -0,0 +1,2 @@
1
+ integration
2
+ pnpm-lock.yaml
@@ -0,0 +1,8 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/prettierrc",
3
+ "printWidth": 140,
4
+ "singleQuote": true,
5
+ "arrowParens": "avoid",
6
+ "trailingComma": "none",
7
+ "plugins": ["@prettier/plugin-oxc"]
8
+ }
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # vue-ninja
2
2
 
3
- Node module used to compute and submit score to
3
+ Node module used to compute and submit score to
4
4
  [vue-exercises.ninja-squad.com](http://vue-exercises.ninja-squad.com)
5
5
 
6
6
  ## Build
@@ -8,19 +8,19 @@ Node module used to compute and submit score to
8
8
  Run:
9
9
 
10
10
  npm run build
11
-
11
+
12
12
  Lint:
13
13
 
14
14
  npm run lint
15
-
15
+
16
16
  Test:
17
17
 
18
18
  npm run test tests
19
-
19
+
20
20
  Integration test (builds a CLI app and test it with the local vue-ninja build):
21
-
21
+
22
22
  npm run test integration
23
-
23
+
24
24
  ## Test locally
25
25
 
26
26
  To use the current dev version in ponyracer:
@@ -28,12 +28,12 @@ To use the current dev version in ponyracer:
28
28
  rm -rf dist
29
29
  npm run build
30
30
  npm link
31
-
31
+
32
32
  Then in ponyracer:
33
33
 
34
34
  npm link vue-ninja
35
35
  npm run vue-ninja
36
-
36
+
37
37
  ## Release
38
38
 
39
39
  git fetch
package/dist/vue-ninja.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{rimrafSync as e}from"rimraf";import r from"fs";import t from"crypto";import o from"child_process";import s from"prompt";import n from"util";import{glob as i}from"glob";import a from"chalk";import c from"axios";import{parseArgs as u}from"node:util";const l=n.promisify(o.exec),h=n.promisify(r.readFile),d=e=>h(e,"utf8"),g=e=>l(e,{maxBuffer:1024e3}),m=e=>new Promise(((r,t)=>{s.start(),s.get(e,((e,o)=>{e?t():r(o)}))})),f=e=>i(e,{nodir:!0,posix:!0}),p=e=>{const o=r.readFileSync(e),s=t.createHash("sha256");return s.update(o),s.digest("hex")},y={log:console.log,error:e=>console.log(a.red(e)),warn:e=>console.log(a.yellow(e)),success:e=>console.log(a.green(e)),debug:(e,r,t)=>{e.verbose&&(t?console.log(a.gray(r),a.gray(t)):console.log(a.gray(r)))}},w="results/vitest-results.json";function v(e,r,t){const o=JSON.parse(e);if(!o)return y.error("An error occurred during the unit tests."),y.error("Run `npm run test:unit` to see the problem."),t();const s={failed:o.numFailedTests?o.numFailedTests:o.numFailedTestSuites,success:o.numPassedTests};return 0!==s.failed?function(e){const r=function(e){if(void 0===e.failed)return 0;const r=100-5*e.failed;return r>=0?r:0}(e);y.warn("Unit tests score: "+r+"%"),y.warn("Looks like you have "+(e.failed?e.failed:"a few")+" unit test(s) failing."),y.warn("Launch `npm run test:unit` and try to fix them.")}(s):y.success("Unit tests score: 100%"),r(s)}const b=e=>new Promise(((r,t)=>(y.log("Starting unit tests..."),g("npm run test:unit:ci").then((()=>d(w)),(r=>(y.debug(e,"Vitest test failed",r),d(w)))).then((e=>v(e,r,t)),(r=>(y.debug(e,"An error occurred while reading vitest results: ",r),function(e){return y.error("Error while running unit tests."),y.error("Maybe your code doesn't compile?"),y.error("Launch `npm run test:unit` to see more."),e()}(t)))))));function k(){return f("./{cypress,src}/**/*.@(cy|spec).ts").then((e=>function(e){return e.map((e=>({name:e,hash:p(e)})))}(e)))}const x=e=>new Promise(((r,t)=>(y.log("Starting code coverage..."),d("coverage/coverage-summary.json").then((e=>function(e,r){const t=e.replace(/\\/g,"/"),o=JSON.parse(t),s={covered:o.total.lines.covered,total:o.total.lines.total},n=function(e){const r=100+e.covered-e.total;return r<0?0:r}(s);100!==n?(y.warn("Code coverage score: "+n+"%"),y.warn("Looks like you don't have a perfect code coverage."),y.warn("Maybe you skipped/deleted some unit tests?"),y.warn("Or maybe you added some code to try something, and this is not covered by a unit test?"),y.warn("To have more info open `coverage/index.html`"),y.warn("You should see which file has a problem.")):y.success("Code coverage score: 100%"),r(s)}(e,r)),(r=>{y.error("Error while reading the code coverage results. Try to run `npm run test:unit`."),y.debug(e,"Error while reading the code coverage results was: ",r),t()}))))),E="results/lint-results.json",j="results/cypress-results.json";function S(){return g(`npx mochawesome-merge ./results/mochawesome/*.json -o ${j}`)}const P=e=>new Promise(((r,t)=>(y.log("Starting end to end tests..."),g("npm run test:e2e:ci").then((()=>S()),(r=>(y.debug(e,"Error while running e2e was: ",r),S()))).then((()=>d(j)),(()=>d(j))).then((e=>function(e){const r=JSON.parse(e),t=r.stats.failures,o=r.stats.passes,s={success:o,failed:t};return t?(y.warn("Looks like you have "+t+" e2e tests failing."),y.warn("Try to launch the tests using `npm run test:e2e`."),y.warn(`E2e tests score: ${Math.round(100*o/(o+t))}%`)):y.success("E2e tests score: 100%"),s}(e))).then((e=>r(e)),(r=>(y.debug(e,"Error while reading e2e results: ",r),y.error("Error while running end-to-end tests."),y.error("Check if your app is running with no error in the browser console,"),y.error("and try to launch the tests using `npm run test:e2e`."),t())))))),O="https://vue-exercises.ninja-squad.com",A="http://localhost:8080";function J(e,r,t){if((r+=1)>3)return y.error("Aborting authentication after 3 failures"),Promise.reject();return m({properties:{email:{required:!0},password:{hidden:!0,required:!0}}}).then((r=>c.post(`${e["local-server"]?A:O}/api/authentications`,r))).then((o=>201!==o.status?(y.error("Authentication failed, try again."),y.debug(e,`Authentication request returned with status: ${o.status}`),J(e,r,t)):(y.debug(e,"Authentication succeeded and we can store credentials"),function(e,r){return y.success("Authentication success"),e.token=r,e}(t,o.data.token))),(o=>(y.error("Authentication failed, try again."),y.debug(e,"An error occurred during authentication: ",o),J(e,r,t))))}function N(e,r,t){let o=100-5*r.vitest.failed-r.tslint.errors-(r.coverage.total-r.coverage.covered)-r.e2e.failed;var s;return o<10&&(o=10),t.local?(100!==o&&(y.error("Score is not perfect! "+o+"%"),s=1,process.exit(s)),y.success("Exercise score: "+o+"%")):100!==o?y.warn("Score is not perfect yet: "+o+"%"):y.success("Perfect score, congrats! "+o+"%"),{metadata:e,score:o}}function T(e,r){const t={Authorization:`Bearer: ${r.token}`},o=e["local-server"]?A:O,s={score:r.score};return c.post(`${o}/api/packs/${r.pack}/exercises/${r.id}/scores`,s,{headers:t}).then((t=>{if(401===t.status){y.error("Authentication failed. Please enter your credentials again.");return J(e,0,r).then((r=>T(e,r)),(r=>(y.error("Error while authenticating to submit results."),y.debug(e,"Error was: ",r),Promise.reject())))}return 201!==t.status?(y.error("Error while sending the results."),y.debug(e,JSON.stringify(t.status),JSON.stringify(t.data)),Promise.reject()):(y.log("Score submitted."),Promise.resolve(r))}),(r=>(y.error("Error while sending the results."),y.error("Maybe check your connection?"),y.debug(e,"Error while sending the result was: ",r),Promise.reject())))}const C=(e,r)=>d("./exercise.json").then((e=>JSON.parse(e)),(e=>(y.error("Looks like you have no exercise.json file."),y.debug(r,"An error occurred while reading exercise.json: ",e),Promise.reject()))).then((t=>N(t,e,r)),(e=>(y.error("Looks like you have an incorrect JSON in the exercise.json file."),y.debug(r,"An error occurred while parsing exercise.json: ",e),Promise.reject()))).then((({metadata:e,score:t})=>{e.score=t;return r.local?e:J(r,0,e)})).then((e=>r.local?e:T(r,e))),L=process.argv.slice(2),{values:$}=u({args:L,parseArgsOptions:{local:{type:"boolean"},"local-server":{type:"boolean"},verbose:{type:"boolean"},"skip-check":{type:"boolean"}},strict:!1});e("results");const q={coverage:{covered:100,total:100},e2e:{failed:0,success:1},tslint:{errors:0}};(e=>new Promise(((r,t)=>{y.log("Checking submission..."),d("./exercise.json").then((t=>{const o=JSON.parse(t);return y.success("Pack V"+o.pack+" - Exercise "+o.id+" - "+o.title),e["skip-check"]?r(o):o}),(r=>(y.error("Looks like you have no exercise.json file."),y.debug(e,"An error occurred while reading exercise.json: ",r),Promise.reject()))).then((e=>Promise.all([e,k()]))).then((([r,t])=>{y.debug(e,"Exercise :",JSON.stringify(r)),y.debug(e,"Hashes :",JSON.stringify(t));const o=[],s=[];return r.specs.forEach((e=>{const r=function(e,r){return e.find((e=>-1!==e.name.indexOf(r)))}(t,e.name);r?r.hash!==e.hash&&o.push(e.name):s.push(e.name)})),0!==o.length||0!==s.length?(0!==o.length&&(y.error("It looks like you forgot to update these spec files"),y.error("or that you modified them manually:"),o.forEach((e=>y.error(" - "+e)))),0!==s.length&&(y.error("It looks like you forgot to add these spec files:"),s.forEach((e=>y.error(" - "+e)))),y.error("Copy the new specs and try again."),Promise.reject()):r}),(r=>(y.debug(e,"Error while computing the hash of the spec files. ",r),Promise.reject(r)))).then((e=>r(e)),(e=>t(e)))})))($).then((e=>q.exercise=e)).then((()=>y.debug($,"Exercise: ",q.exercise.title))).then((()=>b($))).then((e=>q.vitest=e)).then((()=>y.debug($,"Vitest results: ",JSON.stringify(q.vitest)))).then((()=>x($))).then((e=>q.coverage=e)).then((()=>y.debug($,"Coverage results: ",JSON.stringify(q.coverage)))).then((()=>(e=>new Promise(((r,t)=>(y.log("Starting code analysis..."),g(`npm run lint -- --no-fix --format=json --output-file=${E}`).then((()=>d(E)),(()=>d(E))).then((e=>e?JSON.parse(e):Promise.reject()),(r=>{y.error("Error while running `npm run lint`."),y.error("Try to run `npm run lint`."),y.debug(e,"Error while running lint was: ",r),t()})).then((e=>{if(!e)return t();const o={errors:0};if(o.errors=e.map((e=>e.errorCount+e.warningCount)).reduce(((e,r)=>e+r),0),0!==o.errors){const e=Math.max(0,100-o.errors);y.warn("Code quality score: "+e+"%"),y.warn("Looks like you have some issues in your code."),y.warn("Try to run `npm run lint` to see what you can fix.")}else y.success("Code quality score: 100%");r(o)}),(r=>{y.error("Error while reading lint results."),y.error("Try to run `npm run lint`."),y.debug(e,"Error while reading lint errors was: ",r),t()}))))))($))).then((e=>q.tslint=e)).then((()=>y.debug($,"Linter results: ",JSON.stringify(q.tslint)))).then((()=>P($))).then((e=>q.e2e=e)).then((()=>y.debug($,"E2e results: ",JSON.stringify(q.e2e)))).then((()=>C(q,$))).catch((e=>{y.error("Try to fix it and retry!"),$.verbose&&y.error(e),$.local&&(y.error("Running locally, we exit"),process.exit(1))}));
2
+ import{parseArgs as m}from"node:util";import{rimrafSync as b}from"rimraf";import v from"node:fs";import S from"node:fs/promises";import E from"crypto";import k from"child_process";import x from"util";import f from"prompt";import{glob as T}from"glob";import a from"chalk";import g from"axios";const L=x.promisify(k.exec),u=r=>S.readFile(r,"utf8"),l=r=>L(r,{maxBuffer:1024*1e3}),O=r=>new Promise((e,s)=>{f.start(),f.get(r,(o,c)=>{o?s():e(c)})}),A=r=>T(r,{nodir:!0,posix:!0}),F=r=>{process.exit(r)},j=r=>{const e=v.readFileSync(r),s=E.createHash("sha256");return s.update(e),s.digest("hex")},t={log:console.log,error:r=>console.log(a.red(r)),warn:r=>console.log(a.yellow(r)),success:r=>console.log(a.green(r)),debug:(r,e,s)=>{r.verbose&&(s?console.log(a.gray(e),a.gray(s)):console.log(a.gray(e)))}},C="results/vitest-results.json";function N(r){if(r.failed===void 0)return 0;const e=100-r.failed*5;return e>=0?e:0}function R(r){const e=N(r);t.warn("Unit tests score: "+e+"%"),t.warn("Looks like you have "+(r.failed?r.failed:"a few")+" unit test(s) failing."),t.warn("Launch `npm run test:unit` and try to fix them.")}function J(){t.error("Error while running unit tests."),t.error("Maybe your code doesn't compile?"),t.error("Launch `npm run test:unit` to see more.")}function P(r){const e=JSON.parse(r);if(!e)throw t.error("An error occurred during the unit tests."),t.error("Run `npm run test:unit` to see the problem."),new Error("Invalid test results");const o={failed:e.numFailedTests?e.numFailedTests:e.numFailedTestSuites,success:e.numPassedTests};return o.failed!==0?R(o):t.success("Unit tests score: 100%"),o}async function I(r){t.log("Starting unit tests...");try{await l("npm run test:unit:ci")}catch(e){t.debug(r,"Vitest test failed",e)}try{const e=await u(C);return P(e)}catch(e){throw t.debug(r,"An error occurred while reading vitest results: ",e),J(),e}}function U(r,e){return r.find(s=>s.name.includes(e))}function q(){return A("./{e2e,src}/**/*.ts")}function H(r){return r.map(e=>({name:e,hash:j(e)}))}function M(){return q().then(r=>H(r))}async function V(r){t.log("Checking submission...");let e;try{e=JSON.parse(await u("./exercise.json"))}catch(n){throw t.error("Looks like you have no exercise.json file."),t.debug(r,"An error occurred while reading exercise.json: ",n),new Error("No exercise.json file")}if(t.success(`Pack V${e.pack} - Exercise ${e.id} - ${e.title}`),r["skip-check"])return e;let s=[];try{s=await M()}catch(n){throw t.debug(r,"Error while computing the hash of the spec files. ",n),n}t.debug(r,"Exercise :",JSON.stringify(e)),t.debug(r,"Hashes :",JSON.stringify(s));const o=[],c=[];if(e.specs.forEach(n=>{const h=U(s,n.name);h?h.hash!==n.hash&&o.push(n.name):c.push(n.name)}),o.length!==0||c.length!==0)throw o.length!==0&&(t.error("It looks like you forgot to update these spec files"),t.error("or that you modified them manually:"),o.forEach(n=>t.error(` - ${n}`))),c.length!==0&&(t.error("It looks like you forgot to add these spec files:"),c.forEach(n=>t.error(` - ${n}`))),t.error("Copy the new specs and try again."),new Error("Specs are not up to date");return e}const _="coverage/coverage-summary.json";function B(r){const e=100+r.covered-r.total;return e<0?0:e}function W(r){const e=r.replace(/\\/g,"/"),s=JSON.parse(e),o={covered:s.total.lines.covered,total:s.total.lines.total},c=B(o);return c!==100?(t.warn("Code coverage score: "+c+"%"),t.warn("Looks like you don't have a perfect code coverage."),t.warn("Maybe you skipped/deleted some unit tests?"),t.warn("Or maybe you added some code to try something, and this is not covered by a unit test?"),t.warn("To have more info open `coverage/index.html`"),t.warn("You should see which file has a problem.")):t.success("Code coverage score: 100%"),o}async function $(r){t.log("Starting code coverage...");try{const e=await u(_);return W(e)}catch(e){throw t.error("Error while reading the code coverage results. Try to run `npm run test:unit`."),t.debug(r,"Error while reading the code coverage results was: ",e),e}}const p="results/lint-results.json";async function z(r){t.log("Starting code analysis...");try{await l(`npm run lint -- --no-fix --format=json --output-file=${p}`)}catch{}try{const e=await u(p),s=JSON.parse(e),o={errors:0};if(o.errors=s.map(c=>c.errorCount+c.warningCount).reduce((c,n)=>c+n,0),o.errors!==0){const c=Math.max(0,100-o.errors);t.warn("Code quality score: "+c+"%"),t.warn("Looks like you have some issues in your code."),t.warn("Try to run `npm run lint` to see what you can fix.")}else t.success("Code quality score: 100%");return o}catch(e){throw t.error("Error while running `npm run lint`."),t.error("Try to run `npm run lint`."),t.debug(r,"Error was: ",e),e}}const Y="results/playwright-results.json";function D(){t.error("Error while running end-to-end tests."),t.error("Check if your app is running with no error in the browser console,"),t.error("and try to launch the tests using `npm run test:e2e`.")}function G(r){const e=JSON.parse(r),s=e.stats.unexpected,o=e.stats.expected,c={success:o,failed:s};return s?(t.warn("Looks like you have "+s+" e2e tests failing."),t.warn("Try to launch the tests using `npm run test:e2e`."),t.warn(`E2e tests score: ${Math.round(o*100/(o+s))}%`)):t.success("E2e tests score: 100%"),c}async function K(r){t.log("Starting end to end tests...");try{await l("npm run test:e2e:ci")}catch(e){t.debug(r,"Error while running e2e tests: ",e)}try{const e=await u(Y);return G(e)}catch(e){throw t.debug(r,"Error while reading e2e results: ",e),D(),e}}const w="https://vue-exercises.ninja-squad.com",y="http://localhost:8080";function Q(r,e){return t.success("Authentication success"),r.token=e,r}async function d(r,e,s){if(e=e+1,e>3)return t.error("Aborting authentication after 3 failures"),Promise.reject();const o={properties:{email:{required:!0},password:{hidden:!0,required:!0}}};try{const c=await O(o),n=await g.post(`${r["local-server"]?y:w}/api/authentications`,c);return n.status!==201?(t.error("Authentication failed, try again."),t.debug(r,`Authentication request returned with status: ${n.status}`),d(r,e,s)):(t.debug(r,"Authentication succeeded and we can store credentials"),Q(s,n.data.token))}catch(c){return t.error("Authentication failed, try again."),t.debug(r,"An error occurred during authentication: ",c),d(r,e,s)}}function X(r,e){let s=100-r.vitest.failed*5-r.lint.errors-(r.coverage.total-r.coverage.covered)-r.e2e.failed;return s<10&&(s=10),e.local?(s!==100&&(t.error("Score is not perfect! "+s+"%"),F(1)),t.success("Exercise score: "+s+"%")):s!==100?t.warn("Score is not perfect yet: "+s+"%"):t.success("Perfect score, congrats! "+s+"%"),s}async function Z(r,e){const s={Authorization:`Bearer: ${e.token}`},o=r["local-server"]?y:w,c={score:e.score};try{const n=await g.post(`${o}/api/packs/${e.pack}/exercises/${e.id}/scores`,c,{headers:s});return n.status!==201?(t.error("Error while sending the results."),t.debug(r,`${n.status}`,JSON.stringify(n.data)),Promise.reject()):(t.log("Score submitted."),e)}catch(n){throw t.error("Error while sending the results."),t.error("Maybe check your connection?"),t.debug(r,"Error while sending the result was: ",n),n}}async function ee(r,e){let s;try{s=JSON.parse(await u("./exercise.json"))}catch(n){throw t.error("Looks like you have no exercise.json file."),t.debug(e,"An error occurred while reading exercise.json: ",n),n}if(s.score=X(r,e),e.local)return s;const c=await d(e,0,s);return Z(e,c)}const re=process.argv.slice(2),te={local:{type:"boolean"},"local-server":{type:"boolean"},verbose:{type:"boolean"},"skip-check":{type:"boolean"}},{values:i}=m({args:re,parseArgsOptions:te,strict:!1});b("results");try{const r=await V(i);t.debug(i,"Exercise: ",r.title);const e=await I(i);t.debug(i,"Vitest results: ",JSON.stringify(e));const s=await $(i);t.debug(i,"Coverage results: ",JSON.stringify(s));const o=await z(i);t.debug(i,"Linter results: ",JSON.stringify(o));const c=await K(i);t.debug(i,"E2e results: ",JSON.stringify(c)),await ee({exercise:r,vitest:e,coverage:s,lint:o,e2e:c},i)}catch(r){t.error("Try to fix it and retry!"),i.verbose&&t.error(r),i.local&&(t.error("Running locally, we exit"),process.exit(1))}
package/package.json CHANGED
@@ -1,51 +1,45 @@
1
1
  {
2
2
  "name": "vue-ninja",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "CLI for the exercises of \"Become a ninja with Vue\"",
5
5
  "main": "dist/vue-ninja.js",
6
6
  "exports": null,
7
7
  "type": "module",
8
- "packageManager": "pnpm@9.6.0",
9
- "scripts": {
10
- "build": "rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript --failAfterWarnings",
11
- "test": "vitest",
12
- "lint": "eslint {src,tests}/**/* --ext .ts",
13
- "type-check": "tsc --noEmit"
14
- },
15
8
  "author": "",
16
9
  "license": "ISC",
17
10
  "dependencies": {
18
- "axios": "1.7.2",
19
- "chalk": "5.3.0",
20
- "glob": "11.0.0",
11
+ "axios": "1.11.0",
12
+ "chalk": "5.6.0",
13
+ "glob": "11.0.3",
21
14
  "prompt": "1.3.0",
22
15
  "rimraf": "6.0.1"
23
16
  },
24
17
  "devDependencies": {
25
- "@rollup/plugin-terser": "0.4.4",
26
- "@rollup/plugin-typescript": "11.1.6",
27
- "@types/node": "20.14.12",
28
- "@types/prompt": "1.1.8",
29
- "@typescript-eslint/eslint-plugin": "7.17.0",
30
- "@typescript-eslint/parser": "7.17.0",
31
- "create-vue": "3.10.4",
32
- "eslint": "8.57.0",
33
- "eslint-config-prettier": "9.1.0",
34
- "eslint-plugin-prettier": "5.2.1",
35
- "prettier": "3.3.3",
36
- "rollup": "4.19.0",
37
- "tslib": "2.6.3",
38
- "typescript": "5.5.4",
39
- "vite": "5.3.4",
40
- "vitest": "2.0.4"
18
+ "@eslint/js": "9.34.0",
19
+ "@prettier/plugin-oxc": "0.0.4",
20
+ "@types/node": "22.18.0",
21
+ "@types/prompt": "1.1.9",
22
+ "create-vue": "3.18.0",
23
+ "eslint": "9.34.0",
24
+ "eslint-plugin-import": "2.32.0",
25
+ "jiti": "2.5.1",
26
+ "prettier": "3.6.2",
27
+ "rolldown": "1.0.0-beta.34",
28
+ "rollup-plugin-esbuild": "6.2.1",
29
+ "tslib": "2.8.1",
30
+ "typescript": "5.9.2",
31
+ "typescript-eslint": "8.40.0",
32
+ "vite": "7.1.3",
33
+ "vitest": "3.2.4"
41
34
  },
42
35
  "bin": {
43
36
  "vue-ninja": "dist/vue-ninja.js"
44
37
  },
45
- "prettier": {
46
- "printWidth": 140,
47
- "singleQuote": true,
48
- "arrowParens": "avoid",
49
- "trailingComma": "none"
38
+ "scripts": {
39
+ "build": "rolldown --config rolldown.config.ts",
40
+ "test": "vitest",
41
+ "lint": "eslint {src,tests}/**/* --ext .ts",
42
+ "format": "prettier --write .",
43
+ "type-check": "tsc --noEmit"
50
44
  }
51
- }
45
+ }
@@ -0,0 +1,2 @@
1
+ ignoredBuiltDependencies:
2
+ - esbuild