2017-09-03 9 views
2

https://astexplorer.net/#/gist/ad90272020dd0bfb15619d93cca81b66/28d3cf7178271f4f99b10bc9352daa873c2f2b20ファイルの先頭に行を挿入するためにjscodeshiftを使用する方法

// file 
var a = "a" // what if this is import statement? 

// jscodeshift 
export default (file, api) => { 
    const j = api.jscodeshift; 

    const root = j(file.source); 

    root.find(j.VariableDeclaration) 
    .insertBefore("use strict"); 
    return root.toSource(); 
} 

コードの最初の行は、ファイル間の異なる場合どうのinsertBeforeは動作しません。例えば(変数宣言、インポートステートメント)

答えて

2

のノードがjscodeshiftになっているようです。

ソリューションです:あなた明確にするため

export default (file, api) => { 
    const j = api.jscodeshift 

    const root = j(file.source) 

    j(root.find(j.VariableDeclaration).at(0).get()) 
    .insertBefore(
     '"use strict";' 
    ) 
    return root.toSource() 
} 

EDIT

あなたがどんなファイルの先頭にuse strictを挿入しないようにしたい場合は:あなたがもしあれば、import宣言の後use strictを追加したい場合は

export default (file, api) => { 
    const j = api.jscodeshift 
    const s = '"use strict";'; 
    const root = j(file.source) 

    root.get().node.program.body.unshift(s); 

    return root.toSource() 
} 

export default (file, api) => { 
    const j = api.jscodeshift 
    const s = '"use strict";'; 
    const root = j(file.source); 
    const imports = root.find(j.ImportDeclaration); 
    const n = imports.length; 

    if(n){ 
     //j(imports.at(0).get()).insertBefore(s); // before the imports 
     j(imports.at(n-1).get()).insertAfter(s); // after the imports 
    }else{ 
     root.get().node.program.body.unshift(s); // begining of file 
    }   

    return root.toSource(); 
} 
+0

「キャスト」は何をしているのかわかりませんが、私はあなたの意見が不足していると思います。ファイルが変数宣言の代わりにインポートステートメントで始まる場合はどうなりますか?あなたは総称して初めに挿入をどう言うでしょうか?これまで私はj.program()で再構築することでこれを得ることができただけです – user2167582

+0

また、これはあなたが挿入することを期待していますか?あなたは単にノードを挿入することはできません。 – user2167582

+1

@ user2167582あなたが求めたものを解決しました:)あなたはinsertBeforeを使用しようとしています。構造体の場合は、最初の部分にsoneリテラルを追加するだけでよい場合は、insertAt 0を使用できます。 – bluehipy

1

最高私が今までに持っていた解決策は、最初に挿入することです。j.Declaration

j(root.find(j.Declaration).at(0).get()) 
.insertBefore('"use strict";') 
関連する問題