Files
Ferdinand Thiessen fe7bbd6bcd feat(files_versions): allow to block version creation using WFE
This allows users to create workflows to block the versions creation
for some files, based on tags or other conditions using the workflow
engine.
The usecase would be compliance to allow configure some rules to prevent
versioning.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-05-27 10:46:40 +02:00

158 lines
5.8 KiB
TypeScript

/*!
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: CC0-1.0
*/
import { createAppConfig } from '@nextcloud/vite-config'
import { resolve } from 'node:path'
const modules = {
appstore: {
main: resolve(import.meta.dirname, 'apps/appstore/src', 'main.ts'),
},
comments: {
'comments-app': resolve(import.meta.dirname, 'apps/comments/src', 'comments-app.ts'),
'comments-tab': resolve(import.meta.dirname, 'apps/comments/src', 'files-sidebar.ts'),
init: resolve(import.meta.dirname, 'apps/comments/src', 'init.ts'),
},
dav: {
'settings-admin-caldav': resolve(import.meta.dirname, 'apps/dav/src', 'settings-admin.ts'),
'settings-admin-example-content': resolve(import.meta.dirname, 'apps/dav/src', 'settings-admin-example-content.ts'),
'settings-personal-availability': resolve(import.meta.dirname, 'apps/dav/src', 'settings-personal-availability.ts'),
},
encryption: {
encryption: resolve(import.meta.dirname, 'apps/encryption/src', 'encryption.ts'),
settings_admin: resolve(import.meta.dirname, 'apps/encryption/src', 'settings-admin.ts'),
settings_personal: resolve(import.meta.dirname, 'apps/encryption/src', 'settings-personal.ts'),
},
federation: {
'settings-admin': resolve(import.meta.dirname, 'apps/federation/src', 'settings-admin.ts'),
},
federatedfilesharing: {
'init-files': resolve(import.meta.dirname, 'apps/federatedfilesharing/src', 'init-files.js'),
'settings-admin': resolve(import.meta.dirname, 'apps/federatedfilesharing/src', 'settings-admin.ts'),
'settings-personal': resolve(import.meta.dirname, 'apps/federatedfilesharing/src', 'settings-personal.ts'),
},
files_external: {
auth_rsa: resolve(import.meta.dirname, 'apps/files_external/src', 'auth-rsa.ts'),
init: resolve(import.meta.dirname, 'apps/files_external/src', 'init-files.ts'),
init_settings: resolve(import.meta.dirname, 'apps/files_external/src', 'init-settings.ts'),
settings: resolve(import.meta.dirname, 'apps/files_external/src', 'settings-main.ts'),
},
files_reminders: {
init: resolve(import.meta.dirname, 'apps/files_reminders/src', 'files-init.ts'),
},
files_trashbin: {
init: resolve(import.meta.dirname, 'apps/files_trashbin/src', 'files-init.ts'),
},
files_versions: {
'sidebar-tab': resolve(import.meta.dirname, 'apps/files_versions/src', 'sidebar_tab.ts'),
workflow: resolve(import.meta.dirname, 'apps/files_versions/src', 'workflow.ts'),
},
oauth2: {
'settings-admin': resolve(import.meta.dirname, 'apps/oauth2/src', 'settings-admin.ts'),
},
profile: {
main: resolve(import.meta.dirname, 'apps/profile/src', 'main.ts'),
reference: resolve(import.meta.dirname, 'apps/profile/src', 'reference.js'),
},
sharebymail: {
'admin-settings': resolve(import.meta.dirname, 'apps/sharebymail/src', 'settings-admin.ts'),
},
systemtags: {
init: resolve(import.meta.dirname, 'apps/systemtags/src', 'init.ts'),
admin: resolve(import.meta.dirname, 'apps/systemtags/src', 'admin.ts'),
},
theming: {
'settings-personal': resolve(import.meta.dirname, 'apps/theming/src', 'settings-personal.ts'),
'settings-admin': resolve(import.meta.dirname, 'apps/theming/src', 'settings-admin.ts'),
theming: resolve(import.meta.dirname, 'apps/theming/src', 'theming.ts'),
},
twofactor_backupcodes: {
'settings-personal': resolve(import.meta.dirname, 'apps/twofactor_backupcodes/src', 'settings-personal.ts'),
},
user_ldap: {
renewPassword: resolve(import.meta.dirname, 'apps/user_ldap/src', 'renewPassword.ts'),
'settings-admin': resolve(import.meta.dirname, 'apps/user_ldap/src', 'settings-admin.ts'),
},
user_status: {
menu: resolve(import.meta.dirname, 'apps/user_status/src', 'menu.js'),
},
}
// convert modules to modules entries prefied with the app id
const viteModuleEntries = Object.entries(modules)
.map(([appId, entries]) => (
Object.entries(entries)
.map(([entryName, entryPath]) => [`${appId}-${entryName}`, entryPath])
))
.flat(1)
export default createAppConfig(Object.fromEntries(viteModuleEntries), {
createEmptyCSSEntryPoints: true,
emptyOutputDirectory: {
additionalDirectories: [resolve(import.meta.dirname, '../..', 'dist')],
},
extractLicenseInformation: {
includeSourceMaps: true,
},
config: {
root: resolve(import.meta.dirname, '../..'),
resolve: {
preserveSymlinks: true,
},
build: {
outDir: 'dist',
rollupOptions: {
output: {
entryFileNames: '[name].mjs',
chunkFileNames: '[name]-[hash].chunk.mjs',
assetFileNames({ originalFileNames }) {
const apps = originalFileNames.map((name) => name.match(/apps\/([^/]+)\//)?.[1])
.filter(Boolean)
const appId = apps.length === 1 ? apps[0] : 'common'
return `${appId}-[name]-[hash][extname]`
},
experimentalMinChunkSize: 100 * 1024,
/* // with rolldown-vite:
advancedChunks: {
groups: [
// one group for common dependencies
{ name: 'common', test: /[\\/]node_modules[\\/]/ },
// one group per app with a lower minShareCount to encourage sharing within the app
...Object.keys(modules).map((name) => ({
name,
test: new RegExp(`[\\\\/]apps[\\\\/]${name}[\\\\/]`),
minShareCount: 2,
})),
],
// only include modules in the groups if they are used at least by 3 different chunks
minShareCount: 3,
// only include modules in the groups if they are smaller than 400kb on its own
// maxModuleSize: 400 * 1024,
// define the groups output size (not too small but also not too big!)
minSize: 100 * 1024,
maxSize: 800 * 1024,
},
},
experimental: {
strictExecutionOrder: true,
},
*/
},
},
},
experimental: {
renderBuiltUrl(filename, { hostType }) {
if (hostType === 'css') {
return `./${filename}`
}
return {
runtime: `window.OC.filePath('', '', 'dist/${filename}')`,
}
},
},
},
})