@synopackageland/cli 0.8.0 → 0.9.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/CHANGELOG.md +124 -0
- package/README.md +26 -4
- package/dist/add.js +4 -17
- package/dist/authorization-sdk.d.ts +0 -1
- package/dist/authorization-sdk.js +0 -1
- package/dist/build-spk/gateway.js +2 -2
- package/dist/build-spk/notices.js +12 -8
- package/dist/capability-overlays.d.ts +15 -0
- package/dist/capability-overlays.js +18 -0
- package/dist/cli-version.d.ts +2 -0
- package/dist/cli-version.js +3 -0
- package/dist/cli.js +3 -1
- package/dist/error-registry.js +12 -4
- package/dist/info.js +2 -1
- package/dist/init.js +52 -58
- package/dist/reproducible.js +1 -1
- package/dist/runtime/delegate-contract.d.ts +15 -0
- package/dist/runtime/delegate-contract.js +2 -0
- package/dist/runtime/executor-build.d.ts +15 -1
- package/dist/runtime/executor-build.js +42 -11
- package/dist/runtime/executor-digests.json +13 -0
- package/dist/runtime/executor-inspect.d.ts +1 -0
- package/dist/runtime/executor-inspect.js +5 -2
- package/dist/runtime/executor-policy.d.ts +3 -1
- package/dist/runtime/executor-policy.js +7 -2
- package/dist/runtime/executor-source.d.ts +21 -0
- package/dist/runtime/executor-source.js +35 -0
- package/dist/runtime/executor-tasks.d.ts +5 -2
- package/dist/runtime/executor-tasks.js +6 -4
- package/dist/runtime/sdk-source.d.ts +31 -0
- package/dist/runtime/sdk-source.js +92 -0
- package/dist/standalone/api-permissions.d.ts +4 -1
- package/dist/standalone/api-permissions.js +10 -18
- package/dist/standalone/build.d.ts +1 -0
- package/dist/standalone/build.js +11 -4
- package/dist/standalone/daemon.js +2 -2
- package/dist/standalone/dsm-window.js +2 -2
- package/dist/standalone/manifest.d.ts +5 -2
- package/dist/standalone/manifest.js +9 -3
- package/dist/standalone/root-window.d.ts +1 -1
- package/dist/standalone/root-window.js +0 -1
- package/dist/standalone/sdk-check.d.ts +9 -0
- package/dist/standalone/sdk-check.js +43 -0
- package/dist/standalone/spk.js +1 -1
- package/dist/template-paths.d.ts +7 -2
- package/dist/template-paths.js +18 -6
- package/package.json +13 -3
- package/dist/templates/_executor/README.md +0 -318
- package/dist/templates/_executor/anchor.go +0 -156
- package/dist/templates/_executor/anchor_test.go +0 -161
- package/dist/templates/_executor/apppriv_review_test.go +0 -28
- package/dist/templates/_executor/auth_presence_review_test.go +0 -38
- package/dist/templates/_executor/cancel_contract_test.go +0 -236
- package/dist/templates/_executor/cmd/lifecycle/main.go +0 -42
- package/dist/templates/_executor/cookie_review_test.go +0 -27
- package/dist/templates/_executor/copy.go +0 -64
- package/dist/templates/_executor/copy_test.go +0 -88
- package/dist/templates/_executor/digest_review_test.go +0 -120
- package/dist/templates/_executor/directories.go +0 -40
- package/dist/templates/_executor/dsm.go +0 -369
- package/dist/templates/_executor/dsm_test.go +0 -290
- package/dist/templates/_executor/executor.go +0 -735
- package/dist/templates/_executor/executor_test.go +0 -314
- package/dist/templates/_executor/go.mod +0 -5
- package/dist/templates/_executor/identity.go +0 -74
- package/dist/templates/_executor/identity_kernel_linux_test.go +0 -60
- package/dist/templates/_executor/identity_linux.go +0 -82
- package/dist/templates/_executor/identity_security_test.go +0 -43
- package/dist/templates/_executor/internal/lifecycle/lifecycle.go +0 -95
- package/dist/templates/_executor/internal/lifecycle/lifecycle_test.go +0 -232
- package/dist/templates/_executor/internal/taskscript/boot.sh +0 -31
- package/dist/templates/_executor/internal/taskscript/cmd/main.go +0 -19
- package/dist/templates/_executor/internal/taskscript/control.sh +0 -31
- package/dist/templates/_executor/internal/taskscript/tasks.go +0 -44
- package/dist/templates/_executor/json_review_test.go +0 -40
- package/dist/templates/_executor/lifecycle_test.go +0 -97
- package/dist/templates/_executor/link_linux.go +0 -28
- package/dist/templates/_executor/long_running_test.go +0 -530
- package/dist/templates/_executor/main.go +0 -576
- package/dist/templates/_executor/managed.go +0 -117
- package/dist/templates/_executor/managed_test.go +0 -137
- package/dist/templates/_executor/move_linux.go +0 -490
- package/dist/templates/_executor/move_linux_test.go +0 -460
- package/dist/templates/_executor/move_validation.go +0 -46
- package/dist/templates/_executor/move_validation_test.go +0 -187
- package/dist/templates/_executor/operations.go +0 -926
- package/dist/templates/_executor/path_test.go +0 -35
- package/dist/templates/_executor/pid.go +0 -37
- package/dist/templates/_executor/pid_test.go +0 -113
- package/dist/templates/_executor/platform_linux.go +0 -187
- package/dist/templates/_executor/platform_linux_test.go +0 -191
- package/dist/templates/_executor/platform_other.go +0 -76
- package/dist/templates/_executor/process.go +0 -142
- package/dist/templates/_executor/purge_log.go +0 -18
- package/dist/templates/_executor/records.go +0 -242
- package/dist/templates/_executor/scope_cancel_contract_test.go +0 -91
- package/dist/templates/_executor/scope_client.go +0 -37
- package/dist/templates/_executor/scope_contract.go +0 -12
- package/dist/templates/_executor/selected_scope.go +0 -146
- package/dist/templates/_executor/selected_scope_test.go +0 -186
- package/dist/templates/_executor/socket_linux_test.go +0 -46
- package/dist/templates/_executor/status_disabled_test.go +0 -33
- package/dist/templates/_executor/store.go +0 -91
- package/dist/templates/_executor/supervise.go +0 -109
- package/dist/templates/_executor/supervise_test.go +0 -130
- package/dist/templates/_executor/task_race_review_test.go +0 -47
- package/dist/templates/_executor/tasks.go +0 -320
- package/dist/templates/_executor/tasks_dsm71_test.go +0 -114
- package/dist/templates/_executor/tasks_review_test.go +0 -43
- package/dist/templates/_executor/tasks_test.go +0 -223
- package/dist/templates/_executor/testdata/evidence/cleanup.json +0 -24
- package/dist/templates/_executor/testdata/evidence/final-smoke.jsonl +0 -9
- package/dist/templates/_executor/testdata/evidence/kernel-acl.json +0 -6
- package/dist/templates/_executor/testdata/evidence/linux-tests.log +0 -123
- package/dist/templates/_executor/testdata/evidence/live.jsonl +0 -23
- package/dist/templates/_executor/testdata/evidence/storage.json +0 -90
- package/dist/templates/_executor/testdata/evidence/validation.json +0 -55
- package/dist/templates/_executor/testdata/live_probe.py +0 -98
- package/dist/templates/_executor/upgrade_watch_test.go +0 -244
- package/dist/templates/_executor/watch.go +0 -164
- package/dist/templates/_executor/watch_test.go +0 -291
- package/dist/templates/_executor/write_review_linux_test.go +0 -87
- package/dist/templates/_shared/AGENTS.md +0 -146
- package/dist/templates/_shared/CLAUDE.md +0 -1
- package/dist/templates/_shared/third-party-notices.mjs +0 -51
- package/dist/templates/binary/LICENSES/GO-LICENSE +0 -27
- package/dist/templates/binary/LICENSES/GO-PATENTS +0 -22
- package/dist/templates/binary/dsm-package.yaml +0 -46
- package/dist/templates/binary/example/main.go +0 -16
- package/dist/templates/binary/gitignore +0 -2
- package/dist/templates/binary/i18n/messages/de.json +0 -4
- package/dist/templates/binary/i18n/messages/en.json +0 -4
- package/dist/templates/binary/i18n/messages/es.json +0 -4
- package/dist/templates/binary/i18n/messages/fr.json +0 -4
- package/dist/templates/binary/i18n/messages/it.json +0 -4
- package/dist/templates/binary/i18n/messages/ja.json +0 -4
- package/dist/templates/binary/i18n/messages/ko.json +0 -4
- package/dist/templates/binary/i18n/messages/zh-CN.json +0 -4
- package/dist/templates/binary/i18n/messages/zh-TW.json +0 -4
- package/dist/templates/binary/ui/app.css +0 -4
- package/dist/templates/binary/ui/app.js +0 -32
- package/dist/templates/compose/compose.yaml +0 -8
- package/dist/templates/compose/synology-app.yaml +0 -16
- package/dist/templates/native-authorization/AuthorizationGate.vue +0 -91
- package/dist/templates/native-authorization/i18n/de.json +0 -37
- package/dist/templates/native-authorization/i18n/en.json +0 -37
- package/dist/templates/native-authorization/i18n/es.json +0 -37
- package/dist/templates/native-authorization/i18n/fr.json +0 -37
- package/dist/templates/native-authorization/i18n/index.ts +0 -15
- package/dist/templates/native-authorization/i18n/it.json +0 -37
- package/dist/templates/native-authorization/i18n/ja.json +0 -37
- package/dist/templates/native-authorization/i18n/ko.json +0 -37
- package/dist/templates/native-authorization/i18n/zh-CN.json +0 -37
- package/dist/templates/native-authorization/i18n/zh-TW.json +0 -37
- package/dist/templates/native-go/README.md +0 -459
- package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +0 -61
- package/dist/templates/native-go/backend/cmd/app/main.go +0 -95
- package/dist/templates/native-go/backend/cmd/background-worker/main.go +0 -38
- package/dist/templates/native-go/backend/go.mod +0 -9
- package/dist/templates/native-go/backend/go.sum +0 -4
- package/dist/templates/native-go/backend/internal/api/cgi_framing_test.go +0 -32
- package/dist/templates/native-go/backend/internal/api/cookie_review_test.go +0 -28
- package/dist/templates/native-go/backend/internal/api/deadline_test.go +0 -114
- package/dist/templates/native-go/backend/internal/api/dsm-session.go +0 -54
- package/dist/templates/native-go/backend/internal/api/dsm-session_test.go +0 -51
- package/dist/templates/native-go/backend/internal/api/entry_test.go +0 -47
- package/dist/templates/native-go/backend/internal/api/errors.go +0 -47
- package/dist/templates/native-go/backend/internal/api/permissions.go +0 -161
- package/dist/templates/native-go/backend/internal/api/permissions.json +0 -5
- package/dist/templates/native-go/backend/internal/api/permissions_test.go +0 -113
- package/dist/templates/native-go/backend/internal/api/policy_fixture_test.go +0 -8
- package/dist/templates/native-go/backend/internal/api/registry.go +0 -142
- package/dist/templates/native-go/backend/internal/api/registry_test.go +0 -344
- package/dist/templates/native-go/backend/internal/api/resource_limits_test.go +0 -87
- package/dist/templates/native-go/backend/internal/api/sdk-permissions.json +0 -59
- package/dist/templates/native-go/backend/internal/api/sdk_policy_test.go +0 -31
- package/dist/templates/native-go/backend/internal/api/server.go +0 -305
- package/dist/templates/native-go/backend/internal/api/testdata/permissions-cases.json +0 -172
- package/dist/templates/native-go/backend/internal/app/background.go +0 -249
- package/dist/templates/native-go/backend/internal/app/background_none.go +0 -8
- package/dist/templates/native-go/backend/internal/app/background_owner.go +0 -38
- package/dist/templates/native-go/backend/internal/app/background_owner_test.go +0 -163
- package/dist/templates/native-go/backend/internal/app/background_schedule.go +0 -69
- package/dist/templates/native-go/backend/internal/app/background_schedule_test.go +0 -62
- package/dist/templates/native-go/backend/internal/app/background_test.go +0 -320
- package/dist/templates/native-go/backend/internal/app/delegate_config.go +0 -57
- package/dist/templates/native-go/backend/internal/app/delegate_config_test.go +0 -28
- package/dist/templates/native-go/backend/internal/app/delegate_none.go +0 -5
- package/dist/templates/native-go/backend/internal/app/identity.go +0 -20
- package/dist/templates/native-go/backend/internal/app/identity_test.go +0 -15
- package/dist/templates/native-go/backend/internal/app/migrations.go +0 -41
- package/dist/templates/native-go/backend/internal/app/migrations_test.go +0 -41
- package/dist/templates/native-go/backend/internal/app/portal.go +0 -30
- package/dist/templates/native-go/backend/internal/app/portal_test.go +0 -55
- package/dist/templates/native-go/backend/internal/app/root_none.go +0 -9
- package/dist/templates/native-go/backend/internal/app/routes.go +0 -137
- package/dist/templates/native-go/backend/internal/app/routes_test.go +0 -165
- package/dist/templates/native-go/backend/internal/app/session_files.go +0 -9
- package/dist/templates/native-go/backend/internal/app/session_files_test.go +0 -14
- package/dist/templates/native-go/backend/internal/app/shared_folder.go +0 -144
- package/dist/templates/native-go/backend/internal/app/shared_folder_test.go +0 -158
- package/dist/templates/native-go/backend/internal/background/access.go +0 -57
- package/dist/templates/native-go/backend/internal/background/lock_test.go +0 -131
- package/dist/templates/native-go/backend/internal/background/owner_test.go +0 -118
- package/dist/templates/native-go/backend/internal/background/runner.go +0 -185
- package/dist/templates/native-go/backend/internal/background/runner_test.go +0 -209
- package/dist/templates/native-go/backend/internal/background/schedule.go +0 -336
- package/dist/templates/native-go/backend/internal/background/schedule_test.go +0 -368
- package/dist/templates/native-go/backend/internal/background/store.go +0 -825
- package/dist/templates/native-go/backend/internal/background/store_test.go +0 -365
- package/dist/templates/native-go/backend/internal/datamigrate/migrate.go +0 -191
- package/dist/templates/native-go/backend/internal/datamigrate/migrate_test.go +0 -177
- package/dist/templates/native-go/backend/internal/dsm/admin.go +0 -76
- package/dist/templates/native-go/backend/internal/dsm/admin_linux.go +0 -110
- package/dist/templates/native-go/backend/internal/dsm/admin_linux_test.go +0 -105
- package/dist/templates/native-go/backend/internal/dsm/admin_other.go +0 -15
- package/dist/templates/native-go/backend/internal/dsm/admin_test.go +0 -67
- package/dist/templates/native-go/backend/internal/dsm/apppriv.go +0 -30
- package/dist/templates/native-go/backend/internal/dsm/auth.go +0 -94
- package/dist/templates/native-go/backend/internal/dsm/auth_test.go +0 -159
- package/dist/templates/native-go/backend/internal/dsm/bridge_file.go +0 -75
- package/dist/templates/native-go/backend/internal/dsm/bridge_file_test.go +0 -57
- package/dist/templates/native-go/backend/internal/dsm/entry.go +0 -177
- package/dist/templates/native-go/backend/internal/dsm/entry_test.go +0 -315
- package/dist/templates/native-go/backend/internal/dsm/native/admin-aarch64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/admin-x86_64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/admin_check.c +0 -28
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv_check.c +0 -33
- package/dist/templates/native-go/backend/internal/dsm/native/build.sh +0 -18
- package/dist/templates/native-go/backend/internal/dsm/native/licenses/GLIBC-NOTICES.txt +0 -400
- package/dist/templates/native-go/backend/internal/dsm/native/licenses/LGPL-2.1.txt +0 -501
- package/dist/templates/native-go/backend/internal/dsm/native/licenses/SOURCE.txt +0 -5
- package/dist/templates/native-go/backend/internal/dsm/native/licenses/ZIG-MIT.txt +0 -21
- package/dist/templates/native-go/backend/internal/dsm/native/provenance.json +0 -18
- package/dist/templates/native-go/backend/internal/filestation/browse_test.go +0 -67
- package/dist/templates/native-go/backend/internal/filestation/check_permission.go +0 -71
- package/dist/templates/native-go/backend/internal/filestation/check_permission_test.go +0 -77
- package/dist/templates/native-go/backend/internal/filestation/client.go +0 -337
- package/dist/templates/native-go/backend/internal/filestation/client_test.go +0 -155
- package/dist/templates/native-go/backend/internal/filestation/doc.go +0 -4
- package/dist/templates/native-go/backend/internal/filestation/download_dsm71_test.go +0 -82
- package/dist/templates/native-go/backend/internal/filestation/http.go +0 -70
- package/dist/templates/native-go/backend/internal/filestation/http_test.go +0 -188
- package/dist/templates/native-go/backend/internal/filestation/operations_test.go +0 -206
- package/dist/templates/native-go/backend/internal/filestation/read_file_test.go +0 -89
- package/dist/templates/native-go/backend/internal/filestation/sdk_policy_test.go +0 -39
- package/dist/templates/native-go/backend/internal/filestation/service.go +0 -254
- package/dist/templates/native-go/backend/internal/filestation/service_test.go +0 -74
- package/dist/templates/native-go/backend/internal/filestation/upload_stream.go +0 -76
- package/dist/templates/native-go/backend/internal/filestation/upload_stream_test.go +0 -77
- package/dist/templates/native-go/backend/internal/filestation/write.go +0 -32
- package/dist/templates/native-go/backend/internal/filestation/write_test.go +0 -124
- package/dist/templates/native-go/backend/internal/identity/README.md +0 -59
- package/dist/templates/native-go/backend/internal/identity/dsm.go +0 -115
- package/dist/templates/native-go/backend/internal/identity/http.go +0 -291
- package/dist/templates/native-go/backend/internal/identity/identity_test.go +0 -530
- package/dist/templates/native-go/backend/internal/identity/service.go +0 -159
- package/dist/templates/native-go/backend/internal/identity/store.go +0 -109
- package/dist/templates/native-go/backend/internal/jsonlimits/limits.go +0 -48
- package/dist/templates/native-go/backend/internal/jsonlimits/limits_test.go +0 -52
- package/dist/templates/native-go/backend/internal/portal/portal.go +0 -138
- package/dist/templates/native-go/backend/internal/portal/portal_test.go +0 -89
- package/dist/templates/native-go/dsm-package.yaml +0 -71
- package/dist/templates/native-go/gitignore +0 -1
- package/dist/templates/native-go/i18n/glossary.json +0 -663
- package/dist/templates/native-go/i18n/messages/de.json +0 -29
- package/dist/templates/native-go/i18n/messages/en.json +0 -29
- package/dist/templates/native-go/i18n/messages/es.json +0 -29
- package/dist/templates/native-go/i18n/messages/fr.json +0 -29
- package/dist/templates/native-go/i18n/messages/it.json +0 -29
- package/dist/templates/native-go/i18n/messages/ja.json +0 -29
- package/dist/templates/native-go/i18n/messages/ko.json +0 -29
- package/dist/templates/native-go/i18n/messages/zh-CN.json +0 -29
- package/dist/templates/native-go/i18n/messages/zh-TW.json +0 -29
- package/dist/templates/native-go/ui/app.css +0 -45
- package/dist/templates/native-go/ui/app.js +0 -111
- package/dist/templates/native-go-delegate/DELEGATE.md +0 -263
- package/dist/templates/native-go-delegate/backend/cmd/background-worker/main.go +0 -48
- package/dist/templates/native-go-delegate/backend/internal/app/delegate.go +0 -25
- package/dist/templates/native-go-delegate/backend/internal/app/delegate_on.go +0 -5
- package/dist/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +0 -31
- package/dist/templates/native-go-delegate/backend/internal/background/delegate_review_test.go +0 -174
- package/dist/templates/native-go-delegate/backend/internal/background/delegated.go +0 -277
- package/dist/templates/native-go-delegate/backend/internal/background/delegated_moves.go +0 -270
- package/dist/templates/native-go-delegate/backend/internal/background/delegated_test.go +0 -34
- package/dist/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +0 -410
- package/dist/templates/native-go-delegate/backend/internal/delegate/busy_review_test.go +0 -15
- package/dist/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +0 -95
- package/dist/templates/native-go-delegate/backend/internal/delegate/client.go +0 -151
- package/dist/templates/native-go-delegate/backend/internal/delegate/client_test.go +0 -214
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination.go +0 -110
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state.go +0 -117
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +0 -60
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_test.go +0 -116
- package/dist/templates/native-go-delegate/backend/internal/delegate/example.go +0 -81
- package/dist/templates/native-go-delegate/backend/internal/delegate/example_test.go +0 -91
- package/dist/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +0 -511
- package/dist/templates/native-go-delegate/backend/internal/delegate/files.go +0 -132
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +0 -92
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +0 -99
- package/dist/templates/native-go-delegate/backend/internal/delegate/move.go +0 -348
- package/dist/templates/native-go-delegate/backend/internal/delegate/move_test.go +0 -351
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list.go +0 -65
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +0 -114
- package/dist/templates/native-go-delegate/backend/internal/delegate/retry.go +0 -106
- package/dist/templates/native-go-delegate/backend/internal/delegate/retry_test.go +0 -143
- package/dist/templates/native-go-delegate/backend/internal/delegate/service.go +0 -364
- package/dist/templates/native-go-delegate/backend/internal/delegate/service_test.go +0 -318
- package/dist/templates/native-go-delegate/backend/internal/delegate/staging.go +0 -121
- package/dist/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +0 -51
- package/dist/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +0 -112
- package/dist/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +0 -137
- package/dist/templates/native-go-delegate/backend/internal/delegate/wait_cancel_test.go +0 -101
- package/dist/templates/native-go-delegate/backend/internal/delegate/worker.go +0 -225
- package/dist/templates/native-go-delegate/backend/internal/filestation/files.go +0 -43
- package/dist/templates/native-go-delegate/backend/internal/filestation/files_test.go +0 -59
- package/dist/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +0 -37
- package/dist/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +0 -113
- package/dist/templates/native-go-delegate/frontend/src/delegate/DelegatePanel.vue +0 -70
- package/dist/templates/native-go-delegate/frontend/src/delegate/copy.ts +0 -8
- package/dist/templates/native-go-delegate/frontend/src/delegate/i18n/waiting.json +0 -11
- package/dist/templates/native-go-delegate/frontend/test/background-save.test.ts +0 -121
- package/dist/templates/native-go-delegate/frontend/test/delegate.test.ts +0 -145
- package/dist/templates/native-go-delegate/frontend/test/scope-settings.test.ts +0 -49
- package/dist/templates/native-go-delegate/test-frontend.sh +0 -12
- package/dist/templates/native-go-delegate/test.sh +0 -18
- package/dist/templates/native-go-jobs/BACKGROUND.md +0 -108
- package/dist/templates/native-go-jobs/backend/internal/app/background_on.go +0 -7
- package/dist/templates/native-go-jobs/backend/internal/app/background_routes_test.go +0 -90
- package/dist/templates/native-go-jobs/frontend/src/background/BackgroundPanel.vue +0 -170
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/de.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/en.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/es.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/fr.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/it.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ja.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ko.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n.ts +0 -19
- package/dist/templates/native-go-jobs/frontend/src/background/picker-provider.ts +0 -12
- package/dist/templates/native-go-jobs/frontend/src/background/request-key.ts +0 -5
- package/dist/templates/native-go-jobs/frontend/test/background.test.ts +0 -205
- package/dist/templates/native-go-root-ops/backend/internal/app/executor.go +0 -140
- package/dist/templates/native-go-root-ops/backend/internal/app/executor_test.go +0 -117
- package/dist/templates/native-go-root-ops/root/whoami.sh +0 -3
- package/dist/templates/native-go-vue/README.md +0 -47
- package/dist/templates/native-go-vue/frontend/DESIGN.md +0 -61
- package/dist/templates/native-go-vue/frontend/package-lock.json +0 -2530
- package/dist/templates/native-go-vue/frontend/package.json +0 -6
- package/dist/templates/native-go-vue/frontend/src/App.vue +0 -96
- package/dist/templates/native-go-vue/frontend/src/CapabilityPanels.vue +0 -6
- package/dist/templates/native-go-vue/frontend/src/context.ts +0 -78
- package/dist/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +0 -70
- package/dist/templates/native-go-vue/frontend/src/delegate/catalogs.ts +0 -11
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.test.ts +0 -12
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.ts +0 -4
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +0 -23
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +0 -24
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.test.ts +0 -100
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.ts +0 -85
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/de.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/en.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/es.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/it.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/long-running.ts +0 -57
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +0 -12
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.ts +0 -24
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +0 -12
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +0 -21
- package/dist/templates/native-go-vue/frontend/src/files/FileBrowser.vue +0 -131
- package/dist/templates/native-go-vue/frontend/src/files/FilesPage.vue +0 -35
- package/dist/templates/native-go-vue/frontend/src/files/files.test.ts +0 -100
- package/dist/templates/native-go-vue/frontend/src/files/provider.test.ts +0 -48
- package/dist/templates/native-go-vue/frontend/src/files/transfers.test.ts +0 -27
- package/dist/templates/native-go-vue/frontend/src/files/transfers.ts +0 -25
- package/dist/templates/native-go-vue/frontend/src/i18n/de.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/en.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/es.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/fr.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/it.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/ja.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/ko.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-CN.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-TW.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n.ts +0 -13
- package/dist/templates/native-go-vue/frontend/src/identity/DESIGN.md +0 -46
- package/dist/templates/native-go-vue/frontend/src/identity/LoginPage.vue +0 -78
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/de.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/en.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/es.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/fr.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/it.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ja.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ko.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n.ts +0 -14
- package/dist/templates/native-go-vue/frontend/src/identity/login.test.ts +0 -32
- package/dist/templates/native-go-vue/frontend/src/identity/session.test.ts +0 -33
- package/dist/templates/native-go-vue/frontend/src/identity/session.ts +0 -74
- package/dist/templates/native-go-vue/frontend/src/main.ts +0 -32
- package/dist/templates/native-go-vue/frontend/src/nas/NasPicker.vue +0 -42
- package/dist/templates/native-go-vue/frontend/src/nas/contract.ts +0 -12
- package/dist/templates/native-go-vue/frontend/src/nas/destination.test.ts +0 -48
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n.ts +0 -2
- package/dist/templates/native-go-vue/frontend/src/nas/locale.ts +0 -24
- package/dist/templates/native-go-vue/frontend/src/nas/provider.ts +0 -50
- package/dist/templates/native-go-vue/frontend/src/nas/use-request.ts +0 -18
- package/dist/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +0 -39
- package/dist/templates/native-go-vue/frontend/src/shell/AppShell.vue +0 -48
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/de.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/en.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/es.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/it.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ko.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n.ts +0 -17
- package/dist/templates/native-go-vue/frontend/src/shell/pages.ts +0 -15
- package/dist/templates/native-go-vue/frontend/src/style.css +0 -27
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +0 -57
- package/dist/templates/native-go-vue/frontend/test/native-controls.test.ts +0 -27
- package/dist/templates/native-go-vue/frontend/test/portal-settings.test.ts +0 -71
- package/dist/templates/native-go-vue/frontend/test/shell-i18n.test.ts +0 -50
- package/dist/templates/native-go-vue/frontend/test/shell-ui.test.ts +0 -20
- package/dist/templates/native-go-vue/frontend/test/shell.test.ts +0 -30
- package/dist/templates/native-go-vue/frontend/tsconfig.json +0 -1
- package/dist/templates/native-go-vue/frontend/vite.config.ts +0 -10
- package/dist/templates/native-go-vue/gitignore +0 -2
- package/templates/_daemon/fixture_linux_test.go +0 -15
- package/templates/_daemon/fixture_other_test.go +0 -7
- package/templates/_daemon/go.mod +0 -5
- package/templates/_daemon/main.go +0 -611
- package/templates/_daemon/main_test.go +0 -315
- package/templates/_daemon/process_linux.go +0 -55
- package/templates/_daemon/process_linux_test.go +0 -161
- package/templates/_daemon/process_other.go +0 -14
- package/templates/_daemon/testdata/child.go +0 -44
- package/templates/_executor/README.md +0 -318
- package/templates/_executor/anchor.go +0 -156
- package/templates/_executor/anchor_test.go +0 -161
- package/templates/_executor/apppriv_review_test.go +0 -28
- package/templates/_executor/auth_presence_review_test.go +0 -38
- package/templates/_executor/cancel_contract_test.go +0 -236
- package/templates/_executor/cmd/lifecycle/main.go +0 -42
- package/templates/_executor/cookie_review_test.go +0 -27
- package/templates/_executor/copy.go +0 -64
- package/templates/_executor/copy_test.go +0 -88
- package/templates/_executor/digest_review_test.go +0 -120
- package/templates/_executor/directories.go +0 -40
- package/templates/_executor/dsm.go +0 -369
- package/templates/_executor/dsm_test.go +0 -290
- package/templates/_executor/executor.go +0 -735
- package/templates/_executor/executor_test.go +0 -314
- package/templates/_executor/go.mod +0 -5
- package/templates/_executor/identity.go +0 -74
- package/templates/_executor/identity_kernel_linux_test.go +0 -60
- package/templates/_executor/identity_linux.go +0 -82
- package/templates/_executor/identity_security_test.go +0 -43
- package/templates/_executor/internal/lifecycle/lifecycle.go +0 -95
- package/templates/_executor/internal/lifecycle/lifecycle_test.go +0 -232
- package/templates/_executor/internal/taskscript/boot.sh +0 -31
- package/templates/_executor/internal/taskscript/cmd/main.go +0 -19
- package/templates/_executor/internal/taskscript/control.sh +0 -31
- package/templates/_executor/internal/taskscript/tasks.go +0 -44
- package/templates/_executor/json_review_test.go +0 -40
- package/templates/_executor/lifecycle_test.go +0 -97
- package/templates/_executor/link_linux.go +0 -28
- package/templates/_executor/long_running_test.go +0 -530
- package/templates/_executor/main.go +0 -576
- package/templates/_executor/managed.go +0 -117
- package/templates/_executor/managed_test.go +0 -137
- package/templates/_executor/move_linux.go +0 -490
- package/templates/_executor/move_linux_test.go +0 -460
- package/templates/_executor/move_validation.go +0 -46
- package/templates/_executor/move_validation_test.go +0 -187
- package/templates/_executor/operations.go +0 -926
- package/templates/_executor/path_test.go +0 -35
- package/templates/_executor/pid.go +0 -37
- package/templates/_executor/pid_test.go +0 -113
- package/templates/_executor/platform_linux.go +0 -187
- package/templates/_executor/platform_linux_test.go +0 -191
- package/templates/_executor/platform_other.go +0 -76
- package/templates/_executor/process.go +0 -142
- package/templates/_executor/purge_log.go +0 -18
- package/templates/_executor/records.go +0 -242
- package/templates/_executor/scope_cancel_contract_test.go +0 -91
- package/templates/_executor/scope_client.go +0 -37
- package/templates/_executor/scope_contract.go +0 -12
- package/templates/_executor/selected_scope.go +0 -146
- package/templates/_executor/selected_scope_test.go +0 -186
- package/templates/_executor/socket_linux_test.go +0 -46
- package/templates/_executor/status_disabled_test.go +0 -33
- package/templates/_executor/store.go +0 -91
- package/templates/_executor/supervise.go +0 -109
- package/templates/_executor/supervise_test.go +0 -130
- package/templates/_executor/task_race_review_test.go +0 -47
- package/templates/_executor/tasks.go +0 -320
- package/templates/_executor/tasks_dsm71_test.go +0 -114
- package/templates/_executor/tasks_review_test.go +0 -43
- package/templates/_executor/tasks_test.go +0 -223
- package/templates/_executor/testdata/evidence/cleanup.json +0 -24
- package/templates/_executor/testdata/evidence/final-smoke.jsonl +0 -9
- package/templates/_executor/testdata/evidence/kernel-acl.json +0 -6
- package/templates/_executor/testdata/evidence/linux-tests.log +0 -123
- package/templates/_executor/testdata/evidence/live.jsonl +0 -23
- package/templates/_executor/testdata/evidence/storage.json +0 -90
- package/templates/_executor/testdata/evidence/validation.json +0 -55
- package/templates/_executor/testdata/live_probe.py +0 -98
- package/templates/_executor/upgrade_watch_test.go +0 -244
- package/templates/_executor/watch.go +0 -164
- package/templates/_executor/watch_test.go +0 -291
- package/templates/_executor/write_review_linux_test.go +0 -87
- package/templates/_gateway/auth.go +0 -101
- package/templates/_gateway/auth_test.go +0 -216
- package/templates/_gateway/cgi.go +0 -133
- package/templates/_gateway/cgi_test.go +0 -156
- package/templates/_gateway/csrf.go +0 -73
- package/templates/_gateway/csrf_test.go +0 -155
- package/templates/_gateway/directory.go +0 -108
- package/templates/_gateway/directory_test.go +0 -202
- package/templates/_gateway/gateway.go +0 -412
- package/templates/_gateway/gateway_test.go +0 -676
- package/templates/_gateway/go.mod +0 -5
- package/templates/_gateway/groups.go +0 -66
- package/templates/_gateway/main.go +0 -45
- package/templates/_shared/AGENTS.md +0 -146
- package/templates/_shared/CLAUDE.md +0 -1
- package/templates/_shared/GO-LICENSE +0 -27
- package/templates/_shared/GO-PATENTS +0 -22
- package/templates/_shared/LICENSES/TEMPLATE.txt +0 -21
- package/templates/_shared/third-party-notices.mjs +0 -51
- package/templates/binary/LICENSES/GO-LICENSE +0 -27
- package/templates/binary/LICENSES/GO-PATENTS +0 -22
- package/templates/binary/dsm-package.yaml +0 -46
- package/templates/binary/example/main.go +0 -16
- package/templates/binary/gitignore +0 -2
- package/templates/binary/i18n/messages/de.json +0 -4
- package/templates/binary/i18n/messages/en.json +0 -4
- package/templates/binary/i18n/messages/es.json +0 -4
- package/templates/binary/i18n/messages/fr.json +0 -4
- package/templates/binary/i18n/messages/it.json +0 -4
- package/templates/binary/i18n/messages/ja.json +0 -4
- package/templates/binary/i18n/messages/ko.json +0 -4
- package/templates/binary/i18n/messages/zh-CN.json +0 -4
- package/templates/binary/i18n/messages/zh-TW.json +0 -4
- package/templates/binary/ui/app.css +0 -4
- package/templates/binary/ui/app.js +0 -32
- package/templates/compose/compose.yaml +0 -8
- package/templates/compose/synology-app.yaml +0 -16
- package/templates/native-authorization/AuthorizationGate.vue +0 -91
- package/templates/native-authorization/i18n/de.json +0 -37
- package/templates/native-authorization/i18n/en.json +0 -37
- package/templates/native-authorization/i18n/es.json +0 -37
- package/templates/native-authorization/i18n/fr.json +0 -37
- package/templates/native-authorization/i18n/index.ts +0 -15
- package/templates/native-authorization/i18n/it.json +0 -37
- package/templates/native-authorization/i18n/ja.json +0 -37
- package/templates/native-authorization/i18n/ko.json +0 -37
- package/templates/native-authorization/i18n/zh-CN.json +0 -37
- package/templates/native-authorization/i18n/zh-TW.json +0 -37
- package/templates/native-go/README.md +0 -459
- package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +0 -61
- package/templates/native-go/backend/cmd/app/main.go +0 -95
- package/templates/native-go/backend/cmd/background-worker/main.go +0 -38
- package/templates/native-go/backend/go.mod +0 -9
- package/templates/native-go/backend/go.sum +0 -4
- package/templates/native-go/backend/internal/api/cgi_framing_test.go +0 -32
- package/templates/native-go/backend/internal/api/cookie_review_test.go +0 -28
- package/templates/native-go/backend/internal/api/deadline_test.go +0 -114
- package/templates/native-go/backend/internal/api/dsm-session.go +0 -54
- package/templates/native-go/backend/internal/api/dsm-session_test.go +0 -51
- package/templates/native-go/backend/internal/api/entry_test.go +0 -47
- package/templates/native-go/backend/internal/api/errors.go +0 -47
- package/templates/native-go/backend/internal/api/permissions.go +0 -161
- package/templates/native-go/backend/internal/api/permissions.json +0 -5
- package/templates/native-go/backend/internal/api/permissions_test.go +0 -113
- package/templates/native-go/backend/internal/api/policy_fixture_test.go +0 -8
- package/templates/native-go/backend/internal/api/registry.go +0 -142
- package/templates/native-go/backend/internal/api/registry_test.go +0 -344
- package/templates/native-go/backend/internal/api/resource_limits_test.go +0 -87
- package/templates/native-go/backend/internal/api/sdk-permissions.json +0 -59
- package/templates/native-go/backend/internal/api/sdk_policy_test.go +0 -31
- package/templates/native-go/backend/internal/api/server.go +0 -305
- package/templates/native-go/backend/internal/api/testdata/permissions-cases.json +0 -172
- package/templates/native-go/backend/internal/app/background.go +0 -249
- package/templates/native-go/backend/internal/app/background_none.go +0 -8
- package/templates/native-go/backend/internal/app/background_owner.go +0 -38
- package/templates/native-go/backend/internal/app/background_owner_test.go +0 -163
- package/templates/native-go/backend/internal/app/background_schedule.go +0 -69
- package/templates/native-go/backend/internal/app/background_schedule_test.go +0 -62
- package/templates/native-go/backend/internal/app/background_test.go +0 -320
- package/templates/native-go/backend/internal/app/delegate_config.go +0 -57
- package/templates/native-go/backend/internal/app/delegate_config_test.go +0 -28
- package/templates/native-go/backend/internal/app/delegate_none.go +0 -5
- package/templates/native-go/backend/internal/app/identity.go +0 -20
- package/templates/native-go/backend/internal/app/identity_test.go +0 -15
- package/templates/native-go/backend/internal/app/migrations.go +0 -41
- package/templates/native-go/backend/internal/app/migrations_test.go +0 -41
- package/templates/native-go/backend/internal/app/portal.go +0 -30
- package/templates/native-go/backend/internal/app/portal_test.go +0 -55
- package/templates/native-go/backend/internal/app/root_none.go +0 -9
- package/templates/native-go/backend/internal/app/routes.go +0 -137
- package/templates/native-go/backend/internal/app/routes_test.go +0 -165
- package/templates/native-go/backend/internal/app/session_files.go +0 -9
- package/templates/native-go/backend/internal/app/session_files_test.go +0 -14
- package/templates/native-go/backend/internal/app/shared_folder.go +0 -144
- package/templates/native-go/backend/internal/app/shared_folder_test.go +0 -158
- package/templates/native-go/backend/internal/background/access.go +0 -57
- package/templates/native-go/backend/internal/background/lock_test.go +0 -131
- package/templates/native-go/backend/internal/background/owner_test.go +0 -118
- package/templates/native-go/backend/internal/background/runner.go +0 -185
- package/templates/native-go/backend/internal/background/runner_test.go +0 -209
- package/templates/native-go/backend/internal/background/schedule.go +0 -336
- package/templates/native-go/backend/internal/background/schedule_test.go +0 -368
- package/templates/native-go/backend/internal/background/store.go +0 -825
- package/templates/native-go/backend/internal/background/store_test.go +0 -365
- package/templates/native-go/backend/internal/datamigrate/migrate.go +0 -191
- package/templates/native-go/backend/internal/datamigrate/migrate_test.go +0 -177
- package/templates/native-go/backend/internal/dsm/admin.go +0 -76
- package/templates/native-go/backend/internal/dsm/admin_linux.go +0 -110
- package/templates/native-go/backend/internal/dsm/admin_linux_test.go +0 -105
- package/templates/native-go/backend/internal/dsm/admin_other.go +0 -15
- package/templates/native-go/backend/internal/dsm/admin_test.go +0 -67
- package/templates/native-go/backend/internal/dsm/apppriv.go +0 -30
- package/templates/native-go/backend/internal/dsm/auth.go +0 -94
- package/templates/native-go/backend/internal/dsm/auth_test.go +0 -159
- package/templates/native-go/backend/internal/dsm/bridge_file.go +0 -75
- package/templates/native-go/backend/internal/dsm/bridge_file_test.go +0 -57
- package/templates/native-go/backend/internal/dsm/entry.go +0 -177
- package/templates/native-go/backend/internal/dsm/entry_test.go +0 -315
- package/templates/native-go/backend/internal/dsm/native/admin-aarch64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/admin-x86_64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/admin_check.c +0 -28
- package/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv_check.c +0 -33
- package/templates/native-go/backend/internal/dsm/native/build.sh +0 -18
- package/templates/native-go/backend/internal/dsm/native/licenses/GLIBC-NOTICES.txt +0 -400
- package/templates/native-go/backend/internal/dsm/native/licenses/LGPL-2.1.txt +0 -501
- package/templates/native-go/backend/internal/dsm/native/licenses/SOURCE.txt +0 -5
- package/templates/native-go/backend/internal/dsm/native/licenses/ZIG-MIT.txt +0 -21
- package/templates/native-go/backend/internal/dsm/native/provenance.json +0 -18
- package/templates/native-go/backend/internal/filestation/browse_test.go +0 -67
- package/templates/native-go/backend/internal/filestation/check_permission.go +0 -71
- package/templates/native-go/backend/internal/filestation/check_permission_test.go +0 -77
- package/templates/native-go/backend/internal/filestation/client.go +0 -337
- package/templates/native-go/backend/internal/filestation/client_test.go +0 -155
- package/templates/native-go/backend/internal/filestation/doc.go +0 -4
- package/templates/native-go/backend/internal/filestation/download_dsm71_test.go +0 -82
- package/templates/native-go/backend/internal/filestation/http.go +0 -70
- package/templates/native-go/backend/internal/filestation/http_test.go +0 -188
- package/templates/native-go/backend/internal/filestation/operations_test.go +0 -206
- package/templates/native-go/backend/internal/filestation/read_file_test.go +0 -89
- package/templates/native-go/backend/internal/filestation/sdk_policy_test.go +0 -39
- package/templates/native-go/backend/internal/filestation/service.go +0 -254
- package/templates/native-go/backend/internal/filestation/service_test.go +0 -74
- package/templates/native-go/backend/internal/filestation/upload_stream.go +0 -76
- package/templates/native-go/backend/internal/filestation/upload_stream_test.go +0 -77
- package/templates/native-go/backend/internal/filestation/write.go +0 -32
- package/templates/native-go/backend/internal/filestation/write_test.go +0 -124
- package/templates/native-go/backend/internal/identity/README.md +0 -59
- package/templates/native-go/backend/internal/identity/dsm.go +0 -115
- package/templates/native-go/backend/internal/identity/http.go +0 -291
- package/templates/native-go/backend/internal/identity/identity_test.go +0 -530
- package/templates/native-go/backend/internal/identity/service.go +0 -159
- package/templates/native-go/backend/internal/identity/store.go +0 -109
- package/templates/native-go/backend/internal/jsonlimits/limits.go +0 -48
- package/templates/native-go/backend/internal/jsonlimits/limits_test.go +0 -52
- package/templates/native-go/backend/internal/portal/portal.go +0 -138
- package/templates/native-go/backend/internal/portal/portal_test.go +0 -89
- package/templates/native-go/dsm-package.yaml +0 -71
- package/templates/native-go/gitignore +0 -1
- package/templates/native-go/i18n/glossary.json +0 -663
- package/templates/native-go/i18n/messages/de.json +0 -29
- package/templates/native-go/i18n/messages/en.json +0 -29
- package/templates/native-go/i18n/messages/es.json +0 -29
- package/templates/native-go/i18n/messages/fr.json +0 -29
- package/templates/native-go/i18n/messages/it.json +0 -29
- package/templates/native-go/i18n/messages/ja.json +0 -29
- package/templates/native-go/i18n/messages/ko.json +0 -29
- package/templates/native-go/i18n/messages/zh-CN.json +0 -29
- package/templates/native-go/i18n/messages/zh-TW.json +0 -29
- package/templates/native-go/ui/app.css +0 -45
- package/templates/native-go/ui/app.js +0 -111
- package/templates/native-go-delegate/DELEGATE.md +0 -263
- package/templates/native-go-delegate/backend/cmd/background-worker/main.go +0 -48
- package/templates/native-go-delegate/backend/internal/app/delegate.go +0 -25
- package/templates/native-go-delegate/backend/internal/app/delegate_on.go +0 -5
- package/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +0 -31
- package/templates/native-go-delegate/backend/internal/background/delegate_review_test.go +0 -174
- package/templates/native-go-delegate/backend/internal/background/delegated.go +0 -277
- package/templates/native-go-delegate/backend/internal/background/delegated_moves.go +0 -270
- package/templates/native-go-delegate/backend/internal/background/delegated_test.go +0 -34
- package/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +0 -410
- package/templates/native-go-delegate/backend/internal/delegate/busy_review_test.go +0 -15
- package/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +0 -95
- package/templates/native-go-delegate/backend/internal/delegate/client.go +0 -151
- package/templates/native-go-delegate/backend/internal/delegate/client_test.go +0 -214
- package/templates/native-go-delegate/backend/internal/delegate/destination.go +0 -110
- package/templates/native-go-delegate/backend/internal/delegate/destination_state.go +0 -117
- package/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +0 -60
- package/templates/native-go-delegate/backend/internal/delegate/destination_test.go +0 -116
- package/templates/native-go-delegate/backend/internal/delegate/example.go +0 -81
- package/templates/native-go-delegate/backend/internal/delegate/example_test.go +0 -91
- package/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +0 -511
- package/templates/native-go-delegate/backend/internal/delegate/files.go +0 -132
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +0 -92
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +0 -99
- package/templates/native-go-delegate/backend/internal/delegate/move.go +0 -348
- package/templates/native-go-delegate/backend/internal/delegate/move_test.go +0 -351
- package/templates/native-go-delegate/backend/internal/delegate/operations_list.go +0 -65
- package/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +0 -114
- package/templates/native-go-delegate/backend/internal/delegate/retry.go +0 -106
- package/templates/native-go-delegate/backend/internal/delegate/retry_test.go +0 -143
- package/templates/native-go-delegate/backend/internal/delegate/service.go +0 -364
- package/templates/native-go-delegate/backend/internal/delegate/service_test.go +0 -318
- package/templates/native-go-delegate/backend/internal/delegate/staging.go +0 -121
- package/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +0 -51
- package/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +0 -112
- package/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +0 -137
- package/templates/native-go-delegate/backend/internal/delegate/wait_cancel_test.go +0 -101
- package/templates/native-go-delegate/backend/internal/delegate/worker.go +0 -225
- package/templates/native-go-delegate/backend/internal/filestation/files.go +0 -43
- package/templates/native-go-delegate/backend/internal/filestation/files_test.go +0 -59
- package/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +0 -37
- package/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +0 -113
- package/templates/native-go-delegate/frontend/src/delegate/DelegatePanel.vue +0 -70
- package/templates/native-go-delegate/frontend/src/delegate/copy.ts +0 -8
- package/templates/native-go-delegate/frontend/src/delegate/i18n/waiting.json +0 -11
- package/templates/native-go-delegate/frontend/test/background-save.test.ts +0 -121
- package/templates/native-go-delegate/frontend/test/delegate.test.ts +0 -145
- package/templates/native-go-delegate/frontend/test/scope-settings.test.ts +0 -49
- package/templates/native-go-delegate/test-frontend.sh +0 -12
- package/templates/native-go-delegate/test.sh +0 -18
- package/templates/native-go-jobs/BACKGROUND.md +0 -108
- package/templates/native-go-jobs/backend/internal/app/background_on.go +0 -7
- package/templates/native-go-jobs/backend/internal/app/background_routes_test.go +0 -90
- package/templates/native-go-jobs/frontend/src/background/BackgroundPanel.vue +0 -170
- package/templates/native-go-jobs/frontend/src/background/i18n/de.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/en.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/es.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/fr.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/it.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/ja.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/ko.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n.ts +0 -19
- package/templates/native-go-jobs/frontend/src/background/picker-provider.ts +0 -12
- package/templates/native-go-jobs/frontend/src/background/request-key.ts +0 -5
- package/templates/native-go-jobs/frontend/test/background.test.ts +0 -205
- package/templates/native-go-root-ops/backend/internal/app/executor.go +0 -140
- package/templates/native-go-root-ops/backend/internal/app/executor_test.go +0 -117
- package/templates/native-go-root-ops/root/whoami.sh +0 -3
- package/templates/native-go-vue/README.md +0 -47
- package/templates/native-go-vue/frontend/DESIGN.md +0 -61
- package/templates/native-go-vue/frontend/package-lock.json +0 -2530
- package/templates/native-go-vue/frontend/package.json +0 -6
- package/templates/native-go-vue/frontend/src/App.vue +0 -96
- package/templates/native-go-vue/frontend/src/CapabilityPanels.vue +0 -6
- package/templates/native-go-vue/frontend/src/context.ts +0 -78
- package/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +0 -70
- package/templates/native-go-vue/frontend/src/delegate/catalogs.ts +0 -11
- package/templates/native-go-vue/frontend/src/delegate/copy.test.ts +0 -12
- package/templates/native-go-vue/frontend/src/delegate/copy.ts +0 -4
- package/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +0 -23
- package/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +0 -24
- package/templates/native-go-vue/frontend/src/delegate/facade.test.ts +0 -100
- package/templates/native-go-vue/frontend/src/delegate/facade.ts +0 -85
- package/templates/native-go-vue/frontend/src/delegate/i18n/de.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/en.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/es.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/it.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/long-running.ts +0 -57
- package/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +0 -12
- package/templates/native-go-vue/frontend/src/delegate/save-copy.ts +0 -24
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +0 -12
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +0 -21
- package/templates/native-go-vue/frontend/src/files/FileBrowser.vue +0 -131
- package/templates/native-go-vue/frontend/src/files/FilesPage.vue +0 -35
- package/templates/native-go-vue/frontend/src/files/files.test.ts +0 -100
- package/templates/native-go-vue/frontend/src/files/provider.test.ts +0 -48
- package/templates/native-go-vue/frontend/src/files/transfers.test.ts +0 -27
- package/templates/native-go-vue/frontend/src/files/transfers.ts +0 -25
- package/templates/native-go-vue/frontend/src/i18n/de.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/en.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/es.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/fr.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/it.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/ja.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/ko.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/zh-CN.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/zh-TW.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n.ts +0 -13
- package/templates/native-go-vue/frontend/src/identity/DESIGN.md +0 -46
- package/templates/native-go-vue/frontend/src/identity/LoginPage.vue +0 -78
- package/templates/native-go-vue/frontend/src/identity/i18n/de.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/en.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/es.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/fr.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/it.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/ja.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/ko.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n.ts +0 -14
- package/templates/native-go-vue/frontend/src/identity/login.test.ts +0 -32
- package/templates/native-go-vue/frontend/src/identity/session.test.ts +0 -33
- package/templates/native-go-vue/frontend/src/identity/session.ts +0 -74
- package/templates/native-go-vue/frontend/src/main.ts +0 -32
- package/templates/native-go-vue/frontend/src/nas/NasPicker.vue +0 -42
- package/templates/native-go-vue/frontend/src/nas/contract.ts +0 -12
- package/templates/native-go-vue/frontend/src/nas/destination.test.ts +0 -48
- package/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n.ts +0 -2
- package/templates/native-go-vue/frontend/src/nas/locale.ts +0 -24
- package/templates/native-go-vue/frontend/src/nas/provider.ts +0 -50
- package/templates/native-go-vue/frontend/src/nas/use-request.ts +0 -18
- package/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +0 -39
- package/templates/native-go-vue/frontend/src/shell/AppShell.vue +0 -48
- package/templates/native-go-vue/frontend/src/shell/i18n/de.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/en.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/es.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/it.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/ko.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n.ts +0 -17
- package/templates/native-go-vue/frontend/src/shell/pages.ts +0 -15
- package/templates/native-go-vue/frontend/src/style.css +0 -27
- package/templates/native-go-vue/frontend/test/apps.test.ts +0 -57
- package/templates/native-go-vue/frontend/test/native-controls.test.ts +0 -27
- package/templates/native-go-vue/frontend/test/portal-settings.test.ts +0 -71
- package/templates/native-go-vue/frontend/test/shell-i18n.test.ts +0 -50
- package/templates/native-go-vue/frontend/test/shell-ui.test.ts +0 -20
- package/templates/native-go-vue/frontend/test/shell.test.ts +0 -30
- package/templates/native-go-vue/frontend/tsconfig.json +0 -1
- package/templates/native-go-vue/frontend/vite.config.ts +0 -10
- package/templates/native-go-vue/gitignore +0 -2
- /package/{dist/templates/_daemon → assets/go/daemon}/fixture_linux_test.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/fixture_other_test.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/go.mod +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/main.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/main_test.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/process_linux.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/process_linux_test.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/process_other.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/testdata/child.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/auth.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/auth_test.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/cgi.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/cgi_test.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/csrf.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/csrf_test.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/directory.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/directory_test.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/gateway.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/gateway_test.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/go.mod +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/groups.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/main.go +0 -0
- /package/{dist/templates/_shared → assets/licenses}/GO-LICENSE +0 -0
- /package/{dist/templates/_shared → assets/licenses}/GO-PATENTS +0 -0
- /package/{dist/templates/_shared/LICENSES → assets/licenses}/TEMPLATE.txt +0 -0
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"title": "背景存檔",
|
|
3
|
-
"help": "登出後,App 仍可將完整檔案存入你選取的資料夾,直到你撤銷授權。既有檔案一律不會被取代。",
|
|
4
|
-
"selection": "允許此 App 在你登出後繼續儲存到這裡,直到你撤銷授權。",
|
|
5
|
-
"delegations": "我的目的地",
|
|
6
|
-
"operations": "我的存檔",
|
|
7
|
-
"empty": "目前沒有有效目的地。",
|
|
8
|
-
"noOperations": "目前沒有存檔工作。",
|
|
9
|
-
"revoke": "撤銷授權",
|
|
10
|
-
"choose": "選擇存檔目的地",
|
|
11
|
-
"needs": "管理員必須先核准背景存取,你才能選擇存檔目的地。",
|
|
12
|
-
"cancel": "取消存檔",
|
|
13
|
-
"refresh": "重新整理",
|
|
14
|
-
"disable": "停用背景存檔",
|
|
15
|
-
"enable": "啟用背景存檔",
|
|
16
|
-
"disableHelp": "停用會撤銷此 App 的所有目的地授權,並取消待完成的存檔。已儲存的檔案會保留。",
|
|
17
|
-
"disabled": "背景存檔已停用。管理員可重新啟用,之後你須重新選取目的地。",
|
|
18
|
-
"enabled": "背景存檔已啟用。",
|
|
19
|
-
"revoked": "授權已撤銷。已儲存的檔案會保留。",
|
|
20
|
-
"untilRevoked": "直到撤銷授權",
|
|
21
|
-
"queued": "等待中",
|
|
22
|
-
"copying": "存檔中",
|
|
23
|
-
"committed": "已儲存",
|
|
24
|
-
"canceled": "已取消",
|
|
25
|
-
"canceling": "取消中",
|
|
26
|
-
"interrupted": "已中斷",
|
|
27
|
-
"uncertain": "結果不明",
|
|
28
|
-
"uncertainHelp": "結果不明。請先檢查原工作與目的地,再決定後續操作。App 不會自動重新儲存。",
|
|
29
|
-
"interruptedHelp": "存檔已中斷。請檢查目的地;App 不會自動重試。",
|
|
30
|
-
"loading": "正在載入目的地與存檔…",
|
|
31
|
-
"denied": "存取遭拒。請檢查資料夾權限,再重新選取目的地。",
|
|
32
|
-
"session": "請重新登入 DSM,再重新整理。",
|
|
33
|
-
"conflict": "已存在同名檔案。請檢查目的地,並為新工作選擇另一個名稱。",
|
|
34
|
-
"space": "空間不足。請檢查目的地,再開始新工作。",
|
|
35
|
-
"error": "無法確認操作結果。請重新整理查詢目前結果,再決定後續操作。",
|
|
36
|
-
"scope": "已確認的儲存範圍",
|
|
37
|
-
"scopeNeeds": "管理員必須先在「管理員設定」確認安裝時的預選,你才能選擇目的地。",
|
|
38
|
-
"scopeMismatch": "安裝時的預選與已確認範圍不同。儲存會依已確認範圍執行:",
|
|
39
|
-
"reselect": "儲存範圍已更換,或授權已被撤銷。請重新選擇目的地。先前儲存的檔案會保留。",
|
|
40
|
-
"example": "儲存範例檔案",
|
|
41
|
-
"exampleHelp": "將小型範例檔案儲存到有效目的地。App 先在私有空間產生檔案,再以你自己的權限儲存。結果請在「我的存檔」查看。"
|
|
42
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"title": "后台文件访问",
|
|
3
|
-
"help": "关闭 App 后下载仍会继续。每项任务只能在一小时内写入所选的文件夹,现有文件绝不会被替换。",
|
|
4
|
-
"setupTitle": "管理员设置",
|
|
5
|
-
"setupHelp": "批准一次,让 App 在用户离线时也能完成文件任务。",
|
|
6
|
-
"password": "DSM 密码",
|
|
7
|
-
"authorize": "批准后台文件访问",
|
|
8
|
-
"confirmShare": "确认共享文件夹",
|
|
9
|
-
"scopeNeeds": "共享文件夹尚待确认。请在下方选择共享文件夹,并输入 DSM 密码确认。",
|
|
10
|
-
"ready": "后台文件访问已就绪。",
|
|
11
|
-
"needs": "需要管理员批准后台文件访问。",
|
|
12
|
-
"blocked": "后台文件访问不可用,请管理员检查 App 设置。",
|
|
13
|
-
"details": "详情",
|
|
14
|
-
"refresh": "刷新",
|
|
15
|
-
"revoke": "撤销",
|
|
16
|
-
"cancel": "取消任务",
|
|
17
|
-
"noDelegations": "目前没有有效委托。",
|
|
18
|
-
"delegations": "我的委托",
|
|
19
|
-
"expires": "到期时间",
|
|
20
|
-
"downloads": "我的下载",
|
|
21
|
-
"noJobs": "目前没有下载任务。",
|
|
22
|
-
"url": "下载网址",
|
|
23
|
-
"name": "文件名",
|
|
24
|
-
"choose": "选择文件夹",
|
|
25
|
-
"submit": "下载到我的文件夹",
|
|
26
|
-
"destination": "目标文件夹",
|
|
27
|
-
"pending": "任务已取消。委托撤销尚未完成,App 将自动重试。",
|
|
28
|
-
"error": "操作未完成,请刷新后重试。若持续失败,请联系管理员。",
|
|
29
|
-
"setupError": "批准未完成,请重新输入 DSM 密码后重试,或检查 App 设置。",
|
|
30
|
-
"denied": "访问被拒绝,请检查文件夹权限后重试。",
|
|
31
|
-
"session": "请重新登录 DSM,然后刷新。",
|
|
32
|
-
"size": "下载上限为 64 MB、60 秒。",
|
|
33
|
-
"queued": "等待中",
|
|
34
|
-
"running": "下载中",
|
|
35
|
-
"succeeded": "已保存",
|
|
36
|
-
"failed": "失败",
|
|
37
|
-
"canceled": "已取消",
|
|
38
|
-
"interrupted": "已中断",
|
|
39
|
-
"homeScope": "各用户的 home 文件夹",
|
|
40
|
-
"scopeLabel": "后台保存范围",
|
|
41
|
-
"protectedScope": "已确认范围",
|
|
42
|
-
"preselection": "安装时的预选",
|
|
43
|
-
"preselectionHelp": "安装时的预选仅供参考。启用后台访问时,请用 DSM 密码确认此范围。",
|
|
44
|
-
"scopeMismatch": "安装时的预选与已确认范围不同。后台保存将按已确认范围执行。",
|
|
45
|
-
"scopeChangeHelp": "更改范围会撤销现有目标,并取消待完成的保存。用户必须重新选择目标。已保存的文件会保留。",
|
|
46
|
-
"confirmScope": "确认更改范围"
|
|
47
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"title": "背景檔案存取",
|
|
3
|
-
"help": "關閉 App 後下載仍會繼續。每項工作只能在一小時內寫入所選的資料夾,既有檔案一律不會被取代。",
|
|
4
|
-
"setupTitle": "管理員設定",
|
|
5
|
-
"setupHelp": "核准一次,讓 App 在使用者離線時也能完成檔案工作。",
|
|
6
|
-
"password": "DSM 密碼",
|
|
7
|
-
"authorize": "核准背景檔案存取",
|
|
8
|
-
"confirmShare": "確認共用資料夾",
|
|
9
|
-
"scopeNeeds": "共用資料夾尚待確認。請在下方選擇共用資料夾,並輸入 DSM 密碼確認。",
|
|
10
|
-
"ready": "背景檔案存取已就緒。",
|
|
11
|
-
"needs": "需要管理員核准背景檔案存取。",
|
|
12
|
-
"blocked": "背景檔案存取無法使用,請管理員檢查 App 設定。",
|
|
13
|
-
"details": "詳情",
|
|
14
|
-
"refresh": "重新整理",
|
|
15
|
-
"revoke": "撤銷",
|
|
16
|
-
"cancel": "取消工作",
|
|
17
|
-
"noDelegations": "目前沒有有效委託。",
|
|
18
|
-
"delegations": "我的委託",
|
|
19
|
-
"expires": "到期時間",
|
|
20
|
-
"downloads": "我的下載",
|
|
21
|
-
"noJobs": "目前沒有下載工作。",
|
|
22
|
-
"url": "下載網址",
|
|
23
|
-
"name": "檔案名稱",
|
|
24
|
-
"choose": "選擇資料夾",
|
|
25
|
-
"submit": "下載到我的資料夾",
|
|
26
|
-
"destination": "目的資料夾",
|
|
27
|
-
"pending": "工作已取消。委託尚未撤銷完成,App 會自動重試。",
|
|
28
|
-
"error": "操作未完成,請重新整理後再試。若持續失敗,請聯絡管理員。",
|
|
29
|
-
"setupError": "核准未完成,請重新輸入 DSM 密碼再試,或檢查 App 設定。",
|
|
30
|
-
"denied": "存取遭拒,請檢查資料夾權限後再試。",
|
|
31
|
-
"session": "請重新登入 DSM,再重新整理。",
|
|
32
|
-
"size": "下載上限為 64 MB、60 秒。",
|
|
33
|
-
"queued": "等待中",
|
|
34
|
-
"running": "下載中",
|
|
35
|
-
"succeeded": "已儲存",
|
|
36
|
-
"failed": "失敗",
|
|
37
|
-
"canceled": "已取消",
|
|
38
|
-
"interrupted": "已中斷",
|
|
39
|
-
"homeScope": "各使用者的 home 資料夾",
|
|
40
|
-
"scopeLabel": "背景儲存範圍",
|
|
41
|
-
"protectedScope": "已確認範圍",
|
|
42
|
-
"preselection": "安裝時的預選",
|
|
43
|
-
"preselectionHelp": "安裝時的預選只供參考。啟用背景存取時,請以 DSM 密碼確認這個範圍。",
|
|
44
|
-
"scopeMismatch": "安裝時的預選與已確認範圍不同。背景儲存會依已確認範圍執行。",
|
|
45
|
-
"scopeChangeHelp": "更換範圍會撤銷既有目的地,並取消待完成的儲存。使用者必須重新選擇目的地。已儲存的檔案會保留。",
|
|
46
|
-
"confirmScope": "確認更換範圍"
|
|
47
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
// Portable copies of the frozen W1 DTOs in src/runtime/delegate-contract.ts.
|
|
2
|
-
// The generated frontend cannot import CLI source. Contract tests check parity.
|
|
3
|
-
export interface SelectDestination {key:string;path:string}
|
|
4
|
-
// The executor supplies selection; installation draft is display-only.
|
|
5
|
-
export interface ScopeSelection {scope:string;root:string;generation:number}
|
|
6
|
-
export interface DestinationState {
|
|
7
|
-
key:string
|
|
8
|
-
selection:ScopeSelection|null
|
|
9
|
-
destination:DestinationGrant|null
|
|
10
|
-
status:'active'|'missing'|'reselection-required'|'needs-scope-confirmation'|'disabled'
|
|
11
|
-
}
|
|
12
|
-
export interface DestinationGrant {
|
|
13
|
-
id:string
|
|
14
|
-
key:string
|
|
15
|
-
path:string
|
|
16
|
-
username:string
|
|
17
|
-
lifetime:'until-revoked'
|
|
18
|
-
}
|
|
19
|
-
export type DelegateOperationState='queued'|'copying'|'committed'|'canceled'|'interrupted'|'uncertain'
|
|
20
|
-
export interface OperationRef {delegation_id:string;job_id:string}
|
|
21
|
-
export interface OperationResult {
|
|
22
|
-
job_id:string
|
|
23
|
-
state:DelegateOperationState
|
|
24
|
-
receipt?:{path:string;size:number}
|
|
25
|
-
code?:string
|
|
26
|
-
reason?:string
|
|
27
|
-
}
|
|
28
|
-
export interface MoveFromStaging {
|
|
29
|
-
delegation_id:string
|
|
30
|
-
job_id:string
|
|
31
|
-
staging:string
|
|
32
|
-
name:string
|
|
33
|
-
size:number
|
|
34
|
-
}
|
|
35
|
-
// Display metadata comes from App-owned jobs; only OperationResult is executor evidence.
|
|
36
|
-
export interface SaveOperation extends OperationResult,OperationRef {name:string}
|
|
37
|
-
// createBackgroundSaveFacade binds these methods to W2 and App-owned metadata.
|
|
38
|
-
// No method accepts an owner/UID selector.
|
|
39
|
-
export interface BackgroundSaveStatus {disabled:boolean;selection?:ScopeSelection|null;scopeMode?:string;preselection?:string;mismatch?:boolean}
|
|
40
|
-
export interface DestinationSelection {
|
|
41
|
-
key:string
|
|
42
|
-
selectDestination(input:SelectDestination):Promise<DestinationGrant>
|
|
43
|
-
}
|
|
44
|
-
export interface BackgroundSaveFacade {
|
|
45
|
-
destination(key:string):Promise<DestinationState>
|
|
46
|
-
exportExample(input:{key:string;job_id:string}):Promise<OperationRef>
|
|
47
|
-
selectDestination(input:SelectDestination):Promise<DestinationGrant>
|
|
48
|
-
status():Promise<BackgroundSaveStatus>
|
|
49
|
-
list():Promise<DestinationGrant[]>
|
|
50
|
-
operations():Promise<SaveOperation[]>
|
|
51
|
-
revoke(input:{delegation_id:string}):Promise<{revoked:true}>
|
|
52
|
-
// Same-ref and idempotent. copying+CANCEL_REQUESTED is an accepted cancel, not
|
|
53
|
-
// completion: poll operations() until canceled, or committed if publish won.
|
|
54
|
-
cancel(input:OperationRef):Promise<OperationResult>
|
|
55
|
-
disable():Promise<{disabled:true}>
|
|
56
|
-
enable():Promise<{disabled:false}>
|
|
57
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {expect,test} from 'vitest'
|
|
2
|
-
import {saveCopy,saveError} from './save-copy'
|
|
3
|
-
test('formal executor refusals explain destination and identity recovery in every locale',()=>{
|
|
4
|
-
for(const locale of ['en','zh-TW','zh-CN','ja','ko','de','fr','es','it']){
|
|
5
|
-
const copy=saveCopy(locale)
|
|
6
|
-
expect(saveError({code:'destination-exists'},copy)).toBe(copy.conflict)
|
|
7
|
-
expect(saveError({code:'DELEGATION_DENIED'},copy)).toBe(copy.denied)
|
|
8
|
-
expect(saveError({code:'IDENTITY_CHANGED'},copy)).toBe(copy.denied)
|
|
9
|
-
expect(saveError({code:'NO_SPACE'},copy)).toBe(copy.space)
|
|
10
|
-
expect(saveError({code:'EXECUTOR_TIMEOUT'},copy)).toBe(copy.error)
|
|
11
|
-
}
|
|
12
|
-
})
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
// Background-save copy is separate from the legacy download copy in ./i18n.
|
|
2
|
-
import {uiLocale} from '../nas/locale'
|
|
3
|
-
import en from './i18n/save/en.json'
|
|
4
|
-
import zhTW from './i18n/save/zh-TW.json'
|
|
5
|
-
import zhCN from './i18n/save/zh-CN.json'
|
|
6
|
-
import ja from './i18n/save/ja.json'
|
|
7
|
-
import ko from './i18n/save/ko.json'
|
|
8
|
-
import de from './i18n/save/de.json'
|
|
9
|
-
import fr from './i18n/save/fr.json'
|
|
10
|
-
import es from './i18n/save/es.json'
|
|
11
|
-
import it from './i18n/save/it.json'
|
|
12
|
-
const catalogs:Record<string,typeof en>={en,'zh-TW':zhTW,'zh-CN':zhCN,ja,ko,de,fr,es,it}
|
|
13
|
-
export function saveCopy(locale='en'){return catalogs[uiLocale(locale)]!}
|
|
14
|
-
export function saveError(error:unknown,copy=saveCopy()){
|
|
15
|
-
const code=(error as {code?:string})?.code
|
|
16
|
-
if(code==='disabled')return copy.disabled
|
|
17
|
-
if(['EXECUTOR_UNAVAILABLE','needs-admin-approval','needs-scope-confirmation'].includes(code??''))return copy.needs
|
|
18
|
-
if(['session_required','dsm_session_required','AUTH_DENIED'].includes(code??''))return copy.session
|
|
19
|
-
if(['DENIED','DELEGATION_DENIED','IDENTITY_CHANGED','PERMISSION_DENIED','SCOPE_DENIED','APP_DENIED','INELIGIBLE','DESTINATION_CHANGED','denied','grant-revoked','identity-changed','permission-changed'].includes(code??''))return copy.denied
|
|
20
|
-
if(['CONFLICT','conflict','file-exists','destination-exists'].includes(code??''))return copy.conflict
|
|
21
|
-
if(['NO_SPACE','ENOSPC','no-space'].includes(code??''))return copy.space
|
|
22
|
-
if(['uncertain','commit-uncertain'].includes(code??''))return copy.uncertainHelp
|
|
23
|
-
return copy.error
|
|
24
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {expect,test,vi} from 'vitest'
|
|
2
|
-
import {scopedPicker} from './scoped-picker'
|
|
3
|
-
import type {NasProvider} from '../nas/contract'
|
|
4
|
-
test('the picker exposes only the confirmed root and refuses traversal before contacting DSM',async()=>{
|
|
5
|
-
const entry={name:'reports',path:'/reports',isDir:true},signal=new AbortController().signal
|
|
6
|
-
const source={info:vi.fn(async()=>entry),shares:vi.fn(),list:vi.fn(async()=>({entries:[entry],offset:0,total:1})),createFolder:vi.fn(),dispose:vi.fn()} as NasProvider
|
|
7
|
-
const picker=scopedPicker(source,'/reports')
|
|
8
|
-
expect((await picker.shares(0,signal)).entries).toEqual([entry]);expect(source.shares).not.toHaveBeenCalled()
|
|
9
|
-
for(const path of ['/reports2','/reports/../other','/other'])await expect(picker.list(path,{},signal)).rejects.toMatchObject({code:'SCOPE_DENIED'})
|
|
10
|
-
expect(source.list).not.toHaveBeenCalled();await picker.list('/reports',{},signal);expect(source.list).toHaveBeenCalledOnce()
|
|
11
|
-
picker.dispose();expect(source.dispose).not.toHaveBeenCalled()
|
|
12
|
-
})
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type {NasProvider} from '../nas/contract'
|
|
2
|
-
/** A UX bound only; the executor independently enforces its protected scope. */
|
|
3
|
-
export function scopedPicker(source:NasProvider,root:string):NasProvider{
|
|
4
|
-
const check=(path:string)=>{
|
|
5
|
-
if(!root||!(path===root||path.startsWith(root+'/'))||path.includes('\\')||path.slice(1).split('/').some(p=>!p||p==='.'||p==='..'))throw {code:'SCOPE_DENIED'}
|
|
6
|
-
}
|
|
7
|
-
return {
|
|
8
|
-
async shares(offset,signal){
|
|
9
|
-
check(root)
|
|
10
|
-
if(offset!==0)return {entries:[],offset,total:1}
|
|
11
|
-
const entry=await source.info(root,signal)
|
|
12
|
-
if(entry.path!==root||!entry.isDir)throw {code:'SCOPE_DENIED'}
|
|
13
|
-
return {entries:[entry],offset:0,total:1}
|
|
14
|
-
},
|
|
15
|
-
async list(path,options,signal){check(path);const page=await source.list(path,options,signal);page.entries.forEach(e=>check(e.path));return page},
|
|
16
|
-
async info(path,signal){check(path);const entry=await source.info(path,signal);check(entry.path);return entry},
|
|
17
|
-
async createFolder(parent,name,signal){check(parent);check(parent+'/'+name);return source.createFolder(parent,name,signal)},
|
|
18
|
-
// The parent owns the shared session provider; closing a picker must not dispose it.
|
|
19
|
-
dispose(){},
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import {computed,onBeforeUnmount,onMounted,ref} from 'vue'
|
|
3
|
-
import {Button,Callout,DataGrid,TreeView,FilePicker,type DataGridSort,type TreeNode} from '@synopackageland/ui'
|
|
4
|
-
import {Folder,File} from '@lucide/vue'
|
|
5
|
-
import type {NasEntry,NasProvider} from '../nas/contract'
|
|
6
|
-
import {nasCopy,nasErrorCopy} from '../nas/locale'
|
|
7
|
-
import {format} from '../nas/i18n'
|
|
8
|
-
import {useNasRequest} from '../nas/use-request'
|
|
9
|
-
const props=withDefaults(defineProps<{provider:NasProvider;locale:string;mode?:'folder'|'file';transfers?:boolean}>(),{mode:'file',transfers:false})
|
|
10
|
-
const emit=defineEmits<{selected:[path:string|undefined]}>()
|
|
11
|
-
const copy=computed(()=>nasCopy(props.locale))
|
|
12
|
-
const request=useNasRequest(),{busy,error}=request
|
|
13
|
-
const entries=ref<NasEntry[]>([]),roots=ref<TreeNode[]>([]),trail=ref<NasEntry[]>([]),chosen=ref<NasEntry>(),next=ref<number>()
|
|
14
|
-
const expanded=ref<string[]>([]),treeSelection=ref<string>()
|
|
15
|
-
const sort=ref<DataGridSort>({key:'name',direction:'asc'}),generation=ref(0)
|
|
16
|
-
const uploads=ref<globalThis.File[]>([]),uploadDone=ref(false)
|
|
17
|
-
let life=new AbortController()
|
|
18
|
-
async function download(){
|
|
19
|
-
const selected=chosen.value
|
|
20
|
-
if(!selected||selected.isDir||!props.provider.download)return
|
|
21
|
-
await request.run(async signal=>{await props.provider.info(selected.path,signal);props.provider.download!(selected.path);return true})
|
|
22
|
-
}
|
|
23
|
-
async function upload(){
|
|
24
|
-
const parent=trail.value.at(-1)?.path,file=uploads.value[0]
|
|
25
|
-
if(!parent||!file||!props.provider.upload)return
|
|
26
|
-
uploadDone.value=false
|
|
27
|
-
const done=await request.run(async signal=>{await props.provider.upload!(parent,file,signal);return true})
|
|
28
|
-
if(done){uploads.value=[];await browse(trail.value);uploadDone.value=true}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const columns=computed(()=>[
|
|
32
|
-
{key:'name',label:copy.value.nameColumn,sortable:true},
|
|
33
|
-
{key:'kind',label:copy.value.kindColumn},
|
|
34
|
-
{key:'bytes',label:copy.value.sizeColumn,align:'right' as const,sortable:true},
|
|
35
|
-
{key:'selection',label:copy.value.selectAction},
|
|
36
|
-
])
|
|
37
|
-
function node(entry:NasEntry):TreeNode{return {id:entry.path,label:entry.name,icon:Folder,data:entry}}
|
|
38
|
-
function select(entry?:NasEntry){chosen.value=entry;emit('selected',entry?.path)}
|
|
39
|
-
function findTrail(nodes:TreeNode[],id:string,parents:NasEntry[]=[]):NasEntry[]|undefined{
|
|
40
|
-
for(const n of nodes){const path=[...parents,n.data as NasEntry];if(n.id===id)return path;const found=findTrail(n.children??[],id,path);if(found)return found}
|
|
41
|
-
}
|
|
42
|
-
async function loadChildren(parent:TreeNode):Promise<TreeNode[]|undefined>{
|
|
43
|
-
const version=generation.value,signal=life.signal
|
|
44
|
-
try{
|
|
45
|
-
const children:TreeNode[]=[]
|
|
46
|
-
let offset:number|undefined=0
|
|
47
|
-
while(offset!==undefined){
|
|
48
|
-
const page=await props.provider.list(parent.id,{offset,sortBy:'name',sortDirection:'ASC'},signal)
|
|
49
|
-
if(signal.aborted||version!==generation.value)return undefined
|
|
50
|
-
children.push(...page.entries.filter(e=>e.isDir).map(node));offset=page.nextOffset
|
|
51
|
-
}
|
|
52
|
-
return children
|
|
53
|
-
}catch(e){if(!signal.aborted&&version===generation.value){error.value=e;select()};return undefined}
|
|
54
|
-
}
|
|
55
|
-
async function browse(target:NasEntry[],more=false){
|
|
56
|
-
if(busy.value)return
|
|
57
|
-
select();entries.value=more?entries.value:[];next.value=more?next.value:undefined
|
|
58
|
-
const offset=more?next.value??0:0,path=target.at(-1)?.path
|
|
59
|
-
trail.value=target
|
|
60
|
-
const page=await request.run(signal=>path
|
|
61
|
-
?props.provider.list(path,{offset,sortBy:sort.value.key as 'name'|'size',sortDirection:sort.value.direction==='asc'?'ASC':'DESC'},signal)
|
|
62
|
-
:props.provider.shares(offset,signal))
|
|
63
|
-
if(page){
|
|
64
|
-
entries.value=more?[...entries.value,...page.entries]:page.entries;next.value=page.nextOffset
|
|
65
|
-
if(!path)roots.value=entries.value.filter(e=>e.isDir).map(node)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
function open(entry:NasEntry){void browse([...trail.value,entry])}
|
|
69
|
-
function sortChanged(value:DataGridSort|null){sort.value={key:value?.key==='bytes'?'size':'name',direction:value?.direction??'asc'};void browse(trail.value)}
|
|
70
|
-
function refresh(){
|
|
71
|
-
if(busy.value)return
|
|
72
|
-
generation.value++;life.abort();life=new AbortController();roots.value=[];expanded.value=[];treeSelection.value=undefined
|
|
73
|
-
void browse([])
|
|
74
|
-
}
|
|
75
|
-
onMounted(()=>void browse([]))
|
|
76
|
-
onBeforeUnmount(()=>{generation.value++;life.abort()})
|
|
77
|
-
</script>
|
|
78
|
-
<template>
|
|
79
|
-
<section class="file-browser" :aria-busy="busy" :aria-label="copy.title">
|
|
80
|
-
<p>{{ copy.ownPermissions }}</p>
|
|
81
|
-
<nav class="file-toolbar" :aria-label="copy.directoryKind">
|
|
82
|
-
<Button variant="secondary" :disabled="busy" @click="refresh">{{ copy.refresh }}</Button>
|
|
83
|
-
<Button v-if="trail.length" variant="secondary" :disabled="busy" @click="browse(trail.slice(0,-1))">{{ copy.back }}</Button>
|
|
84
|
-
<Button variant="secondary" :disabled="busy" @click="browse([])">{{ copy.roots }}</Button>
|
|
85
|
-
<Button v-for="(part,index) in trail" :key="part.path" variant="secondary" :disabled="busy" @click="browse(trail.slice(0,index+1))">{{ part.name }}</Button>
|
|
86
|
-
</nav>
|
|
87
|
-
<div v-if="transfers&&provider.upload&&trail.length" class="file-toolbar">
|
|
88
|
-
<FilePicker v-model="uploads" variant="compact" :disabled="busy" :max-files="1" :max-size="16*1024**3" :title="copy.upload" @rejected="error={code:'upload_size_required'}" />
|
|
89
|
-
<Button variant="primary" :disabled="busy||!uploads.length" @click="upload">{{ copy.upload }}</Button>
|
|
90
|
-
</div>
|
|
91
|
-
<p v-if="uploadDone" role="status">{{ copy.uploaded }}</p>
|
|
92
|
-
<Button v-if="transfers&&provider.download&&chosen&&!chosen.isDir&&!error" variant="secondary" :disabled="busy" @click="download">{{ copy.download }}</Button>
|
|
93
|
-
<Callout v-if="error" tone="danger"><span role="alert">{{ nasErrorCopy(error,copy) }}</span></Callout>
|
|
94
|
-
<p v-if="busy" role="status">{{ copy.loading }}</p>
|
|
95
|
-
<div class="file-columns">
|
|
96
|
-
<aside class="file-tree" :aria-label="copy.roots">
|
|
97
|
-
<TreeView v-if="roots.length" :key="generation" v-model="treeSelection" v-model:nodes="roots" v-model:expanded="expanded" :load-children="loadChildren" :expand-label="(n,expanded)=>format(expanded?copy.collapse:copy.expand,n.label)" @select="n=>browse(findTrail(roots,n.id)??[n.data as NasEntry])" />
|
|
98
|
-
</aside>
|
|
99
|
-
<div class="file-content">
|
|
100
|
-
<DataGrid v-if="!error" :columns="columns" :rows="entries.map(e=>({...e,kind:e.isDir?copy.directoryKind:copy.fileKind}))" row-key="path" :footer="false" :resizable="false" :local-sort="false" :local-pagination="false" :loading="busy" :loading-text="copy.loading" :sort="{key:sort.key==='size'?'bytes':sort.key,direction:sort.direction}" :labels="{empty:copy.emptyFolder}" @update:sort="sortChanged">
|
|
101
|
-
<template #cell-name="{row}">
|
|
102
|
-
<Button v-if="row.isDir" variant="secondary" :disabled="busy" :aria-label="format(copy.open,String(row.name))" @click="open(entries.find(e=>e.path===row.path)!)"><Folder :size="16" aria-hidden="true" />{{ row.name }}</Button>
|
|
103
|
-
<span v-else class="file-name"><File :size="16" aria-hidden="true" />{{ row.name }}</span>
|
|
104
|
-
</template>
|
|
105
|
-
<template #cell-bytes="{row}"><span class="file-bytes">{{ row.isDir?'—':row.bytes??'—' }}</span></template>
|
|
106
|
-
<template #cell-selection="{row}">
|
|
107
|
-
<Button v-if="mode==='folder'?row.isDir:!row.isDir" variant="secondary" :disabled="busy" :aria-pressed="chosen?.path===row.path" :aria-label="format(copy.select,String(row.name))" @click="select(entries.find(e=>e.path===row.path))">{{ copy.selectAction }}</Button>
|
|
108
|
-
</template>
|
|
109
|
-
</DataGrid>
|
|
110
|
-
<Button v-if="next!==undefined&&!error" variant="secondary" :disabled="busy" @click="browse(trail,true)">{{ copy.loadMore }}</Button>
|
|
111
|
-
<Button v-if="mode==='folder'&&trail.length&&!error" variant="secondary" :disabled="busy" @click="select(trail.at(-1))">{{ format(copy.select,trail.at(-1)!.name) }}</Button>
|
|
112
|
-
</div>
|
|
113
|
-
</div>
|
|
114
|
-
<p v-if="chosen&&!error" class="file-selection" role="status">{{ format(copy.selected,chosen.path) }}</p>
|
|
115
|
-
</section>
|
|
116
|
-
</template>
|
|
117
|
-
<style scoped>
|
|
118
|
-
.file-browser { min-width: 0; color: var(--ui-text); }
|
|
119
|
-
.file-toolbar { display: flex; flex-wrap: wrap; gap: var(--ui-space-2, 8px); margin-block: var(--ui-space-3, 12px); }
|
|
120
|
-
.file-columns { display: grid; grid-template-columns: minmax(140px, 1fr) minmax(0, 3fr); gap: var(--ui-space-3, 12px); }
|
|
121
|
-
.file-tree { min-width: 0; max-height: 55vh; overflow: auto; border-inline-end: 1px solid var(--ui-border); }
|
|
122
|
-
.file-content { min-width: 0; overflow: auto; }
|
|
123
|
-
.file-name { display: inline-flex; align-items: center; gap: var(--ui-space-2, 8px); overflow-wrap: anywhere; }
|
|
124
|
-
.file-bytes { font-variant-numeric: tabular-nums; }
|
|
125
|
-
.file-selection { overflow-wrap: anywhere; }
|
|
126
|
-
@media (max-width: 600px) {
|
|
127
|
-
.file-columns { grid-template-columns: minmax(0, 1fr); }
|
|
128
|
-
.file-content :deep(th:nth-child(2)), .file-content :deep(td:nth-child(2)), .file-content :deep(th:nth-child(3)), .file-content :deep(td:nth-child(3)) { display: none; }
|
|
129
|
-
.file-tree { max-height: 180px; border-inline-end: 0; border-bottom: 1px solid var(--ui-border); }
|
|
130
|
-
}
|
|
131
|
-
</style>
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import {onBeforeUnmount,onMounted,ref} from 'vue'
|
|
3
|
-
import {Button,Callout,SettingsSection} from '@synopackageland/ui'
|
|
4
|
-
import type {Context} from '../context'
|
|
5
|
-
import FileBrowser from './FileBrowser.vue'
|
|
6
|
-
import NasPicker from '../nas/NasPicker.vue'
|
|
7
|
-
import {createNasProvider} from '../nas/provider'
|
|
8
|
-
import {nasCopy,nasErrorCopy} from '../nas/locale'
|
|
9
|
-
const props=defineProps<{ctx:Context}>()
|
|
10
|
-
const error=ref<unknown>()
|
|
11
|
-
const ready=ref(false),mode=ref<'folder'|'file'>('folder'),open=ref(false),selected=ref(''),generation=ref(0)
|
|
12
|
-
const provider=createNasProvider(props.ctx)
|
|
13
|
-
let disposed=false,unsubscribe:(()=>void)|undefined
|
|
14
|
-
async function check(){
|
|
15
|
-
if(disposed)return
|
|
16
|
-
error.value=undefined
|
|
17
|
-
ready.value=false;selected.value='';open.value=false;generation.value++
|
|
18
|
-
try{await props.ctx.call('nas.session.status');if(!disposed)ready.value=true}catch(e){if(!disposed&&(e as {code?:string})?.code!=='unknown_method')error.value=e}
|
|
19
|
-
}
|
|
20
|
-
onMounted(()=>{unsubscribe=props.ctx.reopen(()=>void check());void check()})
|
|
21
|
-
onBeforeUnmount(()=>{disposed=true;unsubscribe?.();provider.dispose()})
|
|
22
|
-
</script>
|
|
23
|
-
<template>
|
|
24
|
-
<Callout v-if="error" tone="danger"><span role="alert">{{ nasErrorCopy(error,nasCopy(ctx.locale)) }}</span><Button variant="secondary" @click="check">{{ nasCopy(ctx.locale).refresh }}</Button></Callout>
|
|
25
|
-
<SettingsSection v-if="ready" :title="nasCopy(ctx.locale).title" :collapsible="false">
|
|
26
|
-
<div class="files-actions"><Button variant="secondary" @click="mode='folder';open=true">{{ nasCopy(ctx.locale).choose }}</Button><Button variant="secondary" @click="mode='file';open=true">{{ nasCopy(ctx.locale).chooseFile }}</Button></div>
|
|
27
|
-
<p v-if="selected" class="files-path" role="status">{{ selected }}</p>
|
|
28
|
-
<FileBrowser :key="generation" :provider="provider" :locale="ctx.locale" transfers />
|
|
29
|
-
<NasPicker :provider="provider" :locale="ctx.locale" :mode="mode" v-model:open="open" @selected="selected=$event" />
|
|
30
|
-
</SettingsSection>
|
|
31
|
-
</template>
|
|
32
|
-
<style scoped>
|
|
33
|
-
.files-actions { display: flex; flex-wrap: wrap; gap: var(--ui-space-2, 8px); }
|
|
34
|
-
.files-path { overflow-wrap: anywhere; }
|
|
35
|
-
</style>
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import {afterEach,expect,test,vi} from 'vitest'
|
|
3
|
-
import {createApp,h,nextTick,ref} from 'vue'
|
|
4
|
-
import {AppRoot} from '@synopackageland/ui'
|
|
5
|
-
import FileBrowser from './FileBrowser.vue'
|
|
6
|
-
import NasPicker from '../nas/NasPicker.vue'
|
|
7
|
-
import {createNasProvider} from '../nas/provider'
|
|
8
|
-
import {nasCopy} from '../nas/locale'
|
|
9
|
-
|
|
10
|
-
async function settle(){for(let i=0;i<30;i++){await Promise.resolve();await nextTick()}await new Promise(r=>setTimeout(r,20))}
|
|
11
|
-
const cleanup:Array<()=>void>=[]
|
|
12
|
-
afterEach(()=>{cleanup.splice(0).forEach(fn=>fn())})
|
|
13
|
-
const folder=(path:string)=>({path,name:path.split('/').at(-1)!,isdir:true})
|
|
14
|
-
const file=(path:string)=>({path,name:path.split('/').at(-1)!,isdir:false,additional:{size:2}})
|
|
15
|
-
function mount(component:any,call:any,extra:Record<string,unknown>={}){
|
|
16
|
-
const root=document.createElement('div');document.body.append(root)
|
|
17
|
-
const app=createApp({render:()=>h(AppRoot,{},()=>h(component,{provider:createNasProvider({call}),locale:'en',...extra}))})
|
|
18
|
-
app.mount(root);cleanup.push(()=>{app.unmount();root.remove()});return root
|
|
19
|
-
}
|
|
20
|
-
function button(root:HTMLElement,label:string){const node=Array.from(root.querySelectorAll('button')).find(n=>n.textContent?.trim()===label||n.getAttribute('aria-label')===label);expect(node,label).toBeTruthy();return node!}
|
|
21
|
-
function fixture(){
|
|
22
|
-
return vi.fn(async(method:string,params:any)=>{
|
|
23
|
-
if(method==='nas.files.shares')return {shares:[folder('/homes'),folder('/shared')],offset:0,total:2}
|
|
24
|
-
if(method==='nas.files.list')return {files:params.path==='/homes'?[folder('/homes/sub'),file('/homes/a.txt')]:[],offset:params.offset??0,total:params.path==='/homes'?2:0}
|
|
25
|
-
throw {code:'unknown_method'}
|
|
26
|
-
})
|
|
27
|
-
}
|
|
28
|
-
test('tree loads roots only and loads children on first expansion, including DSM-returned homes',async()=>{
|
|
29
|
-
const call=fixture(),root=mount(FileBrowser,call);await settle()
|
|
30
|
-
expect(call.mock.calls.map(([m])=>m)).toEqual(['nas.files.shares'])
|
|
31
|
-
expect(root.textContent).toContain('homes')
|
|
32
|
-
button(root,'Expand homes').click();await settle()
|
|
33
|
-
expect(call.mock.calls.filter(([m])=>m==='nas.files.list')).toHaveLength(1)
|
|
34
|
-
expect(root.textContent).toContain('sub')
|
|
35
|
-
button(root,'Collapse homes').click();await settle();button(root,'Expand homes').click();await settle()
|
|
36
|
-
expect(call.mock.calls.filter(([m])=>m==='nas.files.list')).toHaveLength(1)
|
|
37
|
-
})
|
|
38
|
-
test.each(['folder','file'] as const)('picker returns a DSM path in %s mode without creating grants',async(mode)=>{
|
|
39
|
-
const call=fixture(),selected=vi.fn(),root=mount(NasPicker,call,{open:true,mode,onSelected:selected});await settle()
|
|
40
|
-
button(root,'Open homes').click();await settle()
|
|
41
|
-
if(mode==='file')button(root,'Select a.txt').click()
|
|
42
|
-
else button(root,'Select homes').click()
|
|
43
|
-
await settle();button(root,nasCopy('en').confirm).click();await settle()
|
|
44
|
-
expect(selected).toHaveBeenCalledWith(mode==='file'?'/homes/a.txt':'/homes')
|
|
45
|
-
expect(call.mock.calls.every(([m])=>!m.includes('grants'))).toBe(true)
|
|
46
|
-
})
|
|
47
|
-
test.each([407,408,'denied'])('permission error %s is visible and suppresses misleading empty state',async(code)=>{
|
|
48
|
-
const call=vi.fn(async()=>{throw {code,message:'secret SID'}}),root=mount(FileBrowser,call);await settle()
|
|
49
|
-
expect(root.querySelector('[role="alert"]')?.textContent).toContain(nasCopy('en').errorDenied)
|
|
50
|
-
expect(root.textContent).not.toContain('secret SID')
|
|
51
|
-
expect(root.textContent).not.toContain(nasCopy('en').emptyFolder)
|
|
52
|
-
expect(button(root,nasCopy('en').refresh).disabled).toBe(false)
|
|
53
|
-
})
|
|
54
|
-
test('folder navigation clears selection when permissions are lost',async()=>{
|
|
55
|
-
const call=fixture(),root=mount(FileBrowser,call,{mode:'file'});await settle()
|
|
56
|
-
button(root,'Open homes').click();await settle();button(root,'Select a.txt').click();await settle()
|
|
57
|
-
call.mockRejectedValue({code:'denied'});button(root,nasCopy('en').refresh).click();await settle()
|
|
58
|
-
expect(root.querySelector('[role="alert"]')).toBeTruthy()
|
|
59
|
-
expect(root.textContent).not.toContain('a.txt')
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
test('lazy tree follows full DSM page cursors even when a page contains only files',async()=>{
|
|
63
|
-
const call=vi.fn(async(method:string,params:any)=>{
|
|
64
|
-
if(method==='nas.files.shares')return {shares:[folder('/team')],offset:0,total:1}
|
|
65
|
-
if(params.offset===0)return {files:[file('/team/a.txt')],offset:0,total:2}
|
|
66
|
-
return {files:[folder('/team/later')],offset:1,total:2}
|
|
67
|
-
})
|
|
68
|
-
const root=mount(FileBrowser,call);await settle();button(root,'Expand team').click();await settle()
|
|
69
|
-
expect(call.mock.calls.filter(([m])=>m==='nas.files.list').map(([,p])=>p.offset)).toEqual([0,1])
|
|
70
|
-
expect(root.textContent).toContain('later')
|
|
71
|
-
})
|
|
72
|
-
test('reopening picker clears the old path and reloads current DSM visibility',async()=>{
|
|
73
|
-
const call=fixture(),open=ref(true),selected=vi.fn(),root=document.createElement('div');document.body.append(root)
|
|
74
|
-
const provider=createNasProvider({call:call as any})
|
|
75
|
-
const app=createApp({render:()=>h(AppRoot,{},()=>h(NasPicker,{provider,locale:'en',mode:'folder',open:open.value,onSelected:selected,'onUpdate:open':v=>{open.value=v}}))})
|
|
76
|
-
app.mount(root);cleanup.push(()=>{app.unmount();root.remove()})
|
|
77
|
-
await settle();button(root,'Select homes').click();await settle();button(root,nasCopy('en').confirm).click();await settle()
|
|
78
|
-
expect(selected).toHaveBeenCalledWith('/homes')
|
|
79
|
-
open.value=true;await settle()
|
|
80
|
-
expect(button(root,nasCopy('en').confirm).disabled).toBe(true)
|
|
81
|
-
expect(call.mock.calls.filter(([m])=>m==='nas.files.shares')).toHaveLength(2)
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
test('upload picker states the same 16 GB limit as the size error',async()=>{
|
|
85
|
-
const call=fixture(),provider=createNasProvider({call:call as any})
|
|
86
|
-
const root=mount(FileBrowser,call,{transfers:true,provider:{...provider,upload:vi.fn(),download:vi.fn(),info:vi.fn()}});await settle()
|
|
87
|
-
button(root,'Open homes').click();await settle()
|
|
88
|
-
expect(nasCopy('en').errorUploadSize).toContain('16 GB')
|
|
89
|
-
expect(root.textContent).toContain('max 16 GB')
|
|
90
|
-
})
|
|
91
|
-
test('file browser downloads selected files and streams uploads to the current folder',async()=>{
|
|
92
|
-
const call=fixture(),provider=createNasProvider({call:call as any}),upload=vi.fn(async()=>{}),download=vi.fn(),info=vi.fn(async()=>({name:'a.txt',path:'/homes/a.txt',isDir:false}))
|
|
93
|
-
const root=mount(FileBrowser,call,{transfers:true,provider:{...provider,upload,download,info}});await settle()
|
|
94
|
-
button(root,'Open homes').click();await settle();button(root,'Select a.txt').click();await settle()
|
|
95
|
-
button(root,nasCopy('en').download).click();await settle();expect(info).toHaveBeenCalledWith('/homes/a.txt',expect.any(AbortSignal));expect(download).toHaveBeenCalledWith('/homes/a.txt')
|
|
96
|
-
const picker=root.querySelector<HTMLInputElement>('input[type=file]')!;expect(picker).toBeTruthy()
|
|
97
|
-
const file=new File(['payload'],'upload.txt');Object.defineProperty(picker,'files',{value:[file],configurable:true});picker.dispatchEvent(new Event('change',{bubbles:true}));await settle()
|
|
98
|
-
button(root,nasCopy('en').upload).click();await settle()
|
|
99
|
-
expect(upload).toHaveBeenCalledWith('/homes',file,expect.any(AbortSignal));expect(root.textContent).toContain(nasCopy('en').uploaded)
|
|
100
|
-
})
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import {expect,test,vi} from 'vitest'
|
|
2
|
-
import {createNasProvider} from '../nas/provider'
|
|
3
|
-
import {nasCatalogs,nasCopy,nasErrorCopy} from '../nas/locale'
|
|
4
|
-
const signal=()=>new AbortController().signal
|
|
5
|
-
|
|
6
|
-
test('provider forwards pagination/sorting and preserves every DSM-returned path',async()=>{
|
|
7
|
-
const call=vi.fn(async()=>({files:[{name:'outside homes',path:'/team/outside homes',isdir:false,additional:{size:12}}],offset:100,total:102}))
|
|
8
|
-
const p=createNasProvider({call:call as any})
|
|
9
|
-
const page=await p.list('/team',{offset:100,limit:1,sortBy:'size',sortDirection:'DESC'},signal())
|
|
10
|
-
expect(call).toHaveBeenCalledWith('nas.files.list',{path:'/team',offset:100,limit:1,sortBy:'size',sortDirection:'DESC'})
|
|
11
|
-
expect(page.entries[0]?.path).toBe('/team/outside homes');expect(page.nextOffset).toBe(101)
|
|
12
|
-
})
|
|
13
|
-
test.each([
|
|
14
|
-
{},{files:[],offset:0,total:1},{files:[],offset:-1,total:0},
|
|
15
|
-
{files:[{name:'x',path:'/x',isdir:true}],offset:0,total:0},
|
|
16
|
-
{files:[{name:'x',path:'/x',isdir:'true'}],offset:0,total:1},
|
|
17
|
-
])('malformed or stalled page fails visibly: %j',async(value)=>{
|
|
18
|
-
const p=createNasProvider({call:vi.fn(async()=>value) as any})
|
|
19
|
-
await expect(p.shares(0,signal())).rejects.toEqual({code:'unavailable'})
|
|
20
|
-
})
|
|
21
|
-
test('canceling or disposing observation rejects late results and stops subsequent calls',async()=>{
|
|
22
|
-
let resolve!:(v:unknown)=>void
|
|
23
|
-
const call=vi.fn(()=>new Promise(r=>{resolve=r})),p=createNasProvider({call:call as any}),abort=new AbortController()
|
|
24
|
-
const pending=p.shares(0,abort.signal);abort.abort()
|
|
25
|
-
await expect(pending).rejects.toEqual({code:'canceled'})
|
|
26
|
-
resolve({shares:[],offset:0,total:0});p.dispose()
|
|
27
|
-
await expect(p.shares(0,signal())).rejects.toEqual({code:'canceled'})
|
|
28
|
-
expect(call).toHaveBeenCalledTimes(1)
|
|
29
|
-
})
|
|
30
|
-
test('lost mutation response stays uncertain and sensitive error details are discarded',async()=>{
|
|
31
|
-
const p=createNasProvider({call:vi.fn(async()=>{throw {message:'SID=secret',code:'transport_error'}})})
|
|
32
|
-
await expect(p.createFolder('/team','new',signal())).rejects.toEqual({code:'commit-uncertain'})
|
|
33
|
-
})
|
|
34
|
-
test('all supported locales share copy keys, aliases and explicit permission errors',()=>{
|
|
35
|
-
const keys=Object.keys(nasCopy('en')).sort()
|
|
36
|
-
for(const copy of Object.values(nasCatalogs)){
|
|
37
|
-
expect(Object.keys(copy).sort()).toEqual(keys)
|
|
38
|
-
expect(nasErrorCopy({code:'denied',message:'SID=secret'},copy)).toBe(copy.errorDenied)
|
|
39
|
-
}
|
|
40
|
-
expect(nasCopy('cht')).toBe(nasCopy('zh-TW'))
|
|
41
|
-
expect(nasCopy('unknown')).toBe(nasCopy('en'))
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
test('App-only file errors retain a DSM-login recovery hint',async()=>{
|
|
45
|
-
const p=createNasProvider({call:vi.fn(async()=>{throw {code:'dsm_session_required'}})})
|
|
46
|
-
await expect(p.shares(0,signal())).rejects.toEqual({code:'dsm_session_required'})
|
|
47
|
-
expect(nasErrorCopy({code:'dsm_session_required'},nasCopy('en'))).toContain('DSM')
|
|
48
|
-
})
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import {expect,test,vi,afterEach} from 'vitest'
|
|
3
|
-
import {createFileTransfers} from './transfers'
|
|
4
|
-
afterEach(()=>vi.unstubAllGlobals())
|
|
5
|
-
test('upload passes the File itself with caller credentials and a header token',async()=>{
|
|
6
|
-
const fetch=vi.fn(async()=>({json:async()=>({success:true,data:{uploaded:true}})}));vi.stubGlobal('fetch',fetch)
|
|
7
|
-
const file=new File(['payload'],'\u5831\u544a.txt'),signal=new AbortController().signal
|
|
8
|
-
await createFileTransfers({endpoint:'/cgi/api.cgi',token:()=> 'caller-token'}).upload('/home',file,signal)
|
|
9
|
-
const [url,request]=fetch.mock.calls[0] as any
|
|
10
|
-
expect(url).toContain('method=nas.files.upload');expect(url).toContain('parent=%2Fhome')
|
|
11
|
-
expect(request.body).toBe(file);expect(request.signal).toBe(signal);expect(request.credentials).toBe('same-origin');expect(request.headers['X-SYNO-TOKEN']).toBe('caller-token')
|
|
12
|
-
})
|
|
13
|
-
test('native download sends the caller token in a POST body, never a URL',()=>{
|
|
14
|
-
let action='',method='',token=''
|
|
15
|
-
const submit=vi.spyOn(HTMLFormElement.prototype,'submit').mockImplementation(function(this:HTMLFormElement){action=this.action;method=this.method;token=(this.elements.namedItem('SynoToken') as HTMLInputElement).value})
|
|
16
|
-
const transfers=createFileTransfers({endpoint:'/cgi/api.cgi',token:()=> 'secret'})
|
|
17
|
-
transfers.download('/home/\u5831\u544a.txt')
|
|
18
|
-
expect(action).toContain('method=nas.files.download');expect(action).not.toContain('secret');expect(method).toBe('post');expect(token).toBe('secret')
|
|
19
|
-
expect(document.querySelector('form')).toBeNull();transfers.dispose();expect(document.querySelector('iframe')).toBeNull();submit.mockRestore()
|
|
20
|
-
})
|
|
21
|
-
test('lost upload response is uncertain and server DSM refusal stays actionable',async()=>{
|
|
22
|
-
vi.stubGlobal('fetch',vi.fn(async()=>{throw Error('offline')}))
|
|
23
|
-
const t=createFileTransfers({endpoint:'/cgi/api.cgi'}),file=new File(['a'],'a')
|
|
24
|
-
await expect(t.upload('/home',file,new AbortController().signal)).rejects.toEqual({code:'commit-uncertain'})
|
|
25
|
-
vi.stubGlobal('fetch',vi.fn(async()=>({json:async()=>({success:false,error:{code:'dsm_session_required'}})})))
|
|
26
|
-
await expect(t.upload('/home',file,new AbortController().signal)).rejects.toEqual({code:'dsm_session_required'})
|
|
27
|
-
})
|