Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:
pull_request:
branches: [main]
jobs:
format:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
Expand Down
16 changes: 4 additions & 12 deletions lib/types.d.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,17 @@
import type { TransformOptions } from 'esbuild'
import type { CompilerOptions, TypeAcquisition } from 'typescript'

export interface TSConfig {
compilerOptions?: CompilerOptions
exclude?: string[]
compileOnSave?: boolean
extends?: string
files?: string[]
include?: string[]
typeAcquisition?: TypeAcquisition
}

export interface Options {
rootDir: string
baseURL: string
atomic?: boolean
hash?: boolean
tsconfig: string | TSConfig
/**@deprecated client will be built based on your default `tsconfig.json` path*/
tsconfig: string
client: {
replaceParentNode: boolean
tsconfig?: string | TSConfig
/**@deprecated client will be built based on your default `tsconfig.json` path*/
tsconfig: string
output: string
}
}
Expand Down
16 changes: 1 addition & 15 deletions playground/rollup.config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
const { nodeResolve } = require('@rollup/plugin-node-resolve')
const { babel } = require('@rollup/plugin-babel')
const preactPlugin = require('@barelyhuman/preact-island-plugins/rollup')
const { DEFAULT_EXTENSIONS } = require('@babel/core')
const typescript = require('@rollup/plugin-typescript').default

/**
Expand All @@ -16,20 +13,9 @@ module.exports = {
plugins: [
typescript({
compilerOptions: {
jsx: 'react-jsx',
jsxImportSource: 'preact',
jsx: 'preserve',
},
}),
preactPlugin(),
babel({
plugins: [
[
'@babel/plugin-transform-react-jsx',
{ runtime: 'automatic', importSource: 'preact' },
],
],
babelHelpers: 'bundled',
extensions: [...DEFAULT_EXTENSIONS, '.ts', '.tsx'],
}),
],
}
101 changes: 31 additions & 70 deletions rollup.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { generateIslands, generateIslandsWithSource } = require('./lib/plugin')
const { writeFileSync, existsSync } = require('fs')
const { transform, build } = require('esbuild')
const { mkdir } = require('fs/promises')
const { dirname } = require('path')
const rollup = require('rollup')
Expand All @@ -19,10 +20,8 @@ const defaultOptions = {
baseURL: '/public',
atomic: true,
hash: false,
tsconfig: './tsconfig.json',
client: {
replaceParentNode: false,
tsconfig: './tsconfig.json',
output: './dist/client',
},
}
Expand All @@ -37,92 +36,54 @@ function rollupPlugin(options = defaultOptions) {
name: 'preact-island-plugin',
// vite specific option
enforce: 'pre',
async transform(_, id) {
async transform(sourceCode, id) {
if (!ALLOWED_EXTENSIONS.includes(path.extname(id))) return
if (id.includes('virtual:')) return
// ignore files that don't exist
if (!existsSync(id)) return

let generatedOutput
const normalizedCode = await transform(sourceCode, {
jsx: 'preserve',
format: 'esm',
platform: 'neutral',
loader: 'tsx',
})

const typescript = autoLoadTypescriptPlug()

if (id.endsWith('ts') || id.endsWith('tsx')) {
let isIsland = false
const baseTransformTSConfig = await resolveTsConfig(options.tsconfig)
const builder = await rollup.rollup({
input: id,
acornInjectPlugins: [jsx()],
plugins: [
typescript({
// Override given tsconfig's jsx property
// for the client source since, it is the expected
// input for the plugin
// and modified by the plugin
...baseTransformTSConfig,
compilerOptions: {
...baseTransformTSConfig.compilerOptions,
jsx: 'preserve',
},
}),
],
})
const build = await builder.generate({})
const sourceCode = build.output[0].code

if (
sourceCode.indexOf('//@island') > -1 ||
sourceCode.indexOf('// @island') > -1
) {
isIsland = true
}

let inputCode = sourceCode

if (isIsland) {
inputCode = '//@island\n' + inputCode
}

generatedOutput = generateIslandsWithSource(inputCode, id, options)
} else {
generatedOutput = generateIslands(id, options)
}
const generatedOutput = generateIslandsWithSource(
normalizedCode.code,
id,
options
)

const { code, paths } = generatedOutput

if (paths.client) {
await mkdir(dirname(paths.client), { recursive: true })
writeFileSync(paths.client, code.client, 'utf8')

const builder = await rollup.rollup({
input: paths.client,
acornInjectPlugins: [jsx()],
plugins: [
typescript({
...(await resolveTsConfig(options.client.tsconfig)),
jsx: 'preserve',
jsxImportSource: 'preact',
}),
nodeResolve(),
babel({
babelHelpers: 'bundled',
plugins: [
[
'@babel/plugin-transform-react-jsx',
{ runtime: 'automatic', importSource: 'preact' },
],
],
}),
],
})
await builder.write({
await build({
entryPoints: [paths.client],
platform: 'browser',
allowOverwrite: true,
bundle: true,
jsx: 'automatic',
jsxImportSource: 'preact',
loader: {
'.js': 'jsx',
},
format: 'esm',
dir: dirname(paths.client),
outdir: dirname(paths.client),
})
}

const serverFinalTransform = await transform(code.server, {
jsx: 'automatic',
jsxImportSource: 'preact',
loader: 'jsx',
})

return {
code: code.server,
code: serverFinalTransform.code,
map: null,
}
},
Expand Down