mirror of
https://github.com/withastro/astro.git
synced 2024-12-30 22:03:56 -05:00
Enables eslint on the full repo and adds a rule for no only()
tests (#3659)
* enabling eslint on the all packages and tests * enabling for all packages * TEMP: adding an only() test to verify it fails CI * using our eslint config and ignore in CI * removing the temporary .only() test * update lock file * lint: fixing new test with a no-shadow warning * chore: update lock file
This commit is contained in:
parent
f6400e694e
commit
b8c6dabfb7
23 changed files with 61 additions and 43 deletions
|
@ -1,8 +1,9 @@
|
||||||
**/*.js
|
**/*.d.ts
|
||||||
**/*.ts
|
packages/**/dist/**/*
|
||||||
!packages/astro/**/*.js
|
packages/**/fixtures/**/*
|
||||||
!packages/astro/**/*.ts
|
packages/webapi/**/*
|
||||||
packages/astro/test/**/*.js
|
|
||||||
packages/astro/vendor/vite/**/*
|
packages/astro/vendor/vite/**/*
|
||||||
|
examples/**/*
|
||||||
|
scripts/**/*
|
||||||
.github
|
.github
|
||||||
.changeset
|
.changeset
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
parser: '@typescript-eslint/parser',
|
parser: '@typescript-eslint/parser',
|
||||||
extends: ['plugin:@typescript-eslint/recommended', 'prettier'],
|
extends: ['plugin:@typescript-eslint/recommended', 'prettier'],
|
||||||
plugins: ['@typescript-eslint', 'prettier'],
|
plugins: ['@typescript-eslint', 'prettier', 'no-only-tests'],
|
||||||
rules: {
|
rules: {
|
||||||
'@typescript-eslint/ban-ts-comment': 'off',
|
'@typescript-eslint/ban-ts-comment': 'off',
|
||||||
'@typescript-eslint/camelcase': 'off',
|
'@typescript-eslint/camelcase': 'off',
|
||||||
|
@ -17,5 +17,6 @@ module.exports = {
|
||||||
'prefer-const': 'off',
|
'prefer-const': 'off',
|
||||||
'no-shadow': 'off',
|
'no-shadow': 'off',
|
||||||
'@typescript-eslint/no-shadow': ['error'],
|
'@typescript-eslint/no-shadow': ['error'],
|
||||||
|
'no-only-tests/no-only-tests': 'error'
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
3
.github/workflows/ci.yml
vendored
3
.github/workflows/ci.yml
vendored
|
@ -54,9 +54,6 @@ jobs:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
eslint: true
|
eslint: true
|
||||||
eslint_args: --ignore-pattern test --ignore-pattern vendor
|
|
||||||
eslint_dir: packages/astro
|
|
||||||
eslint_extensions: ts
|
|
||||||
prettier: false
|
prettier: false
|
||||||
auto_fix: true
|
auto_fix: true
|
||||||
git_name: github-actions[bot]
|
git_name: github-actions[bot]
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
"test:e2e": "cd packages/astro && pnpm playwright install && pnpm run test:e2e",
|
"test:e2e": "cd packages/astro && pnpm playwright install && pnpm run test:e2e",
|
||||||
"test:e2e:match": "cd packages/astro && pnpm playwright install && pnpm run test:e2e:match",
|
"test:e2e:match": "cd packages/astro && pnpm playwright install && pnpm run test:e2e:match",
|
||||||
"benchmark": "turbo run benchmark --scope=astro",
|
"benchmark": "turbo run benchmark --scope=astro",
|
||||||
"lint": "eslint \"packages/**/*.ts\"",
|
"lint": "eslint .",
|
||||||
"version": "changeset version && pnpm install --no-frozen-lockfile && pnpm run format"
|
"version": "changeset version && pnpm install --no-frozen-lockfile && pnpm run format"
|
||||||
},
|
},
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
|
@ -69,6 +69,7 @@
|
||||||
"esbuild": "^0.14.42",
|
"esbuild": "^0.14.42",
|
||||||
"eslint": "^8.16.0",
|
"eslint": "^8.16.0",
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
|
"eslint-plugin-no-only-tests": "^2.6.0",
|
||||||
"eslint-plugin-prettier": "^4.0.0",
|
"eslint-plugin-prettier": "^4.0.0",
|
||||||
"execa": "^6.1.0",
|
"execa": "^6.1.0",
|
||||||
"organize-imports-cli": "^0.10.0",
|
"organize-imports-cli": "^0.10.0",
|
||||||
|
|
|
@ -8,8 +8,8 @@ const test = base.extend({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
function runTest(test) {
|
function runTest(it) {
|
||||||
test('client:idle', async ({ page, astro }) => {
|
it('client:idle', async ({ page, astro }) => {
|
||||||
await page.goto(astro.resolveUrl('/'));
|
await page.goto(astro.resolveUrl('/'));
|
||||||
|
|
||||||
const counter = page.locator('#client-idle');
|
const counter = page.locator('#client-idle');
|
||||||
|
|
|
@ -52,8 +52,8 @@ describe('CSS Bundling', function () {
|
||||||
|
|
||||||
// test 3: assert all bundled CSS was built and contains CSS
|
// test 3: assert all bundled CSS was built and contains CSS
|
||||||
for (const url of builtCSS.keys()) {
|
for (const url of builtCSS.keys()) {
|
||||||
const css = await fixture.readFile(url);
|
const bundledCss = await fixture.readFile(url);
|
||||||
expect(css).to.be.ok;
|
expect(bundledCss).to.be.ok;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -20,7 +20,7 @@ describe('Sass', () => {
|
||||||
// TODO: Sass cannot be found on macOS for some reason... Vite issue?
|
// TODO: Sass cannot be found on macOS for some reason... Vite issue?
|
||||||
const test = os.platform() === 'darwin' ? it.skip : it;
|
const test = os.platform() === 'darwin' ? it.skip : it;
|
||||||
test('shows helpful error on failure', async () => {
|
test('shows helpful error on failure', async () => {
|
||||||
const res = await fixture.fetch('/error').then((res) => res.text());
|
const text = await fixture.fetch('/error').then((res) => res.text());
|
||||||
expect(res).to.include('Undefined variable');
|
expect(text).to.include('Undefined variable');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -26,8 +26,8 @@ describe('Integration buildConfig hook', () => {
|
||||||
if (id === '@my-ssr') {
|
if (id === '@my-ssr') {
|
||||||
return id;
|
return id;
|
||||||
} else if (id === 'astro/app') {
|
} else if (id === 'astro/app') {
|
||||||
const id = viteID(new URL('../dist/core/app/index.js', import.meta.url));
|
const viteId = viteID(new URL('../dist/core/app/index.js', import.meta.url));
|
||||||
return id;
|
return viteId;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
load(id) {
|
load(id) {
|
||||||
|
|
|
@ -2,11 +2,10 @@ import { expect } from 'chai';
|
||||||
import { loadFixture } from './test-utils.js';
|
import { loadFixture } from './test-utils.js';
|
||||||
|
|
||||||
describe('Static build: pages routes have distURL', () => {
|
describe('Static build: pages routes have distURL', () => {
|
||||||
/** @type {import('./test-utils').Fixture} */
|
|
||||||
let fixture;
|
|
||||||
/** @type {RouteData[]} */
|
/** @type {RouteData[]} */
|
||||||
let checkRoutes;
|
let checkRoutes;
|
||||||
before(async () => {
|
before(async () => {
|
||||||
|
/** @type {import('./test-utils').Fixture} */
|
||||||
const fixture = await loadFixture({
|
const fixture = await loadFixture({
|
||||||
root: './fixtures/astro pages/',
|
root: './fixtures/astro pages/',
|
||||||
integrations: [
|
integrations: [
|
||||||
|
|
|
@ -2,8 +2,6 @@ import { expect } from 'chai';
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import { loadFixture } from './test-utils.js';
|
import { loadFixture } from './test-utils.js';
|
||||||
|
|
||||||
let fixture;
|
|
||||||
|
|
||||||
describe('Tailwind', () => {
|
describe('Tailwind', () => {
|
||||||
let fixture;
|
let fixture;
|
||||||
|
|
||||||
|
@ -62,10 +60,10 @@ describe('Tailwind', () => {
|
||||||
|
|
||||||
it('handles Markdown pages', async () => {
|
it('handles Markdown pages', async () => {
|
||||||
const html = await fixture.readFile('/markdown-page/index.html');
|
const html = await fixture.readFile('/markdown-page/index.html');
|
||||||
const $ = cheerio.load(html);
|
const $md = cheerio.load(html);
|
||||||
const bundledCSSHREF = $('link[rel=stylesheet][href^=/assets/]').attr('href');
|
const bundledCSSHREF = $md('link[rel=stylesheet][href^=/assets/]').attr('href');
|
||||||
const bundledCSS = await fixture.readFile(bundledCSSHREF.replace(/^\/?/, '/'));
|
const mdBundledCSS = await fixture.readFile(bundledCSSHREF.replace(/^\/?/, '/'));
|
||||||
expect(bundledCSS, 'includes used component classes').to.match(/\.bg-purple-600{/);
|
expect(mdBundledCSS, 'includes used component classes').to.match(/\.bg-purple-600{/);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -17,8 +17,8 @@ export default function () {
|
||||||
if (id === '@my-ssr') {
|
if (id === '@my-ssr') {
|
||||||
return id;
|
return id;
|
||||||
} else if (id === 'astro/app') {
|
} else if (id === 'astro/app') {
|
||||||
const id = viteID(new URL('../dist/core/app/index.js', import.meta.url));
|
const viteId = viteID(new URL('../dist/core/app/index.js', import.meta.url));
|
||||||
return id;
|
return viteId;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
load(id) {
|
load(id) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
/* eslint no-console: 'off' */
|
||||||
import degit from 'degit';
|
import degit from 'degit';
|
||||||
import { execa, execaCommand } from 'execa';
|
import { execa, execaCommand } from 'execa';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { resolve } from 'path';
|
import path from 'path';
|
||||||
import { promises, existsSync } from 'fs';
|
import { promises, existsSync } from 'fs';
|
||||||
import { PROMPT_MESSAGES, testDir, setup, promiseWithTimeout, timeout } from './utils.js';
|
import { PROMPT_MESSAGES, testDir, setup, promiseWithTimeout, timeout } from './utils.js';
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ describe('[create-astro] select directory', function () {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('should proceed on an empty directory', async function () {
|
it('should proceed on an empty directory', async function () {
|
||||||
const resolvedEmptyDirPath = resolve(testDir, inputs.emptyDir);
|
const resolvedEmptyDirPath = path.resolve(testDir, inputs.emptyDir);
|
||||||
if (!existsSync(resolvedEmptyDirPath)) {
|
if (!existsSync(resolvedEmptyDirPath)) {
|
||||||
await promises.mkdir(resolvedEmptyDirPath);
|
await promises.mkdir(resolvedEmptyDirPath);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,7 @@ export function start(manifest: SSRManifest, options: Options) {
|
||||||
});
|
});
|
||||||
|
|
||||||
_startPromise = Promise.resolve(_server.listenAndServe());
|
_startPromise = Promise.resolve(_server.listenAndServe());
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
console.error(`Server running on port ${port}`);
|
console.error(`Server running on port ${port}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ Deno.test({
|
||||||
const div = doc.querySelector('#thing');
|
const div = doc.querySelector('#thing');
|
||||||
assert(div, 'div exists');
|
assert(div, 'div exists');
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
console.error(err);
|
console.error(err);
|
||||||
} finally {
|
} finally {
|
||||||
await close();
|
await close();
|
||||||
|
|
|
@ -200,7 +200,7 @@ export default function (dir, opts = {}) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let lookup = opts.dev ? viaLocal.bind(0, dir, isEtag) : viaCache.bind(0, FILES);
|
let fileLookup = opts.dev ? viaLocal.bind(0, dir, isEtag) : viaCache.bind(0, FILES);
|
||||||
|
|
||||||
return function (req, res, next) {
|
return function (req, res, next) {
|
||||||
let extns = [''];
|
let extns = [''];
|
||||||
|
@ -224,7 +224,7 @@ export default function (dir, opts = {}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
let data =
|
let data =
|
||||||
lookup(pathname, extns) || (isSPA && !isMatch(pathname, ignores) && lookup(fallback, extns));
|
fileLookup(pathname, extns) || (isSPA && !isMatch(pathname, ignores) && fileLookup(fallback, extns));
|
||||||
if (!data) return next ? next() : isNotFound(req, res);
|
if (!data) return next ? next() : isNotFound(req, res);
|
||||||
|
|
||||||
if (isEtag && req.headers['if-none-match'] === data.headers['ETag']) {
|
if (isEtag && req.headers['if-none-match'] === data.headers['ETag']) {
|
||||||
|
|
|
@ -23,7 +23,7 @@ export class Logger implements ILogger {
|
||||||
this.packageName = packageName;
|
this.packageName = packageName;
|
||||||
}
|
}
|
||||||
|
|
||||||
private log(msg: string, prefix: string = '') {
|
private log(msg: string, prefix = '') {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(`%s${this.packageName}:%s ${msg}\n`, prefix, prefix ? this.colors.reset : '');
|
console.log(`%s${this.packageName}:%s ${msg}\n`, prefix, prefix ? this.colors.reset : '');
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ export const validateOptions = (site: string | undefined, opts: SitemapOptions)
|
||||||
site: z.string().optional(), // Astro takes care of `site`: how to validate, transform and refine
|
site: z.string().optional(), // Astro takes care of `site`: how to validate, transform and refine
|
||||||
canonicalURL: z.string().optional(), // `canonicalURL` is already validated in prev step
|
canonicalURL: z.string().optional(), // `canonicalURL` is already validated in prev step
|
||||||
})
|
})
|
||||||
.refine(({ site, canonicalURL }) => site || canonicalURL, {
|
.refine((options) => options.site || options.canonicalURL, {
|
||||||
message: 'Required `site` astro.config option or `canonicalURL` integration option',
|
message: 'Required `site` astro.config option or `canonicalURL` integration option',
|
||||||
})
|
})
|
||||||
.parse({
|
.parse({
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import type { PathLike } from 'node:fs';
|
import type { PathLike } from 'node:fs';
|
||||||
import * as fs from 'node:fs/promises';
|
import * as fs from 'node:fs/promises';
|
||||||
|
|
||||||
export async function writeJson<T extends any>(path: PathLike, data: T) {
|
export async function writeJson<T>(path: PathLike, data: T) {
|
||||||
await fs.writeFile(path, JSON.stringify(data), { encoding: 'utf-8' });
|
await fs.writeFile(path, JSON.stringify(data), { encoding: 'utf-8' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,8 @@ export async function renderMarkdown(
|
||||||
const loadedRemarkPlugins = await Promise.all(loadPlugins(remarkPlugins));
|
const loadedRemarkPlugins = await Promise.all(loadPlugins(remarkPlugins));
|
||||||
const loadedRehypePlugins = await Promise.all(loadPlugins(rehypePlugins));
|
const loadedRehypePlugins = await Promise.all(loadPlugins(rehypePlugins));
|
||||||
|
|
||||||
loadedRemarkPlugins.forEach(([plugin, opts]) => {
|
loadedRemarkPlugins.forEach(([plugin, pluginOpts]) => {
|
||||||
parser.use([[plugin, opts]]);
|
parser.use([[plugin, pluginOpts]]);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (scopedClassName) {
|
if (scopedClassName) {
|
||||||
|
@ -87,8 +87,8 @@ export async function renderMarkdown(
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
loadedRehypePlugins.forEach(([plugin, opts]) => {
|
loadedRehypePlugins.forEach(([plugin, pluginOpts]) => {
|
||||||
parser.use([[plugin, opts]]);
|
parser.use([[plugin, pluginOpts]]);
|
||||||
});
|
});
|
||||||
|
|
||||||
parser
|
parser
|
||||||
|
@ -106,6 +106,7 @@ export async function renderMarkdown(
|
||||||
// Ensure that the error message contains the input filename
|
// Ensure that the error message contains the input filename
|
||||||
// to make it easier for the user to fix the issue
|
// to make it easier for the user to fix the issue
|
||||||
err = prefixError(err, `Failed to parse Markdown file "${input.path}"`);
|
err = prefixError(err, `Failed to parse Markdown file "${input.path}"`);
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
console.error(err);
|
console.error(err);
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ export default function createCollectHeaders() {
|
||||||
|
|
||||||
let text = '';
|
let text = '';
|
||||||
let isJSX = false;
|
let isJSX = false;
|
||||||
visit(node, (child, _, parent) => {
|
visit(node, (child, __, parent) => {
|
||||||
if (child.type === 'element' || parent == null) {
|
if (child.type === 'element' || parent == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,9 @@ function runHighlighter(lang: string, code: string) {
|
||||||
lang = 'plaintext';
|
lang = 'plaintext';
|
||||||
}
|
}
|
||||||
|
|
||||||
const ensureLoaded = (lang: string) => {
|
const ensureLoaded = (language: string) => {
|
||||||
if (lang && !Prism.languages[lang]) {
|
if (language && !Prism.languages[language]) {
|
||||||
loadLanguages([lang]);
|
loadLanguages([language]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ function runHighlighter(lang: string, code: string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lang && !Prism.languages[lang]) {
|
if (lang && !Prism.languages[lang]) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
console.warn(`Unable to load the language: ${lang}`);
|
console.warn(`Unable to load the language: ${lang}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ importers:
|
||||||
esbuild: ^0.14.42
|
esbuild: ^0.14.42
|
||||||
eslint: ^8.16.0
|
eslint: ^8.16.0
|
||||||
eslint-config-prettier: ^8.5.0
|
eslint-config-prettier: ^8.5.0
|
||||||
|
eslint-plugin-no-only-tests: ^2.6.0
|
||||||
eslint-plugin-prettier: ^4.0.0
|
eslint-plugin-prettier: ^4.0.0
|
||||||
execa: ^6.1.0
|
execa: ^6.1.0
|
||||||
organize-imports-cli: ^0.10.0
|
organize-imports-cli: ^0.10.0
|
||||||
|
@ -35,6 +36,7 @@ importers:
|
||||||
esbuild: 0.14.43
|
esbuild: 0.14.43
|
||||||
eslint: 8.17.0
|
eslint: 8.17.0
|
||||||
eslint-config-prettier: 8.5.0_eslint@8.17.0
|
eslint-config-prettier: 8.5.0_eslint@8.17.0
|
||||||
|
eslint-plugin-no-only-tests: 2.6.0
|
||||||
eslint-plugin-prettier: 4.0.0_ucegkljdju7q4zmvwxzqoprf3y
|
eslint-plugin-prettier: 4.0.0_ucegkljdju7q4zmvwxzqoprf3y
|
||||||
execa: 6.1.0
|
execa: 6.1.0
|
||||||
organize-imports-cli: 0.10.0
|
organize-imports-cli: 0.10.0
|
||||||
|
@ -8248,6 +8250,11 @@ packages:
|
||||||
|
|
||||||
/debug/3.2.7:
|
/debug/3.2.7:
|
||||||
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
|
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
|
||||||
|
peerDependencies:
|
||||||
|
supports-color: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
supports-color:
|
||||||
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
ms: 2.1.3
|
ms: 2.1.3
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -8883,6 +8890,11 @@ packages:
|
||||||
eslint: 8.17.0
|
eslint: 8.17.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/eslint-plugin-no-only-tests/2.6.0:
|
||||||
|
resolution: {integrity: sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==}
|
||||||
|
engines: {node: '>=4.0.0'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/eslint-plugin-prettier/4.0.0_ucegkljdju7q4zmvwxzqoprf3y:
|
/eslint-plugin-prettier/4.0.0_ucegkljdju7q4zmvwxzqoprf3y:
|
||||||
resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==}
|
resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
|
@ -11164,6 +11176,8 @@ packages:
|
||||||
debug: 3.2.7
|
debug: 3.2.7
|
||||||
iconv-lite: 0.4.24
|
iconv-lite: 0.4.24
|
||||||
sax: 1.2.4
|
sax: 1.2.4
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/netmask/2.0.2:
|
/netmask/2.0.2:
|
||||||
|
@ -11247,6 +11261,8 @@ packages:
|
||||||
rimraf: 2.7.1
|
rimraf: 2.7.1
|
||||||
semver: 5.7.1
|
semver: 5.7.1
|
||||||
tar: 4.4.19
|
tar: 4.4.19
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/node-releases/2.0.5:
|
/node-releases/2.0.5:
|
||||||
|
|
Loading…
Reference in a new issue