@synopackageland/templates 0.9.9 → 0.10.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.
Files changed (137) hide show
  1. package/README.md +29 -29
  2. package/package.json +2 -2
  3. package/templates/_shared/AGENTS.md +53 -15
  4. package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +1 -1
  5. package/templates/native-go/backend/cmd/app/main.go +15 -1
  6. package/templates/native-go/backend/cmd/app/main_test.go +33 -0
  7. package/templates/native-go/backend/go.mod +1 -1
  8. package/templates/native-go/backend/go.sum +2 -2
  9. package/templates/native-go/i18n/messages/de.json +4 -0
  10. package/templates/native-go/i18n/messages/en.json +4 -0
  11. package/templates/native-go/i18n/messages/es.json +4 -0
  12. package/templates/native-go/i18n/messages/fr.json +4 -0
  13. package/templates/native-go/i18n/messages/it.json +4 -0
  14. package/templates/native-go/i18n/messages/ja.json +4 -0
  15. package/templates/native-go/i18n/messages/ko.json +4 -0
  16. package/templates/native-go/i18n/messages/zh-CN.json +4 -0
  17. package/templates/native-go/i18n/messages/zh-TW.json +4 -0
  18. package/templates/native-go/ui/app.js +2 -1
  19. package/templates/native-go-delegate/frontend/test/capability-panels.test.ts +24 -3
  20. package/templates/native-go-jobs/frontend/test/background-page.test.ts +4 -4
  21. package/templates/native-go-root-ops/backend/internal/app/executor.go +2 -65
  22. package/templates/native-go-root-ops/backend/internal/app/executor_test.go +10 -82
  23. package/templates/native-go-root-ops/frontend/src/ExecutorGate.vue +16 -0
  24. package/templates/native-go-root-ops/frontend/test/executor-gate.test.ts +60 -0
  25. package/templates/native-go-vue/README.md +24 -8
  26. package/templates/native-go-vue/frontend/package-lock.json +9 -9
  27. package/templates/native-go-vue/frontend/package.json +2 -2
  28. package/templates/native-go-vue/frontend/src/App.vue +36 -36
  29. package/templates/native-go-vue/frontend/src/ExecutorGate.vue +10 -0
  30. package/templates/native-go-vue/frontend/test/apps.test.ts +65 -12
  31. package/templates/native-go-vue/frontend/test/context.ts +8 -0
  32. package/templates/native-go-vue/frontend/test/native-controls.test.ts +3 -4
  33. package/templates/native-go-vue/frontend/test/shell-i18n.test.ts +2 -2
  34. package/templates/native-node/README.md +153 -0
  35. package/templates/native-node/backend/app/package.json +4 -0
  36. package/templates/native-node/backend/app/permissions.json +5 -0
  37. package/templates/native-node/backend/package-lock.json +59 -0
  38. package/templates/native-node/backend/package.json +17 -0
  39. package/templates/native-node/backend/src/delegate.ts +5 -0
  40. package/templates/native-node/backend/src/jobs.ts +5 -0
  41. package/templates/native-node/backend/src/main.ts +4 -0
  42. package/templates/native-node/backend/src/params.ts +11 -0
  43. package/templates/native-node/backend/src/root-ops.ts +5 -0
  44. package/templates/native-node/backend/src/routes.ts +97 -0
  45. package/templates/native-node/backend/src/service.ts +22 -0
  46. package/templates/native-node/backend/test/routes.test.ts +75 -0
  47. package/templates/native-node/backend/test/support.ts +67 -0
  48. package/templates/native-node/backend/tsconfig.build.json +8 -0
  49. package/templates/native-node/backend/tsconfig.json +18 -0
  50. package/templates/native-node/dsm-package.yaml +80 -0
  51. package/templates/native-node/gitignore +4 -0
  52. package/templates/native-node-delegate/backend/src/delegate.ts +35 -0
  53. package/templates/native-node-delegate/backend/test/delegate.test.ts +51 -0
  54. package/templates/native-node-jobs/backend/src/jobs.ts +38 -0
  55. package/templates/native-node-jobs/backend/test/jobs.test.ts +73 -0
  56. package/templates/native-node-root-ops/backend/src/root-ops.ts +16 -0
  57. package/templates/native-node-root-ops/backend/test/root-ops.test.ts +23 -0
  58. package/templates/native-node-vue/README.md +56 -0
  59. package/templates/native-node-vue/gitignore +4 -0
  60. package/templates/native-python/README.md +150 -0
  61. package/templates/native-python/backend/app/delegate.py +5 -0
  62. package/templates/native-python/backend/app/jobs.py +5 -0
  63. package/templates/native-python/backend/app/main.py +5 -0
  64. package/templates/native-python/backend/app/params.py +10 -0
  65. package/templates/native-python/backend/app/permissions.json +5 -0
  66. package/templates/native-python/backend/app/root_ops.py +5 -0
  67. package/templates/native-python/backend/app/routes.py +107 -0
  68. package/templates/native-python/backend/tests/support.py +72 -0
  69. package/templates/native-python/backend/tests/test_routes.py +73 -0
  70. package/templates/native-python/dsm-package.yaml +77 -0
  71. package/templates/native-python/gitignore +2 -0
  72. package/templates/native-python-delegate/backend/app/delegate.py +42 -0
  73. package/templates/native-python-delegate/backend/tests/test_delegate.py +58 -0
  74. package/templates/native-python-jobs/backend/app/jobs.py +40 -0
  75. package/templates/native-python-jobs/backend/tests/test_jobs.py +72 -0
  76. package/templates/native-python-root-ops/backend/app/root_ops.py +18 -0
  77. package/templates/native-python-root-ops/backend/tests/test_root_ops.py +34 -0
  78. package/templates/native-python-vue/README.md +56 -0
  79. package/templates/native-python-vue/gitignore +3 -0
  80. package/templates/native-rust/README.md +74 -296
  81. package/templates/native-rust/backend/Cargo.lock +6 -6
  82. package/templates/native-rust/backend/Cargo.toml +2 -10
  83. package/templates/native-rust/backend/src/delegate.rs +6 -0
  84. package/templates/native-rust/backend/src/jobs.rs +6 -0
  85. package/templates/native-rust/backend/src/main.rs +12 -0
  86. package/templates/native-rust/backend/src/root_ops.rs +6 -0
  87. package/templates/native-rust/backend/src/routes.rs +352 -0
  88. package/templates/native-rust/backend/src/test_support.rs +91 -0
  89. package/templates/native-rust/dsm-package.yaml +10 -21
  90. package/templates/native-rust-delegate/backend/src/delegate.rs +171 -0
  91. package/templates/native-rust-jobs/backend/src/jobs.rs +240 -0
  92. package/templates/native-rust-root-ops/backend/src/root_ops.rs +83 -0
  93. package/templates/native-rust-vue/README.md +35 -34
  94. package/templates/native-rust/backend/THIRD_PARTY_NOTICES.txt +0 -207
  95. package/templates/native-rust/backend/src/app/background/mod.rs +0 -424
  96. package/templates/native-rust/backend/src/app/background/owner.rs +0 -77
  97. package/templates/native-rust/backend/src/app/background/owner_tests.rs +0 -174
  98. package/templates/native-rust/backend/src/app/background/schedule.rs +0 -126
  99. package/templates/native-rust/backend/src/app/background/schedule_tests.rs +0 -108
  100. package/templates/native-rust/backend/src/app/background/tests.rs +0 -505
  101. package/templates/native-rust/backend/src/app/background/work.rs +0 -78
  102. package/templates/native-rust/backend/src/app/background/work_tests.rs +0 -123
  103. package/templates/native-rust/backend/src/app/background_routes.rs +0 -22
  104. package/templates/native-rust/backend/src/app/delegate_config.rs +0 -188
  105. package/templates/native-rust/backend/src/app/delegate_routes.rs +0 -22
  106. package/templates/native-rust/backend/src/app/identity.rs +0 -56
  107. package/templates/native-rust/backend/src/app/migrations.rs +0 -79
  108. package/templates/native-rust/backend/src/app/mod.rs +0 -30
  109. package/templates/native-rust/backend/src/app/portal.rs +0 -317
  110. package/templates/native-rust/backend/src/app/root_routes.rs +0 -23
  111. package/templates/native-rust/backend/src/app/routes.rs +0 -315
  112. package/templates/native-rust/backend/src/app/session_files.rs +0 -19
  113. package/templates/native-rust/backend/src/app/shared_folder.rs +0 -383
  114. package/templates/native-rust/backend/src/app/test_support.rs +0 -202
  115. package/templates/native-rust/backend/src/app/uninstall.rs +0 -38
  116. package/templates/native-rust/backend/src/bin/api.rs +0 -72
  117. package/templates/native-rust/backend/src/bin/background-worker.rs +0 -37
  118. package/templates/native-rust/backend/src/build_env.rs +0 -155
  119. package/templates/native-rust/backend/src/lib.rs +0 -6
  120. package/templates/native-rust/backend/src/permissions.rs +0 -54
  121. package/templates/native-rust/backend/src/process.rs +0 -91
  122. package/templates/native-rust/i18n/glossary.json +0 -665
  123. package/templates/native-rust/i18n/messages/de.json +0 -32
  124. package/templates/native-rust/i18n/messages/en.json +0 -32
  125. package/templates/native-rust/i18n/messages/es.json +0 -32
  126. package/templates/native-rust/i18n/messages/fr.json +0 -32
  127. package/templates/native-rust/i18n/messages/it.json +0 -32
  128. package/templates/native-rust/i18n/messages/ja.json +0 -32
  129. package/templates/native-rust/i18n/messages/ko.json +0 -32
  130. package/templates/native-rust/i18n/messages/zh-CN.json +0 -32
  131. package/templates/native-rust/i18n/messages/zh-TW.json +0 -32
  132. package/templates/native-rust/ui/app.css +0 -45
  133. package/templates/native-rust/ui/app.js +0 -111
  134. package/templates/native-rust-delegate/backend/src/app/delegate_routes.rs +0 -92
  135. package/templates/native-rust-delegate/backend/src/bin/background-worker.rs +0 -52
  136. package/templates/native-rust-jobs/backend/src/app/background_routes.rs +0 -109
  137. package/templates/native-rust-root-ops/backend/src/app/root_routes.rs +0 -475
@@ -1,32 +0,0 @@
1
- {
2
- "app.loading": "Loading...",
3
- "app.refresh": "Refresh",
4
- "app.title": "It works",
5
- "error.admin_required": "Sorry, this user account has not been assigned proper privileges to perform this action.",
6
- "error.app_privilege_denied": "Sorry, this user account has not been assigned proper privileges to perform this action.",
7
- "error.auth_unavailable": "Unable to perform this operation. Please try again later.",
8
- "error.bad_request": "Check the entered value and try again.",
9
- "error.bad_response": "Unable to perform this operation. Please try again later.",
10
- "error.cross_origin": "Unable to perform this operation. Please try again later.",
11
- "error.origin_required": "The request was refused: the browser did not show that it came from this App's page. Open the App again in a current browser.",
12
- "error.internal": "Unable to perform this operation. Please try again later.",
13
- "error.json_required": "Unable to perform this operation. Please try again later.",
14
- "error.method_not_allowed": "Unable to perform this operation. Please try again later.",
15
- "error.network": "Connection failed. Please check your network settings.",
16
- "error.request_too_large": "Unable to perform this operation. Please try again later.",
17
- "error.request_timeout": "Unable to perform this operation. Please try again later.",
18
- "error.request_canceled": "Unable to perform this operation. Please try again later.",
19
- "error.session_required": "Connection expired. Please sign in again.",
20
- "error.unknown_method": "Unable to perform this operation. Please try again later.",
21
- "greeting.adminOnly": "Only members of the administrators group can change the greeting.",
22
- "greeting.label": "New greeting",
23
- "greeting.save": "Save",
24
- "greeting.setBy": "{text} — set by {user}",
25
- "status.backend": "Backend",
26
- "status.heading": "Backend status",
27
- "status.package": "Package name",
28
- "status.uid": "Runs as UID",
29
- "status.user": "User",
30
- "status.userAdmin": "{user} (administrator)",
31
- "status.version": "Version"
32
- }
@@ -1,32 +0,0 @@
1
- {
2
- "app.loading": "Cargando...",
3
- "app.refresh": "Actualizar",
4
- "app.title": "Funciona",
5
- "error.admin_required": "A esta cuenta de usuario no se le han asignado los privilegios adecuados para realizar esta acción.",
6
- "error.app_privilege_denied": "A esta cuenta de usuario no se le han asignado los privilegios adecuados para realizar esta acción.",
7
- "error.auth_unavailable": "No se puede realizar esta operación. Vuelva a intentarlo más tarde.",
8
- "error.bad_request": "Compruebe el valor introducido y vuelva a intentarlo.",
9
- "error.bad_response": "No se puede realizar esta operación. Vuelva a intentarlo más tarde.",
10
- "error.cross_origin": "No se puede realizar esta operación. Vuelva a intentarlo más tarde.",
11
- "error.origin_required": "Se rechazó la solicitud: el navegador no indicó que procediera de la página de esta App. Vuelva a abrir la App en un navegador actual.",
12
- "error.internal": "No se puede realizar esta operación. Vuelva a intentarlo más tarde.",
13
- "error.json_required": "No se puede realizar esta operación. Vuelva a intentarlo más tarde.",
14
- "error.method_not_allowed": "No se puede realizar esta operación. Vuelva a intentarlo más tarde.",
15
- "error.network": "Error de la conexión. Compruebe su conexión de red.",
16
- "error.request_too_large": "No se puede realizar esta operación. Vuelva a intentarlo más tarde.",
17
- "error.request_timeout": "No se puede realizar esta operación. Vuelva a intentarlo más tarde.",
18
- "error.request_canceled": "No se puede realizar esta operación. Vuelva a intentarlo más tarde.",
19
- "error.session_required": "Conexión caducada. Vuelva a conectarse.",
20
- "error.unknown_method": "No se puede realizar esta operación. Vuelva a intentarlo más tarde.",
21
- "greeting.adminOnly": "Solo los miembros del grupo administrators pueden cambiar el saludo.",
22
- "greeting.label": "Nuevo saludo",
23
- "greeting.save": "Guardar",
24
- "greeting.setBy": "{text} — establecido por {user}",
25
- "status.backend": "Backend",
26
- "status.heading": "Estado del backend",
27
- "status.package": "Nombre del paquete",
28
- "status.uid": "Se ejecuta como UID",
29
- "status.user": "Usuario",
30
- "status.userAdmin": "{user} (administrador)",
31
- "status.version": "Versión"
32
- }
@@ -1,32 +0,0 @@
1
- {
2
- "app.loading": "Chargement...",
3
- "app.refresh": "Actualiser",
4
- "app.title": "Ça fonctionne",
5
- "error.admin_required": "Désolé, ce compte utilisateur ne dispose pas des droits nécessaires pour accomplir cette action.",
6
- "error.app_privilege_denied": "Désolé, ce compte utilisateur ne dispose pas des droits nécessaires pour accomplir cette action.",
7
- "error.auth_unavailable": "Impossible d'effectuer cette opération. Veuillez réessayer ultérieurement.",
8
- "error.bad_request": "Vérifiez la valeur saisie et réessayez.",
9
- "error.bad_response": "Impossible d'effectuer cette opération. Veuillez réessayer ultérieurement.",
10
- "error.cross_origin": "Impossible d'effectuer cette opération. Veuillez réessayer ultérieurement.",
11
- "error.origin_required": "La requête a été refusée : le navigateur n’a pas indiqué qu’elle provenait de la page de cette App. Rouvrez l’App dans un navigateur récent.",
12
- "error.internal": "Impossible d'effectuer cette opération. Veuillez réessayer ultérieurement.",
13
- "error.json_required": "Impossible d'effectuer cette opération. Veuillez réessayer ultérieurement.",
14
- "error.method_not_allowed": "Impossible d'effectuer cette opération. Veuillez réessayer ultérieurement.",
15
- "error.network": "La connexion a échoué. Vérifiez vos paramètres réseau.",
16
- "error.request_too_large": "Impossible d'effectuer cette opération. Veuillez réessayer ultérieurement.",
17
- "error.request_timeout": "Impossible d'effectuer cette opération. Veuillez réessayer ultérieurement.",
18
- "error.request_canceled": "Impossible d'effectuer cette opération. Veuillez réessayer ultérieurement.",
19
- "error.session_required": "La connexion a expiré. Reconnectez-vous.",
20
- "error.unknown_method": "Impossible d'effectuer cette opération. Veuillez réessayer ultérieurement.",
21
- "greeting.adminOnly": "Seuls les membres du groupe administrators peuvent modifier le message d'accueil.",
22
- "greeting.label": "Nouveau message d'accueil",
23
- "greeting.save": "Sauvegarder",
24
- "greeting.setBy": "{text} — défini par {user}",
25
- "status.backend": "Backend",
26
- "status.heading": "Statut du backend",
27
- "status.package": "Nom du paquet",
28
- "status.uid": "Exécuté avec l'UID",
29
- "status.user": "Utilisateur",
30
- "status.userAdmin": "{user} (administrateur)",
31
- "status.version": "Version"
32
- }
@@ -1,32 +0,0 @@
1
- {
2
- "app.loading": "Caricamento...",
3
- "app.refresh": "Aggiorna",
4
- "app.title": "Funziona",
5
- "error.admin_required": "Siamo spiacenti, a questo account utente non sono stati assegnati privilegi appropriati per eseguire questa azione.",
6
- "error.app_privilege_denied": "Siamo spiacenti, a questo account utente non sono stati assegnati privilegi appropriati per eseguire questa azione.",
7
- "error.auth_unavailable": "Impossibile eseguire questa operazione. Riprovare più tardi.",
8
- "error.bad_request": "Controllare il valore inserito e riprovare.",
9
- "error.bad_response": "Impossibile eseguire questa operazione. Riprovare più tardi.",
10
- "error.cross_origin": "Impossibile eseguire questa operazione. Riprovare più tardi.",
11
- "error.origin_required": "La richiesta è stata rifiutata: il browser non ha indicato che proviene dalla pagina di questa App. Riaprire l’App in un browser aggiornato.",
12
- "error.internal": "Impossibile eseguire questa operazione. Riprovare più tardi.",
13
- "error.json_required": "Impossibile eseguire questa operazione. Riprovare più tardi.",
14
- "error.method_not_allowed": "Impossibile eseguire questa operazione. Riprovare più tardi.",
15
- "error.network": "Connessione non riuscita. Controllare le impostazioni di rete.",
16
- "error.request_too_large": "Impossibile eseguire questa operazione. Riprovare più tardi.",
17
- "error.request_timeout": "Impossibile eseguire questa operazione. Riprovare più tardi.",
18
- "error.request_canceled": "Impossibile eseguire questa operazione. Riprovare più tardi.",
19
- "error.session_required": "Connessione scaduta. Accedere nuovamente.",
20
- "error.unknown_method": "Impossibile eseguire questa operazione. Riprovare più tardi.",
21
- "greeting.adminOnly": "Solo i membri del gruppo administrators possono modificare il saluto.",
22
- "greeting.label": "Nuovo saluto",
23
- "greeting.save": "Salva",
24
- "greeting.setBy": "{text} — impostato da {user}",
25
- "status.backend": "Backend",
26
- "status.heading": "Stato del backend",
27
- "status.package": "Nome pacchetto",
28
- "status.uid": "Eseguito come UID",
29
- "status.user": "Utente",
30
- "status.userAdmin": "{user} (amministratore)",
31
- "status.version": "Versione"
32
- }
@@ -1,32 +0,0 @@
1
- {
2
- "app.loading": "読み込み中...",
3
- "app.refresh": "最新の情報に更新",
4
- "app.title": "動作しています",
5
- "error.admin_required": "申し訳ありませんが、このユーザー アカウントにはこの操作を行うための権限が与えられていません。",
6
- "error.app_privilege_denied": "申し訳ありませんが、このユーザー アカウントにはこの操作を行うための権限が与えられていません。",
7
- "error.auth_unavailable": "この操作は実行できません。後でもう一度お試しください。",
8
- "error.bad_request": "入力した値を確認して、もう一度お試しください。",
9
- "error.bad_response": "この操作は実行できません。後でもう一度お試しください。",
10
- "error.cross_origin": "この操作は実行できません。後でもう一度お試しください。",
11
- "error.origin_required": "リクエストは拒否されました。ブラウザーがこの App のページからのリクエストであることを示しませんでした。最新のブラウザーで App を開き直してください。",
12
- "error.internal": "この操作は実行できません。後でもう一度お試しください。",
13
- "error.json_required": "この操作は実行できません。後でもう一度お試しください。",
14
- "error.method_not_allowed": "この操作は実行できません。後でもう一度お試しください。",
15
- "error.network": "接続に失敗しました。ネットワーク設定を確認してください。",
16
- "error.request_too_large": "この操作は実行できません。後でもう一度お試しください。",
17
- "error.request_timeout": "この操作は実行できません。後でもう一度お試しください。",
18
- "error.request_canceled": "この操作は実行できません。後でもう一度お試しください。",
19
- "error.session_required": "接続の期限が切れています。もう 1 度サイン インしてください。",
20
- "error.unknown_method": "この操作は実行できません。後でもう一度お試しください。",
21
- "greeting.adminOnly": "あいさつを変更できるのは administrators グループのメンバーのみです。",
22
- "greeting.label": "新しいあいさつ",
23
- "greeting.save": "保存",
24
- "greeting.setBy": "{text} — {user} が設定",
25
- "status.backend": "バックエンド",
26
- "status.heading": "バックエンドの状態",
27
- "status.package": "パッケージ名",
28
- "status.uid": "実行 UID",
29
- "status.user": "ユーザー",
30
- "status.userAdmin": "{user}(管理者)",
31
- "status.version": "バージョン"
32
- }
@@ -1,32 +0,0 @@
1
- {
2
- "app.loading": "로드 중…",
3
- "app.refresh": "새로 고침",
4
- "app.title": "정상적으로 작동합니다",
5
- "error.admin_required": "죄송합니다. 이 사용자 계정에는 이 작업을 수행하기에 적절한 권한이 할당되지 않았습니다.",
6
- "error.app_privilege_denied": "죄송합니다. 이 사용자 계정에는 이 작업을 수행하기에 적절한 권한이 할당되지 않았습니다.",
7
- "error.auth_unavailable": "이 작업을 수행할 수 없습니다. 나중에 다시 시도하십시오.",
8
- "error.bad_request": "입력한 값을 확인한 후 다시 시도하십시오.",
9
- "error.bad_response": "이 작업을 수행할 수 없습니다. 나중에 다시 시도하십시오.",
10
- "error.cross_origin": "이 작업을 수행할 수 없습니다. 나중에 다시 시도하십시오.",
11
- "error.origin_required": "요청이 거부되었습니다. 브라우저가 이 App 페이지에서 보낸 요청임을 알리지 않았습니다. 최신 브라우저에서 App을 다시 여십시오.",
12
- "error.internal": "이 작업을 수행할 수 없습니다. 나중에 다시 시도하십시오.",
13
- "error.json_required": "이 작업을 수행할 수 없습니다. 나중에 다시 시도하십시오.",
14
- "error.method_not_allowed": "이 작업을 수행할 수 없습니다. 나중에 다시 시도하십시오.",
15
- "error.network": "연결 실패. 네트워크 설정을 확인해 주십시오.",
16
- "error.request_too_large": "이 작업을 수행할 수 없습니다. 나중에 다시 시도하십시오.",
17
- "error.request_timeout": "이 작업을 수행할 수 없습니다. 나중에 다시 시도하십시오.",
18
- "error.request_canceled": "이 작업을 수행할 수 없습니다. 나중에 다시 시도하십시오.",
19
- "error.session_required": "연결 만료됨. 다시 로그인 해 주십시오.",
20
- "error.unknown_method": "이 작업을 수행할 수 없습니다. 나중에 다시 시도하십시오.",
21
- "greeting.adminOnly": "administrators 그룹의 구성원만 인사말을 변경할 수 있습니다.",
22
- "greeting.label": "새 인사말",
23
- "greeting.save": "저장",
24
- "greeting.setBy": "{text} — {user}님이 설정함",
25
- "status.backend": "백엔드",
26
- "status.heading": "백엔드 상태",
27
- "status.package": "패키지 이름",
28
- "status.uid": "실행 UID",
29
- "status.user": "사용자",
30
- "status.userAdmin": "{user}(관리자)",
31
- "status.version": "버전"
32
- }
@@ -1,32 +0,0 @@
1
- {
2
- "app.loading": "加载中...",
3
- "app.refresh": "刷新",
4
- "app.title": "运行成功",
5
- "error.admin_required": "抱歉,此用户帐户权限不足,无法执行此操作。",
6
- "error.app_privilege_denied": "抱歉,此用户帐户权限不足,无法执行此操作。",
7
- "error.auth_unavailable": "无法执行此操作。请稍后再试。",
8
- "error.bad_request": "请检查输入的值后重试。",
9
- "error.bad_response": "无法执行此操作。请稍后再试。",
10
- "error.cross_origin": "无法执行此操作。请稍后再试。",
11
- "error.origin_required": "请求已被拒绝:浏览器没有表明它来自此 App 的页面。请使用新版浏览器重新打开 App。",
12
- "error.internal": "无法执行此操作。请稍后再试。",
13
- "error.json_required": "无法执行此操作。请稍后再试。",
14
- "error.method_not_allowed": "无法执行此操作。请稍后再试。",
15
- "error.network": "无法联机,请检查你的网络设置。",
16
- "error.request_too_large": "无法执行此操作。请稍后再试。",
17
- "error.request_timeout": "无法执行此操作。请稍后再试。",
18
- "error.request_canceled": "无法执行此操作。请稍后再试。",
19
- "error.session_required": "联机超时,请重新登录。",
20
- "error.unknown_method": "无法执行此操作。请稍后再试。",
21
- "greeting.adminOnly": "只有 administrators 群组的成员可以更改问候语。",
22
- "greeting.label": "新的问候语",
23
- "greeting.save": "保存",
24
- "greeting.setBy": "{text} — 由 {user} 设置",
25
- "status.backend": "后端",
26
- "status.heading": "后端状态",
27
- "status.package": "套件名称",
28
- "status.uid": "运行身份 UID",
29
- "status.user": "用户帐号",
30
- "status.userAdmin": "{user}(管理员)",
31
- "status.version": "版本"
32
- }
@@ -1,32 +0,0 @@
1
- {
2
- "app.loading": "載入中...",
3
- "app.refresh": "重新整理",
4
- "app.title": "成功運作了",
5
- "error.admin_required": "抱歉,此使用者帳號權限不足,無法執行此動作。",
6
- "error.app_privilege_denied": "抱歉,此使用者帳號權限不足,無法執行此動作。",
7
- "error.auth_unavailable": "無法執行此操作。請稍後再試。",
8
- "error.bad_request": "請檢查輸入的值後再試一次。",
9
- "error.bad_response": "無法執行此操作。請稍後再試。",
10
- "error.cross_origin": "無法執行此操作。請稍後再試。",
11
- "error.origin_required": "要求已被拒絕:瀏覽器沒有表明它來自這個 App 的頁面。請使用新版瀏覽器重新開啟 App。",
12
- "error.internal": "無法執行此操作。請稍後再試。",
13
- "error.json_required": "無法執行此操作。請稍後再試。",
14
- "error.method_not_allowed": "無法執行此操作。請稍後再試。",
15
- "error.network": "無法連線,請檢查你的網路設定。",
16
- "error.request_too_large": "無法執行此操作。請稍後再試。",
17
- "error.request_timeout": "無法執行此操作。請稍後再試。",
18
- "error.request_canceled": "無法執行此操作。請稍後再試。",
19
- "error.session_required": "連線逾時。請重新登入。",
20
- "error.unknown_method": "無法執行此操作。請稍後再試。",
21
- "greeting.adminOnly": "只有 administrators 群組的成員可以變更問候語。",
22
- "greeting.label": "新的問候語",
23
- "greeting.save": "儲存",
24
- "greeting.setBy": "{text} — 由 {user} 設定",
25
- "status.backend": "後端",
26
- "status.heading": "後端狀態",
27
- "status.package": "套件名稱",
28
- "status.uid": "執行身分 UID",
29
- "status.user": "使用者帳號",
30
- "status.userAdmin": "{user}(管理員)",
31
- "status.version": "版本"
32
- }
@@ -1,45 +0,0 @@
1
- /* Scoped to .dsmapp: the DSM desktop shares one page with every other app. */
2
- .dsmapp {
3
- box-sizing: border-box;
4
- height: 100%;
5
- overflow: auto;
6
- padding: 20px 24px;
7
- font: 13px/1.5 "Noto Sans", "Helvetica Neue", Arial, sans-serif;
8
- color: #1d2733;
9
- background: #fff;
10
- }
11
- .dsmapp-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
12
- .dsmapp h1 { margin: 0 0 4px; font-size: 20px; font-weight: 600; }
13
- .dsmapp-secondary {
14
- height: 28px; padding: 0 12px; border: 1px solid #c8d0da; border-radius: 3px;
15
- background: #fff; color: inherit; font: inherit; cursor: pointer;
16
- }
17
- .dsmapp h2 { margin: 24px 0 8px; font-size: 14px; font-weight: 600; }
18
- .dsmapp-greeting { margin: 0 0 12px; font-size: 15px; }
19
- .dsmapp-form { display: flex; gap: 8px; max-width: 420px; }
20
- .dsmapp-form[hidden] { display: none; }
21
- .dsmapp-form input {
22
- flex: 1; height: 28px; padding: 0 8px;
23
- border: 1px solid #c8d0da; border-radius: 3px; font: inherit;
24
- }
25
- .dsmapp-form button {
26
- height: 30px; padding: 0 16px; border: 0; border-radius: 3px;
27
- background: #0086e5; color: #fff; font: inherit; cursor: pointer;
28
- }
29
- .dsmapp-form button:disabled { opacity: 0.6; cursor: default; }
30
- .dsmapp-note { margin: 0; color: #5d6b7a; }
31
- .dsmapp-note[hidden] { display: none; }
32
- .dsmapp-message { min-height: 1.5em; color: #c0392b; }
33
- .dsmapp-facts { display: grid; grid-template-columns: max-content 1fr; gap: 4px 16px; margin: 0; }
34
- .dsmapp-facts dt { color: #5d6b7a; }
35
- .dsmapp-facts dd { margin: 0; }
36
- /* SDK portal panel (ctx.portal.mountPanel). */
37
- .dsmapp-portal-form { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; max-width: 560px; }
38
- .dsmapp-portal input { height: 28px; padding: 0 8px; border: 1px solid #c8d0da; border-radius: 3px; font: inherit; }
39
- .dsmapp-portal button {
40
- height: 30px; padding: 0 12px; border: 1px solid #c8d0da; border-radius: 3px;
41
- background: #fff; color: inherit; font: inherit; cursor: pointer; margin-top: 8px;
42
- }
43
- .dsmapp-portal-form button { margin-top: 0; }
44
- .dsmapp-portal-form button[type="submit"] { border-color: #0086e5; background: #0086e5; color: #fff; }
45
- .dsmapp-portal-error { color: #c0392b; }
@@ -1,111 +0,0 @@
1
- // The app inside the DSM window. The generated DSM wrapper loads this file and
2
- // calls mount(root, ctx) when the window opens:
3
- // ctx.call(method, params) -> Promise<data> POSTs to the package CGI with
4
- // DSM's session; rejects with
5
- // { code, message } on errors
6
- // ctx.t(key, params) -> text from i18n/messages/<locale>.json in DSM's
7
- // language ({name} placeholders, key.one/.other
8
- // plurals with { count }), English as fallback
9
- // ctx.locale -> "en", "zh-TW", … (use it for Intl formatting)
10
- // ctx.reopen(fn) -> idempotent unsubscribe; fn runs on re-show
11
- // ctx.host.platform() -> read-only host/launch mode/language/version snapshot
12
- // ctx.host.setTitle(text) -> encoded DSM title or standalone document.title;
13
- // inspect the returned status, not host authority
14
- // ctx.host.subscribe(event, fn) -> status + dispose for window-resize;
15
- // host-theme/language-change unsupported
16
- // ctx.host.openFileManager(path) / revealFile(path) -> File Station virtual path
17
- // request only; preview/details/settings return unsupported, never a grant
18
- // ctx.portal -> only with `portal:` in dsm-package.yaml;
19
- // mountPanel(element) shows the DSM Application
20
- // Portal link, or the alias form to administrators
21
- // Replace everything below with your own UI (plain JS, or a bundle you build
22
- // with Vite/Vue into this folder -- see README.md).
23
- (function () {
24
- "use strict";
25
-
26
- function el(tag, attrs, children) {
27
- var node = document.createElement(tag);
28
- Object.keys(attrs || {}).forEach(function (key) {
29
- if (key === "text") node.textContent = attrs[key];
30
- else node.setAttribute(key, attrs[key]);
31
- });
32
- (children || []).forEach(function (child) { node.appendChild(child); });
33
- return node;
34
- }
35
-
36
- function mount(root, ctx) {
37
- var t = ctx.t;
38
- var status = el("dl", { class: "dsmapp-facts" });
39
- var greeting = el("p", { class: "dsmapp-greeting", text: t("app.loading") });
40
- var input = el("input", { type: "text", maxlength: "200", "aria-label": t("greeting.label"), placeholder: t("greeting.label") });
41
- var save = el("button", { type: "submit", text: t("greeting.save") });
42
- var refreshButton = el("button", { type: "button", class: "dsmapp-secondary", text: t("app.refresh") });
43
- var message = el("p", { class: "dsmapp-message", role: "status" });
44
- var form = el("form", { class: "dsmapp-form", hidden: "" }, [input, save]);
45
- var adminOnly = el("p", { class: "dsmapp-note", hidden: "", text: t("greeting.adminOnly") });
46
- var portal = ctx.portal ? el("section", { class: "dsmapp-portal" }) : null;
47
-
48
- root.classList.add("dsmapp");
49
- root.replaceChildren(
50
- el("div", { class: "dsmapp-header" }, [el("h1", { text: t("app.title") }), refreshButton]),
51
- greeting,
52
- form,
53
- adminOnly,
54
- message,
55
- el("h2", { text: t("status.heading") }),
56
- status
57
- );
58
- var portalPanel = portal && (root.appendChild(portal), ctx.portal.mountPanel(portal));
59
-
60
- // Errors arrive as { code }; the backend's English message is only a fallback.
61
- function showError(error) {
62
- var code = (error && error.code) || "internal";
63
- var text = t("error." + code);
64
- message.textContent = text === "error." + code ? (error && error.message) || t("error.internal") : text;
65
- }
66
-
67
- function refresh() {
68
- message.textContent = "";
69
- ctx.call("app.status").then(function (data) {
70
- status.replaceChildren();
71
- [[t("status.user"), data.admin ? t("status.userAdmin", { user: data.user }) : data.user],
72
- [t("status.package"), data.package],
73
- [t("status.version"), data.version],
74
- [t("status.backend"), data.language + " · " + data.platform],
75
- [t("status.uid"), String(data.process.uid)]].forEach(function (row) {
76
- status.appendChild(el("dt", { text: row[0] }));
77
- status.appendChild(el("dd", { text: row[1] }));
78
- });
79
- form.hidden = !data.admin;
80
- adminOnly.hidden = data.admin;
81
- }).catch(showError);
82
- ctx.call("greeting.get").then(function (data) {
83
- greeting.textContent = data.updated_by
84
- ? t("greeting.setBy", { text: data.text, user: data.updated_by })
85
- : data.text;
86
- }).catch(showError);
87
- }
88
-
89
- form.addEventListener("submit", function (event) {
90
- event.preventDefault();
91
- save.disabled = true;
92
- ctx.call("greeting.set", { text: input.value })
93
- .then(function () { input.value = ""; refresh(); })
94
- .catch(showError)
95
- .then(function () { save.disabled = false; });
96
- });
97
- refreshButton.addEventListener("click", refresh);
98
-
99
- ctx.reopen(refresh);
100
- refresh();
101
- return {
102
- unmount: function () {
103
- if (portalPanel) portalPanel.dispose();
104
- root.replaceChildren();
105
- }
106
- };
107
- }
108
-
109
- window.DsmPackageApps = window.DsmPackageApps || {};
110
- window.DsmPackageApps[document.currentScript.dataset.package] = { mount: mount };
111
- })();
@@ -1,92 +0,0 @@
1
- use std::sync::Arc;
2
-
3
- use syno_pkg_land_sdk::api::Route;
4
- use syno_pkg_land_sdk::background::Store;
5
- use syno_pkg_land_sdk::delegate::{Client, Service};
6
- use syno_pkg_land_sdk::filestation;
7
-
8
- #[cfg(test)]
9
- use super::test_support::{Sample, sample};
10
- use super::{Config, parse_delegate_config};
11
-
12
- impl Config {
13
- /// Serves the SDK's delegate routes. The scope comes from the trusted
14
- /// manifest, never an HTTP parameter.
15
- pub(super) fn delegate_routes(self: &Arc<Self>) -> Vec<Route> {
16
- let mut service = Service::new(Client::local(&self.package_id));
17
- if let Some(executor) = &self.executor {
18
- service.client = executor.clone();
19
- }
20
- service.executor_digest = self.executor_digest.clone();
21
- service.policy_digest = self.policy_digest.clone();
22
- service.store = Some(Arc::new(Store::new_request(
23
- self.data_dir.join("background"),
24
- )));
25
- service.scope = self.delegate_scope.clone();
26
- service.staging_dir = self.data_dir.join("executor-staging");
27
- service.install_draft_path = self.data_dir.join("delegate-install.json");
28
- if let Ok(settings) = parse_delegate_config(self) {
29
- service.destinations = settings.destinations;
30
- service.operations = settings.operations;
31
- service.lifetime = settings.lifetime;
32
- }
33
- service.session_files = Some(match &self.session_files {
34
- Some(files) => files.clone(),
35
- None => Arc::new(filestation::Service::local(&self.data_dir)),
36
- });
37
- Arc::new(service).routes()
38
- }
39
- }
40
-
41
- /// Valid params for every delegate route. The fixture has no DSM cookie, so
42
- /// every session route, delegate.status included since SDK 0.9.6, refuses first, and ordinary jobs fail closed
43
- /// on the fixture's unresolved UID.
44
- #[cfg(test)]
45
- pub(super) fn samples() -> Vec<Sample> {
46
- let session = |method: &'static str, params: &str| sample(method, params, "session_required");
47
- vec![
48
- session(
49
- "delegate.example.export",
50
- r#"{"key":"save","job_id":"example-1"}"#,
51
- ),
52
- session("delegate.destination", r#"{"key":"save"}"#),
53
- session(
54
- "delegate.select_destination",
55
- r#"{"key":"save","path":"/home"}"#,
56
- ),
57
- session(
58
- "delegate.move_from_staging",
59
- r#"{"delegation_id":"grant","job_id":"export-1","staging":"a","name":"a","size":3}"#,
60
- ),
61
- session(
62
- "delegate.operations.get",
63
- r#"{"delegation_id":"grant","job_id":"export-1"}"#,
64
- ),
65
- session("delegate.operations.list", "{}"),
66
- session(
67
- "delegate.operations.cancel",
68
- r#"{"delegation_id":"grant","job_id":"export-1"}"#,
69
- ),
70
- session("delegate.disable", "{}"),
71
- session("delegate.enable", "{}"),
72
- session("delegate.audit", "{}"),
73
- session("delegate.status", "{}"),
74
- session(
75
- "delegate.create",
76
- r#"{"job_id":"job1","ops":["files.write"],"path":"/home","ttl_seconds":60}"#,
77
- ),
78
- session("delegate.list", "{}"),
79
- session("delegate.revoke", r#"{"delegation_id":"missing"}"#),
80
- sample(
81
- "delegate.jobs.submit",
82
- r#"{"key":"download","url":"http://localhost/file","dest":"/home","name":"file"}"#,
83
- "identity_unavailable",
84
- ),
85
- sample("delegate.jobs.list", "{}", "identity_unavailable"),
86
- sample(
87
- "delegate.jobs.cancel",
88
- r#"{"id":"missing"}"#,
89
- "identity_unavailable",
90
- ),
91
- ]
92
- }
@@ -1,52 +0,0 @@
1
- //! The package's fixed background worker. DSM runs it as the package's
2
- //! systemd user unit under the package account; it never runs as root and
3
- //! takes no input except the jobs in its private spool.
4
-
5
- use std::process::exit;
6
- use std::sync::Arc;
7
-
8
- use app::app::{Config, hash_work, parse_delegate_config};
9
- use app::build_env::Build;
10
- use app::process::{current_username, until_terminated};
11
- use syno_pkg_land_sdk::BoxError;
12
- use syno_pkg_land_sdk::background::{Store, WorkerInfo, refuse_root};
13
- use syno_pkg_land_sdk::delegate::{Client, Service};
14
-
15
- fn main() {
16
- let build = Build::compiled();
17
- if let Err(e) = run(&build) {
18
- eprintln!("{} background: {e}", build.package_id);
19
- exit(1);
20
- }
21
- }
22
-
23
- fn run(build: &Build) -> Result<(), BoxError> {
24
- // SAFETY: these take no arguments and cannot fail.
25
- let (euid, uid, pid) = unsafe { (libc::geteuid(), libc::getuid(), libc::getpid()) };
26
- refuse_root(euid)?;
27
- let info = WorkerInfo {
28
- pid: i64::from(pid),
29
- uid: i64::from(uid),
30
- username: current_username(),
31
- ..WorkerInfo::default()
32
- };
33
- let ctx = until_terminated();
34
- eprintln!("{} background: started as uid {uid}", build.package_id);
35
- let data_dir = build.data_dir();
36
- let mut service = Service::new(Client::local(build.package_id));
37
- service.store = Some(Arc::new(Store::new(format!("{data_dir}/background"))));
38
- service.staging_dir = format!("{data_dir}/executor-staging").into();
39
- service.work = Some(Arc::new(hash_work));
40
- let settings = parse_delegate_config(&Config {
41
- delegate_scope: build.delegate_scope.into(),
42
- delegate_operations_json: build.delegate_operations.into(),
43
- delegate_destinations_json: build.delegate_destinations.into(),
44
- delegate_lifetime: build.delegate_lifetime.into(),
45
- ..Config::default()
46
- })?;
47
- service.scope = settings.scope;
48
- service.operations = settings.operations;
49
- service.destinations = settings.destinations;
50
- service.lifetime = settings.lifetime;
51
- service.run(&ctx, info)
52
- }