@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.
Files changed (280) hide show
  1. package/README.md +20 -9
  2. package/dist/bin.js +1 -2
  3. package/dist/build-spk/generator.d.ts +0 -3
  4. package/dist/build-spk/generator.js +135 -287
  5. package/dist/build-spk/native-lifecycle.js +0 -3
  6. package/dist/build-spk/native-payload.js +0 -1
  7. package/dist/cli.js +171 -151
  8. package/dist/compose/analyze.d.ts +1 -2
  9. package/dist/compose/analyze.js +5 -48
  10. package/dist/contract/unsupported-types.d.ts +10 -0
  11. package/dist/contract/unsupported-types.js +49 -0
  12. package/dist/contract/validate.js +25 -2
  13. package/dist/contract/web-launch.js +0 -2
  14. package/dist/deploy/deploy.d.ts +1 -4
  15. package/dist/deploy/deploy.js +45 -156
  16. package/dist/deploy/homes-values.js +1 -1
  17. package/dist/deploy/plan.d.ts +18 -0
  18. package/dist/deploy/plan.js +54 -0
  19. package/dist/deploy/spk-version.d.ts +2 -14
  20. package/dist/deploy/spk-version.js +25 -111
  21. package/dist/dev.d.ts +1 -3
  22. package/dist/dev.js +14 -28
  23. package/dist/error-registry.js +810 -862
  24. package/dist/host/dsm-client.js +12 -272
  25. package/dist/host/dsm-port-profile.d.ts +0 -1
  26. package/dist/host/dsm-port-profile.js +0 -2
  27. package/dist/host/types.d.ts +1 -83
  28. package/dist/index.d.ts +0 -9
  29. package/dist/index.js +0 -6
  30. package/dist/info.d.ts +0 -1
  31. package/dist/info.js +3 -10
  32. package/dist/init.d.ts +11 -1
  33. package/dist/init.js +112 -4
  34. package/dist/log.js +2 -3
  35. package/dist/native/validate.js +0 -1
  36. package/dist/standalone/binary.d.ts +9 -0
  37. package/dist/standalone/binary.js +67 -0
  38. package/dist/standalone/build.d.ts +25 -0
  39. package/dist/standalone/build.js +108 -0
  40. package/dist/standalone/dsm-window.d.ts +26 -0
  41. package/dist/standalone/dsm-window.js +251 -0
  42. package/dist/standalone/helper.d.ts +31 -0
  43. package/dist/standalone/helper.js +104 -0
  44. package/dist/standalone/i18n.d.ts +28 -0
  45. package/dist/standalone/i18n.js +161 -0
  46. package/dist/standalone/inspect-spk.d.ts +21 -0
  47. package/dist/standalone/inspect-spk.js +160 -0
  48. package/dist/standalone/manifest.d.ts +71 -0
  49. package/dist/standalone/manifest.js +276 -0
  50. package/dist/standalone/root-messages.d.ts +7 -0
  51. package/dist/standalone/root-messages.js +250 -0
  52. package/dist/standalone/root-ops.d.ts +42 -0
  53. package/dist/standalone/root-ops.js +101 -0
  54. package/dist/standalone/root-window.d.ts +35 -0
  55. package/dist/standalone/root-window.js +290 -0
  56. package/dist/standalone/spk.d.ts +22 -0
  57. package/dist/standalone/spk.js +205 -0
  58. package/dist/templates/binary/synology-app.yaml +7 -0
  59. package/dist/templates/hello-files/compose.yaml +0 -1
  60. package/dist/templates/hello-web/compose.yaml +13 -10
  61. package/dist/templates/hello-web/html/app.js +1 -23
  62. package/dist/templates/hello-web/html/index.html +1 -3
  63. package/dist/templates/hello-web-page/compose.yaml +13 -10
  64. package/dist/templates/hello-web-page/html/app.js +1 -23
  65. package/dist/templates/hello-web-page/html/index.html +1 -3
  66. package/dist/templates/native-go/README.md +268 -0
  67. package/dist/templates/native-go/backend/cmd/app/main.go +49 -0
  68. package/dist/templates/native-go/backend/cmd/helper/main.go +38 -0
  69. package/dist/templates/native-go/backend/go.mod +3 -0
  70. package/dist/templates/native-go/backend/internal/api/errors.go +33 -0
  71. package/dist/templates/native-go/backend/internal/api/registry.go +94 -0
  72. package/dist/templates/native-go/backend/internal/api/registry_test.go +329 -0
  73. package/dist/templates/native-go/backend/internal/api/server.go +155 -0
  74. package/dist/templates/native-go/backend/internal/app/root_none.go +9 -0
  75. package/dist/templates/native-go/backend/internal/app/routes.go +127 -0
  76. package/dist/templates/native-go/backend/internal/app/routes_test.go +167 -0
  77. package/dist/templates/native-go/backend/internal/dsm/auth.go +118 -0
  78. package/dist/templates/native-go/backend/internal/dsm/auth_test.go +139 -0
  79. package/dist/templates/native-go/backend/internal/helper/control.go +219 -0
  80. package/dist/templates/native-go/backend/internal/helper/control_test.go +242 -0
  81. package/dist/templates/native-go/backend/internal/helper/peer_linux.go +44 -0
  82. package/dist/templates/native-go/backend/internal/helper/peer_other.go +7 -0
  83. package/dist/templates/native-go/backend/internal/helper/process_linux.go +167 -0
  84. package/dist/templates/native-go/backend/internal/helper/process_other.go +5 -0
  85. package/dist/templates/native-go/backend/internal/helper/server_linux.go +83 -0
  86. package/dist/templates/native-go/backend/internal/helper/status.go +271 -0
  87. package/dist/templates/native-go/backend/internal/helper/status_test.go +205 -0
  88. package/dist/templates/native-go/backend/internal/helper/supervision.go +84 -0
  89. package/dist/templates/native-go/backend/internal/helper/supervision_test.go +124 -0
  90. package/dist/templates/native-go/backend/internal/helper/supervisor_linux.go +192 -0
  91. package/dist/templates/native-go/backend/internal/helper/supervisor_linux_test.go +302 -0
  92. package/dist/templates/native-go/dsm-package.yaml +58 -0
  93. package/dist/templates/native-go/gitignore +1 -0
  94. package/dist/templates/native-go/i18n/glossary.json +662 -0
  95. package/dist/templates/native-go/i18n/messages/de.json +28 -0
  96. package/dist/templates/native-go/i18n/messages/en.json +28 -0
  97. package/dist/templates/native-go/i18n/messages/es.json +28 -0
  98. package/dist/templates/native-go/i18n/messages/fr.json +28 -0
  99. package/dist/templates/native-go/i18n/messages/it.json +28 -0
  100. package/dist/templates/native-go/i18n/messages/ja.json +28 -0
  101. package/dist/templates/native-go/i18n/messages/ko.json +28 -0
  102. package/dist/templates/native-go/i18n/messages/zh-CN.json +28 -0
  103. package/dist/templates/native-go/i18n/messages/zh-TW.json +28 -0
  104. package/dist/templates/native-go/ui/app.css +35 -0
  105. package/dist/templates/native-go/ui/app.js +94 -0
  106. package/dist/templates/native-go-better-auth/backend/internal/app/identity.go +208 -0
  107. package/dist/templates/native-go-better-auth/backend/internal/app/identity_test.go +113 -0
  108. package/dist/templates/native-go-better-auth/node/app.mjs +72 -0
  109. package/dist/templates/native-go-better-auth/node/build.mjs +2 -0
  110. package/dist/templates/native-go-better-auth/node/package-lock.json +862 -0
  111. package/dist/templates/native-go-better-auth/node/package.json +1 -0
  112. package/dist/templates/native-go-better-auth/node/test/auth.test.mjs +31 -0
  113. package/dist/templates/native-go-integration/backend/internal/app/identity_none.go +6 -0
  114. package/dist/templates/native-go-integration/backend/internal/app/personal.go +203 -0
  115. package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +119 -0
  116. package/dist/templates/native-go-root/backend/internal/app/root.go +107 -0
  117. package/dist/templates/native-go-root/backend/internal/app/root_test.go +124 -0
  118. package/dist/templates/native-go-root/root/whoami.sh +6 -0
  119. package/dist/templates/native-go-vue/README.md +110 -0
  120. package/dist/templates/native-go-vue/frontend/DESIGN.md +78 -0
  121. package/dist/templates/native-go-vue/frontend/package-lock.json +2507 -0
  122. package/dist/templates/native-go-vue/frontend/package.json +6 -0
  123. package/dist/templates/native-go-vue/frontend/src/App.vue +132 -0
  124. package/dist/templates/native-go-vue/frontend/src/context.ts +17 -0
  125. package/dist/templates/native-go-vue/frontend/src/main.ts +26 -0
  126. package/dist/templates/native-go-vue/frontend/src/style.css +14 -0
  127. package/dist/templates/native-go-vue/frontend/test/apps.test.ts +148 -0
  128. package/dist/templates/native-go-vue/frontend/tsconfig.json +1 -0
  129. package/dist/templates/native-go-vue/frontend/vite.config.ts +8 -0
  130. package/dist/templates/native-go-vue/gitignore +2 -0
  131. package/dist/types.d.ts +1 -1
  132. package/dist/validate.js +11 -7
  133. package/package.json +3 -7
  134. package/schema/synology-app.schema.json +36 -37
  135. package/skills/SKILL.md +4 -48
  136. package/skills/reference/create.md +11 -83
  137. package/skills/reference/deploy.md +7 -78
  138. package/skills/reference/diagnose.md +4 -101
  139. package/skills/reference/files.md +5 -41
  140. package/skills/reference/identity.md +3 -29
  141. package/skills/reference/wrap.md +0 -2
  142. package/templates/binary/synology-app.yaml +7 -0
  143. package/templates/hello-files/compose.yaml +0 -1
  144. package/templates/hello-web/compose.yaml +13 -10
  145. package/templates/hello-web/html/app.js +1 -23
  146. package/templates/hello-web/html/index.html +1 -3
  147. package/templates/hello-web-page/compose.yaml +13 -10
  148. package/templates/hello-web-page/html/app.js +1 -23
  149. package/templates/hello-web-page/html/index.html +1 -3
  150. package/templates/native-go/README.md +268 -0
  151. package/templates/native-go/backend/cmd/app/main.go +49 -0
  152. package/templates/native-go/backend/cmd/helper/main.go +38 -0
  153. package/templates/native-go/backend/go.mod +3 -0
  154. package/templates/native-go/backend/internal/api/errors.go +33 -0
  155. package/templates/native-go/backend/internal/api/registry.go +94 -0
  156. package/templates/native-go/backend/internal/api/registry_test.go +329 -0
  157. package/templates/native-go/backend/internal/api/server.go +155 -0
  158. package/templates/native-go/backend/internal/app/root_none.go +9 -0
  159. package/templates/native-go/backend/internal/app/routes.go +127 -0
  160. package/templates/native-go/backend/internal/app/routes_test.go +167 -0
  161. package/templates/native-go/backend/internal/dsm/auth.go +118 -0
  162. package/templates/native-go/backend/internal/dsm/auth_test.go +139 -0
  163. package/templates/native-go/backend/internal/helper/control.go +219 -0
  164. package/templates/native-go/backend/internal/helper/control_test.go +242 -0
  165. package/templates/native-go/backend/internal/helper/peer_linux.go +44 -0
  166. package/templates/native-go/backend/internal/helper/peer_other.go +7 -0
  167. package/templates/native-go/backend/internal/helper/process_linux.go +167 -0
  168. package/templates/native-go/backend/internal/helper/process_other.go +5 -0
  169. package/templates/native-go/backend/internal/helper/server_linux.go +83 -0
  170. package/templates/native-go/backend/internal/helper/status.go +271 -0
  171. package/templates/native-go/backend/internal/helper/status_test.go +205 -0
  172. package/templates/native-go/backend/internal/helper/supervision.go +84 -0
  173. package/templates/native-go/backend/internal/helper/supervision_test.go +124 -0
  174. package/templates/native-go/backend/internal/helper/supervisor_linux.go +192 -0
  175. package/templates/native-go/backend/internal/helper/supervisor_linux_test.go +302 -0
  176. package/templates/native-go/dsm-package.yaml +58 -0
  177. package/templates/native-go/gitignore +1 -0
  178. package/templates/native-go/i18n/glossary.json +662 -0
  179. package/templates/native-go/i18n/messages/de.json +28 -0
  180. package/templates/native-go/i18n/messages/en.json +28 -0
  181. package/templates/native-go/i18n/messages/es.json +28 -0
  182. package/templates/native-go/i18n/messages/fr.json +28 -0
  183. package/templates/native-go/i18n/messages/it.json +28 -0
  184. package/templates/native-go/i18n/messages/ja.json +28 -0
  185. package/templates/native-go/i18n/messages/ko.json +28 -0
  186. package/templates/native-go/i18n/messages/zh-CN.json +28 -0
  187. package/templates/native-go/i18n/messages/zh-TW.json +28 -0
  188. package/templates/native-go/ui/app.css +35 -0
  189. package/templates/native-go/ui/app.js +94 -0
  190. package/templates/native-go-better-auth/backend/internal/app/identity.go +208 -0
  191. package/templates/native-go-better-auth/backend/internal/app/identity_test.go +113 -0
  192. package/templates/native-go-better-auth/node/app.mjs +72 -0
  193. package/templates/native-go-better-auth/node/build.mjs +2 -0
  194. package/templates/native-go-better-auth/node/package-lock.json +862 -0
  195. package/templates/native-go-better-auth/node/package.json +1 -0
  196. package/templates/native-go-better-auth/node/test/auth.test.mjs +31 -0
  197. package/templates/native-go-integration/backend/internal/app/identity_none.go +6 -0
  198. package/templates/native-go-integration/backend/internal/app/personal.go +203 -0
  199. package/templates/native-go-integration/backend/internal/app/personal_test.go +119 -0
  200. package/templates/native-go-root/backend/internal/app/root.go +107 -0
  201. package/templates/native-go-root/backend/internal/app/root_test.go +124 -0
  202. package/templates/native-go-root/root/whoami.sh +6 -0
  203. package/templates/native-go-vue/README.md +110 -0
  204. package/templates/native-go-vue/frontend/DESIGN.md +78 -0
  205. package/templates/native-go-vue/frontend/package-lock.json +2507 -0
  206. package/templates/native-go-vue/frontend/package.json +6 -0
  207. package/templates/native-go-vue/frontend/src/App.vue +132 -0
  208. package/templates/native-go-vue/frontend/src/context.ts +17 -0
  209. package/templates/native-go-vue/frontend/src/main.ts +26 -0
  210. package/templates/native-go-vue/frontend/src/style.css +14 -0
  211. package/templates/native-go-vue/frontend/test/apps.test.ts +148 -0
  212. package/templates/native-go-vue/frontend/tsconfig.json +1 -0
  213. package/templates/native-go-vue/frontend/vite.config.ts +8 -0
  214. package/templates/native-go-vue/gitignore +2 -0
  215. package/dist/attestation/app-package.d.ts +0 -86
  216. package/dist/attestation/app-package.js +0 -206
  217. package/dist/attestation/install-on-host.d.ts +0 -14
  218. package/dist/attestation/install-on-host.js +0 -52
  219. package/dist/attestation/keyring.d.ts +0 -21
  220. package/dist/attestation/keyring.js +0 -168
  221. package/dist/attestation/platform-service.d.ts +0 -70
  222. package/dist/attestation/platform-service.js +0 -250
  223. package/dist/build-spk/broker-glue.d.ts +0 -16
  224. package/dist/build-spk/broker-glue.js +0 -40
  225. package/dist/deploy/catalog-publish.d.ts +0 -3
  226. package/dist/deploy/catalog-publish.js +0 -7
  227. package/dist/doctor.d.ts +0 -22
  228. package/dist/doctor.js +0 -822
  229. package/dist/error-collector.d.ts +0 -2
  230. package/dist/error-collector.js +0 -46
  231. package/dist/host/broker-paths.d.ts +0 -1
  232. package/dist/host/broker-paths.js +0 -1
  233. package/dist/host/broker-upgrade-preflight.d.ts +0 -61
  234. package/dist/host/broker-upgrade-preflight.js +0 -156
  235. package/dist/host/digests.d.ts +0 -5
  236. package/dist/host/digests.js +0 -63
  237. package/dist/host/fake-nas.d.ts +0 -49
  238. package/dist/host/fake-nas.js +0 -193
  239. package/dist/mock-broker/bootstrap.d.ts +0 -2
  240. package/dist/mock-broker/bootstrap.js +0 -8
  241. package/dist/mock-broker/files.d.ts +0 -60
  242. package/dist/mock-broker/files.js +0 -408
  243. package/dist/mock-broker/oidc.d.ts +0 -31
  244. package/dist/mock-broker/oidc.js +0 -161
  245. package/dist/mock-broker/path.d.ts +0 -9
  246. package/dist/mock-broker/path.js +0 -50
  247. package/dist/mock-broker/server.d.ts +0 -19
  248. package/dist/mock-broker/server.js +0 -350
  249. package/dist/publish/build-ledger.d.ts +0 -22
  250. package/dist/publish/build-ledger.js +0 -26
  251. package/dist/publish/community-path.d.ts +0 -6
  252. package/dist/publish/community-path.js +0 -41
  253. package/dist/publish/curated-release.d.ts +0 -78
  254. package/dist/publish/curated-release.js +0 -883
  255. package/dist/publish/file-build-ledger.d.ts +0 -18
  256. package/dist/publish/file-build-ledger.js +0 -268
  257. package/dist/publish/github-pr.d.ts +0 -25
  258. package/dist/publish/github-pr.js +0 -85
  259. package/dist/publish/github-repo.d.ts +0 -8
  260. package/dist/publish/github-repo.js +0 -21
  261. package/dist/publish/platform-service-release.d.ts +0 -60
  262. package/dist/publish/platform-service-release.js +0 -333
  263. package/dist/publish/preflight.d.ts +0 -24
  264. package/dist/publish/preflight.js +0 -138
  265. package/dist/publish/publish.d.ts +0 -27
  266. package/dist/publish/publish.js +0 -136
  267. package/dist/publish/sync-definition.d.ts +0 -4
  268. package/dist/publish/sync-definition.js +0 -48
  269. package/dist/release-bin.d.ts +0 -2
  270. package/dist/release-bin.js +0 -23
  271. package/dist/templates/hello-web/html/sdk.js +0 -68
  272. package/dist/templates/hello-web-page/html/sdk.js +0 -68
  273. package/dist/templates/native/synology-app.yaml +0 -7
  274. package/dist/test-host.d.ts +0 -15
  275. package/dist/test-host.js +0 -37
  276. package/templates/hello-web/html/sdk.js +0 -68
  277. package/templates/hello-web-page/html/sdk.js +0 -68
  278. package/templates/native/synology-app.yaml +0 -7
  279. /package/dist/templates/{native → binary}/native.yaml +0 -0
  280. /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
- }
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
@@ -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
- }
@@ -1,7 +0,0 @@
1
- schema: 1
2
- package: com.example.native-app
3
- version: 0.1.0
4
- displayname: Native App
5
- description: A minimal Syno Package Land native binary app template.
6
- maintainer: Syno Package Land
7
- os_min_ver: "7.2-60000"
@@ -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
- }
@@ -1,7 +0,0 @@
1
- schema: 1
2
- package: com.example.native-app
3
- version: 0.1.0
4
- displayname: Native App
5
- description: A minimal Syno Package Land native binary app template.
6
- maintainer: Syno Package Land
7
- os_min_ver: "7.2-60000"
File without changes
File without changes