Просмотр исходного кода

core: prevent UI imports compiling TSX source

vimtor 2 месяцев назад
Родитель
Сommit
eeb5b1d8bc
4 измененных файлов с 58 добавлено и 2 удалено
  1. 2 0
      packages/ui/package.json
  2. 40 0
      packages/ui/script/pack.ts
  3. 2 2
      packages/ui/script/publish.ts
  4. 14 0
      packages/ui/tsconfig.build.json

+ 2 - 0
packages/ui/package.json

@@ -15,6 +15,7 @@
     "**/*.css"
     "**/*.css"
   ],
   ],
   "files": [
   "files": [
+    "dist/**/*.d.ts",
     "src/**/*.ts",
     "src/**/*.ts",
     "src/**/*.tsx",
     "src/**/*.tsx",
     "!src/**/*.test.ts",
     "!src/**/*.test.ts",
@@ -55,6 +56,7 @@
     "./v2/styles/*": "./src/v2/styles/*"
     "./v2/styles/*": "./src/v2/styles/*"
   },
   },
   "scripts": {
   "scripts": {
+    "build": "rm -rf dist && tsc -p tsconfig.build.json",
     "typecheck": "tsgo --noEmit",
     "typecheck": "tsgo --noEmit",
     "test": "bun test src --only-failures",
     "test": "bun test src --only-failures",
     "dev": "vite",
     "dev": "vite",

+ 40 - 0
packages/ui/script/pack.ts

@@ -0,0 +1,40 @@
+#!/usr/bin/env bun
+
+import { $ } from "bun"
+import { rm } from "node:fs/promises"
+import path from "node:path"
+
+export async function pack() {
+  const original = await Bun.file("package.json").text()
+  const pkg = JSON.parse(original) as {
+    name: string
+    version: string
+    exports: Record<string, string | { types: string; import: string }>
+  }
+  const tarball = path.resolve(`${pkg.name.replace("@", "").replace("/", "-")}-${pkg.version}.tgz`)
+
+  await $`bun run build`
+  pkg.exports = Object.fromEntries(
+    Object.entries(pkg.exports).map(([key, value]) => {
+      if (typeof value !== "string" || (!value.endsWith(".ts") && !value.endsWith(".tsx"))) return [key, value]
+      return [
+        key,
+        {
+          types: value.replace("./src/", "./dist/").replace(/\.tsx?$/, ".d.ts"),
+          import: value,
+        },
+      ]
+    }),
+  )
+
+  await rm(tarball, { force: true })
+  await Bun.write("package.json", JSON.stringify(pkg, null, 2) + "\n")
+  try {
+    await $`bun pm pack`
+    return tarball
+  } finally {
+    await Bun.write("package.json", original)
+  }
+}
+
+if (import.meta.main) console.log(await pack())

+ 2 - 2
packages/ui/script/publish.ts

@@ -4,6 +4,7 @@ import { Script } from "@opencode-ai/script"
 import { $ } from "bun"
 import { $ } from "bun"
 import { rm } from "node:fs/promises"
 import { rm } from "node:fs/promises"
 import { fileURLToPath } from "node:url"
 import { fileURLToPath } from "node:url"
+import { pack } from "./pack"
 
 
 process.chdir(fileURLToPath(new URL("..", import.meta.url)))
 process.chdir(fileURLToPath(new URL("..", import.meta.url)))
 
 
@@ -18,8 +19,7 @@ if ((await $`npm view ${pkg.name}@${pkg.version} version`.nothrow()).exitCode ==
 try {
 try {
   await $`bun run typecheck`
   await $`bun run typecheck`
   await $`bun run test`
   await $`bun run test`
-  await rm(tarball, { force: true })
-  await $`bun pm pack`
+  await pack()
   await $`npm publish ${tarball} --access public --tag ${Script.channel}`
   await $`npm publish ${tarball} --access public --tag ${Script.channel}`
 } finally {
 } finally {
   await rm(tarball, { force: true })
   await rm(tarball, { force: true })

+ 14 - 0
packages/ui/tsconfig.build.json

@@ -0,0 +1,14 @@
+{
+  "$schema": "https://json.schemastore.org/tsconfig",
+  "extends": "./tsconfig.json",
+  "compilerOptions": {
+    "rootDir": "src",
+    "outDir": "dist",
+    "noEmit": false,
+    // Publish declarations so consumer compiler options do not typecheck our TSX implementation.
+    "declaration": true,
+    "emitDeclarationOnly": true
+  },
+  "include": ["src"],
+  "exclude": ["**/*.stories.*", "**/*.test.*", "**/*.mdx"]
+}