kintone プラグイン package.json 一括変更（作業メモ）

[kintone プラグインアップローダー互換対応](https://qiita.com/rex0220/items/aab91d4ee35baf113082)を各プラグインのディレクトリに適用させるため、sed を使って package.json を一括変更します。

# 概要

下記の package.json 変更要件で、ChatGPT に処理方法を提案してもらった。
いろいろなやり方をすぐ作ってくれて、比較できるのがいい。
ただ一括編集は、sed が慣れているので sed のコードを書いてもらった。

## chatGPT4o

- リクエスト内容
下記の処理を行うのに、適した方法を教えて。
window 環境で、powershell, wsl, vs code が使えます。
・プラグインごとにディレクトリがあり、その直下にpackage.json ファイルがある
・package.json ファイルの "kintone-plugin-uploader" を "node scripts/plugin-uploader.js" に変更
・package.json ファイルの "--waiting-dialog-ms" を "--waittime" に変更

- 下記のスクリプトを提案してもらったので、さらに評価してもらう
    - PowerShell: Windows標準のスクリプト言語で、特にWindows環境に最適。
    - WSL: Linuxコマンドラインツールを利用できるため、Unix系のツールに慣れている場合に便利。
    - VS Code: 強力なエディタ機能とターミナルを持ち、複数の言語やツールを統合的に利用可能。
    - バッチファイル: 簡単なスクリプトでWindows環境に特化。
    - Python: 複雑な処理やデータ操作に強い柔軟なスクリプト言語。

- 変更を実行する前に、変更箇所を確認するにはどの方法がおすすめか？
    - 各スクリプトを変更箇所を確認する処理に変更
- どれもわかりにくいので sed を使った修正箇所確認と修正のコードを依頼
- スクリプトの冗長な個所を最適化

# sed のコード

変更箇所確認とファイル変更のスクリプトは、sed -i オプションの有無の違い

- 変更箇所を確認するスクリプト

```check_package_json_changes.sh
#!/bin/bash

# 対象のディレクトリをリテラルで指定
target_dir="/mnt/c/path/to/plugins"

# plugin ディレクトリの存在を確認
plugin_dir="$target_dir/plugin"
if [ ! -d "$plugin_dir" ]; then
  echo "Directory $plugin_dir does not exist."
  exit 1
fi

# plugin ディレクトリ内のサブディレクトリをループ
for dir in "$plugin_dir"/*/; do
  package_json_path="${dir}package.json"
  
  if [ -f "$package_json_path" ]; then
    echo "Processing file: $package_json_path"
    
    # "kintone-plugin-uploader" と "--waiting-dialog-ms" を同時に変更（プレビュー）
    sed -e 's/"kintone-plugin-uploader"/"node scripts\/plugin-uploader.js -f"/g' -e 's/--waiting-dialog-ms/--waittime/g' "$package_json_path" | diff -u "$package_json_path" -
    
    echo "---------------------------------"
  else
    echo "package.json not found in $dir"
  fi
done
```

- 実際にファイルを変更するスクリプト

```.sh
#!/bin/bash

# 対象のディレクトリをリテラルで指定
target_dir="/mnt/c/path/to/plugins"

# plugin ディレクトリの存在を確認
plugin_dir="$target_dir/plugin"
if [ ! -d "$plugin_dir" ]; then
  echo "Directory $plugin_dir does not exist."
  exit 1
fi

# plugin ディレクトリ内のサブディレクトリをループ
for dir in "$plugin_dir"/*/; do
  package_json_path="${dir}package.json"
  
  if [ -f "$package_json_path" ]; then
    echo "Processing file: $package_json_path"
    
    # "kintone-plugin-uploader" と "--waiting-dialog-ms" を同時に変更
    sed -i -e 's/"kintone-plugin-uploader"/"node scripts\/plugin-uploader.js -f"/g' -e 's/--waiting-dialog-ms/--waittime/g' "$package_json_path"
    
    echo "Updated file: $package_json_path"
    echo "---------------------------------"
  else
    echo "package.json not found in $dir"
  fi
done
```

# 変更箇所確認

変更は、うまくいっていそうです。

```.log
$ ./scripts/check_package_json_changes.sh
Processing file: /home/rex0220/kintone/plugin/action-control/package.json
--- /home/rex0220/kintone/plugin/action-control/package.json    2024-07-15 20:03:18.923000000 +0900
+++ -   2024-07-21 08:40:31.141776754 +0900
@@ -16,11 +16,11 @@
     "copy-trial": "node scripts/dcopy.js prod trial",
     "copy-china": "node scripts/dcopy.js prod china",

-    "upload-prod": "kintone-plugin-uploader dist/action-control-plugin11.zip --watch --waiting-dialog-ms 3000",
-    "upload-trial": "kintone-plugin-uploader dist/action-control-plugin11-try20251231.zip --waiting-dialog-ms 3000",
-    "upload-capdo": "kintone-plugin-uploader dist/action-control-plugin11-capdo.zip --waiting-dialog-ms 3000",
-    "upload-testc": "kintone-plugin-uploader dist/action-control-plugin11-testc.zip --waiting-dialog-ms 3000",
-    "upload-china": "kintone-plugin-uploader dist/action-control-plugin11-china.zip --waiting-dialog-ms 3000",
+    "upload-prod": "node scripts/plugin-uploader.js -f dist/action-control-plugin11.zip --watch --waittime 3000",
+    "upload-trial": "node scripts/plugin-uploader.js -f dist/action-control-plugin11-try20251231.zip --waittime 3000",
+    "upload-capdo": "node scripts/plugin-uploader.js -f dist/action-control-plugin11-capdo.zip --waittime 3000",
+    "upload-testc": "node scripts/plugin-uploader.js -f dist/action-control-plugin11-testc.zip --waittime 3000",
+    "upload-china": "node scripts/plugin-uploader.js -f dist/action-control-plugin11-china.zip --waittime 3000",

     "develop-prod": "npm run build-prod -- --watch",
     "develop-trial": "npm run build-trial --",
---------------------------------
...
```

# ファイル変更実行

```.log
$ ./scripts/update_package_json_changes.sh
Processing file: /home/rex0220/kintone/plugin/action-control/package.json
sed: preserving permissions for ‘/home/rex0220/kintone/plugin/action-control/sedZRYQU8’: Operation not permitted
---------------------------------
...
```

# ファイル変更結果確認

変更結果は、問題なさそう

![2024-07-21_10h10_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/bd70d8bc-570c-9e49-1918-3018feb33b91.png)

# plugin-uploader.js をコピーするスクリプト

plugin-uploader.js を各ディレクトリにコピーするスクリプトも chatGPT に作ってもらった。

```copy_plugin_uploader.sh
#!/bin/bash

# コピー元のファイルパスを指定
SOURCE_FILE="/path/to/plugin-uploader.js"

# プラグインディレクトリの親ディレクトリを指定
PARENT_DIR="/path/to/plugins"

# プラグインディレクトリを検索し、各scriptsディレクトリにファイルをコピー
for PLUGIN_DIR in "$PARENT_DIR"/*; do
    if [ -d "$PLUGIN_DIR" ]; then
        SCRIPTS_DIR="$PLUGIN_DIR/scripts"
        if [ -d "$SCRIPTS_DIR" ]; then
            cp "$SOURCE_FILE" "$SCRIPTS_DIR"
            echo "Copied to $SCRIPTS_DIR"
        else
            echo "Scripts directory not found in $PLUGIN_DIR"
        fi
    fi
done
```

# plugin-uploader.js をコピー実行

```copy_plugin_uploader.log
$ ./scripts/copy_plugin_uploader.sh
Copied to /home/rex0220/kintone/plugin/action-control/scripts
Copied to /home/rex0220/kintone/plugin/action-file/scripts
Copied to /home/rex0220/kintone/plugin/aggregate/scripts
...
```

# プラグインアップロード実行

プラグインアップロード成功

```.log
> npm run upload-prod

> action-control@0.1.0 upload-prod
> node scripts/plugin-uploader.js -f dist/action-control-plugin11.zip --watch --waittime 3000

Uploading file...
File uploaded successfully. fileKey: 7790f052-1e17-416c-84c1-2caf50c6f5f8
Plugin updated successfully. { id: 'fjnoboohpdkgkiajpogkgfhdlipoddop', version: '11' }

```