449 lines
12 KiB
JavaScript
449 lines
12 KiB
JavaScript
/* eslint-disable-line @kbn/eslint/require-license-header */
|
|
/*
|
|
* This product uses import/no-restricted-paths which is available under a
|
|
* "MIT" license.
|
|
*
|
|
* The MIT License (MIT)
|
|
*
|
|
* Copyright (c) 2015-present, Ben Mosher
|
|
* https://github.com/benmosher/eslint-plugin-import
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
|
|
const path = require('path');
|
|
const { RuleTester } = require('eslint');
|
|
const rule = require('./no_restricted_paths');
|
|
|
|
const ruleTester = new RuleTester({
|
|
parser: require.resolve('babel-eslint'),
|
|
parserOptions: {
|
|
sourceType: 'module',
|
|
ecmaVersion: 2018,
|
|
},
|
|
});
|
|
|
|
ruleTester.run('@kbn/eslint/no-restricted-paths', rule, {
|
|
valid: [
|
|
{
|
|
code: 'import a from "../client/a.js"',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/server/b.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: '__fixtures__/no_restricted_paths/server/**/*',
|
|
from: '__fixtures__/no_restricted_paths/other/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'const a = require("../client/a.js")',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/server/b.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: '__fixtures__/no_restricted_paths/server/**/*',
|
|
from: '__fixtures__/no_restricted_paths/other/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'import b from "../server/b.js"',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/client/a.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: '**/no_restricted_paths/client/**/*',
|
|
from: '**/no_restricted_paths/other/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
// irrelevant function calls
|
|
{
|
|
code: 'notrequire("../server/b.js")',
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'notrequire("../server/b.js")',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/client/a.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: '__fixtures__/no_restricted_paths/client/**/*',
|
|
from: '__fixtures__/no_restricted_paths/server/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
// no config
|
|
{
|
|
code: 'require("../server/b.js")',
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'import b from "../server/b.js"',
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
},
|
|
],
|
|
},
|
|
|
|
// builtin (ignore)
|
|
{
|
|
code: 'require("os")',
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
code: 'const d = require("./deep/d.js")',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/server/b.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
allowSameFolder: true,
|
|
target: '__fixtures__/no_restricted_paths/**/*',
|
|
from: '__fixtures__/no_restricted_paths/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'const d = require("./deep/d.js")',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/server/b.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
allowSameFolder: true,
|
|
target: '__fixtures__/no_restricted_paths/**/*',
|
|
from: [
|
|
'__fixtures__/no_restricted_paths/**/*',
|
|
'!__fixtures__/no_restricted_paths/server/b*',
|
|
],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
// Check if dirs that start with 'index' work correctly.
|
|
code: 'import { X } from "./index_patterns"',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/server/b.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: ['__fixtures__/no_restricted_paths/(public|server)/**/*'],
|
|
from: [
|
|
'__fixtures__/no_restricted_paths/server/**/*',
|
|
'!__fixtures__/no_restricted_paths/server/index.{ts,tsx}',
|
|
],
|
|
allowSameFolder: true,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
|
|
invalid: [
|
|
{
|
|
code: 'export { b } from "../server/b.js"',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/client/a.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: '__fixtures__/no_restricted_paths/client/**/*',
|
|
from: '__fixtures__/no_restricted_paths/server/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
errors: [
|
|
{
|
|
message: 'Unexpected path "../server/b.js" imported in restricted zone.',
|
|
line: 1,
|
|
column: 19,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'import b from "../server/b.js"',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/client/a.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: '__fixtures__/no_restricted_paths/client/**/*',
|
|
from: '__fixtures__/no_restricted_paths/server/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
errors: [
|
|
{
|
|
message: 'Unexpected path "../server/b.js" imported in restricted zone.',
|
|
line: 1,
|
|
column: 15,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'import a from "../client/a"\nimport c from "./c"',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/server/b.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: '__fixtures__/no_restricted_paths/server/**/*',
|
|
from: '__fixtures__/no_restricted_paths/client/**/*',
|
|
},
|
|
{
|
|
target: '__fixtures__/no_restricted_paths/server/**/*',
|
|
from: '__fixtures__/no_restricted_paths/server/c.js',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
errors: [
|
|
{
|
|
message: 'Unexpected path "../client/a" imported in restricted zone.',
|
|
line: 1,
|
|
column: 15,
|
|
},
|
|
{
|
|
message: 'Unexpected path "./c" imported in restricted zone.',
|
|
line: 2,
|
|
column: 15,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'const b = require("../server/b.js")',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/client/a.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: '**/no_restricted_paths/client/**/*',
|
|
from: '**/no_restricted_paths/server/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
errors: [
|
|
{
|
|
message: 'Unexpected path "../server/b.js" imported in restricted zone.',
|
|
line: 1,
|
|
column: 19,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
code: 'const b = require("../server/b.js")',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/client/a.js'),
|
|
options: [
|
|
{
|
|
basePath: path.join(__dirname, '__fixtures__', 'no_restricted_paths'),
|
|
zones: [
|
|
{
|
|
target: 'client/**/*',
|
|
from: 'server/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
errors: [
|
|
{
|
|
message: 'Unexpected path "../server/b.js" imported in restricted zone.',
|
|
line: 1,
|
|
column: 19,
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
code: 'const d = require("./deep/d.js")',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/server/b.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: '__fixtures__/no_restricted_paths/**/*',
|
|
from: '__fixtures__/no_restricted_paths/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
errors: [
|
|
{
|
|
message: 'Unexpected path "./deep/d.js" imported in restricted zone.',
|
|
line: 1,
|
|
column: 19,
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
// Does not allow to import deeply within Core, using "src/core/..." Webpack alias.
|
|
code: 'const d = require("src/core/server/saved_objects")',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/client/a.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: '__fixtures__/no_restricted_paths/**/*',
|
|
from: 'src/core/server/**/*',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
errors: [
|
|
{
|
|
message: 'Unexpected path "src/core/server/saved_objects" imported in restricted zone.',
|
|
line: 1,
|
|
column: 19,
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
// Does not allow to import "ui/kfetch".
|
|
code: 'const d = require("ui/kfetch")',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/client/a.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
from: ['src/legacy/ui/**/*', 'ui/**/*'],
|
|
target: '__fixtures__/no_restricted_paths/**/*',
|
|
allowSameFolder: true,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
errors: [
|
|
{
|
|
message: 'Unexpected path "ui/kfetch" imported in restricted zone.',
|
|
line: 1,
|
|
column: 19,
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
// Does not allow to import deeply "ui/kfetch/public/index".
|
|
code: 'const d = require("ui/kfetch/public/index")',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/client/a.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
from: ['src/legacy/ui/**/*', 'ui/**/*'],
|
|
target: '__fixtures__/no_restricted_paths/**/*',
|
|
allowSameFolder: true,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
errors: [
|
|
{
|
|
message: 'Unexpected path "ui/kfetch/public/index" imported in restricted zone.',
|
|
line: 1,
|
|
column: 19,
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
// Don't use index*.
|
|
// It won't work with dirs that start with 'index'.
|
|
code: 'import { X } from "./index_patterns"',
|
|
filename: path.join(__dirname, './__fixtures__/no_restricted_paths/server/b.js'),
|
|
options: [
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: ['__fixtures__/no_restricted_paths/(public|server)/**/*'],
|
|
from: [
|
|
'__fixtures__/no_restricted_paths/server/**/*',
|
|
'!__fixtures__/no_restricted_paths/server/index*',
|
|
],
|
|
allowSameFolder: true,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
errors: [
|
|
{
|
|
message: 'Unexpected path "./index_patterns" imported in restricted zone.',
|
|
line: 1,
|
|
column: 19,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
});
|