diff --git a/packages/bun/.npmignore b/packages/bun/.npmignore new file mode 100644 index 000000000..2b29f2764 --- /dev/null +++ b/packages/bun/.npmignore @@ -0,0 +1 @@ +tests diff --git a/packages/bun/README.md b/packages/bun/README.md new file mode 100644 index 000000000..38b45c78e --- /dev/null +++ b/packages/bun/README.md @@ -0,0 +1,10 @@ +# Deepkit Bun Plugin + + +## Install + +`bunfig.toml`: + +```toml +preload = ["@deepkit/bun"] +``` diff --git a/packages/bun/dist/.gitkeep b/packages/bun/dist/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/packages/bun/index.ts b/packages/bun/index.ts new file mode 100644 index 000000000..d85756b7d --- /dev/null +++ b/packages/bun/index.ts @@ -0,0 +1,9 @@ +export * from './src/plugin.js'; +import { deepkitType } from './src/plugin.js'; + +//@ts-ignore +import { plugin } from 'bun'; + +if (plugin) { + plugin(deepkitType()); +} diff --git a/packages/bun/package-lock.json b/packages/bun/package-lock.json new file mode 100644 index 000000000..2d8e9eed5 --- /dev/null +++ b/packages/bun/package-lock.json @@ -0,0 +1,297 @@ +{ + "name": "@deepkit/bun", + "version": "1.0.1-alpha.100", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@deepkit/bun", + "version": "1.0.1-alpha.100", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.2" + }, + "peerDependencies": { + "@deepkit/type-compiler": "^1.0.1-alpha.93", + "typescript": "*" + } + }, + "node_modules/@deepkit/type-compiler": { + "version": "1.0.1-alpha.93", + "resolved": "https://registry.npmjs.org/@deepkit/type-compiler/-/type-compiler-1.0.1-alpha.93.tgz", + "integrity": "sha512-7dYNaNyTG2IB3gIeiBLDdvQ51lW8vBk6YmDm6f/y7c2eyhLXd4ZSRqn/+lTcbTpxVzOB0OdpWfZMDGXDq3unCw==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@deepkit/type-spec": "^1.0.1-alpha.93", + "@marcj/ts-clone-node": "^2.0.0", + "@typescript/vfs": "^1.4.0", + "get-tsconfig": "^4.5.0", + "lz-string": "^1.4.4", + "micromatch": "^4.0.5", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "deepkit-type-install": "dist/cjs/install-transformer.js" + }, + "peerDependencies": { + "typescript": "^4.8.2" + } + }, + "node_modules/@deepkit/type-spec": { + "version": "1.0.1-alpha.93", + "resolved": "https://registry.npmjs.org/@deepkit/type-spec/-/type-spec-1.0.1-alpha.93.tgz", + "integrity": "sha512-ZJHq0tOCYW0pDZ4Ab3RLQiFvDCTD2Dur+af4I0kmtT23slz+WWMNehJF08lO4DUDyOO0f0DlLLCqO39GhY3J4Q==", + "peer": true + }, + "node_modules/@marcj/ts-clone-node": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@marcj/ts-clone-node/-/ts-clone-node-2.0.0.tgz", + "integrity": "sha512-GPafMHAdvXPOFzJ8mtnOa+S4NR+fWQEggKo1laAejeSzzp9k223xZjogkNQSVLrzn8sinHCkvJv9f7nVaX3gPQ==", + "peer": true, + "dependencies": { + "compatfactory": "^1.0.1" + }, + "engines": { + "node": ">=14.9.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/ts-clone-node?sponsor=1" + }, + "peerDependencies": { + "typescript": "^4.8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@typescript/vfs": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.4.0.tgz", + "integrity": "sha512-Pood7yv5YWMIX+yCHo176OnF8WUlKGImFG7XlsuH14Zb1YN5+dYD3uUtS7lqZtsH7tAveNUi2NzdpQCN0yRbaw==", + "peer": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "peer": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/compatfactory": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/compatfactory/-/compatfactory-1.0.1.tgz", + "integrity": "sha512-hR9u0HSZTKDNNchPtMHg6myeNx0XO+av7UZIJPsi4rPALJBHi/W5Mbwi19hC/xm6y3JkYpxVYjTqnSGsU5X/iw==", + "peer": true, + "dependencies": { + "helpertypes": "^0.0.18" + }, + "engines": { + "node": ">=14.9.0" + }, + "peerDependencies": { + "typescript": ">=3.x || >= 4.x" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "peer": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "peer": true, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/helpertypes": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/helpertypes/-/helpertypes-0.0.18.tgz", + "integrity": "sha512-XRhfbSEmR+poXUC5/8AbmYNJb2riOT6qPzjGJZr0S9YedHiaY+/tzPYzWMUclYMEdCYo/1l8PDYrQFCj02v97w==", + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "peer": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "peer": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "peer": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/rollup": { + "version": "3.21.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.5.tgz", + "integrity": "sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==", + "optional": true, + "peer": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "peer": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + } + } +} diff --git a/packages/bun/package.json b/packages/bun/package.json new file mode 100644 index 000000000..1fa7a5fce --- /dev/null +++ b/packages/bun/package.json @@ -0,0 +1,47 @@ +{ + "name": "@deepkit/bun", + "version": "1.0.1-alpha.100", + "description": "Deepkit Bun Plugin for Deepkit Runtime Types support", + "type": "commonjs", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/cjs/index.d.ts", + "exports": { + ".": { + "types": "./dist/cjs/index.d.ts", + "require": "./dist/cjs/index.js", + "default": "./dist/esm/index.js" + } + }, + "repository": "https://github.com/deepkit/deepkit-framework", + "author": "Marc J. Schmidt ", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "echo '{\"type\": \"module\"}' > ./dist/esm/package.json", + "install": "rm -rf node_modules/typescript || exit 0" + }, + "peerDependencies": { + "@deepkit/type-compiler": "^1.0.1-alpha.93", + "typescript": "*" + }, + "dependencies": { + "@rollup/pluginutils": "^5.0.2" + }, + "devDependencies": { + "@deepkit/type-compiler": "^1.0.1-alpha.100" + }, + "jest": { + "transform": { + "^.+\\.(ts|tsx)$": "ts-jest" + }, + "moduleNameMapper": { + "(.+)\\.js": "$1" + }, + "testMatch": [ + "**/tests/**/*.spec.ts" + ] + } +} diff --git a/packages/bun/src/plugin.ts b/packages/bun/src/plugin.ts new file mode 100644 index 000000000..1799d9cc6 --- /dev/null +++ b/packages/bun/src/plugin.ts @@ -0,0 +1,50 @@ +// @ts-ignore +import { type BunPlugin } from 'bun'; +import * as ts from 'typescript'; +import { cwd } from 'process'; +import { declarationTransformer, transformer } from '@deepkit/type-compiler'; + +export interface Options { + include?: string; + exclude?: string; + tsConfig?: string; + transformers?: ts.CustomTransformers; + compilerOptions?: ts.CompilerOptions; +} + +declare var Bun: any; + +export function deepkitType(options: Options = {}): BunPlugin { + return { + name: 'Deepkit', + setup(build: any) { + const transformers = options.transformers || { + before: [transformer], + after: [declarationTransformer], + }; + + build.onLoad({ filter: /\.tsx?$/ }, async (args: any) => { + const configFilePath = options.tsConfig || cwd() + '/tsconfig.json'; + + const code = await Bun.file(args.path).text(); + const transformed = ts.transpileModule(code, { + //@ts-ignore + compilerOptions: Object.assign({ + 'target': ts.ScriptTarget.ESNext, + 'module': ts.ModuleKind.ESNext, + sourceMap: false, + skipDefaultLibCheck: true, + skipLibCheck: true, + configFilePath, + }, options || {}), + fileName: args.path, + moduleName: args.namespace, + //@ts-ignore + transformers + }); + + return { contents: transformed.outputText }; + }); + }, + }; +} diff --git a/packages/bun/tests/case1/app.ts b/packages/bun/tests/case1/app.ts new file mode 100644 index 000000000..88e21112a --- /dev/null +++ b/packages/bun/tests/case1/app.ts @@ -0,0 +1,3 @@ +import { Dog } from './mod'; + +console.log(Dog); diff --git a/packages/bun/tests/case1/index.html b/packages/bun/tests/case1/index.html new file mode 100644 index 000000000..1e0dbf324 --- /dev/null +++ b/packages/bun/tests/case1/index.html @@ -0,0 +1,7 @@ + diff --git a/packages/bun/tests/case1/mod.ts b/packages/bun/tests/case1/mod.ts new file mode 100644 index 000000000..547d020b7 --- /dev/null +++ b/packages/bun/tests/case1/mod.ts @@ -0,0 +1,3 @@ +export class Dog { + name!: string; +} diff --git a/packages/bun/tests/case1/package.json b/packages/bun/tests/case1/package.json new file mode 100644 index 000000000..7e0ab3f99 --- /dev/null +++ b/packages/bun/tests/case1/package.json @@ -0,0 +1,12 @@ +{ + "name": "mjs", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "test": "NODE_OPTIONS=--preserve-symlinks vite build" + }, + "author": "", + "license": "ISC" +} diff --git a/packages/bun/tests/case1/tsconfig.json b/packages/bun/tests/case1/tsconfig.json new file mode 100644 index 000000000..b9b913171 --- /dev/null +++ b/packages/bun/tests/case1/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "module": "esnext", + "target": "esnext", + "outDir": "dist/tsc", + "moduleResolution": "nodenext", + "experimentalDecorators": true + }, + "include": ["./mod.ts"], + "reflection": true +} diff --git a/packages/bun/tests/case1/vite.config.js b/packages/bun/tests/case1/vite.config.js new file mode 100644 index 000000000..70c95f719 --- /dev/null +++ b/packages/bun/tests/case1/vite.config.js @@ -0,0 +1,26 @@ +import {defineConfig} from 'vite'; +import {deepkitType} from '../../dist/esm/index.js'; + +export default defineConfig({ + plugins: [deepkitType()], + + build: { + "modulePreload": false, + minify: false, + target: "esnext", + rollupOptions: { + "preserveEntrySignatures": "strict", + + "output": { + + "preserveModules": true, + "esModule": true, + "format": "esm", + + }, + "input": { + "xxx": "./mod.ts" + } + } + }, +}); diff --git a/packages/bun/tsconfig.esm.json b/packages/bun/tsconfig.esm.json new file mode 100644 index 000000000..d41ece113 --- /dev/null +++ b/packages/bun/tsconfig.esm.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist/esm", + "module": "ES2020" + }, + "references": [ + { + "path": "../core/tsconfig.esm.json" + }, + { + "path": "../type-compiler/tsconfig.esm.json" + } + ] +} diff --git a/packages/bun/tsconfig.json b/packages/bun/tsconfig.json new file mode 100644 index 000000000..dd1256132 --- /dev/null +++ b/packages/bun/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "moduleResolution": "node", + "target": "es2018", + "module": "CommonJS", + "esModuleInterop": true, + "outDir": "./dist/cjs", + "declaration": true, + "composite": true + }, + "include": [ + "src", + "tests", + "index.ts" + ], + "references": [ + { + "path": "../core/tsconfig.json" + }, + { + "path": "../type-compiler/tsconfig.json" + } + ] +} diff --git a/packages/type/src/reflection/processor.ts b/packages/type/src/reflection/processor.ts index 9b8cc1d4f..00ccfb565 100644 --- a/packages/type/src/reflection/processor.ts +++ b/packages/type/src/reflection/processor.ts @@ -118,7 +118,8 @@ function isPack(o: any): o is Packed { function extractTypeNameFromFunction(fn: Function): string { const str = fn.toString(); - const match = str.match(/__Ω([\w]+)/); + //either it starts with __Ω* or __\u{3a9}* (bun.js) + const match = str.match(/(?:__Ω|__\\u\{3a9\})([\w]+)/); if (match) { return match[1]; } diff --git a/packages/vite/package.json b/packages/vite/package.json index 6b43c771d..b187ce7b6 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -1,7 +1,7 @@ { "name": "@deepkit/vite", "version": "1.0.1-alpha.100", - "description": "Deepkit Vite Plugin for type compiler support", + "description": "Deepkit Vite Plugin for Deepkit Runtime Types support", "type": "commonjs", "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", diff --git a/tsconfig.esm.json b/tsconfig.esm.json index ee72ee73d..793c6bb61 100644 --- a/tsconfig.esm.json +++ b/tsconfig.esm.json @@ -90,6 +90,9 @@ }, { "path": "packages/vite/tsconfig.esm.json" + }, + { + "path": "packages/bun/tsconfig.esm.json" } ] } diff --git a/tsconfig.json b/tsconfig.json index b6fdef31e..093f2f079 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -108,6 +108,9 @@ }, { "path": "packages/vite/tsconfig.json" + }, + { + "path": "packages/bun/tsconfig.json" } ] }