Skip to content

Commit

Permalink
Merge branch 'master' into fullscreen-analyzer
Browse files Browse the repository at this point in the history
  • Loading branch information
kqualters-elastic committed Sep 2, 2021
2 parents 0c1da5a + 56669c0 commit 1067696
Show file tree
Hide file tree
Showing 289 changed files with 3,317 additions and 2,595 deletions.
19 changes: 19 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -1656,5 +1656,24 @@ module.exports = {
'@typescript-eslint/prefer-ts-expect-error': 'error',
},
},

/**
* Disallow `export *` syntax in plugin/core public/server/common index files and instead
* require that plugins/core explicitly export the APIs that should be accessible outside the plugin.
*
* To add your plugin to this list just update the relevant glob with the name of your plugin
*/
{
files: [
'src/core/{server,public,common}/index.ts',
'src/plugins/*/{server,public,common}/index.ts',
'src/plugins/*/*/{server,public,common}/index.ts',
'x-pack/plugins/*/{server,public,common}/index.ts',
'x-pack/plugins/*/*/{server,public,common}/index.ts',
],
rules: {
'@kbn/eslint/no_export_all': 'error',
},
},
],
};
1 change: 1 addition & 0 deletions packages/kbn-eslint-plugin-eslint/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ PKG_REQUIRE_NAME = "@kbn/eslint-plugin-eslint"
SOURCE_FILES = glob(
[
"rules/**/*.js",
"helpers/**/*.js",
"index.js",
"lib.js",
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@
* Side Public License, v 1.
*/

import './action_bar_directive';
/* eslint-disable no-restricted-syntax */

export class Bar {}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,8 @@
* Side Public License, v 1.
*/

export { handleSourceColumnState } from './state_helpers';
export { PromiseServiceCreator } from './promises';
/* eslint-disable no-restricted-syntax */

export const one = 1;
export const two = 2;
export const three = 3;
31 changes: 31 additions & 0 deletions packages/kbn-eslint-plugin-eslint/__fixtures__/foo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

/* eslint-disable no-restricted-syntax */

export type { Bar as ReexportedClass } from './bar';

export const someConst = 'bar';

// eslint-disable-next-line prefer-const
export let someLet = 'bar';

export function someFunction() {}

export class SomeClass {}

export interface SomeInterface {
prop: number;
}

export enum SomeEnum {
a = 'a',
b = 'b',
}

export type TypeAlias = string[];
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
* Side Public License, v 1.
*/

// required for i18nIdDirective
import 'angular-sanitize';
/* eslint-disable no-restricted-syntax */

import './doc';
import './context';
export * from './foo';
82 changes: 82 additions & 0 deletions packages/kbn-eslint-plugin-eslint/helpers/codegen.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

const t = require('@babel/types');
const { default: generate } = require('@babel/generator');

/** @typedef {import('./export_set').ExportSet} ExportSet */

/**
* Generate code for replacing a `export * from './path'`, ie.
*
* export type { foo } from './path'
* export { bar } from './path'
* @param {ExportSet} exportSet
* @param {string} source
*/
const getExportCode = (exportSet, source) => {
const exportedTypes = exportSet.types.size
? t.exportNamedDeclaration(
undefined,
Array.from(exportSet.types).map((n) => t.exportSpecifier(t.identifier(n), t.identifier(n))),
t.stringLiteral(source)
)
: undefined;

if (exportedTypes) {
exportedTypes.exportKind = 'type';
}

const exportedValues = exportSet.values.size
? t.exportNamedDeclaration(
undefined,
Array.from(exportSet.values).map((n) =>
t.exportSpecifier(t.identifier(n), t.identifier(n))
),
t.stringLiteral(source)
)
: undefined;

return generate(t.program([exportedTypes, exportedValues].filter(Boolean))).code;
};

/**
* Generate code for replacing a `export * as name from './path'`, ie.
*
* import { foo, bar } from './path'
* export const name = { foo, bar }
*
* @param {string} nsName
* @param {string[]} exportNames
* @param {string} source
*/
const getExportNamedNamespaceCode = (nsName, exportNames, source) => {
return generate(
t.program([
t.importDeclaration(
exportNames.map((n) => t.importSpecifier(t.identifier(n), t.identifier(n))),
t.stringLiteral(source)
),
t.exportNamedDeclaration(
t.variableDeclaration('const', [
t.variableDeclarator(
t.identifier(nsName),
t.objectExpression(
exportNames.map((n) =>
t.objectProperty(t.identifier(n), t.identifier(n), false, true)
)
)
),
])
),
])
).code;
};

module.exports = { getExportCode, getExportNamedNamespaceCode };
34 changes: 34 additions & 0 deletions packages/kbn-eslint-plugin-eslint/helpers/export_set.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

/**
* Helper class to collect exports of different types, either "value" exports or "type" exports
*/
class ExportSet {
constructor() {
/** @type {Set<string>} */
this.values = new Set();

/** @type {Set<string>} */
this.types = new Set();
}

get size() {
return this.values.size + this.types.size;
}

/**
* @param {'value'|'type'} type
* @param {string} value
*/
add(type, value) {
this[type + 's'].add(value);
}
}

module.exports = { ExportSet };
Loading

0 comments on commit 1067696

Please sign in to comment.