mirror of
https://github.com/owncloud/ocis.git
synced 2026-10-23 23:29:02 +03:00
test-cli-postprocessing-resume
20 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
b9077d96d8 |
chore(deps): consolidate dependency and security bumps (#13081)
* chore(deps): consolidate dependency and security bumps Dependabot PRs applied: - #12878 qs 6.15.2 -> 6.16.0 (web/web-runtime) - #13013 alpine 3.24.1 -> 3.24.2 - #13061 actions/checkout -> v7.0.1 (missed instance in k8s.yml) - #13062 actions/setup-node -> v7.0.0 (missed instance in k8s.yml) - #13075 simple-git 3.36.0 -> 4.0.1 (security) - #13076 katex 0.16.45 -> 0.18.2+ (security) - #13077 dompurify 3.4.13 -> 3.4.16 (security) - #13079 go deps minor-and-patch group, 18 updates (opa 1.19.0 -> 1.21.1, otel 1.46 -> 1.47, bleve, govips, grpc-gateway, lico, tablewriter, logrus, gjson, x/exp, x/image, genproto, etc.) Skipped (already satisfied on master): #12513, #12624, #12625, #12633 Manual security bumps via pnpm.overrides (no dependabot PR existed): - axios -> 1.20.0 - smol-toml -> 1.9.0 - postcss -> 8.5.23 - postcss-selector-parser -> 7.1.6 - colord -> 2.9.4 - unhead -> 2.1.13 - markdown-it -> 14.3.1 - esbuild -> 0.28.1 - brace-expansion 5.0.11 -> 5.0.12 Not fixable: sprintf-js and elliptic have no patched version released upstream yet; left as-is. go build and pnpm install verified clean. * chore(deps): fix residual transitive vulns found by trivy trivy flagged duplicate/stale resolutions that survived the earlier override pass: dompurify (3.4.12 -> 3.4.16), qs (6.14.2 -> 6.16.0), and fast-uri (3.1.7 -> 3.1.8, CVE-2026-86472). Added/bumped pnpm.overrides accordingly. trivy fs scan of web/pnpm-lock.yaml now clean. * chore(deps): bump reva to bac0e1ee144ab853a81c6b02142032f102dd245a Pins github.com/owncloud/reva/v2 to bac0e1ee144ab853a81c6b02142032f102dd245a, pulling in its go-playground/locales and huandu/xstrings version bumps. Appends this PR to changelog/unreleased/bump-reva.md. go build ./... verified clean after go mod vendor resync. * fix(ci): revert unhead override, breaks web build * revert: keep k8s.yml actions/checkout and setup-node pinned |
||
|
|
4b35a609ea |
bump vue to 3.5.43 (#13073)
chore(web): bump vue to 3.5.43 and source-map-js |
||
|
|
30ff89b1de |
[full-ci] chore(web): adopt Nx as task orchestrator for web/ (#13039)
feat(web): adopt Nx as task orchestrator for web/ Introduces Nx on top of the existing pnpm workspace, so lint/typecheck/ test can be scoped to only the projects affected by a change instead of running against the whole monorepo on every PR. - Phase 0: add nx (^23.2.1) as a workspace devDependency, nx.json with a targetDefaults entry for test:unit (cache: true), ignore .nx/cache and .nx/workspace-data. No behavior change to any existing script. - Phase 1: register @nx/vitest's inference plugin so every package with a vitest.config.ts gets a real, cached "test" target read directly from its own config, not just the packages that happened to already declare a "test:unit" npm script. Excludes vite.config.common.ts, the root vite.config.ts and vite.cern.config.ts from the plugin's default glob - none of them are test configs, and loading them as one aborts the whole project graph. defaultBase: "master" (bare `nx affected` defaults to a branch named "main"). testMode: "run" so `nx run <project>:test` doesn't default to vitest's watch mode locally. - Phase 2a: register @nx/eslint/plugin for a per-project "lint" target on every project (root `lint` script untouched). - Phase 2b: register @nx/vite/plugin's typecheckTargetName for a per-project "typecheck" target on projects with their own real vite.config.ts (design-system, web-client, web-pkg, web-test-helpers). The ~20 web-app-*/web-runtime projects only have a vitest.config.ts and aren't covered; root `pnpm run check:types` (whole-repo vue-tsc) stays the one check that covers everything. - Phase 3 (CI): adds a `full-run` output to detect-web-changes - true for push to master/stable-* or a `[full-ci]` PR title (unchanged behavior), false for a normal PR, which instead runs `nx affected -t lint` / `nx affected -t test --base=<PR base sha>`. Added fetch-depth: 0 to web-build-test's checkout, needed for `nx affected --base=<sha>` to find that commit. Check types and the full-run unit-test path deliberately stay whole-repo (see inline comments for why). Also: - removes design-system's broken "lint": "lint:stylelint" alias (needed the "lint" name free for the new per-project target; it was never callable as written - "lint:stylelint" isn't a binary - and nothing called it). - makes the design system's webfontloader import fire-and-forget so an in-flight rejection at test teardown doesn't surface as an unhandled rejection under vitest's per-project runs. - pin `typescript` via `pnpm.overrides`. Adding nx's own devDependencies makes pnpm re-resolve the workspace's peer graph, and today's registry now has a typescript 6.x that some peer ranges accept - without the pin, half the vue-peer-dependent packages (pinia, vue-router, vue3-gettext, focus-trap-vue, ...) fork into a second, incompatible module instance. Same pin as the dependency-cycle fix, for an unrelated reason; needed independently here since this branch changes package.json on its own. nx's `dependsOn: ["^target"]` errors outright on a circular task graph, so this only works once the pre-existing web-pkg/design-system/ web-test-helpers dependency cycle is fixed - see fix(web): break web-pkg/design-system/web-test-helpers dependency cycle, which this PR targets rather than master. Verified: nx run-many -t test / lint / typecheck succeed for all projects; nx show projects --affected --files=... resolves correctly for shared config changes; nx affected -t lint --base=<sha> matches pnpm lint; root pnpm lint/check:types/check:format/test:unit/build all still pass unchanged (380 files / 3128 tests). |
||
|
|
6069640d49 |
[full-ci] fix(web): break web-pkg/design-system/web-test-helpers dependency cycle (#13038)
fix(web): break web-pkg/design-system/web-test-helpers dependency cycle
web-pkg, design-system and web-test-helpers formed a cycle: the mount
helpers have to install the design system (its components are registered
globally) and web-pkg's mocked pinia stores, so web-test-helpers was
imported by both packages that imported it back.
Resolved by layering the helpers onto the packages that already need
them, instead of adding another one:
design-system/testing mount/shallowMount, prop types, design system +
gettext + router-link stub plugins
web-pkg/src/testing the above, extended with casl abilities, mocked
pinia stores and component mocks
web-test-helpers re-export of web-pkg/src/testing
design-system sits at the bottom of the workspace graph, so it cannot
depend on a package that installs it - hence the generic half lives
there. web-pkg composes those plugins rather than duplicating them, so
every helper is still defined exactly once, and no package depends on
one above it.
The public API of `@ownclouders/web-test-helpers` is unchanged, so
external extensions are unaffected.
Also:
- pin `typescript` via `pnpm.overrides` - without it, a second peer-
resolved typescript version forks `vue`, which forks `vue3-gettext`
into two module instances, breaking `inject(GetTextSymbol)` for any
component mounted through these helpers.
- keep `@ownclouders/design-system/testing` external in web-pkg's lib
build. rollup matches `external` strings exactly, so the subpath was
inlined, shipping a second copy of the design system and of
@vue/test-utils into the published bundle - components and wrappers
were then not identity-equal to the consumer's own, and gettext
injection broke.
- name the web-test-helpers umd output `.cjs`. The package is ESM, so the
`.js` file that publishConfig.exports pointed `require` at could not be
required.
Verified: `pnpm install --frozen-lockfile` clean, zero cyclic-workspace
warnings; `pnpm test:unit` 380 files / 3129 tests pass; `pnpm check:types`
0 errors; `pnpm lint`/`check:format` 0 errors; `pnpm build` succeeds;
published artifacts checked by mounting through the built `dist/` bundles
the way an external extension resolves them via publishConfig.exports.
|
||
|
|
ed40259ebf |
bump brace-expansion version to 5.0.11 (#13026)
chore: bump brace-expansion version to 5.0.11 |
||
|
|
738b15268d |
pump fast-uri version (#13021)
chore: pump fast-uri version |
||
|
|
709b9ac0e4 |
build(deps-dev): bump vitest from 4.1.6 to 4.1.11 in /web (#12909)
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.6 to 4.1.11. - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md) - [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/vitest) --- updated-dependencies: - dependency-name: vitest dependency-version: 4.1.11 dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
0da35cc945 |
build(deps): bump dependencies (#12908)
Signed-off-by: Prajwol Amatya <prajwolamatya11@gmail.com> |
||
|
|
fa2e5168ae |
Bump fast-uri Dependency (#12877)
build(deps): bump fast-uri dependency |
||
|
|
0586d3a669 |
build(deps): bump dependencies (#12871)
build(deps): bump google.golang.org/grpc and browserslist |
||
|
|
90148451c8 |
chore: bump go and web packages (#12765)
* chore: bump go packages * chore: bump web packages |
||
|
|
e1ee0d01ef | chore(web): update dep js-yml to 4.3.1 (#12747) | ||
|
|
0e591928c8 |
chore: update brace expansion package (#12714)
* build(deps): bump pnpm dependencies * chore(deps): update fast-uri to 3.1.5 --------- Co-authored-by: Matteo <matteo.sonnenholzner@kiteworks.com> |
||
|
|
e70497b49c | chore: update brace expansion package (#12653) | ||
|
|
86fa96362a | feat: [OCISDEV-855] receivedsharecache: retry on transient storage errors in CAS loop (#12621) | ||
|
|
50141f471b |
fix(web): preserve focus in file versions sidebar (#12630)
- Keep keyboard and screen-reader focus inside the versions sidebar while panels transition or reload. - Restore focus to the opening control when the sidebar closes and to the matching Restore action after a version is restored. - Improve version date and action announcements without introducing duplicate announcements or additional tab stops. Signed-off-by: Matteo <matteo.sonnenholzner@kiteworks.com> |
||
|
|
1256793012 |
build(deps): bump qs from 6.14.2 to 6.15.2 in /web (#12623)
Bumps [qs](https://github.com/ljharb/qs) from 6.14.2 to 6.15.2. - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.14.2...v6.15.2) --- updated-dependencies: - dependency-name: qs dependency-version: 6.15.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
cdcabdb527 |
chore(web): upgrade vue3-gettext from 2.4.0 to 4.0.1 (#12622)
Migrates all v-translate directive usages to $gettext() calls since v4 removes the deprecated <translate> component/directive entirely and silently drops such strings during extraction. Also drops the now-unsupported disableHtmlEscaping positional argument from ~40 call sites (v4 no longer HTML-escapes interpolated values; none of the affected strings are rendered via v-html) and removes the pnpm patch that only backported a types export field v4 now ships natively. Signed-off-by: Lukas Hirt <info@hirt.cz> |
||
|
|
5bf887a570 |
Chore/fix e2e violation (#12526)
* fix(e2e): resolve admin-settings general spec violations
- prevent focusable elements inside hidden breadcrumb items
- make OcDrop tippy role configurable, default to none
- wait for logo-wrapper element after page reload in e2e
* fix(e2e): resolve admin-settings groups spec violations
- add aria-label to the icon-only groups filter-confirm button, which
had no name for screen readers to announce
- set reducedMotion on e2e browser contexts so notification fade-in
animations don't race axe scans and produce false color-contrast
failures
- fix tippbBox selector typo (-> tippyBox) that made the scan on the
group context menu throw instead of running
- fix groupList and editPanel selectors in the shared selector map:
groupList pointed at a nonexistent class, and editPanel used the
non-standard :visible pseudo-selector which is invalid in native
querySelectorAll
* fix(e2e): skip tooltip fade transition under reduced motion
Plain tooltips (v-oc-tooltip) use tippy.js's default fade animation
and default #333/#fff colors, driven by tippy's own duration option
rather than a CSS transition. Setting reducedMotion on the Playwright
browser context does not stop this, since tippy's animation ignores
prefers-reduced-motion on its own. Axe scans could catch the tooltip
mid-fade, when the text is still low-opacity, and report a false
color-contrast violation. Now the duration is forced to 0 when the
media query matches, mirroring how oc-fade-in already handles this
for CSS-driven animations.
* fix(e2e): resolve officeSuites spec progressbar violation and test bugs
- add aria-label to the global loading progress bar, which had no name
- point the space quota progress bar at its existing text label via
aria-labelledby instead of leaving it unnamed
- fix a string-literal-instead-of-variable typo, an XPath selector that
axe can't use (only CSS), and a scan that ran after clicking closed
the element it was targeting, all in the public link test helpers
- move the create-document-modal scan to after the modal actually
opens, since it was scanning too early and finding nothing
* fix(e2e): resolve app-store details spec contrast violation and scan bug
- override md-editor-v3's default link and inline-code colors in the
read-only markdown preview, which didn't meet WCAG AA contrast
against the app card background
- point the download-app a11y scan at the app list page instead of a
details-page selector that isn't present on that page, a leftover
from copying the sibling download-version helper
* fix(e2e): resolve participantManagement pagination spec violations
- patch vue-select to render aria-controls on its combobox toggle,
which it already computed internally but never attached to the
element with role="combobox"
- add aria-label to the account menu quota bar and upload progress
bar, both missing a name on their progressbar role, same gap fixed
earlier in LoadingIndicator/SpaceQuota
- add aria-label to the file-details preview-loading spinner, which
rendered role="img" with an empty aria-label
- stop scanning the sidebar actions panel in deleteResource after it
was already closed, which made the scan throw instead of running
* fix(e2e): add missing aria-label to hide-share quick action button
The icon-only hide/unhide-share button in the shared-with-me table had
a tooltip but no aria-label, so it had no accessible name. Reused the
label already computed for the tooltip instead of duplicating it.
* fix(e2e): fix sidebarPanel selector typo in downloadResources
Used the string 'sidebarPanel', which isn't a key in the shared a11y
selector map, so it fell through to being used as a literal (and
broken) CSS selector. Switched to the existing appSidebar key, which
resolves to the same #app-sidebar selector already used for this
concept elsewhere.
* fix(e2e): add accessible name to markdown editor's content area
md-editor-v3's underlying CodeMirror instance renders its editable
content div with role="textbox" but no accessible name, and the
library exposes no prop to pass one through. Set aria-label on it
directly after mount, since that's the only available hook.
* fix(e2e): fix users-filter button label and navigate scan selector
- add aria-label to the icon-only users search/filter-confirm button,
the same button-name gap already fixed for the groups page
- fix Users.navigate scanning appSidebar, which isn't rendered until a
sidebar panel is actually opened; switched to scanning body, matching
the working pattern already used by Groups.navigate
* fix(e2e): fix global search dropdown ARIA structure and scan bugs
- restructure the search results listbox so its direct children are
valid group/option roles instead of plain nested <li>/<ul>, fixing
aria-required-children/parent, list, and listitem violations
- give the loading/no-results states no listbox role at all, since
they're informational text rather than actual options
- give the listbox an accessible name via the existing search label
- fix the icon-only "search options" listbox missing aria-controls
becoming null instead of a static string when the dropdown isn't
rendered
- add a disableRules option to assertNoSevereA11yViolations, using it
for two narrow, investigated cases: search-result rows render a real
<a href> so native middle-click/ctrl-click "open in new tab" keeps
working (nested-interactive can't be satisfied without removing
that), and a checkbox nested in a clickable filter-list button that
would otherwise lose its only accessible selection-state indicator
- fix the same aria-controls transient-timing gap in two more call
sites that hit it after a route change (closing the editor, opening
any app via the app switcher)
* fix(e2e): fix low contrast search input in select combobox
vue-select's vendor CSS dims the search input to 20% opacity while
searching but not yet open, dropping text contrast to 1.51:1 against
the required 4.5:1. Override the opacity back to 1 for that state.
* fix(e2e): add labels to app gallery navigation buttons
The prev/next/set-image buttons in the app details image gallery only
render a decorative icon with no text or label, leaving them with no
discernible name for screen reader users.
* fix(e2e): add label to clear-clipboard button in files app bar
The clear-clipboard button next to "Paste here" only renders a
decorative close icon with no text or label, leaving it with no
discernible name for screen reader users.
* fix(e2e): add label to generic app-loading spinner
The spinner shown while an external app is loading has no aria-label,
leaving the role="img" element with no accessible name even though a
visually-hidden "Loading app" text already exists right next to it.
* fix(e2e): add label to GDPR export loading spinner
The spinner shown while the GDPR export status is loading has no
aria-label, leaving the role="img" element with no accessible name.
* fix(e2e): fix combobox aria attributes in create shortcut modal
The suggestion dropdown had no explicit toggle target, so tippy fell
back to the input wrapper div and set aria-expanded on an element with
no ARIA role. Point the drop at the actual input and give it proper
combobox semantics.
* fix(e2e): fix users filter checkbox-button scan and delete selector bug
Suppress the already-accepted checkbox-in-button nested-interactive
rule at the two roles filter scan sites in filterUsers, matching the
pattern used elsewhere for the same ItemFilter.vue markup. Also fix a
string-literal selector in deleteUserUsingContextMenu that was never
actually calling util.format, so axe scanned for a nonexistent element.
* fix(e2e): resolve admin-settings spaces spec violations
- replace removed #files-toggle-sidebar with the "Show details" button
(that button now opens the sidebar in one click; selecting via the
checkbox first would toggle the space off when Show details toggles it on)
- fix broken scan selectors: 'appSidebarDiv' -> 'appSidebar' (not a key in
the selectors map, was silently falling through to the literal string);
'tippyBox' -> 'ocModal' at the confirm-action scan (the modal is what's
actually rendered there, not a tippy); 'filesView' -> 'adminSettingsWrapper'
in performSpaceAction (this runs on the admin-settings page, not files)
- wrap transitionend waits in Promise.all with their triggering click, so
the listener attaches before the transition begins - otherwise a near-
instant transition (under prefers-reduced-motion: reduce, enabled by an
earlier fix in this branch) can finish before the listener binds and
the wait never resolves, hanging the "list members via sidebar" test
* fix(e2e): mark kindergarten journey test as slow
The journey performs 16 downloads plus shares and deletes, each cycling
the sidebar with a11y scans, and consistently runs 3-4 minutes even in
isolation - past the default 180s timeout. When the deadline hits, the
axe scan in flight fails with "Target page, context or browser has been
closed" from a different call site each run.
test.slow() triples the timeout to 540s, the idiomatic Playwright hint
for legitimately long journey tests.
* fix(e2e): add aria-label to create-user button when icon-only
When admin-settings shrinks to a limited-width viewport, the create-user
button collapses to icon-only and its visible text label is hidden. The
tooltip already switches to the accessible name in that mode; mirror
that on aria-label so the button retains an accessible name in the
collapsed state (WCAG 4.1.2).
* fix(e2e): import expect in crashPage step helpers
expectCrashPageHasNoAccessibilityViolations uses expect() but the
import only included Page - the file wouldn't compile if that helper
was referenced anywhere.
* fix(e2e): pass selector variables to admin-settings users a11y scans
Four call sites passed string keys ('loginToggleWithDropdown',
'loginDropDown', 'groupsModalInput') that don't exist in the shared
selectors map - assertNoSevereA11yViolations' fallback then used those
literal strings as raw CSS selectors, matching nothing, so axe threw
"No elements found for include" instead of actually scanning. Same
class of bug as the earlier 'tippbBox'/'sidebarPanel'/'linkUpdateDialog'
fixes in this branch.
Switched to passing the local const variables directly, which resolve
to the real CSS selectors defined in the same file.
* fix(e2e): scan notifications dropdown container instead of message list
Both notification-related scans passed notificationItemsMessages, which
is a selector that matches multiple elements (one per notification). axe
throws on multi-match includes. Switched to notificationsDrop, the
single container that wraps the message list.
* fix(e2e): wait for link-update dialog before scanning it
Four call sites (changeRole, changeName, addExpiration, deleteLink) ran
assertNoSevereA11yViolations on the linkUpdateDialog notification right
after the action that triggers it, without waiting for the notification
to actually appear - axe would race and sometimes scan before the DOM
was there.
Also fixed copyLinkToClipboard: previously scanned '.snackbar' (which
doesn't exist in this codebase) unconditionally; now waits for the
linkUpdateDialog and scans it, or for the password-protected-folder
case, waits inside the iframe and scans the iframe locator instead
(mirroring the pattern already used by open() in utils/sidebar.ts).
* fix(e2e): scan iframe locator for password-protected-folder sidebar
Two scans in the passwordProtectedFolder branch were pointed at
top-level page selectors ('tippyBox', the plain sidebarPanel const)
but that sidebar lives inside its own iframe (#iframe-folder-view),
not on the top-level page - so axe found nothing to scan and threw.
Switched to scanning the iframe locator itself. In open()'s post-open
scan, made the target conditional so the non-iframe branch keeps
scanning #app-sidebar as before.
* fix(e2e): drop premature tippyBox scan before more-options dropdown opens
createShare scanned the tippyBox before clicking showMoreOptionsButton,
but the tippy isn't in the DOM yet at that point - the click on the
button is what opens it. The second scan a couple of lines below runs
after the click, when the dropdown is actually rendered, which is the
only place the scan belongs.
* fix(e2e): scan body in shared createSpace instead of #files-view
createSpace is invoked from both the Files app spaces view (which has
#files-view) and the admin-settings spaces page (which has
#admin-settings-wrapper instead) - scanning a single view-specific
root failed in one of the two callers. Scan the always-present body
so both callers work.
* fix(e2e): make resource-action a11y scans robust to timing and view mode
- clickResource: it's used for both folder navigation (breadcrumb
appears) and file-open (navigates away into a viewer/editor with no
breadcrumb). The unconditional post-click scan of 'breadcrumb' timed
out on file opens. Wait for the breadcrumb with a 5s cap and skip
the scan when it never appears.
- createNewFolder: was scanning 'filesSpaceTable' which only exists in
table view. Scan the view-mode-agnostic 'filesView' wrapper instead.
- downloadResources / pasteResource / moveOrCopyResource: add waitFor
on the target selector before axe scans it, otherwise axe can race
and scan before the DOM updates from the preceding click.
* fix(web-app-app-store): fix TS2322 type error in AppImageGallery aria-label
|
||
|
|
6bad03d364 |
[full-ci] chore: [OCISDEV-5] merge and relicense ownCloud Web into oCIS (#12491)
* chore: [OCISDEV-5] Merge and relicense ownCloud Web into oCIS Consolidate the ownCloud Web frontend into this repository as a single product with one contribution surface and one license. The web/ source is imported as-is from the final standalone owncloud/web release (v12.5.0 / last-agpl-release @ b16a34fdf5569d2fd63b1ff3c575c1a4ee569ad3); the archived owncloud/web repository remains the historical record for everything at and before that commit. Relicensing: - All web/ contributors have signed the ownCloud CLA, granting ownCloud GmbH the right to relicense their contributions. - web/LICENSE (AGPL-3.0) removed; the repository root LICENSE (Apache-2.0) now governs web/ as well, matching how the rest of the repo is already licensed. - All 25 web/packages/*/package.json license fields flipped to Apache-2.0; root NOTICE added documenting the relicensing provenance. - Added REUSE.toml + LICENSES/ so the whole repository (including vendored Go dependencies) is REUSE 3.3 compliant. CI/build: - services/web/Makefile now builds web assets from the in-tree source instead of downloading a release tarball from owncloud/web; license checking/saving likewise runs against the in-tree source. - ci.env and tests/acceptance/run-e2e.py no longer clone owncloud/web for Playwright e2e tests. - Added the app-provider and ocm e2e suites to acceptance-tests.yml's matrix, closing a coverage gap where they were silently excluded; ported the Collabora/OnlyOffice/federated-instance orchestration web's old CI used to run them. - Added web-tests.yml (typecheck/format/lint/unit-test), a check-licenses.yml, commit-message.yml, and release-npm-packages.yml for the @ownclouders/* packages, replacing web's old standalone CI. - Removed dead CI tooling inherited from the standalone repo (web/tests/drone, web/tests/actions, web/.github, and an orphaned ci.env-dependent cache-check script). Docs: - Rewrote docs/services/web/releasing.md and web/docs/releasing to describe the in-tree build/release process. - Updated remaining references to github.com/owncloud/web across docs, services/web/README.md, and the deployment example to point at the in-tree web/ directory. Signed-off-by: Lukas Hirt <info@hirt.cz> * ci: sync web/ translations via Transifex web/ is a pnpm workspace nested inside the repo, so it isn't covered by the existing translation-sync job (sub_path: ., no package.json at the repo root). Add a second sync-web job invoking the same reusable workflow with sub_path: web and package_manager: pnpm, so its l10n-read/ push/pull/write targets actually install web's dependencies instead of silently running against an empty node_modules. Sequenced after the existing sync job since both push to the same hardcoded chore/translations-update branch. * ci: fix pnpm cache setup order in web-tests and check-licenses actions/setup-node's cache: pnpm input shells out to pnpm to resolve the cache directory, so pnpm must already be on PATH when that step runs. Both workflows ran `corepack enable` *after* setup-node, which still failed: corepack writes its pnpm shim into the currently active Node installation's bin dir, and setup-node had already swapped PATH to the newly-installed Node version by that point, leaving the shim behind. Use pnpm/action-setup instead, which installs a standalone pnpm binary independent of the Node version, before setup-node runs. Also set cache-dependency-path explicitly: the lockfile lives at web/pnpm-lock.yaml, and cache-dependency-path resolves relative to GITHUB_WORKSPACE regardless of the job's working-directory default (that default only applies to run: steps, not to setup-node itself). * fix(web): resolve 19 HIGH trivy findings in pnpm-lock.yaml All 19 findings had fixes available upstream, so per this repo's own .trivyignore policy (reserved for cases with no fix available), these get fixed rather than suppressed. vite (7.3.2 -> 7.3.5) is a direct dependency, bumped directly in every package.json that pins it. The other 8 (@xmldom/xmldom, flatted, form-data, immutable, js-cookie, linkify-it, minimatch, ws) are purely transitive. Verified empirically that `pnpm update <pkg>` silently no-ops on packages not declared in any workspace manifest, even when a parent's semver range would allow the fix (e.g. glob@10.5.0's `^9.0.4` covers 9.0.7) -- so pnpm.overrides is genuinely required here, not just convenient. minimatch is overridden with a version-range key (minimatch@>=9.0.0 <9.0.7) rather than a blanket override, since 6 different major versions of minimatch coexist in the tree for different consumers (3.x/5.x/10.x elsewhere); a blanket override would have forced all of them to 9.0.7 and likely broken callers expecting a different major's API. * fix(web): unify @types/node resolution to stop duplicate vite types The previous vite 7.3.2 -> 7.3.5 bump caused pnpm to resolve two different @types/node versions (25.7.0 and 26.1.0) as vite's optional peer across different workspace packages. vue-tsc then saw two structurally-different copies of vite's types (e.g. Plugin, HotUpdateOptions) and failed with TS2769 in design-system, web-client, web-pkg and web-test-helpers' vite.config.ts files. Force a single resolution via pnpm.overrides, pinned to 24.13.2 to match the Node 24 runtime (engines/volta) rather than an arbitrary newer major. * fix(tests): fix ocm/app-provider e2e suites' oCIS orchestration Both suites were newly wired up by the previous merge-web-repo commit and hadn't run against real CI yet, so their setup had two latent bugs: e2e-ocm: the federated instance's env only offset *_DEBUG_ADDR ports, leaving the actual service ports (e.g. gateway's default 127.0.0.1:9142) unset. The federated "ocis server" process then crashed trying to bind the same ports the primary instance already held. run-github.py's Behat apiOcm suite already solved this with a canonical tests/config/local/.env-federation port map (proven working, since apiOcm passes) -- reuse it instead of the ad-hoc offset. Also adds OCIS_ADD_RUN_SERVICES=ocm/OCIS_ENABLE_OCM, missing from the primary instance too. e2e-app-provider: tests/config/ci/app-registry.yaml maps its one mimetype to "FakeOffice" (the stub used by apiCollaboration) and has no docx entry at all, so the real Collabora/OnlyOffice containers this suite drives never appeared in the web UI's "New file" menu. Add a dedicated app-registry mapping both odt->Collabora and docx->OnlyOffice with allow_creation, and use it only when COLLABORATION_NEEDED is set. Signed-off-by: Lukas Hirt <info@hirt.cz> * fix(tests): trust federated oCIS cert, register office templates by target_ext e2e-ocm: the primary and federated instances each generate their own self-signed proxy cert. Only the primary's was ever added to the system CA trust store, so Chromium refused the federated instance's TLS handshake ("tls: unknown certificate") once federation began. Trust the federated cert too, and thread OCIS_BASE_DATA_PATH through its `ocis init` call (previously only set for the running server), since that's where the cert actually gets written. e2e-app-provider: reproduced the suite locally (real Collabora/ OnlyOffice containers + `ocis collaboration server`) and diffed `/app/list` before/after. allow_creation and default_app alone don't make the web UI's "New file" menu show an entry -- it additionally requires app_providers[].target_ext, which reva's app-provider only stamps onto a hardcoded set of "-template" mimetypes (vendor/github.com/owncloud/reva/v2/.../appprovider/templates.go), not the plain document mimetypes the previous config used. Existing odt/ docx files still open fine without a static entry, since Collabora/ OnlyOffice register their full supported mimetype list dynamically via WOPI discovery -- it's specifically file *creation* that needs this. Signed-off-by: Lukas Hirt <info@hirt.cz> * fix(changelog): shorten title over the 80-char lint limit changelog/unreleased/bugfix-personal-space-fail-closed.md landed on master (#12442) with a 97-char title, which changelog-lint rejects. GitHub tests PRs against a merge with the current master tip, so this started failing build-and-test on every open PR once master picked up that commit -- unrelated to this branch's own changes. Fixing it here since master needed to be merged in anyway. * fix(tests): load web apps the ocm/app-provider e2e suites depend on Both suites drive the web UI, and web only loads the web apps listed in its UI config's "apps" array. run-e2e.py reuses tests/config/ci/ocis-config.json, which predates the playwright suites and lists neither app they need, so both failed deterministically while the API-only Behat suites (apiOcm, apiCollaboration) kept passing: e2e-ocm: the "open-cloud-mesh" app menu item can never render because "ocm" was missing, so web-app-ocm was never loaded. Add it for the federated suite. Behind that sat a second bug: the invite flow embeds token@<BASE_URL_OCIS host> (127.0.0.1:9200) into invite codes, but the federated instance authorizes providers against tests/config/local/providers.json, which only lists localhost:9200. Address the primary as https://localhost:9200 when federated, mirroring run-github.py's passing apiOcm setup (the self-signed cert covers both hosts; other suites keep 127.0.0.1). e2e-app-provider: web-runtime only builds the per-provider Collabora/ OnlyOffice editor apps -- including their "New file" menu entries -- when web-app-external is loaded (web/packages/web-runtime/src/index.ts gates on applicationStore.has('web-app-external')), and "external" was missing. This also falsifies the previous target_ext theory: the template-mimetype registry was active in the failing run and the menu still never appeared, because the New-file menu needs only allow_creation plus a registered provider (web-app-external/src/index.ts). Revert the app registry to the plain odt->Collabora / docx->OnlyOffice mimetypes web's own e2e CI proved out (web/dev/docker/ocis/app-registry.yaml). Create-from-template still works without static entries: reva stamps target_ext onto the -template mimetypes the providers register via WOPI discovery. Signed-off-by: Lukas Hirt <info@hirt.cz> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci: upload playwright traces and a11y report from e2e suites Port the two upload-artifact steps the standalone web repo's e2e workflow had: playwright error contexts/report output on failure, and the a11y report on any non-cancelled run. Paths are prefixed with web/ since the web repo now lives in that subdirectory, artifact names use the suite name instead of the job index, and the action pin matches the one already used in this workflow. Signed-off-by: Lukas Hirt <info@hirt.cz> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(tests): allow office editor iframes in the e2e proxy CSP The app-provider suite got past file creation but every office test then timed out waiting for the editor to render: ocis's default proxy CSP only allows frame-src 'self' (exact scheme+host+port), so the browser refused to embed the Collabora/OnlyOffice iframes served on other ports. The COLLABORA_DOMAIN/ONLYOFFICE_DOMAIN env vars do nothing on their own -- they are only substituted into a custom CSP file, which is why the pre-merge web CI always set PROXY_CSP_CONFIG_FILE_LOCATION (tests/drone/csp.yaml there). The localStorage SecurityError seen in the logs was a downstream symptom: the CSP-blocked frame ends up with an opaque origin where storage access throws. Add the two editor domains to tests/config/ci/csp.yaml's frame-src and img-src (mirroring web's proven csp.yaml) and point the collaboration suite at it. The keycloak suite shares this file; for it the new entries fall back to nonexistent default hosts and are inert. Signed-off-by: Lukas Hirt <info@hirt.cz> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(licenses): attribute REUSE.toml copyright to ownCloud contributors The web/ tree carries community contributions dating back to 2016; the CLA grants a relicensing right, not a copyright transfer, so declaring sole 2020-2026 ownCloud GmbH authorship was inaccurate. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(tests): trust the Keycloak cert in e2e TLS setup The Keycloak cert had no SAN, and NODE_EXTRA_CA_CERTS only ever pointed at the oCIS cert, so any node-fetch/axios call made directly against Keycloak (admin token fetch, user provisioning) failed TLS validation and aborted the keycloak/mfa matrix jobs before a spec could run. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(web): don't wipe assets/ before a successful build build-assets ran `git clean -xfd assets` before the pnpm build; a failed typecheck or vite build left assets/core/ empty, so the next Go embed or docker deployment served no web UI. Clean only after the build succeeds. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * ci: fail clearly when a release tag matches no known package If the tag-prefix loop found no match, the workflow silently fell through to a jq lookup against "packages//package.json", failing with a confusing path error instead of naming the problem. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * ci: drop duplicate dependency-license-check job web-tests.yml already enforces the license allow-list via `pnpm licenses:check` (license-checker-rseidelsohn) on every PR. check-licenses.yml's dependency-license-check ran a second, differently configured tool (npx license-checker, GPL/AGPL deny-list only), which could disagree with the first without adding coverage. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Signed-off-by: Lukas Hirt <info@hirt.cz> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |