Google Workspace(Apps Script / Drive / Spreadsheet)だけで動く社内向け静的HTML共有サービス。設計は DESIGN.md を参照。
npm install
npx clasp login # 初回のみ。ブラウザでGoogleアカウント認証.clasp.json に既存の GAS プロジェクトの scriptId が設定済みであること。無い場合は:
npx clasp create-script --title "html-cat" --type standalone --rootDir dist初回のみ、Apps Script の実行用に「Apps Script API」を有効化しておく(script.google.com/home/usersettings)。
npm run verify # typecheck + lint + test
npm run build # esbuild で src/ -> dist/main.js
npm run push # verify + build + clasp push初回 push 後、Apps Script エディタを開いて setup 関数を選択し、直接実行する(clasp run-function は認可まわりの制約で失敗するため使わない)。
これにより Drive の Hosting フォルダと sites スプレッドシートが作成される。
Hosting フォルダを既存の Drive フォルダ(共有ドライブ配下など)に固定したい場合は、setup() 実行前に Apps Script エディタの「プロジェクトの設定 > スクリプト プロパティ」で HOSTING_FOLDER_ID にそのフォルダIDを設定しておく。
未設定なら My Drive 直下に自動作成される。
npx clasp create-deployment --description "initial" # 初回のみ。実行結果の deploymentId を控えておく以降、コードを更新して同じ URL のまま反映したい場合は create-deployment ではなく update-deployment を使う。
create-deployment は毎回新しい URL を発行してしまい、既存の共有リンクが壊れるため。
npm run push
npx clasp update-deployment <deploymentId> --description "変更内容のメモ"src/core/ src/app/ は GAS API に依存しない純粋ロジックなので vitest でユニットテストできる。
src/gas/ は GAS API を呼ぶだけの薄い層としてユニットテストの対象外にしている。
ESLintの no-restricted-globals で、core/app/ui から GAS API を直接呼ぶことも禁止している。
npm run test
npm run test:watchsrc/main.ts … doGet/doPost 等のグローバル関数のみ
src/di.ts … 合成ルート
src/core/ … 純粋関数(HTML/CSS書き換え、パス解決、ルーティング等)
src/ports/ … インターフェース定義のみ
src/app/ … ユースケース(UploadService / Renderer / Viewer)。ports にのみ依存
src/ui/ … 管理画面ビュー(文字列を返す純粋関数)
src/gas/ … GAS API を呼ぶ唯一の層(Drive / Spreadsheet 操作、マニフェストによるキャッシュなど)
サイトごとのファイル索引(.hc-manifest.json)や、更新(マージ/フルリプレイス)の意味など、詳細な設計判断は DESIGN.md を参照。