summaryrefslogtreecommitdiff
path: root/@linaria/packages/shaker/src/index.ts
diff options
context:
space:
mode:
Diffstat (limited to '@linaria/packages/shaker/src/index.ts')
-rw-r--r--@linaria/packages/shaker/src/index.ts65
1 files changed, 65 insertions, 0 deletions
diff --git a/@linaria/packages/shaker/src/index.ts b/@linaria/packages/shaker/src/index.ts
new file mode 100644
index 0000000..f71353b
--- /dev/null
+++ b/@linaria/packages/shaker/src/index.ts
@@ -0,0 +1,65 @@
+import generator from '@babel/generator';
+import { transformSync } from '@babel/core';
+import type { Program } from '@babel/types';
+import { debug } from '@linaria/logger';
+import type { Evaluator, StrictOptions } from '@linaria/babel-preset';
+import { buildOptions } from '@linaria/babel-preset';
+import shake from './shaker';
+
+function prepareForShake(
+ filename: string,
+ options: StrictOptions,
+ code: string
+): Program {
+ const transformOptions = buildOptions(filename, options);
+
+ transformOptions.ast = true;
+ transformOptions.presets!.unshift([
+ require.resolve('@babel/preset-env'),
+ {
+ targets: 'ie 11',
+ // we need this plugin so we list it explicitly, explanation in `packages/extractor/src/index`
+ include: ['@babel/plugin-transform-template-literals'],
+ },
+ ]);
+ transformOptions.presets!.unshift([
+ require.resolve('@linaria/preeval'),
+ options,
+ ]);
+ transformOptions.plugins!.unshift(
+ require.resolve('babel-plugin-transform-react-remove-prop-types')
+ );
+ transformOptions.plugins!.unshift([
+ require.resolve('@babel/plugin-transform-runtime'),
+ { useESModules: false },
+ ]);
+
+ debug(
+ 'evaluator:shaker:transform',
+ `Transform ${filename} with options ${JSON.stringify(
+ transformOptions,
+ null,
+ 2
+ )}`
+ );
+ const transformed = transformSync(code, transformOptions);
+
+ if (transformed === null || !transformed.ast) {
+ throw new Error(`${filename} cannot be transformed`);
+ }
+
+ return transformed.ast.program;
+}
+
+const shaker: Evaluator = (filename, options, text, only = null) => {
+ const [shaken, imports] = shake(
+ prepareForShake(filename, options, text),
+ only
+ );
+
+ debug('evaluator:shaker:generate', `Generate shaken source code ${filename}`);
+ const { code: shakenCode } = generator(shaken!);
+ return [shakenCode, imports];
+};
+
+export default shaker;