solidar 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +9 -0
- package/README.md +12 -0
- package/config/default.json +0 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/solid-client.d.ts +2 -0
- package/dist/solid-client.d.ts.map +1 -0
- package/dist/solid-client.js +2 -0
- package/dist/solid-client.js.map +1 -0
- package/dist/watcher.d.ts +2 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +2 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +26 -0
- package/solidar.service +23 -0
- package/src/index.d.ts +2 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +92 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +64 -0
- package/src/solid-client.d.ts +2 -0
- package/src/solid-client.d.ts.map +1 -0
- package/src/solid-client.js +3 -0
- package/src/solid-client.js.map +1 -0
- package/src/solid-client.ts +0 -0
- package/src/watcher.d.ts +2 -0
- package/src/watcher.d.ts.map +1 -0
- package/src/watcher.js +3 -0
- package/src/watcher.js.map +1 -0
- package/src/watcher.ts +0 -0
- package/tsconfig.json +45 -0
package/.env.example
ADDED
package/README.md
ADDED
|
File without changes
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import chokidar from 'chokidar';
|
|
2
|
+
import * as dotenv from 'dotenv';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
// .envファイルの読み込み
|
|
6
|
+
dotenv.config();
|
|
7
|
+
const WATCH_PATH = process.env.WATCH_PATH;
|
|
8
|
+
const SOLID_POD_URL = process.env.SOLID_POD_URL;
|
|
9
|
+
// 1. 起動時のバリデーション
|
|
10
|
+
if (!WATCH_PATH || !SOLID_POD_URL) {
|
|
11
|
+
console.error('Error: WATCH_PATH or SOLID_POD_URL is not defined in .env');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
if (!fs.existsSync(WATCH_PATH)) {
|
|
15
|
+
console.error(`Error: Watch path does not exist: ${WATCH_PATH}`);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
console.log(`[solidar] Starting watcher on: ${WATCH_PATH}`);
|
|
19
|
+
console.log(`[solidar] Notifications will be sent to: ${SOLID_POD_URL}`);
|
|
20
|
+
// 2. Chokidarの設定
|
|
21
|
+
// ignoreInitial: true にすることで、起動時に既存ファイルをすべて「追加」として検知するのを防ぎます
|
|
22
|
+
const watcher = chokidar.watch(WATCH_PATH, {
|
|
23
|
+
ignored: /(^|[\/\\])\../, // 隠しファイルを無視
|
|
24
|
+
persistent: true,
|
|
25
|
+
ignoreInitial: true,
|
|
26
|
+
//recursive: true
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Solidサーバーへ通知を送るための関数(将来の実装ポイント)
|
|
30
|
+
*/
|
|
31
|
+
const notifySolid = async (event, filePath) => {
|
|
32
|
+
const relativePath = path.relative(WATCH_PATH, filePath);
|
|
33
|
+
const timestamp = new Date().toISOString();
|
|
34
|
+
// 現時点ではログ出力のみ
|
|
35
|
+
console.log(`[${timestamp}] ${event.toUpperCase()}: ${relativePath}`);
|
|
36
|
+
// TODO: ここに Solid サーバーへの HTTPリクエスト(POST/PUT等)を実装する
|
|
37
|
+
// 例: fetch(SOLID_POD_URL, { method: 'POST', body: ... })
|
|
38
|
+
};
|
|
39
|
+
// 3. イベントリスナーの設定
|
|
40
|
+
watcher
|
|
41
|
+
.on('add', (path) => notifySolid('add', path))
|
|
42
|
+
.on('change', (path) => notifySolid('change', path))
|
|
43
|
+
.on('unlink', (path) => notifySolid('unlink', path))
|
|
44
|
+
.on('addDir', (path) => notifySolid('addDir', path))
|
|
45
|
+
.on('unlinkDir', (path) => notifySolid('unlinkDir', path))
|
|
46
|
+
.on('error', (error) => console.error(`[solidar] Watcher error: ${error}`));
|
|
47
|
+
// 4. systemd 等での停止をクリーンに処理する
|
|
48
|
+
process.on('SIGINT', () => {
|
|
49
|
+
watcher.close().then(() => {
|
|
50
|
+
console.log('[solidar] Watcher stopped.');
|
|
51
|
+
process.exit(0);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,gBAAgB;AAChB,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAEhD,iBAAiB;AACjB,IAAI,CAAC,UAAU,IAAI,CAAC,aAAa,EAAE,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;AAC5D,OAAO,CAAC,GAAG,CAAC,4CAA4C,aAAa,EAAE,CAAC,CAAC;AAEzE,iBAAiB;AACjB,6DAA6D;AAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE;IACzC,OAAO,EAAE,eAAe,EAAE,YAAY;IACtC,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IACnB,iBAAiB;CAClB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,GAAG,KAAK,EAAE,KAAa,EAAE,QAAgB,EAAE,EAAE;IAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,cAAc;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,YAAY,EAAE,CAAC,CAAC;IAEtE,mDAAmD;IACnD,yDAAyD;AAC3D,CAAC,CAAC;AAEF,iBAAiB;AACjB,OAAO;KACJ,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;KAC7C,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;KACnD,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;KACnD,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;KACnD,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;KACzD,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC,CAAC;AAE9E,6BAA6B;AAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solid-client.d.ts","sourceRoot":"","sources":["../src/solid-client.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solid-client.js","sourceRoot":"","sources":["../src/solid-client.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":""}
|
package/dist/watcher.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "solidar",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
+
},
|
|
9
|
+
"bin": {
|
|
10
|
+
"solidar": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [],
|
|
13
|
+
"author": "",
|
|
14
|
+
"license": "ISC",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@types/node": "^25.3.0",
|
|
18
|
+
"chokidar": "^4.0.3",
|
|
19
|
+
"dotenv": "^17.3.1",
|
|
20
|
+
"ts-node": "^10.9.2",
|
|
21
|
+
"typescript": "^5.9.3"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/dotenv": "^6.1.1"
|
|
25
|
+
}
|
|
26
|
+
}
|
package/solidar.service
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
[Unit]
|
|
2
|
+
Description=Solidar - File System Watcher for Community Solid Server
|
|
3
|
+
After=network.target
|
|
4
|
+
|
|
5
|
+
[Service]
|
|
6
|
+
User=app
|
|
7
|
+
Group=app
|
|
8
|
+
WorkingDirectory=/home/app/solidar
|
|
9
|
+
|
|
10
|
+
# ExecStartPre=/usr/bin/env npm run build
|
|
11
|
+
ExecStart=/usr/bin/env npm start
|
|
12
|
+
|
|
13
|
+
# 異常終了時に自動再起動
|
|
14
|
+
Restart=always
|
|
15
|
+
RestartSec=10
|
|
16
|
+
|
|
17
|
+
# 環境変数
|
|
18
|
+
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
|
|
19
|
+
EnvironmentFile=/home/app/solidar/.env
|
|
20
|
+
|
|
21
|
+
[Install]
|
|
22
|
+
WantedBy=multi-user.target
|
|
23
|
+
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":""}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const chokidar_1 = __importDefault(require("chokidar"));
|
|
40
|
+
const dotenv = __importStar(require("dotenv"));
|
|
41
|
+
const path_1 = __importDefault(require("path"));
|
|
42
|
+
const fs_1 = __importDefault(require("fs"));
|
|
43
|
+
// .envファイルの読み込み
|
|
44
|
+
dotenv.config();
|
|
45
|
+
const WATCH_PATH = process.env.WATCH_PATH;
|
|
46
|
+
const SOLID_POD_URL = process.env.SOLID_POD_URL;
|
|
47
|
+
// 1. 起動時のバリデーション
|
|
48
|
+
if (!WATCH_PATH || !SOLID_POD_URL) {
|
|
49
|
+
console.error('Error: WATCH_PATH or SOLID_POD_URL is not defined in .env');
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
if (!fs_1.default.existsSync(WATCH_PATH)) {
|
|
53
|
+
console.error(`Error: Watch path does not exist: ${WATCH_PATH}`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
console.log(`[solidar] Starting watcher on: ${WATCH_PATH}`);
|
|
57
|
+
console.log(`[solidar] Notifications will be sent to: ${SOLID_POD_URL}`);
|
|
58
|
+
// 2. Chokidarの設定
|
|
59
|
+
// ignoreInitial: true にすることで、起動時に既存ファイルをすべて「追加」として検知するのを防ぎます
|
|
60
|
+
const watcher = chokidar_1.default.watch(WATCH_PATH, {
|
|
61
|
+
ignored: /(^|[\/\\])\../, // 隠しファイルを無視
|
|
62
|
+
persistent: true,
|
|
63
|
+
ignoreInitial: true,
|
|
64
|
+
recursive: true
|
|
65
|
+
});
|
|
66
|
+
/**
|
|
67
|
+
* Solidサーバーへ通知を送るための関数(将来の実装ポイント)
|
|
68
|
+
*/
|
|
69
|
+
const notifySolid = async (event, filePath) => {
|
|
70
|
+
const relativePath = path_1.default.relative(WATCH_PATH, filePath);
|
|
71
|
+
const timestamp = new Date().toISOString();
|
|
72
|
+
// 現時点ではログ出力のみ
|
|
73
|
+
console.log(`[${timestamp}] ${event.toUpperCase()}: ${relativePath}`);
|
|
74
|
+
// TODO: ここに Solid サーバーへの HTTPリクエスト(POST/PUT等)を実装する
|
|
75
|
+
// 例: fetch(SOLID_POD_URL, { method: 'POST', body: ... })
|
|
76
|
+
};
|
|
77
|
+
// 3. イベントリスナーの設定
|
|
78
|
+
watcher
|
|
79
|
+
.on('add', (path) => notifySolid('add', path))
|
|
80
|
+
.on('change', (path) => notifySolid('change', path))
|
|
81
|
+
.on('unlink', (path) => notifySolid('unlink', path))
|
|
82
|
+
.on('addDir', (path) => notifySolid('addDir', path))
|
|
83
|
+
.on('unlinkDir', (path) => notifySolid('unlinkDir', path))
|
|
84
|
+
.on('error', (error) => console.error(`[solidar] Watcher error: ${error}`));
|
|
85
|
+
// 4. systemd 等での停止をクリーンに処理する
|
|
86
|
+
process.on('SIGINT', () => {
|
|
87
|
+
watcher.close().then(() => {
|
|
88
|
+
console.log('[solidar] Watcher stopped.');
|
|
89
|
+
process.exit(0);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAAgC;AAChC,+CAAiC;AACjC,gDAAwB;AACxB,4CAAoB;AAEpB,gBAAgB;AAChB,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAEhD,iBAAiB;AACjB,IAAI,CAAC,UAAU,IAAI,CAAC,aAAa,EAAE,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;AAC5D,OAAO,CAAC,GAAG,CAAC,4CAA4C,aAAa,EAAE,CAAC,CAAC;AAEzE,iBAAiB;AACjB,6DAA6D;AAC7D,MAAM,OAAO,GAAG,kBAAQ,CAAC,KAAK,CAAC,UAAU,EAAE;IACzC,OAAO,EAAE,eAAe,EAAE,YAAY;IACtC,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IACnB,SAAS,EAAE,IAAI;CAChB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,GAAG,KAAK,EAAE,KAAa,EAAE,QAAgB,EAAE,EAAE;IAC5D,MAAM,YAAY,GAAG,cAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,cAAc;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,YAAY,EAAE,CAAC,CAAC;IAEtE,mDAAmD;IACnD,yDAAyD;AAC3D,CAAC,CAAC;AAEF,iBAAiB;AACjB,OAAO;KACJ,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;KAC7C,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;KACnD,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;KACnD,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;KACnD,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;KACzD,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC,CAAC;AAE9E,6BAA6B;AAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import chokidar from 'chokidar';
|
|
2
|
+
import * as dotenv from 'dotenv';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
|
|
6
|
+
// .envファイルの読み込み
|
|
7
|
+
dotenv.config();
|
|
8
|
+
|
|
9
|
+
const WATCH_PATH = process.env.WATCH_PATH;
|
|
10
|
+
const SOLID_POD_URL = process.env.SOLID_POD_URL;
|
|
11
|
+
|
|
12
|
+
// 1. 起動時のバリデーション
|
|
13
|
+
if (!WATCH_PATH || !SOLID_POD_URL) {
|
|
14
|
+
console.error('Error: WATCH_PATH or SOLID_POD_URL is not defined in .env');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (!fs.existsSync(WATCH_PATH)) {
|
|
19
|
+
console.error(`Error: Watch path does not exist: ${WATCH_PATH}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
console.log(`[solidar] Starting watcher on: ${WATCH_PATH}`);
|
|
24
|
+
console.log(`[solidar] Notifications will be sent to: ${SOLID_POD_URL}`);
|
|
25
|
+
|
|
26
|
+
// 2. Chokidarの設定
|
|
27
|
+
// ignoreInitial: true にすることで、起動時に既存ファイルをすべて「追加」として検知するのを防ぎます
|
|
28
|
+
const watcher = chokidar.watch(WATCH_PATH, {
|
|
29
|
+
ignored: /(^|[\/\\])\../, // 隠しファイルを無視
|
|
30
|
+
persistent: true,
|
|
31
|
+
ignoreInitial: true,
|
|
32
|
+
//recursive: true
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Solidサーバーへ通知を送るための関数(将来の実装ポイント)
|
|
37
|
+
*/
|
|
38
|
+
const notifySolid = async (event: string, filePath: string) => {
|
|
39
|
+
const relativePath = path.relative(WATCH_PATH, filePath);
|
|
40
|
+
const timestamp = new Date().toISOString();
|
|
41
|
+
|
|
42
|
+
// 現時点ではログ出力のみ
|
|
43
|
+
console.log(`[${timestamp}] ${event.toUpperCase()}: ${relativePath}`);
|
|
44
|
+
|
|
45
|
+
// TODO: ここに Solid サーバーへの HTTPリクエスト(POST/PUT等)を実装する
|
|
46
|
+
// 例: fetch(SOLID_POD_URL, { method: 'POST', body: ... })
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// 3. イベントリスナーの設定
|
|
50
|
+
watcher
|
|
51
|
+
.on('add', (path) => notifySolid('add', path))
|
|
52
|
+
.on('change', (path) => notifySolid('change', path))
|
|
53
|
+
.on('unlink', (path) => notifySolid('unlink', path))
|
|
54
|
+
.on('addDir', (path) => notifySolid('addDir', path))
|
|
55
|
+
.on('unlinkDir', (path) => notifySolid('unlinkDir', path))
|
|
56
|
+
.on('error', (error) => console.error(`[solidar] Watcher error: ${error}`));
|
|
57
|
+
|
|
58
|
+
// 4. systemd 等での停止をクリーンに処理する
|
|
59
|
+
process.on('SIGINT', () => {
|
|
60
|
+
watcher.close().then(() => {
|
|
61
|
+
console.log('[solidar] Watcher stopped.');
|
|
62
|
+
process.exit(0);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solid-client.d.ts","sourceRoot":"","sources":["solid-client.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solid-client.js","sourceRoot":"","sources":["solid-client.ts"],"names":[],"mappings":""}
|
|
File without changes
|
package/src/watcher.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["watcher.ts"],"names":[],"mappings":""}
|
package/src/watcher.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["watcher.ts"],"names":[],"mappings":""}
|
package/src/watcher.ts
ADDED
|
File without changes
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
// Visit https://aka.ms/tsconfig to read more about this file
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
// File Layout
|
|
5
|
+
"rootDir": "./src",
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
|
|
8
|
+
// Environment Settings
|
|
9
|
+
// See also https://aka.ms/tsconfig/module
|
|
10
|
+
"module": "nodenext",
|
|
11
|
+
"target": "esnext",
|
|
12
|
+
"types": [],
|
|
13
|
+
"moduleResolution": "nodenext",
|
|
14
|
+
// For nodejs:
|
|
15
|
+
// "lib": ["esnext"],
|
|
16
|
+
// "types": ["node"],
|
|
17
|
+
// and npm install -D @types/node
|
|
18
|
+
|
|
19
|
+
// Other Outputs
|
|
20
|
+
"sourceMap": true,
|
|
21
|
+
"declaration": true,
|
|
22
|
+
"declarationMap": true,
|
|
23
|
+
|
|
24
|
+
// Stricter Typechecking Options
|
|
25
|
+
"noUncheckedIndexedAccess": true,
|
|
26
|
+
"exactOptionalPropertyTypes": true,
|
|
27
|
+
|
|
28
|
+
// Style Options
|
|
29
|
+
// "noImplicitReturns": true,
|
|
30
|
+
// "noImplicitOverride": true,
|
|
31
|
+
// "noUnusedLocals": true,
|
|
32
|
+
// "noUnusedParameters": true,
|
|
33
|
+
// "noFallthroughCasesInSwitch": true,
|
|
34
|
+
// "noPropertyAccessFromIndexSignature": true,
|
|
35
|
+
|
|
36
|
+
// Recommended Options
|
|
37
|
+
"strict": true,
|
|
38
|
+
"jsx": "react-jsx",
|
|
39
|
+
"verbatimModuleSyntax": true,
|
|
40
|
+
"isolatedModules": true,
|
|
41
|
+
"noUncheckedSideEffectImports": true,
|
|
42
|
+
"moduleDetection": "force",
|
|
43
|
+
"skipLibCheck": true,
|
|
44
|
+
}
|
|
45
|
+
}
|