initial commit
This commit is contained in:
1 parent
6d8d5fcd6c
commit
8484a534db
3361 files changed
+493837
No files matched your search
+21
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Pooya Parsa <pooya@pi0.io>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
# jiti
|
||||
|
||||
[![npm version][npm-version-src]][npm-version-href]
|
||||
[![npm downloads][npm-downloads-src]][npm-downloads-href]
|
||||
[![bundle][bundle-src]][bundle-href]
|
||||
[![License][license-src]][license-href]
|
||||
|
||||
Runtime Typescript and ESM support for Node.js.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> This is the support branch for jiti v1. Check out [jiti/main](https://github.com/unjs/jiti/tree/main) for the latest version and [unjs/jiti#174](https://github.com/unjs/jiti/issues/174) for the roadmap.
|
||||
|
||||
## Features
|
||||
|
||||
- Seamless typescript and ESM syntax support
|
||||
- Seamless interoperability between ESM and CommonJS
|
||||
- Synchronous API to replace `require`
|
||||
- Super slim and zero dependency
|
||||
- Smart syntax detection to avoid extra transforms
|
||||
- CommonJS cache integration
|
||||
- Filesystem transpile hard cache
|
||||
- V8 compile cache
|
||||
- Custom resolve alias
|
||||
|
||||
## Usage
|
||||
|
||||
### Programmatic
|
||||
|
||||
```js
|
||||
const jiti = require("jiti")(__filename);
|
||||
|
||||
jiti("./path/to/file.ts");
|
||||
```
|
||||
|
||||
You can also pass options as second argument:
|
||||
|
||||
```js
|
||||
const jiti = require("jiti")(__filename, { debug: true });
|
||||
```
|
||||
|
||||
### CLI
|
||||
|
||||
```bash
|
||||
jiti index.ts
|
||||
# or npx jiti index.ts
|
||||
```
|
||||
|
||||
### Register require hook
|
||||
|
||||
```bash
|
||||
node -r jiti/register index.ts
|
||||
```
|
||||
|
||||
Alternatively, you can register `jiti` as a require hook programmatically:
|
||||
|
||||
```js
|
||||
const jiti = require("jiti")();
|
||||
const unregister = jiti.register();
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
### `debug`
|
||||
|
||||
- Type: Boolean
|
||||
- Default: `false`
|
||||
- Environment Variable: `JITI_DEBUG`
|
||||
|
||||
Enable debug to see which files are transpiled
|
||||
|
||||
### `cache`
|
||||
|
||||
- Type: Boolean | String
|
||||
- Default: `true`
|
||||
- Environment Variable: `JITI_CACHE`
|
||||
|
||||
Use transpile cache
|
||||
|
||||
If set to `true` will use `node_modules/.cache/jiti` (if exists) or `{TMP_DIR}/node-jiti`
|
||||
|
||||
### `esmResolve`
|
||||
|
||||
- Type: Boolean | String
|
||||
- Default: `false`
|
||||
- Environment Variable: `JITI_ESM_RESOLVE`
|
||||
|
||||
Using esm resolution algorithm to support `import` condition.
|
||||
|
||||
### `transform`
|
||||
|
||||
- Type: Function
|
||||
- Default: Babel (lazy loaded)
|
||||
|
||||
Transform function. See [src/babel](./src/babel.ts) for more details
|
||||
|
||||
### `sourceMaps`
|
||||
|
||||
- Type: Boolean
|
||||
- Default `false`
|
||||
- Environment Variable: `JITI_SOURCE_MAPS`
|
||||
|
||||
Add inline source map to transformed source for better debugging.
|
||||
|
||||
### `interopDefault`
|
||||
|
||||
- Type: Boolean
|
||||
- Default: `false`
|
||||
|
||||
Return the `.default` export of a module at the top-level.
|
||||
|
||||
### `alias`
|
||||
|
||||
- Type: Object
|
||||
- Default: -
|
||||
- Environment Variable: `JITI_ALIAS`
|
||||
|
||||
Custom alias map used to resolve ids.
|
||||
|
||||
### `nativeModules`
|
||||
|
||||
- Type: Array
|
||||
- Default: ['typescript`]
|
||||
- Environment Variable: `JITI_NATIVE_MODULES`
|
||||
|
||||
List of modules (within `node_modules`) to always use native require for them.
|
||||
|
||||
### `transformModules`
|
||||
|
||||
- Type: Array
|
||||
- Default: []
|
||||
- Environment Variable: `JITI_TRANSFORM_MODULES`
|
||||
|
||||
List of modules (within `node_modules`) to transform them regardless of syntax.
|
||||
|
||||
### `experimentalBun`
|
||||
|
||||
- Type: Boolean
|
||||
- Default: Enabled if `process.versions.bun` exists (Bun runtime)
|
||||
- Environment Variable: `JITI_EXPERIMENTAL_BUN`
|
||||
|
||||
Enable experimental native Bun support for transformations.
|
||||
|
||||
## Development
|
||||
|
||||
- Clone this repository
|
||||
- Enable [Corepack](https://github.com/nodejs/corepack) using `corepack enable`
|
||||
- Install dependencies using `pnpm install`
|
||||
- Run `pnpm dev`
|
||||
- Run `pnpm jiti ./test/path/to/file.ts`
|
||||
|
||||
## License
|
||||
|
||||
MIT. Made with 💖
|
||||
|
||||
<!-- Badged -->
|
||||
|
||||
[npm-version-src]: https://img.shields.io/npm/v/jiti?style=flat&colorA=18181B&colorB=F0DB4F
|
||||
[npm-version-href]: https://npmjs.com/package/jiti
|
||||
[npm-downloads-src]: https://img.shields.io/npm/dm/jiti?style=flat&colorA=18181B&colorB=F0DB4F
|
||||
[npm-downloads-href]: https://npmjs.com/package/jiti
|
||||
[bundle-src]: https://img.shields.io/bundlephobia/minzip/jiti?style=flat&colorA=18181B&colorB=F0DB4F
|
||||
[bundle-href]: https://bundlephobia.com/result?p=h3
|
||||
[license-src]: https://img.shields.io/github/license/unjs/jiti.svg?style=flat&colorA=18181B&colorB=F0DB4F
|
||||
[license-href]: https://github.com/unjs/jiti/blob/main/LICENSE
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const { resolve } = require("path");
|
||||
|
||||
const script = process.argv.splice(2, 1)[0];
|
||||
|
||||
if (!script) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error("Usage: jiti <path> [...arguments]");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const pwd = process.cwd();
|
||||
const jiti = require("..")(pwd);
|
||||
const resolved = (process.argv[1] = jiti.resolve(resolve(pwd, script)));
|
||||
jiti(resolved);
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
import { TransformOptions, TRANSFORM_RESULT } from "./types";
|
||||
export default function transform(opts: TransformOptions): TRANSFORM_RESULT;
|
||||
+1849
File diff suppressed because it is too large.
Load diff
+21
@@ -0,0 +1,21 @@
|
||||
/// <reference types="node" />
|
||||
import { Module } from "module";
|
||||
import { TransformOptions, JITIOptions, JITIImportOptions } from "./types";
|
||||
export type { JITIOptions, TransformOptions } from "./types";
|
||||
type Require = typeof require;
|
||||
type Module = typeof module;
|
||||
type ModuleCache = Record<string, Module>;
|
||||
export type EvalModuleOptions = Partial<{
|
||||
id: string;
|
||||
filename: string;
|
||||
ext: string;
|
||||
cache: ModuleCache;
|
||||
}>;
|
||||
export interface JITI extends Require {
|
||||
transform: (opts: TransformOptions) => string;
|
||||
register: () => () => void;
|
||||
evalModule: (source: string, options?: EvalModuleOptions) => unknown;
|
||||
/** @experimental Behavior of `jiti.import` might change in the future. */
|
||||
import: (id: string, importOptions: JITIImportOptions) => Promise<unknown>;
|
||||
}
|
||||
export default function createJITI(_filename: string, opts?: JITIOptions, parentModule?: Module, parentCache?: ModuleCache): JITI;
|
||||
+1
@@ -0,0 +1 @@
|
||||
(()=>{var __webpack_modules__={"./node_modules/.pnpm/create-require@1.1.1/node_modules/create-require/create-require.js":(module,__unused_webpack_exports,__webpack_require__)=>{const nativeModule=__webpack_require__("module"),path=__webpack_require__("path"),fs=__webpack_require__("fs");module.exports=function(filename){return filename||(filename=process.cwd()),function(path){try{return fs.lstatSync(path).isDirectory()}catch(e){return!1}}(filename)&&(filename=path.join(filename,"index.js")),nativeModule.createRequire?nativeModule.createRequire(filename):nativeModule.createRequireFromPath?nativeModule.createRequireFromPath(filename):function(filename){const mod=new nativeModule.Module(filename,null);return mod.filename=filename,mod.paths=nativeModule.Module._nodeModulePaths(path.dirname(filename)),mod._compile("module.exports = require;",filename),mod.exports}(filename)}},"./node_modules/.pnpm/lru-cache@6.0.0/node_modules/lru-cache/index.js":(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";const Yallist=__webpack_require__("./node_modules/.pnpm/yallist@4.0.0/node_modules/yallist/yallist.js"),MAX=Symbol("max"),LENGTH=Symbol("length"),LENGTH_CALCULATOR=Symbol("lengthCalculator"),ALLOW_STALE=Symbol("allowStale"),MAX_AGE=Symbol("maxAge"),DISPOSE=Symbol("dispose"),NO_DISPOSE_ON_SET=Symbol("noDisposeOnSet"),LRU_LIST=Symbol("lruList"),CACHE=Symbol("cache"),UPDATE_AGE_ON_GET=Symbol("updateAgeOnGet"),naiveLength=()=>1;const get=(self,key,doUse)=>{const node=self[CACHE].get(key);if(node){const hit=node.value;if(isStale(self,hit)){if(del(self,node),!self[ALLOW_STALE])return}else doUse&&(self[UPDATE_AGE_ON_GET]&&(node.value.now=Date.now()),self[LRU_LIST].unshiftNode(node));return hit.value}},isStale=(self,hit)=>{if(!hit||!hit.maxAge&&!self[MAX_AGE])return!1;const diff=Date.now()-hit.now;return hit.maxAge?diff>hit.maxAge:self[MAX_AGE]&&diff>self[MAX_AGE]},trim=self=>{if(self[LENGTH]>self[MAX])for(let walker=self[LRU_LIST].tail;self[LENGTH]>self[MAX]&&null!==walker;){const prev=walker.prev;del(self,walker),walker=prev}},del=(self,node)=>{if(node){const hit=node.value;self[DISPOSE]&&self[DISPOSE](hit.key,hit.value),self[LENGTH]-=hit.length,self[CACHE].delete(hit.key),self[LRU_LIST].removeNode(node)}};class Entry{constructor(key,value,length,now,maxAge){this.key=key,this.value=value,this.length=length,this.now=now,this.maxAge=maxAge||0}}const forEachStep=(self,fn,node,thisp)=>{let hit=node.value;isStale(self,hit)&&(del(self,node),self[ALLOW_STALE]||(hit=void 0)),hit&&fn.call(thisp,hit.value,hit.key,self)};module.exports=class{constructor(options){if("number"==typeof options&&(options={max:options}),options||(options={}),options.max&&("number"!=typeof options.max||options.max<0))throw new TypeError("max must be a non-negative number");this[MAX]=options.max||1/0;const lc=options.length||naiveLength;if(this[LENGTH_CALCULATOR]="function"!=typeof lc?naiveLength:lc,this[ALLOW_STALE]=options.stale||!1,options.maxAge&&"number"!=typeof options.maxAge)throw new TypeError("maxAge must be a number");this[MAX_AGE]=options.maxAge||0,this[DISPOSE]=options.dispose,this[NO_DISPOSE_ON_SET]=options.noDisposeOnSet||!1,this[UPDATE_AGE_ON_GET]=options.updateAgeOnGet||!1,this.reset()}set max(mL){if("number"!=typeof mL||mL<0)throw new TypeError("max must be a non-negative number");this[MAX]=mL||1/0,trim(this)}get max(){return this[MAX]}set allowStale(allowStale){this[ALLOW_STALE]=!!allowStale}get allowStale(){return this[ALLOW_STALE]}set maxAge(mA){if("number"!=typeof mA)throw new TypeError("maxAge must be a non-negative number");this[MAX_AGE]=mA,trim(this)}get maxAge(){return this[MAX_AGE]}set lengthCalculator(lC){"function"!=typeof lC&&(lC=naiveLength),lC!==this[LENGTH_CALCULATOR]&&(this[LENGTH_CALCULATOR]=lC,this[LENGTH]=0,this[LRU_LIST].forEach((hit=>{hit.length=this[LENGTH_CALCULATOR](hit.value,hit.key),this[LENGTH]+=hit.length}))),trim(this)}get lengthCalculator(){return this[LENGTH_CALCULATOR]}get length(){return this[LENGTH]}get itemCount(){return this[LRU_LIST].length}rforEach(fn,thisp){thisp=thisp||this;for(let walker=this[LRU_LIST].tail;null!==walker;){const prev=walker.prev;forEachStep(this,fn,walker,thisp),walker=prev}}forEach(fn,thisp){thisp=thisp||this;for(let walker=this[LRU_LIST].head;null!==walker;){const next=walker.next;forEachStep(this,fn,walker,thisp),walker=next}}keys(){return this[LRU_LIST].toArray().map((k=>k.key))}values(){return this[LRU_LIST].toArray().map((k=>k.value))}reset(){this[DISPOSE]&&this[LRU_LIST]&&this[LRU_LIST].length&&this[LRU_LIST].forEach((hit=>this[DISPOSE](hit.key,hit.value))),this[CACHE]=new Map,this[LRU_LIST]=new Yallist,this[LENGTH]=0}dump(){return this[LRU_LIST].map((hit=>!isStale(this,hit)&&{k:hit.key,v:hit.value,e:hit.now+(hit.maxAge||0)})).toArray().filter((h=>h))}dumpLru(){return this[LRU_LIST]}set(key,value,maxAge){if((maxAge=maxAge||this[MAX_AGE])&&"number"!=typeof maxAge)throw new TypeError("maxAge must be a number");const now=maxAge?Date.now():0,len=this[LENGTH_CALCULATOLine truncated
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
import type { PluginObj } from "@babel/core";
|
||||
export declare function TransformImportMetaPlugin(_ctx: any, opts: {
|
||||
filename?: string;
|
||||
}): PluginObj<import("@babel/core").PluginPass>;
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
/**
|
||||
* Forked from https://github.com/iendeavor/import-meta-env/tree/main/packages/babel 0.4.2 (MIT License - Copyright (c) 2021 Ernest)
|
||||
*/
|
||||
import type { PluginObj } from "@babel/core";
|
||||
export declare function importMetaEnvPlugin({ template, types }: any): PluginObj<import("@babel/core").PluginPass>;
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
export type TransformOptions = {
|
||||
source: string;
|
||||
filename?: string;
|
||||
ts?: boolean;
|
||||
retainLines?: boolean;
|
||||
legacy?: boolean;
|
||||
[key: string]: any;
|
||||
};
|
||||
export type TRANSFORM_RESULT = {
|
||||
code: string;
|
||||
error?: any;
|
||||
};
|
||||
export type JITIOptions = {
|
||||
transform?: (opts: TransformOptions) => TRANSFORM_RESULT;
|
||||
debug?: boolean;
|
||||
cache?: boolean | string;
|
||||
sourceMaps?: boolean;
|
||||
requireCache?: boolean;
|
||||
v8cache?: boolean;
|
||||
interopDefault?: boolean;
|
||||
esmResolve?: boolean;
|
||||
cacheVersion?: string;
|
||||
onError?: (error: Error) => void;
|
||||
legacy?: boolean;
|
||||
extensions?: string[];
|
||||
transformOptions?: Omit<TransformOptions, "source">;
|
||||
alias?: Record<string, string>;
|
||||
nativeModules?: string[];
|
||||
transformModules?: string[];
|
||||
experimentalBun?: boolean;
|
||||
};
|
||||
export interface JITIImportOptions {
|
||||
/** @internal */
|
||||
_import?: () => Promise<any>;
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
import type { PackageJson } from "pkg-types";
|
||||
export declare function getCacheDir(): string;
|
||||
export declare function isDir(filename: string): boolean;
|
||||
export declare function isWritable(filename: string): boolean;
|
||||
export declare function md5(content: string, len?: number): string;
|
||||
export declare function detectLegacySyntax(code: string): RegExpMatchArray | null;
|
||||
export declare function isObject(val: any): boolean;
|
||||
export declare function readNearestPackageJSON(path: string): PackageJson | undefined;
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
function onError(err) {
|
||||
throw err; /* ↓ Check stack trace ↓ */
|
||||
}
|
||||
|
||||
module.exports = function (filename, opts) {
|
||||
const jiti = require("../dist/jiti");
|
||||
|
||||
opts = { onError, ...opts };
|
||||
|
||||
if (!opts.transform) {
|
||||
opts.transform = require("../dist/babel");
|
||||
}
|
||||
|
||||
return jiti(filename, opts);
|
||||
};
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"name": "jiti",
|
||||
"version": "1.21.0",
|
||||
"description": "Runtime typescript and ESM support for Node.js",
|
||||
"repository": "unjs/jiti",
|
||||
"license": "MIT",
|
||||
"main": "./lib/index.js",
|
||||
"types": "dist/jiti.d.ts",
|
||||
"bin": "bin/jiti.js",
|
||||
"files": [
|
||||
"lib",
|
||||
"dist",
|
||||
"register.js"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "pnpm clean && NODE_ENV=production pnpm webpack",
|
||||
"clean": "rm -rf dist",
|
||||
"dev": "pnpm clean && pnpm webpack --watch",
|
||||
"jiti": "JITI_DEBUG=1 JITI_CACHE=false JITI_REQUIRE_CACHE=false ./bin/jiti.js",
|
||||
"jiti:legacy": "JITI_DEBUG=1 npx node@12 ./bin/jiti.js",
|
||||
"lint": "eslint --ext .ts,.js . && prettier -c src lib test stubs",
|
||||
"lint:fix": "eslint --fix --ext .ts,.js . && prettier -w src lib test stubs",
|
||||
"release": "pnpm build && pnpm test && changelogen --release --push && npm publish",
|
||||
"test": "pnpm lint && vitest run --coverage && pnpm test:bun",
|
||||
"test:bun": "bun --bun test test/bun"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.23.2",
|
||||
"@babel/plugin-proposal-decorators": "^7.23.2",
|
||||
"@babel/plugin-syntax-class-properties": "^7.12.13",
|
||||
"@babel/plugin-syntax-import-assertions": "^7.22.5",
|
||||
"@babel/plugin-transform-export-namespace-from": "^7.22.11",
|
||||
"@babel/plugin-transform-modules-commonjs": "^7.23.0",
|
||||
"@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11",
|
||||
"@babel/plugin-transform-optional-chaining": "^7.23.0",
|
||||
"@babel/plugin-transform-typescript": "^7.22.15",
|
||||
"@babel/preset-typescript": "^7.23.2",
|
||||
"@babel/template": "^7.22.15",
|
||||
"@babel/types": "^7.23.0",
|
||||
"@types/babel__core": "^7.20.3",
|
||||
"@types/babel__template": "^7.4.3",
|
||||
"@types/node": "^20.8.9",
|
||||
"@types/object-hash": "^3.0.5",
|
||||
"@types/resolve": "^1.20.4",
|
||||
"@types/semver": "^7.5.4",
|
||||
"@vitest/coverage-v8": "^0.34.6",
|
||||
"acorn": "^8.11.2",
|
||||
"babel-plugin-dynamic-import-node": "^2.3.3",
|
||||
"babel-plugin-parameter-decorator": "^1.0.16",
|
||||
"babel-plugin-transform-typescript-metadata": "^0.3.2",
|
||||
"changelogen": "^0.5.5",
|
||||
"config": "^3.3.9",
|
||||
"create-require": "^1.1.1",
|
||||
"destr": "^2.0.2",
|
||||
"escape-string-regexp": "^5.0.0",
|
||||
"eslint": "^8.52.0",
|
||||
"eslint-config-unjs": "^0.2.1",
|
||||
"esm": "^3.2.25",
|
||||
"estree-walker": "^3.0.3",
|
||||
"execa": "^8.0.1",
|
||||
"fast-glob": "^3.3.1",
|
||||
"mlly": "^1.4.2",
|
||||
"object-hash": "^3.0.0",
|
||||
"pathe": "^1.1.1",
|
||||
"pirates": "^4.0.6",
|
||||
"pkg-types": "^1.0.3",
|
||||
"prettier": "^3.0.3",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"semver": "^7.5.4",
|
||||
"std-env": "^3.4.3",
|
||||
"terser-webpack-plugin": "^5.3.9",
|
||||
"ts-loader": "^9.5.0",
|
||||
"tslib": "^2.6.2",
|
||||
"typescript": "^5.2.2",
|
||||
"vite": "^4.5.0",
|
||||
"vitest": "^0.34.6",
|
||||
"webpack": "^5.89.0",
|
||||
"webpack-cli": "^5.1.4"
|
||||
},
|
||||
"packageManager": "pnpm@8.8.0"
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
const jiti = require(".")();
|
||||
|
||||
jiti.register();
|
||||
Reference in new issue
Block a user