公式 TypeScript パーサーを使用する、小型、高速、純粋な JavaScript タイプ ストリッパー。
TypeScript には次のものが入ります。
class C < T > extends Array < T > implements I {
// ^^^ ^^^^^^^^^^^^^^^^
private field ! : string ;
// ^^^^^^^ ^^^^^^^^^
method < T > ( this : T , a ?: string ) : void {
// ^^^ ^^^^^^^^ ^^^^^^^^^ ^^^^^^
}
}
JavaScript + スペースが出てきます:
class C extends Array {
// ^^^ ^^^^^^^^^^^^^^^^
field ;
// ^^^^^^^ ^^^^^^^^^
method ( a ) {
// ^^^ ^^^^^^^^ ^^^^^^^^^ ^^^^^^
}
}
遊び場で試してみてください。
このライブラリの利点は次のとおりです。
./perf
フォルダーを参照してください。SourceFile
オブジェクトを生成している場合に特に当てはまります。これは再利用可能であり、AST の生成が最も時間のかかる部分であるためです。TypeScript
)すべての TypeScript 構文がサポートされているわけではありません (サポートされていない構文を参照)。ダウンレベリングもありません。 JavaScript はそのまま保持されます。
npm install ts-blank-space
export default function tsBlankSpace ( ts : string , onError ?: ( node ) => void ) : string ;
import tsBlankSpace from "ts-blank-space" ;
console . log ( tsBlankSpace ( `let x: string;` ) ) ;
// "let x ;"
export function blankSourceFile ( ts : typescript . SourceFile , onError ?: ( node ) => void ) : string ;
import ts from "typescript" ;
import { blankSourceFile } from "ts-blank-space" ;
const ast = ts . createSourceFile ( ... ) ;
console . log ( blankSourceFile ( ast ) ) ;
ts-blank-space
インポートされた*.ts
を評価する前に前処理するためにts-blank-space
使用するために必要な Node.js モジュール ローダー フックを公開します。
# Install (one time):
$ npm install --save-dev ts-blank-space
# Example usage (Node.js >= v18.20):
$ node --import ts-blank-space/register ./path/to/your/file.ts
*.ts
ファイルのロードに加えて、失敗した*.js
インポートをキャッチし、拡張子を.ts
に置き換えてインポートを再試行するインポート リゾルバーも登録されます。これにより、バンドルやパッケージ配布など、プロジェクトで考慮する必要がある他の要素に応じて、インポート パスで.ts
または.js
選択できるようになります。
ローダーは、すべての.ts
ファイルが ESM であると想定します。
出力内のすべての JavaScript は元のソースと同じ行、列、バイト オフセットに配置されるため、変換中にマッピング情報が失われることはありません。
ここで説明するように、TypeScript 構文を空白に置き換えるだけではないケースが 2 つあります。
出力における ASI の問題を防ぐために、 ts-blank-space
; を追加します;
型のみのステートメントの最後まで、および先頭の型アノテーションを削除すると、ASI ハザードが発生する可能性があります。
statementWithNoSemiColon
type Erased = true
( "not calling above statement" )
は次のようになります:
statementWithNoSemiColon
;
( "not calling above statement" ) ;
class C {
field = 1 /* no ; */
public [ "computed field not accessing above" ] = 2
}
は次のようになります:
class C {
field = 1 /* no ; */
; [ "computed field not accessing above" ] = 2
}
アロー関数のパラメータの周囲の型注釈で新しい行が導入されている場合、それらを空白に置き換えるだけでは誤りとなる可能性があります。したがって、型アノテーションの削除に加えて、関数パラメータを囲む(
または)
も移動される可能性があります。
let f = ( a : string , b : string ) : Array <
string
> => [ a , b ] ;
は次のようになります:
let f = ( a , b
) => [ a , b ] ;
async
: let f = async <
T
> ( v : T ) => { } ;
は次のようになります:
let f = async (
v ) => { } ;
TypeScript の一部の部分は、ランタイム セマンティクスがあるためその場で消去できないため、サポートされていません。 unsupported_syntax.md を参照してください。
サポートされていない構文が見つかった場合、 ts-blank-space
オプションのonError
コールバックを呼び出して続行します。例は、 errors.test.ts
にあります。
tsconfig.json
コンパイラ設定 {
// Because JS syntax is emitted as-is
"target" : "esnext" ,
// Because class fields are preserved as written which corresponds
// to 'define' semantics in the ECMAScript specification
"useDefineForClassFields" : true ,
// Because imports and exports are preserved as written, only removing the
// parts which are explicitly annotated with the `type` keyword
"verbatimModuleSyntax" : true ,
}
.tsx
入力は.jsx
出力を生成します。 JSX 部分は変換されず、出力に保存されます。
デフォルトでは、 ts-blank-space
.ts
を想定してファイルを解析します。元のファイルに JSX 構文が含まれている場合は、解析を手動で行う必要があります。 valid.test.ts
に TSX の例があります。
import ts from "typescript" ;
import { blankSourceFile } from "ts-blank-space" ;
...
const tsxSource = ts . createSourceFile ( "input.tsx" , tsxInput , ts . ScriptTarget . ESNext , false , ts . ScriptKind . TSX ) ;
const jsxOutput = blankSourceFile ( tsxSource , onError ) ;
TypeScript はexport {};
すべてのimport
とexport
が削除された場合 ( import/export type
だったため)。
ts-blank-space
コードを削除するだけなので、これは実行されません。出力に常に ESM 構文マーカーが含まれるようにするには、 "export {};"
を手動で追加します。 ;
私たちは❤️貢献します。
このプロジェクトで良い経験はありましたか?愛を分かち合ってコードに貢献してみませんか。あるいは、コードに関して発生した問題についてお知らせください。
ここでは問題の報告を歓迎します。必要な情報を確実に提供できるように、問題に適切な問題テンプレートを必ず選択してください。
プル リクエストを送信する前に、投稿ガイドラインを必ずお読みください。
LICENSEファイルをお読みください。
このプロジェクトは行動規範を採用しています。コード、またはプロジェクトで経験した行為について懸念がある場合は、[email protected] までご連絡ください。
プロジェクトのセキュリティ ポリシーを参照してください。