import nodeResolve from '@rollup/plugin-node-resolve'
import babel from '@rollup/plugin-babel'
import replace from '@rollup/plugin-replace'
import typescript from '@rollup/plugin-typescript'
import { terser } from 'rollup-plugin-terser'

import pkg from './package.json'

const extensions = [ '.ts' ]

const babelRuntimeVersion = pkg.dependencies[ '@babel/runtime' ].replace(
    /^[^0-9]*/,
    ''
)

const makeExternalPredicate = externalArr => {
    if ( externalArr.length === 0 ) {
        return () => false
    }
    const pattern = new RegExp( `^(${ externalArr.join( '|' ) })($|/)` )
    return id => pattern.test( id )
}

export default [
    // CommonJS
    {
        input: 'src/index.ts',
        output: { file: 'lib/rxstore-observer.js', format: 'cjs', indent: false },
        external: makeExternalPredicate( [
            ...Object.keys( pkg.dependencies || {} ),
            ...Object.keys( pkg.peerDependencies || {} ),
        ] ),
        plugins: [
            nodeResolve( {
                extensions,
            } ),
            typescript( { declaration: false } ),
            babel( {
                presets: [ '@babel/preset-env' ],
                extensions,
                plugins: [
                    [ '@babel/plugin-proposal-decorators', { legacy: true } ],
                    '@babel/plugin-proposal-class-properties',
                    '@babel/plugin-proposal-object-rest-spread',
                    'babel-plugin-transform-typescript-metadata',
                    [ '@babel/plugin-transform-runtime', { version: babelRuntimeVersion } ],
                ],
                babelHelpers: 'runtime'
            } ),
        ],
    },

    // ES
    {
        input: 'src/index.ts',
        output: { file: 'es/rxstore-observer.js', format: 'es', indent: false },
        external: makeExternalPredicate( [
            ...Object.keys( pkg.dependencies || {} ),
            ...Object.keys( pkg.peerDependencies || {} ),
        ] ),
        plugins: [
            nodeResolve( {
                extensions,
            } ),
            typescript( { declaration: false } ),
            babel( {
                presets: [ '@babel/preset-env' ],
                extensions,
                plugins: [
                    [ '@babel/plugin-proposal-decorators', { legacy: true } ],
                    '@babel/plugin-proposal-class-properties',
                    '@babel/plugin-proposal-object-rest-spread',
                    'babel-plugin-transform-typescript-metadata',
                    [
                        '@babel/plugin-transform-runtime',
                        { version: babelRuntimeVersion, useESModules: true },
                    ],
                ],
                babelHelpers: 'runtime'
            } ),
        ],
    },

    // ES for Browsers
    {
        input: 'src/index.ts',
        output: { file: 'es/rxstore-observer.mjs', format: 'es', indent: false },
        external: makeExternalPredicate( [
            ...Object.keys( pkg.dependencies || {} ),
            ...Object.keys( pkg.peerDependencies || {} ),
        ] ),
        plugins: [
            nodeResolve( {
                extensions,
            } ),
            replace( {
                preventAssignment: true,
                'process.env.NODE_ENV': JSON.stringify( 'production' ),
            } ),
            typescript( { declaration: false } ),
            babel( {
                presets: [ '@babel/preset-env' ],
                extensions,
                exclude: 'node_modules/**',
                plugins: [
                    [ '@babel/plugin-proposal-decorators', { legacy: true } ],
                    '@babel/plugin-proposal-class-properties',
                    '@babel/plugin-proposal-object-rest-spread',
                    'babel-plugin-transform-typescript-metadata',
                ]
            } ),
            terser( {
                compress: {
                    pure_getters: true,
                    unsafe: true,
                    unsafe_comps: true,
                    warnings: false,
                },
            } ),
        ],
    },

    // UMD Development
    {
        input: 'src/index.ts',
        output: {
            file: 'dist/rxstore-observer.js',
            format: 'umd',
            name: 'Rxstore Observer',
            indent: false,
        },
        external: makeExternalPredicate( [
            ...Object.keys( pkg.dependencies || {} ),
            ...Object.keys( pkg.peerDependencies || {} ),
        ] ),
        plugins: [
            nodeResolve( {
                extensions,
            } ),
            typescript( { declaration: false } ),
            babel( {
                presets: [ '@babel/preset-env' ],
                extensions,
                exclude: 'node_modules/**',
                plugins: [
                    [ '@babel/plugin-proposal-decorators', { legacy: true } ],
                    '@babel/plugin-proposal-class-properties',
                    '@babel/plugin-proposal-object-rest-spread',
                    'babel-plugin-transform-typescript-metadata',
                ]
            } ),
            replace( {
                preventAssignment: true,
                'process.env.NODE_ENV': JSON.stringify( 'development' ),
            } ),
        ],
    },

    // UMD Production
    {
        input: 'src/index.ts',
        output: {
            file: 'dist/rxstore-observer.min.js',
            format: 'umd',
            name: 'Rxstore Observer',
            indent: false,
        },
        external: makeExternalPredicate( [
            ...Object.keys( pkg.dependencies || {} ),
            ...Object.keys( pkg.peerDependencies || {} ),
        ] ),
        plugins: [
            nodeResolve( {
                extensions,
            } ),
            typescript( { 
                declaration: false,
            } ),
            babel( {
                presets: [ '@babel/preset-env' ],
                extensions,
                exclude: 'node_modules/**',
                plugins: [
                    [ '@babel/plugin-proposal-decorators', { legacy: true } ],
                    '@babel/plugin-proposal-class-properties',
                    '@babel/plugin-proposal-object-rest-spread',
                    'babel-plugin-transform-typescript-metadata',
                ]
            } ),
            replace( {
                preventAssignment: true,
                'process.env.NODE_ENV': JSON.stringify( 'production' ),
            } ),
            terser( {
                compress: {
                    pure_getters: true,
                    unsafe: true,
                    unsafe_comps: true,
                    warnings: false,
                },
            } ),
        ],
    },
]