@synopackageland/cli 0.3.10 → 0.4.0
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/README.md +20 -9
- package/dist/bin.js +1 -2
- package/dist/build-spk/generator.d.ts +0 -3
- package/dist/build-spk/generator.js +135 -287
- package/dist/build-spk/native-lifecycle.js +0 -3
- package/dist/build-spk/native-payload.js +0 -1
- package/dist/cli.js +171 -151
- package/dist/compose/analyze.d.ts +1 -2
- package/dist/compose/analyze.js +5 -48
- package/dist/contract/unsupported-types.d.ts +10 -0
- package/dist/contract/unsupported-types.js +49 -0
- package/dist/contract/validate.js +25 -2
- package/dist/contract/web-launch.js +0 -2
- package/dist/deploy/deploy.d.ts +1 -4
- package/dist/deploy/deploy.js +45 -156
- package/dist/deploy/homes-values.js +1 -1
- package/dist/deploy/plan.d.ts +18 -0
- package/dist/deploy/plan.js +54 -0
- package/dist/deploy/spk-version.d.ts +2 -14
- package/dist/deploy/spk-version.js +25 -111
- package/dist/dev.d.ts +1 -3
- package/dist/dev.js +14 -28
- package/dist/error-registry.js +810 -862
- package/dist/host/dsm-client.js +12 -272
- package/dist/host/dsm-port-profile.d.ts +0 -1
- package/dist/host/dsm-port-profile.js +0 -2
- package/dist/host/types.d.ts +1 -83
- package/dist/index.d.ts +0 -9
- package/dist/index.js +0 -6
- package/dist/info.d.ts +0 -1
- package/dist/info.js +3 -10
- package/dist/init.d.ts +11 -1
- package/dist/init.js +112 -4
- package/dist/log.js +2 -3
- package/dist/native/validate.js +0 -1
- package/dist/standalone/binary.d.ts +9 -0
- package/dist/standalone/binary.js +67 -0
- package/dist/standalone/build.d.ts +25 -0
- package/dist/standalone/build.js +108 -0
- package/dist/standalone/dsm-window.d.ts +26 -0
- package/dist/standalone/dsm-window.js +251 -0
- package/dist/standalone/helper.d.ts +31 -0
- package/dist/standalone/helper.js +104 -0
- package/dist/standalone/i18n.d.ts +28 -0
- package/dist/standalone/i18n.js +161 -0
- package/dist/standalone/inspect-spk.d.ts +21 -0
- package/dist/standalone/inspect-spk.js +160 -0
- package/dist/standalone/manifest.d.ts +71 -0
- package/dist/standalone/manifest.js +276 -0
- package/dist/standalone/root-messages.d.ts +7 -0
- package/dist/standalone/root-messages.js +250 -0
- package/dist/standalone/root-ops.d.ts +42 -0
- package/dist/standalone/root-ops.js +101 -0
- package/dist/standalone/root-window.d.ts +35 -0
- package/dist/standalone/root-window.js +290 -0
- package/dist/standalone/spk.d.ts +22 -0
- package/dist/standalone/spk.js +205 -0
- package/dist/templates/binary/synology-app.yaml +7 -0
- package/dist/templates/hello-files/compose.yaml +0 -1
- package/dist/templates/hello-web/compose.yaml +13 -10
- package/dist/templates/hello-web/html/app.js +1 -23
- package/dist/templates/hello-web/html/index.html +1 -3
- package/dist/templates/hello-web-page/compose.yaml +13 -10
- package/dist/templates/hello-web-page/html/app.js +1 -23
- package/dist/templates/hello-web-page/html/index.html +1 -3
- package/dist/templates/native-go/README.md +268 -0
- package/dist/templates/native-go/backend/cmd/app/main.go +49 -0
- package/dist/templates/native-go/backend/cmd/helper/main.go +38 -0
- package/dist/templates/native-go/backend/go.mod +3 -0
- package/dist/templates/native-go/backend/internal/api/errors.go +33 -0
- package/dist/templates/native-go/backend/internal/api/registry.go +94 -0
- package/dist/templates/native-go/backend/internal/api/registry_test.go +329 -0
- package/dist/templates/native-go/backend/internal/api/server.go +155 -0
- package/dist/templates/native-go/backend/internal/app/root_none.go +9 -0
- package/dist/templates/native-go/backend/internal/app/routes.go +127 -0
- package/dist/templates/native-go/backend/internal/app/routes_test.go +167 -0
- package/dist/templates/native-go/backend/internal/dsm/auth.go +118 -0
- package/dist/templates/native-go/backend/internal/dsm/auth_test.go +139 -0
- package/dist/templates/native-go/backend/internal/helper/control.go +219 -0
- package/dist/templates/native-go/backend/internal/helper/control_test.go +242 -0
- package/dist/templates/native-go/backend/internal/helper/peer_linux.go +44 -0
- package/dist/templates/native-go/backend/internal/helper/peer_other.go +7 -0
- package/dist/templates/native-go/backend/internal/helper/process_linux.go +167 -0
- package/dist/templates/native-go/backend/internal/helper/process_other.go +5 -0
- package/dist/templates/native-go/backend/internal/helper/server_linux.go +83 -0
- package/dist/templates/native-go/backend/internal/helper/status.go +271 -0
- package/dist/templates/native-go/backend/internal/helper/status_test.go +205 -0
- package/dist/templates/native-go/backend/internal/helper/supervision.go +84 -0
- package/dist/templates/native-go/backend/internal/helper/supervision_test.go +124 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_linux.go +192 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_linux_test.go +302 -0
- package/dist/templates/native-go/dsm-package.yaml +58 -0
- package/dist/templates/native-go/gitignore +1 -0
- package/dist/templates/native-go/i18n/glossary.json +662 -0
- package/dist/templates/native-go/i18n/messages/de.json +28 -0
- package/dist/templates/native-go/i18n/messages/en.json +28 -0
- package/dist/templates/native-go/i18n/messages/es.json +28 -0
- package/dist/templates/native-go/i18n/messages/fr.json +28 -0
- package/dist/templates/native-go/i18n/messages/it.json +28 -0
- package/dist/templates/native-go/i18n/messages/ja.json +28 -0
- package/dist/templates/native-go/i18n/messages/ko.json +28 -0
- package/dist/templates/native-go/i18n/messages/zh-CN.json +28 -0
- package/dist/templates/native-go/i18n/messages/zh-TW.json +28 -0
- package/dist/templates/native-go/ui/app.css +35 -0
- package/dist/templates/native-go/ui/app.js +94 -0
- package/dist/templates/native-go-better-auth/backend/internal/app/identity.go +208 -0
- package/dist/templates/native-go-better-auth/backend/internal/app/identity_test.go +113 -0
- package/dist/templates/native-go-better-auth/node/app.mjs +72 -0
- package/dist/templates/native-go-better-auth/node/build.mjs +2 -0
- package/dist/templates/native-go-better-auth/node/package-lock.json +862 -0
- package/dist/templates/native-go-better-auth/node/package.json +1 -0
- package/dist/templates/native-go-better-auth/node/test/auth.test.mjs +31 -0
- package/dist/templates/native-go-integration/backend/internal/app/identity_none.go +6 -0
- package/dist/templates/native-go-integration/backend/internal/app/personal.go +203 -0
- package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +119 -0
- package/dist/templates/native-go-root/backend/internal/app/root.go +107 -0
- package/dist/templates/native-go-root/backend/internal/app/root_test.go +124 -0
- package/dist/templates/native-go-root/root/whoami.sh +6 -0
- package/dist/templates/native-go-vue/README.md +110 -0
- package/dist/templates/native-go-vue/frontend/DESIGN.md +78 -0
- package/dist/templates/native-go-vue/frontend/package-lock.json +2507 -0
- package/dist/templates/native-go-vue/frontend/package.json +6 -0
- package/dist/templates/native-go-vue/frontend/src/App.vue +132 -0
- package/dist/templates/native-go-vue/frontend/src/context.ts +17 -0
- package/dist/templates/native-go-vue/frontend/src/main.ts +26 -0
- package/dist/templates/native-go-vue/frontend/src/style.css +14 -0
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +148 -0
- package/dist/templates/native-go-vue/frontend/tsconfig.json +1 -0
- package/dist/templates/native-go-vue/frontend/vite.config.ts +8 -0
- package/dist/templates/native-go-vue/gitignore +2 -0
- package/dist/types.d.ts +1 -1
- package/dist/validate.js +11 -7
- package/package.json +3 -7
- package/schema/synology-app.schema.json +36 -37
- package/skills/SKILL.md +4 -48
- package/skills/reference/create.md +11 -83
- package/skills/reference/deploy.md +7 -78
- package/skills/reference/diagnose.md +4 -101
- package/skills/reference/files.md +5 -41
- package/skills/reference/identity.md +3 -29
- package/skills/reference/wrap.md +0 -2
- package/templates/binary/synology-app.yaml +7 -0
- package/templates/hello-files/compose.yaml +0 -1
- package/templates/hello-web/compose.yaml +13 -10
- package/templates/hello-web/html/app.js +1 -23
- package/templates/hello-web/html/index.html +1 -3
- package/templates/hello-web-page/compose.yaml +13 -10
- package/templates/hello-web-page/html/app.js +1 -23
- package/templates/hello-web-page/html/index.html +1 -3
- package/templates/native-go/README.md +268 -0
- package/templates/native-go/backend/cmd/app/main.go +49 -0
- package/templates/native-go/backend/cmd/helper/main.go +38 -0
- package/templates/native-go/backend/go.mod +3 -0
- package/templates/native-go/backend/internal/api/errors.go +33 -0
- package/templates/native-go/backend/internal/api/registry.go +94 -0
- package/templates/native-go/backend/internal/api/registry_test.go +329 -0
- package/templates/native-go/backend/internal/api/server.go +155 -0
- package/templates/native-go/backend/internal/app/root_none.go +9 -0
- package/templates/native-go/backend/internal/app/routes.go +127 -0
- package/templates/native-go/backend/internal/app/routes_test.go +167 -0
- package/templates/native-go/backend/internal/dsm/auth.go +118 -0
- package/templates/native-go/backend/internal/dsm/auth_test.go +139 -0
- package/templates/native-go/backend/internal/helper/control.go +219 -0
- package/templates/native-go/backend/internal/helper/control_test.go +242 -0
- package/templates/native-go/backend/internal/helper/peer_linux.go +44 -0
- package/templates/native-go/backend/internal/helper/peer_other.go +7 -0
- package/templates/native-go/backend/internal/helper/process_linux.go +167 -0
- package/templates/native-go/backend/internal/helper/process_other.go +5 -0
- package/templates/native-go/backend/internal/helper/server_linux.go +83 -0
- package/templates/native-go/backend/internal/helper/status.go +271 -0
- package/templates/native-go/backend/internal/helper/status_test.go +205 -0
- package/templates/native-go/backend/internal/helper/supervision.go +84 -0
- package/templates/native-go/backend/internal/helper/supervision_test.go +124 -0
- package/templates/native-go/backend/internal/helper/supervisor_linux.go +192 -0
- package/templates/native-go/backend/internal/helper/supervisor_linux_test.go +302 -0
- package/templates/native-go/dsm-package.yaml +58 -0
- package/templates/native-go/gitignore +1 -0
- package/templates/native-go/i18n/glossary.json +662 -0
- package/templates/native-go/i18n/messages/de.json +28 -0
- package/templates/native-go/i18n/messages/en.json +28 -0
- package/templates/native-go/i18n/messages/es.json +28 -0
- package/templates/native-go/i18n/messages/fr.json +28 -0
- package/templates/native-go/i18n/messages/it.json +28 -0
- package/templates/native-go/i18n/messages/ja.json +28 -0
- package/templates/native-go/i18n/messages/ko.json +28 -0
- package/templates/native-go/i18n/messages/zh-CN.json +28 -0
- package/templates/native-go/i18n/messages/zh-TW.json +28 -0
- package/templates/native-go/ui/app.css +35 -0
- package/templates/native-go/ui/app.js +94 -0
- package/templates/native-go-better-auth/backend/internal/app/identity.go +208 -0
- package/templates/native-go-better-auth/backend/internal/app/identity_test.go +113 -0
- package/templates/native-go-better-auth/node/app.mjs +72 -0
- package/templates/native-go-better-auth/node/build.mjs +2 -0
- package/templates/native-go-better-auth/node/package-lock.json +862 -0
- package/templates/native-go-better-auth/node/package.json +1 -0
- package/templates/native-go-better-auth/node/test/auth.test.mjs +31 -0
- package/templates/native-go-integration/backend/internal/app/identity_none.go +6 -0
- package/templates/native-go-integration/backend/internal/app/personal.go +203 -0
- package/templates/native-go-integration/backend/internal/app/personal_test.go +119 -0
- package/templates/native-go-root/backend/internal/app/root.go +107 -0
- package/templates/native-go-root/backend/internal/app/root_test.go +124 -0
- package/templates/native-go-root/root/whoami.sh +6 -0
- package/templates/native-go-vue/README.md +110 -0
- package/templates/native-go-vue/frontend/DESIGN.md +78 -0
- package/templates/native-go-vue/frontend/package-lock.json +2507 -0
- package/templates/native-go-vue/frontend/package.json +6 -0
- package/templates/native-go-vue/frontend/src/App.vue +132 -0
- package/templates/native-go-vue/frontend/src/context.ts +17 -0
- package/templates/native-go-vue/frontend/src/main.ts +26 -0
- package/templates/native-go-vue/frontend/src/style.css +14 -0
- package/templates/native-go-vue/frontend/test/apps.test.ts +148 -0
- package/templates/native-go-vue/frontend/tsconfig.json +1 -0
- package/templates/native-go-vue/frontend/vite.config.ts +8 -0
- package/templates/native-go-vue/gitignore +2 -0
- package/dist/attestation/app-package.d.ts +0 -86
- package/dist/attestation/app-package.js +0 -206
- package/dist/attestation/install-on-host.d.ts +0 -14
- package/dist/attestation/install-on-host.js +0 -52
- package/dist/attestation/keyring.d.ts +0 -21
- package/dist/attestation/keyring.js +0 -168
- package/dist/attestation/platform-service.d.ts +0 -70
- package/dist/attestation/platform-service.js +0 -250
- package/dist/build-spk/broker-glue.d.ts +0 -16
- package/dist/build-spk/broker-glue.js +0 -40
- package/dist/deploy/catalog-publish.d.ts +0 -3
- package/dist/deploy/catalog-publish.js +0 -7
- package/dist/doctor.d.ts +0 -22
- package/dist/doctor.js +0 -822
- package/dist/error-collector.d.ts +0 -2
- package/dist/error-collector.js +0 -46
- package/dist/host/broker-paths.d.ts +0 -1
- package/dist/host/broker-paths.js +0 -1
- package/dist/host/broker-upgrade-preflight.d.ts +0 -61
- package/dist/host/broker-upgrade-preflight.js +0 -156
- package/dist/host/digests.d.ts +0 -5
- package/dist/host/digests.js +0 -63
- package/dist/host/fake-nas.d.ts +0 -49
- package/dist/host/fake-nas.js +0 -193
- package/dist/mock-broker/bootstrap.d.ts +0 -2
- package/dist/mock-broker/bootstrap.js +0 -8
- package/dist/mock-broker/files.d.ts +0 -60
- package/dist/mock-broker/files.js +0 -408
- package/dist/mock-broker/oidc.d.ts +0 -31
- package/dist/mock-broker/oidc.js +0 -161
- package/dist/mock-broker/path.d.ts +0 -9
- package/dist/mock-broker/path.js +0 -50
- package/dist/mock-broker/server.d.ts +0 -19
- package/dist/mock-broker/server.js +0 -350
- package/dist/publish/build-ledger.d.ts +0 -22
- package/dist/publish/build-ledger.js +0 -26
- package/dist/publish/community-path.d.ts +0 -6
- package/dist/publish/community-path.js +0 -41
- package/dist/publish/curated-release.d.ts +0 -78
- package/dist/publish/curated-release.js +0 -883
- package/dist/publish/file-build-ledger.d.ts +0 -18
- package/dist/publish/file-build-ledger.js +0 -268
- package/dist/publish/github-pr.d.ts +0 -25
- package/dist/publish/github-pr.js +0 -85
- package/dist/publish/github-repo.d.ts +0 -8
- package/dist/publish/github-repo.js +0 -21
- package/dist/publish/platform-service-release.d.ts +0 -60
- package/dist/publish/platform-service-release.js +0 -333
- package/dist/publish/preflight.d.ts +0 -24
- package/dist/publish/preflight.js +0 -138
- package/dist/publish/publish.d.ts +0 -27
- package/dist/publish/publish.js +0 -136
- package/dist/publish/sync-definition.d.ts +0 -4
- package/dist/publish/sync-definition.js +0 -48
- package/dist/release-bin.d.ts +0 -2
- package/dist/release-bin.js +0 -23
- package/dist/templates/hello-web/html/sdk.js +0 -68
- package/dist/templates/hello-web-page/html/sdk.js +0 -68
- package/dist/templates/native/synology-app.yaml +0 -7
- package/dist/test-host.d.ts +0 -15
- package/dist/test-host.js +0 -37
- package/templates/hello-web/html/sdk.js +0 -68
- package/templates/hello-web-page/html/sdk.js +0 -68
- package/templates/native/synology-app.yaml +0 -7
- /package/dist/templates/{native → binary}/native.yaml +0 -0
- /package/templates/{native → binary}/native.yaml +0 -0
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { cpSync, existsSync, mkdirSync, readdirSync, rmSync, statSync } from "node:fs";
|
|
2
|
-
import { join, resolve } from "node:path";
|
|
3
|
-
const PACKAGING_DEFINITION_FILES = new Set(["synology-app.yaml", "compose.yaml", "README.md", "icon.png"]);
|
|
4
|
-
const PACKAGING_DEFINITION_DIRS = new Set(["html"]);
|
|
5
|
-
export function assertDistinctSyncPaths(sourceRoot, targetDir) {
|
|
6
|
-
if (resolve(sourceRoot) === resolve(targetDir)) {
|
|
7
|
-
throw new Error("publish 的專案根目錄不能是 Community Apps 目標目錄。請對開發專案執行,不要對 synopkgland-community-apps/apps/<package> 本身執行。");
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
export function syncPackagingDefinition(source, targetDir) {
|
|
11
|
-
assertDistinctSyncPaths(source.root, targetDir);
|
|
12
|
-
if (existsSync(targetDir)) {
|
|
13
|
-
rmSync(targetDir, { recursive: true, force: true });
|
|
14
|
-
}
|
|
15
|
-
mkdirSync(targetDir, { recursive: true });
|
|
16
|
-
for (const name of PACKAGING_DEFINITION_FILES) {
|
|
17
|
-
const from = join(source.root, name);
|
|
18
|
-
if (existsSync(from) && statSync(from).isFile()) {
|
|
19
|
-
cpSync(from, join(targetDir, name));
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
for (const name of PACKAGING_DEFINITION_DIRS) {
|
|
23
|
-
const from = join(source.root, name);
|
|
24
|
-
if (existsSync(from) && statSync(from).isDirectory()) {
|
|
25
|
-
cpSync(from, join(targetDir, name), { recursive: true });
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
export function listSyncedRelativePaths(targetDir) {
|
|
30
|
-
const paths = [];
|
|
31
|
-
const walk = (current, prefix) => {
|
|
32
|
-
if (!existsSync(current)) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
for (const entry of readdirSync(current, { withFileTypes: true })) {
|
|
36
|
-
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
37
|
-
const absolute = join(current, entry.name);
|
|
38
|
-
if (entry.isDirectory()) {
|
|
39
|
-
walk(absolute, rel);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
paths.push(rel);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
walk(targetDir, "");
|
|
47
|
-
return paths.sort();
|
|
48
|
-
}
|
package/dist/release-bin.d.ts
DELETED
package/dist/release-bin.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Trusted-CI entry point. Kept out of the `synopkgland` developer binary on
|
|
4
|
-
* purpose: allocating a Package Build, signing attestations and publishing to
|
|
5
|
-
* the Curated Package Source require release authority that a developer's
|
|
6
|
-
* machine must never hold. Only CI running from the reviewed merged revision
|
|
7
|
-
* has the keyring, the ledger write credential and the publish credential.
|
|
8
|
-
*/
|
|
9
|
-
import { loadDotEnv } from "./load-env.js";
|
|
10
|
-
import { runCuratedReleaseCli } from "./publish/curated-release.js";
|
|
11
|
-
import { runPlatformServiceReleaseCli } from "./publish/platform-service-release.js";
|
|
12
|
-
loadDotEnv();
|
|
13
|
-
const releaseRun = process.argv[2] === "release-platform-service"
|
|
14
|
-
? runPlatformServiceReleaseCli(process.argv, process.env)
|
|
15
|
-
: runCuratedReleaseCli(["node", "synopkgland-release", "release", ...process.argv.slice(2)]);
|
|
16
|
-
releaseRun
|
|
17
|
-
.then((status) => {
|
|
18
|
-
process.exitCode = status;
|
|
19
|
-
})
|
|
20
|
-
.catch((error) => {
|
|
21
|
-
console.error(error instanceof Error ? error.message : String(error));
|
|
22
|
-
process.exit(1);
|
|
23
|
-
});
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
export function createSynologyClient(options = {}) {
|
|
2
|
-
const bootstrap =
|
|
3
|
-
options.bootstrap ??
|
|
4
|
-
globalThis.__SYNOLOGY_BOOTSTRAP__ ??
|
|
5
|
-
(options.brokerBaseUrl
|
|
6
|
-
? {
|
|
7
|
-
brokerBaseUrl: options.brokerBaseUrl,
|
|
8
|
-
jwksUrl: `${String(options.brokerBaseUrl).replace(/\/$/, "")}/.well-known/jwks.json`,
|
|
9
|
-
packageId: "com.synology.hello.web",
|
|
10
|
-
}
|
|
11
|
-
: undefined);
|
|
12
|
-
if (!bootstrap?.brokerBaseUrl) {
|
|
13
|
-
throw new Error("缺少 Platform SDK bootstrap。");
|
|
14
|
-
}
|
|
15
|
-
const apiBase = `${String(bootstrap.brokerBaseUrl).replace(/\/$/, "")}/api/v1`;
|
|
16
|
-
let accessToken = null;
|
|
17
|
-
|
|
18
|
-
async function parseJson(response) {
|
|
19
|
-
const text = await response.text();
|
|
20
|
-
const body = text ? JSON.parse(text) : {};
|
|
21
|
-
if (!response.ok) {
|
|
22
|
-
const error = body.error ?? {};
|
|
23
|
-
const err = new Error(error.message ?? `Broker request failed with status ${response.status}`);
|
|
24
|
-
err.code = error.code;
|
|
25
|
-
err.details = error.details;
|
|
26
|
-
throw err;
|
|
27
|
-
}
|
|
28
|
-
return body;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
auth: {
|
|
33
|
-
async requireLogin() {
|
|
34
|
-
const result = await parseJson(
|
|
35
|
-
await fetch(`${apiBase}/auth/login`, {
|
|
36
|
-
method: "POST",
|
|
37
|
-
headers: { "content-type": "application/json" },
|
|
38
|
-
credentials: "include",
|
|
39
|
-
body: JSON.stringify({ packageId: bootstrap.packageId }),
|
|
40
|
-
}),
|
|
41
|
-
);
|
|
42
|
-
accessToken = result.accessToken;
|
|
43
|
-
return result.user;
|
|
44
|
-
},
|
|
45
|
-
async getSession() {
|
|
46
|
-
if (!accessToken) {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
const result = await parseJson(
|
|
50
|
-
await fetch(`${apiBase}/session`, {
|
|
51
|
-
headers: { authorization: `Bearer ${accessToken}` },
|
|
52
|
-
credentials: "include",
|
|
53
|
-
}),
|
|
54
|
-
);
|
|
55
|
-
return result.user;
|
|
56
|
-
},
|
|
57
|
-
async getCurrentUser() {
|
|
58
|
-
const session = await this.getSession();
|
|
59
|
-
if (!session) {
|
|
60
|
-
const err = new Error("尚未建立有效身份。");
|
|
61
|
-
err.code = "UNAUTHENTICATED";
|
|
62
|
-
throw err;
|
|
63
|
-
}
|
|
64
|
-
return session;
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
export function createSynologyClient(options = {}) {
|
|
2
|
-
const bootstrap =
|
|
3
|
-
options.bootstrap ??
|
|
4
|
-
globalThis.__SYNOLOGY_BOOTSTRAP__ ??
|
|
5
|
-
(options.brokerBaseUrl
|
|
6
|
-
? {
|
|
7
|
-
brokerBaseUrl: options.brokerBaseUrl,
|
|
8
|
-
jwksUrl: `${String(options.brokerBaseUrl).replace(/\/$/, "")}/.well-known/jwks.json`,
|
|
9
|
-
packageId: "com.synology.hello.web.page",
|
|
10
|
-
}
|
|
11
|
-
: undefined);
|
|
12
|
-
if (!bootstrap?.brokerBaseUrl) {
|
|
13
|
-
throw new Error("缺少 Platform SDK bootstrap。");
|
|
14
|
-
}
|
|
15
|
-
const apiBase = `${String(bootstrap.brokerBaseUrl).replace(/\/$/, "")}/api/v1`;
|
|
16
|
-
let accessToken = null;
|
|
17
|
-
|
|
18
|
-
async function parseJson(response) {
|
|
19
|
-
const text = await response.text();
|
|
20
|
-
const body = text ? JSON.parse(text) : {};
|
|
21
|
-
if (!response.ok) {
|
|
22
|
-
const error = body.error ?? {};
|
|
23
|
-
const err = new Error(error.message ?? `Broker request failed with status ${response.status}`);
|
|
24
|
-
err.code = error.code;
|
|
25
|
-
err.details = error.details;
|
|
26
|
-
throw err;
|
|
27
|
-
}
|
|
28
|
-
return body;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
auth: {
|
|
33
|
-
async requireLogin() {
|
|
34
|
-
const result = await parseJson(
|
|
35
|
-
await fetch(`${apiBase}/auth/login`, {
|
|
36
|
-
method: "POST",
|
|
37
|
-
headers: { "content-type": "application/json" },
|
|
38
|
-
credentials: "include",
|
|
39
|
-
body: JSON.stringify({ packageId: bootstrap.packageId }),
|
|
40
|
-
}),
|
|
41
|
-
);
|
|
42
|
-
accessToken = result.accessToken;
|
|
43
|
-
return result.user;
|
|
44
|
-
},
|
|
45
|
-
async getSession() {
|
|
46
|
-
if (!accessToken) {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
const result = await parseJson(
|
|
50
|
-
await fetch(`${apiBase}/session`, {
|
|
51
|
-
headers: { authorization: `Bearer ${accessToken}` },
|
|
52
|
-
credentials: "include",
|
|
53
|
-
}),
|
|
54
|
-
);
|
|
55
|
-
return result.user;
|
|
56
|
-
},
|
|
57
|
-
async getCurrentUser() {
|
|
58
|
-
const session = await this.getSession();
|
|
59
|
-
if (!session) {
|
|
60
|
-
const err = new Error("尚未建立有效身份。");
|
|
61
|
-
err.code = "UNAUTHENTICATED";
|
|
62
|
-
throw err;
|
|
63
|
-
}
|
|
64
|
-
return session;
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
}
|
package/dist/test-host.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { ProjectRoot } from "./discovery.js";
|
|
2
|
-
import type { NasHost } from "./host/types.js";
|
|
3
|
-
export interface TestProjectOnHostOptions {
|
|
4
|
-
project: ProjectRoot;
|
|
5
|
-
host: NasHost;
|
|
6
|
-
dev?: boolean;
|
|
7
|
-
cookieHeader?: string;
|
|
8
|
-
}
|
|
9
|
-
export interface TestProjectOnHostResult {
|
|
10
|
-
ok: boolean;
|
|
11
|
-
code?: string;
|
|
12
|
-
message?: string;
|
|
13
|
-
suggestion?: string;
|
|
14
|
-
}
|
|
15
|
-
export declare function testProjectOnHost(options: TestProjectOnHostOptions): Promise<TestProjectOnHostResult>;
|
package/dist/test-host.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { validateProject } from "./validate.js";
|
|
2
|
-
import { resolveDeployIdentity } from "./deploy/identity.js";
|
|
3
|
-
export async function testProjectOnHost(options) {
|
|
4
|
-
const validation = validateProject(options.project);
|
|
5
|
-
if (!validation.ok) {
|
|
6
|
-
const firstCode = validation.errors[0]?.code ?? "VALIDATION_FAILED";
|
|
7
|
-
return {
|
|
8
|
-
ok: false,
|
|
9
|
-
code: firstCode,
|
|
10
|
-
message: validation.errors.map((e) => e.code).join(", "),
|
|
11
|
-
suggestion: "請修正合約與 Compose 錯誤。",
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
const identity = resolveDeployIdentity(options.project, { dev: options.dev });
|
|
15
|
-
const installed = await options.host.isPackageInstalled(identity.packageId);
|
|
16
|
-
if (!installed) {
|
|
17
|
-
return {
|
|
18
|
-
ok: false,
|
|
19
|
-
code: "NOT_INSTALLED",
|
|
20
|
-
message: `尚未部署到 ${options.host.dsmOrigin}。下一步:synopkgland deploy --host <nas>${options.dev ? " --dev" : ""}`,
|
|
21
|
-
suggestion: `請執行 synopkgland deploy --host <nas>${options.dev ? " --dev" : ""} 先行部署。`,
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
const smoke = await options.host.smokeRequireLogin({
|
|
25
|
-
packageIdentity: identity.packageId,
|
|
26
|
-
cookieHeader: options.cookieHeader ?? "id=fake; did=fake",
|
|
27
|
-
});
|
|
28
|
-
if (!smoke.ok) {
|
|
29
|
-
return {
|
|
30
|
-
ok: false,
|
|
31
|
-
code: "TEST_HOST_FAILED",
|
|
32
|
-
message: "Open smoke 失敗:requireLogin 未取得 DSM 使用者。",
|
|
33
|
-
suggestion: "請確認應用程式前端已正確初始化 SDK 並登入 DSM。",
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
return { ok: true };
|
|
37
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
export function createSynologyClient(options = {}) {
|
|
2
|
-
const bootstrap =
|
|
3
|
-
options.bootstrap ??
|
|
4
|
-
globalThis.__SYNOLOGY_BOOTSTRAP__ ??
|
|
5
|
-
(options.brokerBaseUrl
|
|
6
|
-
? {
|
|
7
|
-
brokerBaseUrl: options.brokerBaseUrl,
|
|
8
|
-
jwksUrl: `${String(options.brokerBaseUrl).replace(/\/$/, "")}/.well-known/jwks.json`,
|
|
9
|
-
packageId: "com.synology.hello.web",
|
|
10
|
-
}
|
|
11
|
-
: undefined);
|
|
12
|
-
if (!bootstrap?.brokerBaseUrl) {
|
|
13
|
-
throw new Error("缺少 Platform SDK bootstrap。");
|
|
14
|
-
}
|
|
15
|
-
const apiBase = `${String(bootstrap.brokerBaseUrl).replace(/\/$/, "")}/api/v1`;
|
|
16
|
-
let accessToken = null;
|
|
17
|
-
|
|
18
|
-
async function parseJson(response) {
|
|
19
|
-
const text = await response.text();
|
|
20
|
-
const body = text ? JSON.parse(text) : {};
|
|
21
|
-
if (!response.ok) {
|
|
22
|
-
const error = body.error ?? {};
|
|
23
|
-
const err = new Error(error.message ?? `Broker request failed with status ${response.status}`);
|
|
24
|
-
err.code = error.code;
|
|
25
|
-
err.details = error.details;
|
|
26
|
-
throw err;
|
|
27
|
-
}
|
|
28
|
-
return body;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
auth: {
|
|
33
|
-
async requireLogin() {
|
|
34
|
-
const result = await parseJson(
|
|
35
|
-
await fetch(`${apiBase}/auth/login`, {
|
|
36
|
-
method: "POST",
|
|
37
|
-
headers: { "content-type": "application/json" },
|
|
38
|
-
credentials: "include",
|
|
39
|
-
body: JSON.stringify({ packageId: bootstrap.packageId }),
|
|
40
|
-
}),
|
|
41
|
-
);
|
|
42
|
-
accessToken = result.accessToken;
|
|
43
|
-
return result.user;
|
|
44
|
-
},
|
|
45
|
-
async getSession() {
|
|
46
|
-
if (!accessToken) {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
const result = await parseJson(
|
|
50
|
-
await fetch(`${apiBase}/session`, {
|
|
51
|
-
headers: { authorization: `Bearer ${accessToken}` },
|
|
52
|
-
credentials: "include",
|
|
53
|
-
}),
|
|
54
|
-
);
|
|
55
|
-
return result.user;
|
|
56
|
-
},
|
|
57
|
-
async getCurrentUser() {
|
|
58
|
-
const session = await this.getSession();
|
|
59
|
-
if (!session) {
|
|
60
|
-
const err = new Error("尚未建立有效身份。");
|
|
61
|
-
err.code = "UNAUTHENTICATED";
|
|
62
|
-
throw err;
|
|
63
|
-
}
|
|
64
|
-
return session;
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
export function createSynologyClient(options = {}) {
|
|
2
|
-
const bootstrap =
|
|
3
|
-
options.bootstrap ??
|
|
4
|
-
globalThis.__SYNOLOGY_BOOTSTRAP__ ??
|
|
5
|
-
(options.brokerBaseUrl
|
|
6
|
-
? {
|
|
7
|
-
brokerBaseUrl: options.brokerBaseUrl,
|
|
8
|
-
jwksUrl: `${String(options.brokerBaseUrl).replace(/\/$/, "")}/.well-known/jwks.json`,
|
|
9
|
-
packageId: "com.synology.hello.web.page",
|
|
10
|
-
}
|
|
11
|
-
: undefined);
|
|
12
|
-
if (!bootstrap?.brokerBaseUrl) {
|
|
13
|
-
throw new Error("缺少 Platform SDK bootstrap。");
|
|
14
|
-
}
|
|
15
|
-
const apiBase = `${String(bootstrap.brokerBaseUrl).replace(/\/$/, "")}/api/v1`;
|
|
16
|
-
let accessToken = null;
|
|
17
|
-
|
|
18
|
-
async function parseJson(response) {
|
|
19
|
-
const text = await response.text();
|
|
20
|
-
const body = text ? JSON.parse(text) : {};
|
|
21
|
-
if (!response.ok) {
|
|
22
|
-
const error = body.error ?? {};
|
|
23
|
-
const err = new Error(error.message ?? `Broker request failed with status ${response.status}`);
|
|
24
|
-
err.code = error.code;
|
|
25
|
-
err.details = error.details;
|
|
26
|
-
throw err;
|
|
27
|
-
}
|
|
28
|
-
return body;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
auth: {
|
|
33
|
-
async requireLogin() {
|
|
34
|
-
const result = await parseJson(
|
|
35
|
-
await fetch(`${apiBase}/auth/login`, {
|
|
36
|
-
method: "POST",
|
|
37
|
-
headers: { "content-type": "application/json" },
|
|
38
|
-
credentials: "include",
|
|
39
|
-
body: JSON.stringify({ packageId: bootstrap.packageId }),
|
|
40
|
-
}),
|
|
41
|
-
);
|
|
42
|
-
accessToken = result.accessToken;
|
|
43
|
-
return result.user;
|
|
44
|
-
},
|
|
45
|
-
async getSession() {
|
|
46
|
-
if (!accessToken) {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
const result = await parseJson(
|
|
50
|
-
await fetch(`${apiBase}/session`, {
|
|
51
|
-
headers: { authorization: `Bearer ${accessToken}` },
|
|
52
|
-
credentials: "include",
|
|
53
|
-
}),
|
|
54
|
-
);
|
|
55
|
-
return result.user;
|
|
56
|
-
},
|
|
57
|
-
async getCurrentUser() {
|
|
58
|
-
const session = await this.getSession();
|
|
59
|
-
if (!session) {
|
|
60
|
-
const err = new Error("尚未建立有效身份。");
|
|
61
|
-
err.code = "UNAUTHENTICATED";
|
|
62
|
-
throw err;
|
|
63
|
-
}
|
|
64
|
-
return session;
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
}
|
|
File without changes
|
|
File without changes
|