@synopackageland/cli 0.4.1 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/dist/authorization-sdk.d.ts +5 -0
- package/dist/authorization-sdk.js +5 -0
- package/dist/build-spk/delete-app-data.d.ts +27 -7
- package/dist/build-spk/delete-app-data.js +35 -34
- package/dist/build-spk/dsm-arch.d.ts +6 -1
- package/dist/build-spk/dsm-arch.js +25 -1
- package/dist/build-spk/dsm-version.d.ts +14 -0
- package/dist/build-spk/dsm-version.js +47 -0
- package/dist/build-spk/gateway.d.ts +31 -0
- package/dist/build-spk/gateway.js +55 -0
- package/dist/build-spk/generator.d.ts +5 -0
- package/dist/build-spk/generator.js +103 -107
- package/dist/build-spk/install-wizard.d.ts +20 -0
- package/dist/build-spk/install-wizard.js +76 -0
- package/dist/build-spk/native-lifecycle.d.ts +5 -0
- package/dist/build-spk/native-lifecycle.js +12 -2
- package/dist/build-spk/resource-worker.d.ts +9 -4
- package/dist/build-spk/resource-worker.js +15 -6
- package/dist/build-spk/share-combobox.d.ts +3 -0
- package/dist/build-spk/share-combobox.js +27 -0
- package/dist/build-spk/uninstall-wizard.d.ts +14 -0
- package/dist/build-spk/uninstall-wizard.js +33 -0
- package/dist/build-spk/wizard-i18n.d.ts +18 -0
- package/dist/build-spk/wizard-i18n.js +38 -0
- package/dist/build-spk/wizard-messages.d.ts +388 -0
- package/dist/build-spk/wizard-messages.js +387 -0
- package/dist/cli.js +132 -32
- package/dist/compose/analyze.d.ts +20 -0
- package/dist/compose/analyze.js +75 -11
- package/dist/contract/validate.js +33 -1
- package/dist/contract/web-launch.d.ts +22 -0
- package/dist/contract/web-launch.js +37 -0
- package/dist/deploy/deploy.d.ts +3 -0
- package/dist/deploy/deploy.js +11 -2
- package/dist/error-registry.js +62 -3
- package/dist/host/dsm-port-profile.d.ts +1 -1
- package/dist/host/dsm-port-profile.js +1 -1
- package/dist/host/open-url.d.ts +2 -0
- package/dist/host/open-url.js +4 -1
- package/dist/images/pin.d.ts +52 -0
- package/dist/images/pin.js +249 -0
- package/dist/init.d.ts +27 -3
- package/dist/init.js +126 -16
- package/dist/inspect.d.ts +3 -0
- package/dist/inspect.js +15 -3
- package/dist/standalone/authorization-window.d.ts +2 -0
- package/dist/standalone/authorization-window.js +28 -0
- package/dist/standalone/authorization.d.ts +48 -0
- package/dist/standalone/authorization.js +116 -0
- package/dist/standalone/background.d.ts +21 -0
- package/dist/standalone/background.js +52 -0
- package/dist/standalone/binary.d.ts +1 -0
- package/dist/standalone/binary.js +1 -1
- package/dist/standalone/build.d.ts +2 -0
- package/dist/standalone/build.js +54 -10
- package/dist/standalone/dsm-window.js +10 -3
- package/dist/standalone/helper-inventory.d.ts +15 -0
- package/dist/standalone/helper-inventory.js +9 -0
- package/dist/standalone/helper.d.ts +1 -0
- package/dist/standalone/helper.js +29 -11
- package/dist/standalone/host-adapter.d.ts +1 -1
- package/dist/standalone/host-adapter.js +33 -15
- package/dist/standalone/host-file-navigation.d.ts +7 -0
- package/dist/standalone/host-file-navigation.js +172 -0
- package/dist/standalone/inspect-helper.js +21 -6
- package/dist/standalone/inspect-spk.d.ts +1 -1
- package/dist/standalone/inspect-spk.js +211 -7
- package/dist/standalone/job-diagnostics.d.ts +1 -0
- package/dist/standalone/job-diagnostics.js +49 -0
- package/dist/standalone/lifecycle-helper.d.ts +1 -1
- package/dist/standalone/lifecycle-helper.js +2 -2
- package/dist/standalone/lifecycle.d.ts +1 -1
- package/dist/standalone/lifecycle.js +14 -4
- package/dist/standalone/manifest.d.ts +15 -2
- package/dist/standalone/manifest.js +37 -6
- package/dist/standalone/native-layout.d.ts +74 -0
- package/dist/standalone/native-layout.js +318 -0
- package/dist/standalone/resource.d.ts +11 -0
- package/dist/standalone/resource.js +13 -0
- package/dist/standalone/root-ops.d.ts +2 -0
- package/dist/standalone/root-ops.js +10 -0
- package/dist/standalone/root-window.d.ts +3 -1
- package/dist/standalone/root-window.js +156 -38
- package/dist/standalone/shared-folder.d.ts +39 -0
- package/dist/standalone/shared-folder.js +141 -0
- package/dist/standalone/spk.d.ts +4 -0
- package/dist/standalone/spk.js +47 -3
- package/dist/standalone/worker-contract-json.d.ts +8 -0
- package/dist/standalone/worker-contract-json.js +141 -0
- package/dist/standalone/worker-contract.d.ts +189 -0
- package/dist/standalone/worker-contract.js +175 -0
- package/dist/standalone/worker-registry.d.ts +40 -0
- package/dist/standalone/worker-registry.js +167 -0
- package/dist/templates/_authorization/main.go +104 -0
- package/dist/templates/_authorization/main_test.go +35 -0
- package/dist/templates/_daemon/go.mod +2 -0
- package/dist/templates/_gateway/auth.go +101 -0
- package/dist/templates/_gateway/auth_test.go +216 -0
- package/dist/templates/_gateway/cgi.go +133 -0
- package/dist/templates/_gateway/cgi_test.go +156 -0
- package/dist/templates/_gateway/csrf.go +73 -0
- package/dist/templates/_gateway/csrf_test.go +155 -0
- package/dist/templates/_gateway/directory.go +108 -0
- package/dist/templates/_gateway/directory_test.go +202 -0
- package/dist/templates/_gateway/gateway.go +412 -0
- package/dist/templates/_gateway/gateway_test.go +676 -0
- package/dist/templates/_gateway/go.mod +3 -0
- package/dist/templates/_gateway/groups.go +66 -0
- package/dist/templates/_gateway/main.go +45 -0
- package/dist/templates/binary/synology-app.yaml +1 -1
- package/dist/templates/compose-import/compose.yaml +1 -1
- package/dist/templates/compose-import/synology-app.yaml +1 -1
- package/dist/templates/hello-files/compose.yaml +1 -1
- package/dist/templates/hello-files/synology-app.yaml +1 -1
- package/dist/templates/native-go/README.md +118 -5
- package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +3 -1
- package/dist/templates/native-go/backend/cmd/app/main.go +25 -6
- package/dist/templates/native-go/backend/cmd/app/sdk_main.go +62 -0
- package/dist/templates/native-go/backend/cmd/background-worker/main.go +38 -0
- package/dist/templates/native-go/backend/cmd/helper/main.go +27 -1
- package/dist/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
- package/dist/templates/native-go/backend/go.mod +5 -3
- package/dist/templates/native-go/backend/go.sum +4 -4
- package/dist/templates/native-go/backend/internal/api/registry.go +17 -6
- package/dist/templates/native-go/backend/internal/api/server.go +7 -1
- package/dist/templates/native-go/backend/internal/app/authorization_none.go +5 -0
- package/dist/templates/native-go/backend/internal/app/background.go +270 -0
- package/dist/templates/native-go/backend/internal/app/background_none.go +8 -0
- package/dist/templates/native-go/backend/internal/app/background_owner.go +59 -0
- package/dist/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
- package/dist/templates/native-go/backend/internal/app/background_schedule.go +74 -0
- package/dist/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
- package/dist/templates/native-go/backend/internal/app/background_test.go +346 -0
- package/dist/templates/native-go/backend/internal/app/integration_state.go +16 -0
- package/dist/templates/native-go/backend/internal/app/migrations.go +41 -0
- package/dist/templates/native-go/backend/internal/app/migrations_test.go +41 -0
- package/dist/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +8 -0
- package/dist/templates/native-go/backend/internal/app/routes.go +22 -5
- package/dist/templates/native-go/backend/internal/app/routes_test.go +20 -3
- package/dist/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
- package/dist/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
- package/dist/templates/native-go/backend/internal/app/sdk_routes.go +177 -0
- package/dist/templates/native-go/backend/internal/app/session_files.go +15 -0
- package/dist/templates/native-go/backend/internal/app/session_files_test.go +26 -0
- package/dist/templates/native-go/backend/internal/app/shared_folder.go +144 -0
- package/dist/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
- package/dist/templates/native-go/backend/internal/background/access.go +57 -0
- package/dist/templates/native-go/backend/internal/background/owner_test.go +126 -0
- package/dist/templates/native-go/backend/internal/background/runner.go +185 -0
- package/dist/templates/native-go/backend/internal/background/runner_test.go +209 -0
- package/dist/templates/native-go/backend/internal/background/schedule.go +300 -0
- package/dist/templates/native-go/backend/internal/background/schedule_test.go +335 -0
- package/dist/templates/native-go/backend/internal/background/store.go +807 -0
- package/dist/templates/native-go/backend/internal/background/store_test.go +407 -0
- package/dist/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
- package/dist/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
- package/dist/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
- package/dist/templates/native-go/backend/internal/filestation/client.go +251 -0
- package/dist/templates/native-go/backend/internal/filestation/client_test.go +155 -0
- package/dist/templates/native-go/backend/internal/filestation/doc.go +4 -0
- package/dist/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
- package/dist/templates/native-go/backend/internal/filestation/repository.go +207 -0
- package/dist/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
- package/dist/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
- package/dist/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
- package/dist/templates/native-go/backend/internal/filestation/service.go +254 -0
- package/dist/templates/native-go/backend/internal/filestation/service_test.go +94 -0
- package/dist/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
- package/dist/templates/native-go/backend/internal/filestation/write.go +72 -0
- package/dist/templates/native-go/backend/internal/filestation/write_test.go +123 -0
- package/dist/templates/native-go/backend/internal/helper/background_proof.go +163 -0
- package/dist/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
- package/dist/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
- package/dist/templates/native-go/backend/internal/helper/data_contract.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/data_protocol.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/data_protocol_test.go +1 -1
- package/dist/templates/native-go/backend/internal/helper/grant_authority.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/grant_authority_test.go +1 -1
- package/dist/templates/native-go/backend/internal/helper/grant_repository_linux.go +2 -1
- package/dist/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +4 -3
- package/dist/templates/native-go/backend/internal/helper/grant_snapshot.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
- package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
- package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
- package/dist/templates/native-go/backend/internal/helper/management.go +86 -0
- package/dist/templates/native-go/backend/internal/helper/observation.go +42 -2
- package/dist/templates/native-go/backend/internal/helper/observation_health_test.go +13 -1
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic.go +56 -10
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +6 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
- package/dist/templates/native-go/backend/internal/helper/process_linux.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/purge.go +115 -0
- package/dist/templates/native-go/backend/internal/helper/purge_test.go +59 -0
- package/dist/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
- package/dist/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
- package/dist/templates/native-go/backend/internal/helper/relaxed_invalidation.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/revoke.go +109 -0
- package/dist/templates/native-go/backend/internal/helper/revoke_test.go +121 -0
- package/dist/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +23 -4
- package/dist/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_server_linux.go +161 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
- package/dist/templates/native-go/backend/internal/helper/server_linux.go +14 -2
- package/dist/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
- package/dist/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
- package/dist/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
- package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
- package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
- package/dist/templates/native-go/backend/internal/helper/status.go +22 -13
- package/dist/templates/native-go/backend/internal/helper/status_test.go +45 -0
- package/dist/templates/native-go/backend/internal/helper/supervision.go +1 -1
- package/dist/templates/native-go/backend/internal/helper/supervisor_frame.go +3 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_linux.go +6 -2
- package/dist/templates/native-go/backend/internal/helper/unit_connection_test.go +22 -4
- package/dist/templates/native-go/backend/internal/helper/unit_linux.go +7 -3
- package/dist/templates/native-go/backend/internal/helper/unit_query_linux.go +5 -1
- package/dist/templates/native-go/backend/internal/helper/write_files_linux.go +7 -4
- package/dist/templates/native-go/backend/internal/helper/write_files_linux_test.go +26 -0
- package/dist/templates/native-go/dsm-package.yaml +2 -2
- package/dist/templates/native-go-authorization/backend/internal/app/authorization.go +298 -0
- package/dist/templates/native-go-authorization/backend/internal/app/authorization_test.go +96 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/AuthorizationGate.vue +89 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/de.json +36 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/en.json +36 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/es.json +36 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/fr.json +36 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/index.ts +15 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/it.json +36 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/ja.json +36 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/ko.json +36 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/zh-CN.json +36 -0
- package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/zh-TW.json +36 -0
- package/dist/templates/native-go-authorization/frontend/test/authorization-preview.html +14 -0
- package/dist/templates/native-go-authorization/frontend/test/authorization.test.ts +59 -0
- package/dist/templates/native-go-background/BACKGROUND.md +111 -0
- package/dist/templates/native-go-background/backend/internal/app/background_on.go +7 -0
- package/dist/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
- package/dist/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
- package/dist/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
- package/dist/templates/native-go-background/frontend/test/background.test.ts +179 -0
- package/dist/templates/native-go-integration/backend/internal/app/personal.go +2 -2
- package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
- package/dist/templates/native-go-vue/README.md +38 -7
- package/dist/templates/native-go-vue/frontend/DESIGN.md +15 -3
- package/dist/templates/native-go-vue/frontend/README-JOBS.md +75 -0
- package/dist/templates/native-go-vue/frontend/README-M2.md +64 -0
- package/dist/templates/native-go-vue/frontend/package-lock.json +5 -4
- package/dist/templates/native-go-vue/frontend/package.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/App.vue +39 -11
- package/dist/templates/native-go-vue/frontend/src/M2App.vue +57 -0
- package/dist/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
- package/dist/templates/native-go-vue/frontend/src/context.ts +3 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
- package/dist/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
- package/dist/templates/native-go-vue/frontend/src/m2-style.css +7 -0
- package/dist/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
- package/dist/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
- package/dist/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
- package/dist/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
- package/dist/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
- package/dist/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
- package/dist/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
- package/dist/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
- package/dist/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
- package/dist/templates/native-go-vue/frontend/src/style.css +2 -6
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +21 -0
- package/dist/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
- package/dist/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
- package/dist/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
- package/dist/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
- package/dist/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
- package/dist/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
- package/dist/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
- package/dist/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
- package/dist/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
- package/dist/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
- package/dist/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
- package/dist/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
- package/dist/templates/native-go-vue/frontend/vite.config.ts +2 -2
- package/dist/types.d.ts +1 -1
- package/dist/validate.js +6 -3
- package/package.json +5 -2
- package/schema/synology-app.schema.json +19 -0
- package/skills/reference/create.md +6 -2
- package/templates/_authorization/main.go +104 -0
- package/templates/_authorization/main_test.go +35 -0
- package/templates/_daemon/go.mod +2 -0
- package/templates/_gateway/auth.go +101 -0
- package/templates/_gateway/auth_test.go +216 -0
- package/templates/_gateway/cgi.go +133 -0
- package/templates/_gateway/cgi_test.go +156 -0
- package/templates/_gateway/csrf.go +73 -0
- package/templates/_gateway/csrf_test.go +155 -0
- package/templates/_gateway/directory.go +108 -0
- package/templates/_gateway/directory_test.go +202 -0
- package/templates/_gateway/gateway.go +412 -0
- package/templates/_gateway/gateway_test.go +676 -0
- package/templates/_gateway/go.mod +3 -0
- package/templates/_gateway/groups.go +66 -0
- package/templates/_gateway/main.go +45 -0
- package/templates/binary/synology-app.yaml +1 -1
- package/templates/compose-import/compose.yaml +1 -1
- package/templates/compose-import/synology-app.yaml +1 -1
- package/templates/hello-files/compose.yaml +1 -1
- package/templates/hello-files/synology-app.yaml +1 -1
- package/templates/native-go/README.md +118 -5
- package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +3 -1
- package/templates/native-go/backend/cmd/app/main.go +25 -6
- package/templates/native-go/backend/cmd/app/sdk_main.go +62 -0
- package/templates/native-go/backend/cmd/background-worker/main.go +38 -0
- package/templates/native-go/backend/cmd/helper/main.go +27 -1
- package/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
- package/templates/native-go/backend/go.mod +5 -3
- package/templates/native-go/backend/go.sum +4 -4
- package/templates/native-go/backend/internal/api/registry.go +17 -6
- package/templates/native-go/backend/internal/api/server.go +7 -1
- package/templates/native-go/backend/internal/app/authorization_none.go +5 -0
- package/templates/native-go/backend/internal/app/background.go +270 -0
- package/templates/native-go/backend/internal/app/background_none.go +8 -0
- package/templates/native-go/backend/internal/app/background_owner.go +59 -0
- package/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
- package/templates/native-go/backend/internal/app/background_schedule.go +74 -0
- package/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
- package/templates/native-go/backend/internal/app/background_test.go +346 -0
- package/templates/native-go/backend/internal/app/integration_state.go +16 -0
- package/templates/native-go/backend/internal/app/migrations.go +41 -0
- package/templates/native-go/backend/internal/app/migrations_test.go +41 -0
- package/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +8 -0
- package/templates/native-go/backend/internal/app/routes.go +22 -5
- package/templates/native-go/backend/internal/app/routes_test.go +20 -3
- package/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
- package/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
- package/templates/native-go/backend/internal/app/sdk_routes.go +177 -0
- package/templates/native-go/backend/internal/app/session_files.go +15 -0
- package/templates/native-go/backend/internal/app/session_files_test.go +26 -0
- package/templates/native-go/backend/internal/app/shared_folder.go +144 -0
- package/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
- package/templates/native-go/backend/internal/background/access.go +57 -0
- package/templates/native-go/backend/internal/background/owner_test.go +126 -0
- package/templates/native-go/backend/internal/background/runner.go +185 -0
- package/templates/native-go/backend/internal/background/runner_test.go +209 -0
- package/templates/native-go/backend/internal/background/schedule.go +300 -0
- package/templates/native-go/backend/internal/background/schedule_test.go +335 -0
- package/templates/native-go/backend/internal/background/store.go +807 -0
- package/templates/native-go/backend/internal/background/store_test.go +407 -0
- package/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
- package/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
- package/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
- package/templates/native-go/backend/internal/filestation/client.go +251 -0
- package/templates/native-go/backend/internal/filestation/client_test.go +155 -0
- package/templates/native-go/backend/internal/filestation/doc.go +4 -0
- package/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
- package/templates/native-go/backend/internal/filestation/repository.go +207 -0
- package/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
- package/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
- package/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
- package/templates/native-go/backend/internal/filestation/service.go +254 -0
- package/templates/native-go/backend/internal/filestation/service_test.go +94 -0
- package/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
- package/templates/native-go/backend/internal/filestation/write.go +72 -0
- package/templates/native-go/backend/internal/filestation/write_test.go +123 -0
- package/templates/native-go/backend/internal/helper/background_proof.go +163 -0
- package/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
- package/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
- package/templates/native-go/backend/internal/helper/data_contract.go +3 -0
- package/templates/native-go/backend/internal/helper/data_protocol.go +3 -0
- package/templates/native-go/backend/internal/helper/data_protocol_test.go +1 -1
- package/templates/native-go/backend/internal/helper/grant_authority.go +3 -0
- package/templates/native-go/backend/internal/helper/grant_authority_test.go +1 -1
- package/templates/native-go/backend/internal/helper/grant_repository_linux.go +2 -1
- package/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +4 -3
- package/templates/native-go/backend/internal/helper/grant_snapshot.go +3 -0
- package/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
- package/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
- package/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
- package/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
- package/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
- package/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
- package/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
- package/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
- package/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
- package/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
- package/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
- package/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
- package/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
- package/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
- package/templates/native-go/backend/internal/helper/management.go +86 -0
- package/templates/native-go/backend/internal/helper/observation.go +42 -2
- package/templates/native-go/backend/internal/helper/observation_health_test.go +13 -1
- package/templates/native-go/backend/internal/helper/observer_diagnostic.go +56 -10
- package/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +6 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
- package/templates/native-go/backend/internal/helper/process_linux.go +3 -0
- package/templates/native-go/backend/internal/helper/purge.go +115 -0
- package/templates/native-go/backend/internal/helper/purge_test.go +59 -0
- package/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
- package/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
- package/templates/native-go/backend/internal/helper/relaxed_invalidation.go +3 -0
- package/templates/native-go/backend/internal/helper/revoke.go +109 -0
- package/templates/native-go/backend/internal/helper/revoke_test.go +121 -0
- package/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +23 -4
- package/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
- package/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
- package/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
- package/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
- package/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
- package/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
- package/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
- package/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
- package/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
- package/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
- package/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
- package/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
- package/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
- package/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
- package/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
- package/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
- package/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
- package/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
- package/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
- package/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
- package/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
- package/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
- package/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
- package/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
- package/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
- package/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
- package/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
- package/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
- package/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
- package/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
- package/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
- package/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
- package/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
- package/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
- package/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
- package/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
- package/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
- package/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
- package/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
- package/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
- package/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
- package/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
- package/templates/native-go/backend/internal/helper/sdk_server_linux.go +161 -0
- package/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
- package/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
- package/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
- package/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
- package/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
- package/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
- package/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
- package/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
- package/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
- package/templates/native-go/backend/internal/helper/server_linux.go +14 -2
- package/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
- package/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
- package/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
- package/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
- package/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
- package/templates/native-go/backend/internal/helper/status.go +22 -13
- package/templates/native-go/backend/internal/helper/status_test.go +45 -0
- package/templates/native-go/backend/internal/helper/supervision.go +1 -1
- package/templates/native-go/backend/internal/helper/supervisor_frame.go +3 -0
- package/templates/native-go/backend/internal/helper/supervisor_linux.go +6 -2
- package/templates/native-go/backend/internal/helper/unit_connection_test.go +22 -4
- package/templates/native-go/backend/internal/helper/unit_linux.go +7 -3
- package/templates/native-go/backend/internal/helper/unit_query_linux.go +5 -1
- package/templates/native-go/backend/internal/helper/write_files_linux.go +7 -4
- package/templates/native-go/backend/internal/helper/write_files_linux_test.go +26 -0
- package/templates/native-go/dsm-package.yaml +2 -2
- package/templates/native-go-authorization/backend/internal/app/authorization.go +298 -0
- package/templates/native-go-authorization/backend/internal/app/authorization_test.go +96 -0
- package/templates/native-go-authorization/frontend/src/authorization/AuthorizationGate.vue +89 -0
- package/templates/native-go-authorization/frontend/src/authorization/i18n/de.json +36 -0
- package/templates/native-go-authorization/frontend/src/authorization/i18n/en.json +36 -0
- package/templates/native-go-authorization/frontend/src/authorization/i18n/es.json +36 -0
- package/templates/native-go-authorization/frontend/src/authorization/i18n/fr.json +36 -0
- package/templates/native-go-authorization/frontend/src/authorization/i18n/index.ts +15 -0
- package/templates/native-go-authorization/frontend/src/authorization/i18n/it.json +36 -0
- package/templates/native-go-authorization/frontend/src/authorization/i18n/ja.json +36 -0
- package/templates/native-go-authorization/frontend/src/authorization/i18n/ko.json +36 -0
- package/templates/native-go-authorization/frontend/src/authorization/i18n/zh-CN.json +36 -0
- package/templates/native-go-authorization/frontend/src/authorization/i18n/zh-TW.json +36 -0
- package/templates/native-go-authorization/frontend/test/authorization-preview.html +14 -0
- package/templates/native-go-authorization/frontend/test/authorization.test.ts +59 -0
- package/templates/native-go-background/BACKGROUND.md +111 -0
- package/templates/native-go-background/backend/internal/app/background_on.go +7 -0
- package/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
- package/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
- package/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
- package/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
- package/templates/native-go-background/frontend/test/background.test.ts +179 -0
- package/templates/native-go-integration/backend/internal/app/personal.go +2 -2
- package/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
- package/templates/native-go-vue/README.md +38 -7
- package/templates/native-go-vue/frontend/DESIGN.md +15 -3
- package/templates/native-go-vue/frontend/README-JOBS.md +75 -0
- package/templates/native-go-vue/frontend/README-M2.md +64 -0
- package/templates/native-go-vue/frontend/package-lock.json +5 -4
- package/templates/native-go-vue/frontend/package.json +1 -1
- package/templates/native-go-vue/frontend/src/App.vue +39 -11
- package/templates/native-go-vue/frontend/src/M2App.vue +57 -0
- package/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
- package/templates/native-go-vue/frontend/src/context.ts +3 -0
- package/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
- package/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
- package/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
- package/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
- package/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
- package/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
- package/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
- package/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
- package/templates/native-go-vue/frontend/src/m2-style.css +7 -0
- package/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
- package/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
- package/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
- package/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
- package/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
- package/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
- package/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
- package/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
- package/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
- package/templates/native-go-vue/frontend/src/style.css +2 -6
- package/templates/native-go-vue/frontend/test/apps.test.ts +21 -0
- package/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
- package/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
- package/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
- package/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
- package/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
- package/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
- package/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
- package/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
- package/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
- package/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
- package/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
- package/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
- package/templates/native-go-vue/frontend/vite.config.ts +2 -2
- package/dist/templates/hello-web/compose.yaml +0 -21
- package/dist/templates/hello-web/html/app.js +0 -1
- package/dist/templates/hello-web/html/index.html +0 -13
- package/dist/templates/hello-web/synology-app.yaml +0 -13
- package/dist/templates/hello-web-page/compose.yaml +0 -21
- package/dist/templates/hello-web-page/html/app.js +0 -1
- package/dist/templates/hello-web-page/html/index.html +0 -13
- package/dist/templates/hello-web-page/synology-app.yaml +0 -13
- package/templates/hello-web/compose.yaml +0 -21
- package/templates/hello-web/html/app.js +0 -1
- package/templates/hello-web/html/index.html +0 -13
- package/templates/hello-web/synology-app.yaml +0 -13
- package/templates/hello-web-page/compose.yaml +0 -21
- package/templates/hello-web-page/html/app.js +0 -1
- package/templates/hello-web-page/html/index.html +0 -13
- package/templates/hello-web-page/synology-app.yaml +0 -13
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "NAS 폴더 — File Station",
|
|
3
|
+
"ownPermissions": "자신의 DSM 세션과 현재 File Station 권한으로 작업합니다.",
|
|
4
|
+
"consent": "저장된 선택은 동의 기록이며 추가 DSM 권한을 부여하지 않습니다.",
|
|
5
|
+
"writable": "폴더 생성 및 파일 업로드 허용 (DSM 권한 필요)",
|
|
6
|
+
"readOnly": "읽기 전용",
|
|
7
|
+
"unsupported": "백그라운드 작업, 오프라인 접근, 스트리밍 및 원자적 게시를 지원하지 않습니다.",
|
|
8
|
+
"localOnly": "실험 기능: 로컬 테스트만 완료했으며 DSM 호환성은 검증되지 않았습니다.",
|
|
9
|
+
"identityRisk": "같은 사용자 이름과 UID로 계정을 다시 만들면 기존 선택이 유지될 수 있습니다.",
|
|
10
|
+
"pathRisk": "선택은 경로를 사용하며 inode 고정이나 심볼릭 링크 및 이름 변경 제한을 제공하지 않습니다.",
|
|
11
|
+
"choose": "폴더 선택",
|
|
12
|
+
"confirm": "선택 확인",
|
|
13
|
+
"emptySelections": "저장된 폴더가 없습니다. 폴더를 선택하세요.",
|
|
14
|
+
"refresh": "폴더 새로 고침",
|
|
15
|
+
"openFiles": "파일 탐색",
|
|
16
|
+
"revoke": "철회",
|
|
17
|
+
"confirmRevoke": "철회 확인",
|
|
18
|
+
"revokeWarning": "선택 철회는 새 작업을 거부합니다. 이미 기록된 데이터는 남으며 요청 취소가 작업 중단을 보장하지 않습니다.",
|
|
19
|
+
"loading": "불러오는 중…",
|
|
20
|
+
"emptyFolder": "빈 폴더입니다.",
|
|
21
|
+
"roots": "폴더",
|
|
22
|
+
"back": "뒤로",
|
|
23
|
+
"select": "{name} 선택",
|
|
24
|
+
"open": "{name} 열기",
|
|
25
|
+
"selected": "선택됨: {name}",
|
|
26
|
+
"cancel": "취소",
|
|
27
|
+
"close": "닫기",
|
|
28
|
+
"loadMore": "더 불러오기",
|
|
29
|
+
"inspect": "정보 보기",
|
|
30
|
+
"read": "파일 읽기",
|
|
31
|
+
"readComplete": "파일 읽기가 완료되었습니다. 아래에서 다운로드하세요.",
|
|
32
|
+
"create": "폴더 생성",
|
|
33
|
+
"folderName": "새 폴더 이름",
|
|
34
|
+
"upload": "업로드",
|
|
35
|
+
"uploadFile": "로컬 파일 선택",
|
|
36
|
+
"limit": "파일당 읽기 및 업로드 제한: 512 KiB. 새 파일을 생성하며 덮어쓰지 않습니다.",
|
|
37
|
+
"selectionAdded": "폴더 선택을 저장했습니다.",
|
|
38
|
+
"revokedNotice": "선택을 철회했습니다.",
|
|
39
|
+
"created": "폴더를 생성했습니다.",
|
|
40
|
+
"uploaded": "파일을 업로드했습니다.",
|
|
41
|
+
"accountChanged": "계정 또는 패키지가 변경되었습니다. 창을 닫고 다시 여세요.",
|
|
42
|
+
"errorSession": "DSM 세션이 만료되었습니다. DSM에 다시 로그인한 후 폴더를 새로 고치세요.",
|
|
43
|
+
"errorDenied": "현재 DSM 권한 또는 선택으로 접근이 거부되었습니다. 다른 폴더를 선택하세요.",
|
|
44
|
+
"errorNotFound": "파일 또는 폴더가 없습니다. 목록을 새로 고치세요.",
|
|
45
|
+
"errorConflict": "같은 이름의 파일 또는 폴더가 있습니다. 다른 이름을 사용하세요.",
|
|
46
|
+
"errorUncertain": "작업이 완료되었을 수 있습니다. 다시 제출하기 전에 선택 또는 대상 폴더를 새로 고쳐 결과를 확인하세요.",
|
|
47
|
+
"errorInvalid": "폴더, 파일 이름 또는 요청이 잘못되었습니다. 입력을 확인하세요.",
|
|
48
|
+
"errorUnavailable": "File Station을 사용할 수 없거나 패키지에 세션 adapter가 없습니다. 나중에 새로 고치세요.",
|
|
49
|
+
"errorLimit": "512 KiB 파일 제한 또는 서비스 제한을 초과했습니다. 더 작은 파일을 선택하세요.",
|
|
50
|
+
"errorCanceled": "요청이 취소되었습니다. 새로 고친 후 계속하세요.",
|
|
51
|
+
"errorTimeout": "요청 시간이 초과되었습니다. 목록을 새로 고치세요.",
|
|
52
|
+
"metadata": "정보",
|
|
53
|
+
"fileKind": "파일",
|
|
54
|
+
"directoryKind": "폴더",
|
|
55
|
+
"download": "파일 다운로드"
|
|
56
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "NAS 文件夹 — File Station",
|
|
3
|
+
"ownPermissions": "操作使用你自己的 DSM 会话与 File Station 实时权限。",
|
|
4
|
+
"consent": "保存选择仅记录你的同意,不会授予额外 DSM 权限。",
|
|
5
|
+
"writable": "允许创建文件夹和上传文件(仍须符合 DSM 权限)",
|
|
6
|
+
"readOnly": "只读",
|
|
7
|
+
"unsupported": "不支持后台任务、离线访问、流式传输和原子发布。",
|
|
8
|
+
"localOnly": "实验功能:仅通过本地测试,DSM 兼容性尚未验证。",
|
|
9
|
+
"identityRisk": "使用相同用户名和 UID 重建账号,可能保留已有选择。",
|
|
10
|
+
"pathRisk": "选择按路径操作,不固定 inode,也不限制符号链接和重命名。",
|
|
11
|
+
"choose": "选择文件夹",
|
|
12
|
+
"confirm": "确认选择",
|
|
13
|
+
"emptySelections": "尚未保存文件夹。请选择文件夹开始。",
|
|
14
|
+
"refresh": "刷新文件夹",
|
|
15
|
+
"openFiles": "浏览文件",
|
|
16
|
+
"revoke": "撤销",
|
|
17
|
+
"confirmRevoke": "确认撤销",
|
|
18
|
+
"revokeWarning": "撤销选择会拒绝新操作。已写入的数据仍会保留;取消请求不代表操作已停止。",
|
|
19
|
+
"loading": "正在加载…",
|
|
20
|
+
"emptyFolder": "此文件夹为空。",
|
|
21
|
+
"roots": "文件夹",
|
|
22
|
+
"back": "返回",
|
|
23
|
+
"select": "选择 {name}",
|
|
24
|
+
"open": "打开 {name}",
|
|
25
|
+
"selected": "已选择:{name}",
|
|
26
|
+
"cancel": "取消",
|
|
27
|
+
"close": "关闭",
|
|
28
|
+
"loadMore": "加载更多",
|
|
29
|
+
"inspect": "查看信息",
|
|
30
|
+
"read": "读取文件",
|
|
31
|
+
"readComplete": "文件读取完成。可在下方下载内容。",
|
|
32
|
+
"create": "创建文件夹",
|
|
33
|
+
"folderName": "新文件夹名称",
|
|
34
|
+
"upload": "上传",
|
|
35
|
+
"uploadFile": "选择本地文件",
|
|
36
|
+
"limit": "单文件读取和上传上限:512 KiB。上传会创建新文件,不会覆盖。",
|
|
37
|
+
"selectionAdded": "已保存文件夹选择。",
|
|
38
|
+
"revokedNotice": "已撤销选择。",
|
|
39
|
+
"created": "已创建文件夹。",
|
|
40
|
+
"uploaded": "已上传文件。",
|
|
41
|
+
"accountChanged": "账号或套件已变更。请关闭并重新打开窗口后继续。",
|
|
42
|
+
"errorSession": "DSM 会话已失效。请重新登录 DSM,再刷新文件夹。",
|
|
43
|
+
"errorDenied": "当前 DSM 权限或选择拒绝访问。请选择其他文件夹。",
|
|
44
|
+
"errorNotFound": "文件或文件夹已不存在。请刷新列表。",
|
|
45
|
+
"errorConflict": "已有同名文件或文件夹。请使用其他名称。",
|
|
46
|
+
"errorUncertain": "操作可能已完成。请刷新选择或目标文件夹并确认结果,再决定是否重新提交。",
|
|
47
|
+
"errorInvalid": "文件夹、文件名或请求无效。请检查输入后重试。",
|
|
48
|
+
"errorUnavailable": "File Station 不可用,或此套件未提供会话 adapter。请稍后刷新。",
|
|
49
|
+
"errorLimit": "请求超过单文件 512 KiB 或其他服务限制。请选择较小的文件。",
|
|
50
|
+
"errorCanceled": "请求已取消。请刷新后继续。",
|
|
51
|
+
"errorTimeout": "请求超时。请刷新列表后继续。",
|
|
52
|
+
"metadata": "信息",
|
|
53
|
+
"fileKind": "文件",
|
|
54
|
+
"directoryKind": "文件夹",
|
|
55
|
+
"download": "下载文件"
|
|
56
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "NAS 資料夾 — File Station",
|
|
3
|
+
"ownPermissions": "操作使用你自己的 DSM 工作階段與 File Station 即時權限。",
|
|
4
|
+
"consent": "儲存選取僅記錄你的同意,不會授予額外 DSM 權限。",
|
|
5
|
+
"writable": "允許建立資料夾與上傳檔案(仍須符合 DSM 權限)",
|
|
6
|
+
"readOnly": "唯讀",
|
|
7
|
+
"unsupported": "不支援背景工作、離線存取、串流與原子發布。",
|
|
8
|
+
"localOnly": "實驗功能:僅通過本機測試,DSM 相容性尚未驗證。",
|
|
9
|
+
"identityRisk": "以相同使用者名稱與 UID 重建帳號,可能保留既有選取。",
|
|
10
|
+
"pathRisk": "選取依路徑操作,不固定 inode,也不限制符號連結與重新命名。",
|
|
11
|
+
"choose": "選擇資料夾",
|
|
12
|
+
"confirm": "確認選取",
|
|
13
|
+
"emptySelections": "尚未儲存資料夾。請選擇資料夾開始。",
|
|
14
|
+
"refresh": "重新整理資料夾",
|
|
15
|
+
"openFiles": "瀏覽檔案",
|
|
16
|
+
"revoke": "撤銷",
|
|
17
|
+
"confirmRevoke": "確認撤銷",
|
|
18
|
+
"revokeWarning": "撤銷選取會拒絕新操作。已寫入資料仍會保留;取消請求不代表操作已停止。",
|
|
19
|
+
"loading": "載入中…",
|
|
20
|
+
"emptyFolder": "此資料夾是空的。",
|
|
21
|
+
"roots": "資料夾",
|
|
22
|
+
"back": "返回",
|
|
23
|
+
"select": "選取 {name}",
|
|
24
|
+
"open": "開啟 {name}",
|
|
25
|
+
"selected": "已選取:{name}",
|
|
26
|
+
"cancel": "取消",
|
|
27
|
+
"close": "關閉",
|
|
28
|
+
"loadMore": "載入更多",
|
|
29
|
+
"inspect": "檢視資訊",
|
|
30
|
+
"read": "讀取檔案",
|
|
31
|
+
"readComplete": "檔案讀取完成。可在下方下載內容。",
|
|
32
|
+
"create": "建立資料夾",
|
|
33
|
+
"folderName": "新資料夾名稱",
|
|
34
|
+
"upload": "上傳",
|
|
35
|
+
"uploadFile": "選擇本機檔案",
|
|
36
|
+
"limit": "單檔讀取與上傳上限:512 KiB。上傳會建立新檔案,不會覆寫。",
|
|
37
|
+
"selectionAdded": "已儲存資料夾選取。",
|
|
38
|
+
"revokedNotice": "已撤銷選取。",
|
|
39
|
+
"created": "已建立資料夾。",
|
|
40
|
+
"uploaded": "已上傳檔案。",
|
|
41
|
+
"accountChanged": "帳號或套件已變更。請關閉並重新開啟視窗後繼續。",
|
|
42
|
+
"errorSession": "DSM 工作階段已失效。請重新登入 DSM,再重新整理資料夾。",
|
|
43
|
+
"errorDenied": "目前的 DSM 權限或選取拒絕存取。請選擇其他資料夾。",
|
|
44
|
+
"errorNotFound": "檔案或資料夾已不存在。請重新整理清單。",
|
|
45
|
+
"errorConflict": "已有同名檔案或資料夾。請使用其他名稱。",
|
|
46
|
+
"errorUncertain": "操作可能已完成。請重新整理選取或目的資料夾並確認結果,再決定是否重新送出。",
|
|
47
|
+
"errorInvalid": "資料夾、檔名或請求無效。請檢查輸入後重試。",
|
|
48
|
+
"errorUnavailable": "File Station 無法使用,或此套件未提供工作階段 adapter。請稍後重新整理。",
|
|
49
|
+
"errorLimit": "請求超過單檔 512 KiB 或其他服務限制。請選擇較小的檔案。",
|
|
50
|
+
"errorCanceled": "請求已取消。請重新整理後繼續。",
|
|
51
|
+
"errorTimeout": "請求逾時。請重新整理清單後繼續。",
|
|
52
|
+
"metadata": "資訊",
|
|
53
|
+
"fileKind": "檔案",
|
|
54
|
+
"directoryKind": "資料夾",
|
|
55
|
+
"download": "下載檔案"
|
|
56
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type {InjectionKey} from 'vue'
|
|
2
|
+
|
|
3
|
+
// File Station session selections are consent, not native helper grants.
|
|
4
|
+
// Paths are display/routing data. Only the backend's authenticated DSM session
|
|
5
|
+
// and current File Station ACL authorize an operation; writable is consent only.
|
|
6
|
+
export const M2_MAX_BYTES = 512 * 1024
|
|
7
|
+
export const M2_PAGE_SIZE = 100
|
|
8
|
+
export type M2Code = 'session_required' | 'auth_unavailable' | 'denied' | 'not_found' |
|
|
9
|
+
'conflict' | 'invalid-request' | 'unavailable' | 'unknown_method' | 'unsupported' |
|
|
10
|
+
'commit-uncertain' | 'limit-exceeded' | 'canceled' | 'timeout'
|
|
11
|
+
export interface M2Selection {grantId:string; folder:string; writable:boolean}
|
|
12
|
+
export interface M2Entry {name:string; path:string; isDir:boolean; bytes?:number}
|
|
13
|
+
// File picks consent to their containing folder, with one relative filename.
|
|
14
|
+
export interface M2JobSource {selection:M2Selection;entry:M2Entry;segments:readonly string[]}
|
|
15
|
+
export interface M2Page {entries:M2Entry[]; total:number; offset:number; nextOffset?:number}
|
|
16
|
+
export interface M2Session {
|
|
17
|
+
mode:'filestation-session'; interactive:'session-required'; background:'unavailable'; validation:'local-only'
|
|
18
|
+
}
|
|
19
|
+
export interface M2Provider {
|
|
20
|
+
readonly mode:'filestation-session'
|
|
21
|
+
status(signal:AbortSignal):Promise<M2Session>
|
|
22
|
+
discovery(folder:string|undefined,offset:number,signal:AbortSignal):Promise<M2Page>
|
|
23
|
+
confirm(folder:string,writable:boolean,signal:AbortSignal):Promise<M2Selection>
|
|
24
|
+
selections(signal:AbortSignal):Promise<M2Selection[]>
|
|
25
|
+
revoke(grantId:string,signal:AbortSignal):Promise<void>
|
|
26
|
+
list(grantId:string,relative:string,offset:number,signal:AbortSignal):Promise<M2Page>
|
|
27
|
+
stat(grantId:string,relative:string,signal:AbortSignal):Promise<M2Entry>
|
|
28
|
+
read(grantId:string,relative:string,signal:AbortSignal):Promise<Uint8Array>
|
|
29
|
+
create(grantId:string,relative:string,name:string,signal:AbortSignal):Promise<void>
|
|
30
|
+
upload(grantId:string,relative:string,name:string,data:Uint8Array,signal:AbortSignal):Promise<void>
|
|
31
|
+
dispose():void
|
|
32
|
+
}
|
|
33
|
+
export const M2ProviderKey:InjectionKey<M2Provider> = Symbol('m2-filestation-session')
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type {UiLocale} from '@synopackageland/ui'
|
|
2
|
+
import en from './i18n/m2/en.json'
|
|
3
|
+
import zhTW from './i18n/m2/zh-TW.json'
|
|
4
|
+
import zhCN from './i18n/m2/zh-CN.json'
|
|
5
|
+
import ja from './i18n/m2/ja.json'
|
|
6
|
+
import ko from './i18n/m2/ko.json'
|
|
7
|
+
import de from './i18n/m2/de.json'
|
|
8
|
+
import fr from './i18n/m2/fr.json'
|
|
9
|
+
import es from './i18n/m2/es.json'
|
|
10
|
+
import it from './i18n/m2/it.json'
|
|
11
|
+
export type M2Copy=typeof en
|
|
12
|
+
export const m2Catalogs:Record<string,M2Copy>={en,'zh-TW':zhTW,'zh-CN':zhCN,ja,ko,de,fr,es,it}
|
|
13
|
+
const aliases:Record<string,string>={enu:'en',cht:'zh-TW',chs:'zh-CN',jpn:'ja',krn:'ko',ger:'de',fre:'fr',spn:'es',ita:'it'}
|
|
14
|
+
/** The built-in UI locale (shared by these catalogs and the UI's own text) for a DSM or BCP-47 language tag. */
|
|
15
|
+
export function uiLocale(locale:string):UiLocale{
|
|
16
|
+
const normalized=locale.replaceAll('_','-')
|
|
17
|
+
return ([aliases[normalized]??normalized,normalized.split('-')[0]!].find(key=>key in m2Catalogs)??'en') as UiLocale
|
|
18
|
+
}
|
|
19
|
+
export function m2Copy(locale:string):M2Copy{return m2Catalogs[uiLocale(locale)]!}
|
|
20
|
+
export function m2ErrorCopy(error:unknown,copy:M2Copy):string{
|
|
21
|
+
const code=(error as {code?:string})?.code
|
|
22
|
+
const keys:Record<string,keyof M2Copy>={session_required:'errorSession',denied:'errorDenied',not_found:'errorNotFound',conflict:'errorConflict','commit-uncertain':'errorUncertain','invalid-request':'errorInvalid','limit-exceeded':'errorLimit',canceled:'errorCanceled',timeout:'errorTimeout',unsupported:'unsupported'}
|
|
23
|
+
return copy[keys[code??'']??'errorUnavailable']
|
|
24
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type {Context} from '../context'
|
|
2
|
+
import {M2_MAX_BYTES,M2_PAGE_SIZE,type M2Code,type M2Entry,type M2Page,type M2Provider,type M2Selection,type M2Session} from './m2-contract'
|
|
3
|
+
|
|
4
|
+
const codes=new Set<M2Code>(['session_required','auth_unavailable','denied','not_found','conflict','invalid-request','unavailable','unknown_method','unsupported','commit-uncertain','limit-exceeded','canceled','timeout'])
|
|
5
|
+
function refuse(code:M2Code='invalid-request'):never{throw {code}}
|
|
6
|
+
const record=(value:unknown):Record<string,unknown>=>{
|
|
7
|
+
if(!value||typeof value!=='object'||Array.isArray(value))return refuse('unavailable')
|
|
8
|
+
return value as Record<string,unknown>
|
|
9
|
+
}
|
|
10
|
+
const length=(s:string)=>new TextEncoder().encode(s).length
|
|
11
|
+
const name=(s:unknown):s is string=>typeof s==='string'&&length(s)<=255&&s!==''&&s!=='.'&&s!=='..'&&!/[/\\\x00\r\n,"]/.test(s)
|
|
12
|
+
const path=(s:unknown):s is string=>typeof s==='string'&&s.startsWith('/')&&length(s)<=4096&&s.slice(1).split('/').every(name)
|
|
13
|
+
const relative=(s:string)=>s===''||(!s.startsWith('/')&&s.split('/').every(name))
|
|
14
|
+
const id=(s:unknown):s is string=>typeof s==='string'&&/^[a-fA-F0-9]{64}$/.test(s)
|
|
15
|
+
const integer=(v:unknown):v is number=>typeof v==='number'&&Number.isSafeInteger(v)&&v>=0
|
|
16
|
+
function selection(value:unknown):M2Selection{
|
|
17
|
+
const v=record(value)
|
|
18
|
+
if(!id(v.grantId)||!path(v.folder)||typeof v.writable!=='boolean')refuse('unavailable')
|
|
19
|
+
return {grantId:v.grantId,folder:v.folder,writable:v.writable}
|
|
20
|
+
}
|
|
21
|
+
function entry(value:unknown):M2Entry{
|
|
22
|
+
const v=record(value),additional=record(v.additional??{})
|
|
23
|
+
if(!name(v.name)||!path(v.path)||typeof v.isdir!=='boolean'||(additional.size!==undefined&&!integer(additional.size)))refuse('unavailable')
|
|
24
|
+
return {name:v.name,path:v.path,isDir:v.isdir,...(additional.size===undefined?{}:{bytes:additional.size as number})}
|
|
25
|
+
}
|
|
26
|
+
function page(value:unknown,offset:number):M2Page{
|
|
27
|
+
const v=record(value)
|
|
28
|
+
if(!('files' in v)&&!('shares' in v))refuse('unavailable')
|
|
29
|
+
const raw=v.shares??v.files??[]
|
|
30
|
+
if(!Array.isArray(raw)||raw.length>M2_PAGE_SIZE||!integer(v.total)||v.offset!==offset||offset+raw.length>v.total)refuse('unavailable')
|
|
31
|
+
const entries=raw.map(entry),next=offset+entries.length
|
|
32
|
+
return {entries,total:v.total,offset,...(entries.length&&next<v.total&&next<=1000000?{nextOffset:next}:{})}
|
|
33
|
+
}
|
|
34
|
+
function encode(data:Uint8Array):string{
|
|
35
|
+
let raw=''
|
|
36
|
+
for(const byte of data)raw+=String.fromCharCode(byte)
|
|
37
|
+
return btoa(raw)
|
|
38
|
+
}
|
|
39
|
+
function bytes(value:unknown):Uint8Array{
|
|
40
|
+
const v=record(value)
|
|
41
|
+
if(!integer(v.bytes)||v.bytes>M2_MAX_BYTES||typeof v.data!=='string'||v.data.length>4*Math.ceil(M2_MAX_BYTES/3)||! /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(v.data))refuse('unavailable')
|
|
42
|
+
const raw=atob(v.data)
|
|
43
|
+
if(raw.length!==v.bytes||btoa(raw)!==v.data)refuse('unavailable')
|
|
44
|
+
return Uint8Array.from(raw,c=>c.charCodeAt(0))
|
|
45
|
+
}
|
|
46
|
+
export function createM2Provider(ctx:Pick<Context,'call'>):M2Provider{
|
|
47
|
+
let disposed=false
|
|
48
|
+
const life=new AbortController()
|
|
49
|
+
async function request(method:string,args:Record<string,unknown>,signal:AbortSignal,mutates=false):Promise<unknown>{
|
|
50
|
+
if(disposed||signal.aborted)refuse('canceled')
|
|
51
|
+
let cleanup=()=>{}
|
|
52
|
+
const stop=new Promise<never>((_,reject)=>{
|
|
53
|
+
const abort=()=>reject({code:mutates?'commit-uncertain':'canceled'})
|
|
54
|
+
const timer=setTimeout(()=>reject({code:mutates?'commit-uncertain':'timeout'}),22000)
|
|
55
|
+
signal.addEventListener('abort',abort,{once:true});life.signal.addEventListener('abort',abort,{once:true})
|
|
56
|
+
cleanup=()=>{clearTimeout(timer);signal.removeEventListener('abort',abort);life.signal.removeEventListener('abort',abort)}
|
|
57
|
+
})
|
|
58
|
+
try{
|
|
59
|
+
// ctx.call retains DSM's existing same-origin session and CSRF transport.
|
|
60
|
+
// It has no abort API: canceling local observation cannot prove rollback.
|
|
61
|
+
const value=await Promise.race([ctx.call(method,args),stop])
|
|
62
|
+
if(disposed||signal.aborted)refuse(mutates?'commit-uncertain':'canceled')
|
|
63
|
+
return value
|
|
64
|
+
}catch(e){
|
|
65
|
+
const code=(e as {code?:M2Code})?.code
|
|
66
|
+
if(mutates&&(!code||!codes.has(code)||['timeout','canceled'].includes(code)))refuse('commit-uncertain')
|
|
67
|
+
throw {code:code&&codes.has(code)?code:'unavailable'}
|
|
68
|
+
}finally{cleanup()}
|
|
69
|
+
}
|
|
70
|
+
function fileArgs(grantId:string,rel:string){if(!id(grantId)||!relative(rel))refuse();return {grantId,relative:rel}}
|
|
71
|
+
function offsetArgs(offset:number){if(!integer(offset)||offset>1000000)refuse();return {offset}}
|
|
72
|
+
function dispose(){if(disposed)return;disposed=true;life.abort();if(typeof window!=='undefined')window.removeEventListener('pagehide',dispose)}
|
|
73
|
+
if(typeof window!=='undefined')window.addEventListener('pagehide',dispose)
|
|
74
|
+
return {
|
|
75
|
+
mode:'filestation-session',
|
|
76
|
+
async status(signal){
|
|
77
|
+
const v=record(await request('nas.session.status',{},signal))
|
|
78
|
+
if(v.mode!=='filestation-session'||v.interactive!=='session-required'||v.background!=='unavailable'||v.validation!=='local-only')refuse('unavailable')
|
|
79
|
+
return {mode:v.mode,interactive:v.interactive,background:v.background,validation:v.validation} as M2Session
|
|
80
|
+
},
|
|
81
|
+
async discovery(folder,offset,signal){if(folder!==undefined&&!path(folder))refuse();return page(await request('nas.discovery',{...(folder?{folder}:{}),...offsetArgs(offset)},signal),offset)},
|
|
82
|
+
async confirm(folder,writable,signal){
|
|
83
|
+
if(!path(folder)||typeof writable!=='boolean')refuse()
|
|
84
|
+
const value=await request('nas.grants.confirm',{folder,writable},signal,true)
|
|
85
|
+
try{const s=selection(value);if(s.folder!==folder||s.writable!==writable)refuse();return s}catch{refuse('commit-uncertain')}
|
|
86
|
+
},
|
|
87
|
+
async selections(signal){const values=await request('nas.grants.list',{},signal);if(!Array.isArray(values)||values.length>256)refuse('unavailable');return values.map(selection)},
|
|
88
|
+
async revoke(grantId,signal){if(!id(grantId))refuse();const result=await request('nas.grants.revoke',{grantId},signal,true);if(!result||typeof result!=='object'||(result as {revoked?:unknown}).revoked!==true)refuse('commit-uncertain')},
|
|
89
|
+
async list(grantId,rel,offset,signal){return page(await request('nas.files.list',{...fileArgs(grantId,rel),...offsetArgs(offset)},signal),offset)},
|
|
90
|
+
async stat(grantId,rel,signal){return entry(await request('nas.files.stat',fileArgs(grantId,rel),signal))},
|
|
91
|
+
async read(grantId,rel,signal){if(!rel)refuse();return bytes(await request('nas.files.read',fileArgs(grantId,rel),signal))},
|
|
92
|
+
async create(grantId,rel,n,signal){
|
|
93
|
+
if(!name(n))refuse()
|
|
94
|
+
const v=await request('nas.files.create',{...fileArgs(grantId,rel),name:n},signal,true)
|
|
95
|
+
if(!v||typeof v!=='object'||(v as {created?:unknown}).created!==true)refuse('commit-uncertain')
|
|
96
|
+
},
|
|
97
|
+
async upload(grantId,rel,n,data,signal){
|
|
98
|
+
if(!name(n)||!(data instanceof Uint8Array))refuse()
|
|
99
|
+
if(data.byteLength>M2_MAX_BYTES)refuse('limit-exceeded')
|
|
100
|
+
const v=await request('nas.files.write',{...fileArgs(grantId,rel),name:n,data:encode(data)},signal,true)
|
|
101
|
+
if(!v||typeof v!=='object'||(v as {written?:unknown}).written!==true)refuse('commit-uncertain')
|
|
102
|
+
},dispose,
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {onBeforeUnmount,ref} from 'vue'
|
|
2
|
+
|
|
3
|
+
// The provider owns the 22 s bound (backend handlers are bounded to 20 s).
|
|
4
|
+
// Local cancellation suppresses late display updates, never promises rollback.
|
|
5
|
+
export function useM2Request(){
|
|
6
|
+
const busy=ref(false),error=ref<unknown>()
|
|
7
|
+
let disposed=false,generation=0,active:AbortController|undefined
|
|
8
|
+
function cancel(){generation++;active?.abort();active=undefined;busy.value=false;error.value=undefined}
|
|
9
|
+
async function run<T>(fn:(signal:AbortSignal)=>Promise<T>):Promise<T|undefined>{
|
|
10
|
+
if(disposed||busy.value)return
|
|
11
|
+
const version=++generation,controller=new AbortController();active=controller;busy.value=true;error.value=undefined
|
|
12
|
+
try{const value=await fn(controller.signal);return !disposed&&version===generation?value:undefined}
|
|
13
|
+
catch(e){if(!disposed&&version===generation)error.value=e;return undefined}
|
|
14
|
+
finally{if(!disposed&&version===generation){busy.value=false;active=undefined}}
|
|
15
|
+
}
|
|
16
|
+
onBeforeUnmount(()=>{disposed=true;cancel()})
|
|
17
|
+
return {busy,error,run,cancel}
|
|
18
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {createApp} from 'vue'
|
|
2
|
+
import App from './SDKApp.vue'
|
|
3
|
+
import {JobsProviderKey,JobsAdminProviderKey} from './jobs/provider'
|
|
4
|
+
import {createConnectedJobsProvider,createConnectedJobsAdminProvider} from './jobs/connected-provider'
|
|
5
|
+
import type {Context} from './context'
|
|
6
|
+
import {NasProviderKey, type NasProvider} from './nas/provider'
|
|
7
|
+
import {M2ProviderKey} from './nas/m2-contract'
|
|
8
|
+
import {createM2Provider} from './nas/m2-provider'
|
|
9
|
+
import '@synopackageland/ui/themes/dsm7-embedded.css'
|
|
10
|
+
import './style.css'
|
|
11
|
+
import './m2-style.css'
|
|
12
|
+
|
|
13
|
+
let mountSequence = 0
|
|
14
|
+
export function mount(root: HTMLElement, ctx: Context, options: {nasProvider?: NasProvider} = {}) {
|
|
15
|
+
const app = createApp(App, {ctx})
|
|
16
|
+
const jobs=createConnectedJobsProvider(ctx)
|
|
17
|
+
const selections=createM2Provider(ctx)
|
|
18
|
+
app.provide(M2ProviderKey,selections)
|
|
19
|
+
app.provide(JobsProviderKey,jobs)
|
|
20
|
+
app.provide(JobsAdminProviderKey,createConnectedJobsAdminProvider(ctx))
|
|
21
|
+
// The shipped strict-S1 build never installs a NAS provider. Preview is dev/mock only.
|
|
22
|
+
if(import.meta.env.DEV && options.nasProvider?.mode === 'mock') app.provide(NasProviderKey, options.nasProvider)
|
|
23
|
+
// Include the generated package ID, an instance counter and randomness even
|
|
24
|
+
// across separately loaded bundles. getRandomValues also works on DSM HTTP.
|
|
25
|
+
app.config.idPrefix = `__PACKAGE__-${++mountSequence}-${crypto.getRandomValues(new Uint32Array(4)).join('-')}`
|
|
26
|
+
const hadRootClass = root.classList.contains('dsmapp-vue-root')
|
|
27
|
+
root.classList.add('dsmapp-vue-root')
|
|
28
|
+
app.mount(root)
|
|
29
|
+
return {unmount() {app.unmount(); jobs.disconnect(); selections.dispose(); if(!hadRootClass) root.classList.remove('dsmapp-vue-root')}}
|
|
30
|
+
}
|
|
31
|
+
// Register with the existing per-package DSM window loader. Never share a
|
|
32
|
+
// singleton app or user/session state between different mount calls.
|
|
33
|
+
const script = document.currentScript as HTMLScriptElement | null
|
|
34
|
+
const packageID = script?.getAttribute('data-package')
|
|
35
|
+
const host = window as unknown as {DsmPackageApps: Record<string, {mount: typeof mount}>}
|
|
36
|
+
if (packageID) {
|
|
37
|
+
host.DsmPackageApps = host.DsmPackageApps || {}
|
|
38
|
+
host.DsmPackageApps[packageID] = {mount}
|
|
39
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// DSM-style shell: a fixed left navigation and one right-hand page with a
|
|
3
|
+
// header. Pages stay mounted (v-show) so provider leases and job polling keep
|
|
4
|
+
// running while the user moves between them.
|
|
5
|
+
import {computed, type Component} from 'vue'
|
|
6
|
+
import {AppLayout, AppSidebar, PageContent, PageHeader, type AppSidebarGroup} from '@synopackageland/ui'
|
|
7
|
+
import {FolderOpen, Info, KeyRound, ListChecks, MousePointerClick, NotebookPen, Shield, Timer} from '@lucide/vue'
|
|
8
|
+
import {shellCopy} from './i18n'
|
|
9
|
+
import type {ShellPage} from './pages'
|
|
10
|
+
|
|
11
|
+
const props = defineProps<{
|
|
12
|
+
locale: string
|
|
13
|
+
modelValue: ShellPage
|
|
14
|
+
pages: readonly ShellPage[]
|
|
15
|
+
description?: string
|
|
16
|
+
}>()
|
|
17
|
+
const emit = defineEmits<{'update:modelValue': [value: ShellPage]}>()
|
|
18
|
+
const copy = computed(() => shellCopy(props.locale))
|
|
19
|
+
const icons: Record<ShellPage, Component> = {status:Info,sample:NotebookPen,nas:FolderOpen,interactive:MousePointerClick,background:Timer,admin:ListChecks,identity:KeyRound,folders:Shield}
|
|
20
|
+
const groups = computed<AppSidebarGroup[]>(() => [{
|
|
21
|
+
items: props.pages.map(page => ({key:page,label:copy.value[page],icon:icons[page]})),
|
|
22
|
+
}])
|
|
23
|
+
const title = computed(() => copy.value[props.modelValue] ?? copy.value.status)
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<template>
|
|
27
|
+
<AppLayout class="app-shell" min-height="0">
|
|
28
|
+
<template #sidebar>
|
|
29
|
+
<AppSidebar :model-value="modelValue" :groups="groups" @update:model-value="emit('update:modelValue', $event as ShellPage)" />
|
|
30
|
+
</template>
|
|
31
|
+
<PageContent class="app-page">
|
|
32
|
+
<PageHeader :title="title" :description="description">
|
|
33
|
+
<template #actions><slot name="actions" /></template>
|
|
34
|
+
</PageHeader>
|
|
35
|
+
<div class="app-page-content"><slot /></div>
|
|
36
|
+
</PageContent>
|
|
37
|
+
</AppLayout>
|
|
38
|
+
</template>
|
|
39
|
+
|
|
40
|
+
<style scoped>
|
|
41
|
+
/* The library clips AppLayout at window height; the page body scrolls while
|
|
42
|
+
the sidebar keeps its own height. Modeled on syno-reclaim's AppShell. */
|
|
43
|
+
.app-shell { height: 100%; min-width: 0; grid-template-rows: minmax(0, 1fr); }
|
|
44
|
+
.app-shell :deep(> div) { min-height: 0; }
|
|
45
|
+
.app-shell :deep(main) { display: flex; flex-direction: column; overflow: hidden; }
|
|
46
|
+
.app-page { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
|
|
47
|
+
.app-page-content { padding-bottom: var(--ui-space-6, 24px); }
|
|
48
|
+
</style>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "Status",
|
|
3
|
+
"sample": "Meine Beispieldaten",
|
|
4
|
+
"nas": "NAS-Ordnerzugriff",
|
|
5
|
+
"interactive": "Interaktive Aufträge",
|
|
6
|
+
"background": "Hintergrundaufträge",
|
|
7
|
+
"admin": "Auftragsverwaltung",
|
|
8
|
+
"identity": "Optionale App-Identität",
|
|
9
|
+
"folders": "Ordnerauswahl"
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "Status",
|
|
3
|
+
"sample": "My sample data",
|
|
4
|
+
"nas": "NAS folder access",
|
|
5
|
+
"interactive": "Interactive jobs",
|
|
6
|
+
"background": "Background jobs",
|
|
7
|
+
"admin": "Job management",
|
|
8
|
+
"identity": "Optional app identity",
|
|
9
|
+
"folders": "Folder selections"
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "Estado",
|
|
3
|
+
"sample": "Mis datos de ejemplo",
|
|
4
|
+
"nas": "Acceso a carpetas NAS",
|
|
5
|
+
"interactive": "Tareas interactivas",
|
|
6
|
+
"background": "Tareas en segundo plano",
|
|
7
|
+
"admin": "Gestión de tareas",
|
|
8
|
+
"identity": "Identidad de aplicación opcional",
|
|
9
|
+
"folders": "Selección de carpetas"
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "État",
|
|
3
|
+
"sample": "Mes données d'exemple",
|
|
4
|
+
"nas": "Accès aux dossiers NAS",
|
|
5
|
+
"interactive": "Tâches interactives",
|
|
6
|
+
"background": "Tâches en arrière-plan",
|
|
7
|
+
"admin": "Gestion des tâches",
|
|
8
|
+
"identity": "Identité d'application facultative",
|
|
9
|
+
"folders": "Sélection de dossiers"
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "Stato",
|
|
3
|
+
"sample": "I miei dati di esempio",
|
|
4
|
+
"nas": "Accesso alle cartelle NAS",
|
|
5
|
+
"interactive": "Attività interattive",
|
|
6
|
+
"background": "Attività in background",
|
|
7
|
+
"admin": "Gestione attività",
|
|
8
|
+
"identity": "Identità app opzionale",
|
|
9
|
+
"folders": "Selezione cartelle"
|
|
10
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import en from './i18n/en.json'
|
|
2
|
+
import zhTW from './i18n/zh-TW.json'
|
|
3
|
+
import zhCN from './i18n/zh-CN.json'
|
|
4
|
+
import ja from './i18n/ja.json'
|
|
5
|
+
import ko from './i18n/ko.json'
|
|
6
|
+
import de from './i18n/de.json'
|
|
7
|
+
import fr from './i18n/fr.json'
|
|
8
|
+
import es from './i18n/es.json'
|
|
9
|
+
import it from './i18n/it.json'
|
|
10
|
+
|
|
11
|
+
export type ShellCopy = typeof en
|
|
12
|
+
export const shellCatalogs: Record<string, ShellCopy> = {en,'zh-TW':zhTW,'zh-CN':zhCN,ja,ko,de,fr,es,it}
|
|
13
|
+
const aliases: Record<string,string> = {enu:'en',cht:'zh-TW',chs:'zh-CN',jpn:'ja',krn:'ko',ger:'de',fre:'fr',spn:'es',ita:'it'}
|
|
14
|
+
export function shellCopy(locale: string): ShellCopy {
|
|
15
|
+
const normalized = locale.replaceAll('_','-')
|
|
16
|
+
return shellCatalogs[aliases[normalized] ?? normalized] ?? shellCatalogs[normalized.split('-')[0]!] ?? en
|
|
17
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// The DSM-style shell shows one sidebar entry per feature that this build
|
|
2
|
+
// actually provides. The manifest is resolved at build time, so the entries
|
|
3
|
+
// here are driven by runtime feature flags rather than by the YAML itself.
|
|
4
|
+
export type ShellPage =
|
|
5
|
+
| 'status'
|
|
6
|
+
| 'sample'
|
|
7
|
+
| 'nas'
|
|
8
|
+
| 'interactive'
|
|
9
|
+
| 'background'
|
|
10
|
+
| 'admin'
|
|
11
|
+
| 'identity'
|
|
12
|
+
| 'folders'
|
|
13
|
+
|
|
14
|
+
export interface ShellFeatureFlags {
|
|
15
|
+
sample?: boolean
|
|
16
|
+
nas?: boolean
|
|
17
|
+
interactive?: boolean
|
|
18
|
+
background?: boolean
|
|
19
|
+
admin?: boolean
|
|
20
|
+
identity?: boolean
|
|
21
|
+
folders?: boolean
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** 'status' is the integration/account page every Vue build has. */
|
|
25
|
+
const ORDER: readonly ShellPage[] = ['status','sample','nas','interactive','background','admin','identity','folders']
|
|
26
|
+
|
|
27
|
+
export function shellPages(features: ShellFeatureFlags): ShellPage[] {
|
|
28
|
+
return ORDER.filter(page => page === 'status' || features[page] === true)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Keeps a selection that still exists; otherwise the first page wins. */
|
|
32
|
+
export function activePage(current: ShellPage | undefined, pages: readonly ShellPage[]): ShellPage {
|
|
33
|
+
return current !== undefined && pages.includes(current) ? current : (pages[0] ?? 'status')
|
|
34
|
+
}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
.dsmapp-vue-root {height: 100%; min-height: 0; width: 100%; overflow: hidden;}
|
|
2
|
-
[data-ui-app] .integration-app {padding: var(--ui-
|
|
3
|
-
[data-ui-app] .integration-
|
|
4
|
-
[data-ui-app] .integration-heading h1 {font-size: 20px; font-weight: 600; margin: 0;}
|
|
5
|
-
[data-ui-app] .integration-heading p {color: var(--ui-text); margin: 4px 0 0;}
|
|
6
|
-
[data-ui-app] .integration-app section {margin-top: 24px;}
|
|
2
|
+
[data-ui-app] .integration-app {padding: 0 var(--ui-page-padding-x, 16px); color: var(--ui-text); font-family: var(--ui-font-sans); font-size: 13px; line-height: 1.5;}
|
|
3
|
+
[data-ui-app] .integration-app section {margin-top: var(--ui-space-4, 16px);}
|
|
7
4
|
[data-ui-app] .integration-status h2 {font-size: 15px; font-weight: 600; margin: 0;}
|
|
8
5
|
[data-ui-app] .integration-status p {margin: 6px 0;}
|
|
9
6
|
[data-ui-app] .integration-status dl {display: grid; grid-template-columns: max-content 1fr; gap: 4px 16px; margin: 12px 0;}
|
|
10
7
|
[data-ui-app] .integration-status dt, [data-ui-app] .integration-help {color: var(--ui-text);}
|
|
11
8
|
[data-ui-app] .integration-status dd {margin: 0;}
|
|
12
9
|
[data-ui-app] .integration-actions {display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px;}
|
|
13
|
-
[data-ui-app] .integration-field {display: grid; gap: 6px; margin: 12px 0;}
|
|
14
10
|
[data-ui-app] .integration-notice {color: var(--ui-text);}
|
|
15
11
|
[data-ui-app] .nas-summary {display: grid; grid-template-columns: minmax(6ch, max-content) minmax(0, 1fr); gap: var(--ui-space-2, 8px) var(--ui-space-4, 16px);}
|
|
16
12
|
[data-ui-app] .nas-summary dd {margin: 0; overflow-wrap: anywhere;}
|