Compare commits
	
		
			1 Commits
		
	
	
		
			v0.93.0
			...
			algolia_v1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | baed93e749 | 
| @@ -1,44 +1,7 @@ | ||||
| # ignored Files | ||||
| .dockerignore | ||||
| .editorconfig | ||||
| .git* | ||||
| .prettier* | ||||
| electron* | ||||
| entitlements.plist | ||||
| nodemon.json | ||||
| renovate.json | ||||
| trilium.iml | ||||
| Dockerfile | ||||
| Dockerfile.* | ||||
| npm-debug.log | ||||
| /src/**/*.spec.ts | ||||
|  | ||||
| # ignored folders | ||||
| /.cache | ||||
| /.git | ||||
| /.github | ||||
| /.idea | ||||
| /.vscode | ||||
| .git | ||||
| .idea | ||||
| /bin | ||||
| /build | ||||
| /dist | ||||
| /docs | ||||
| /dump-db | ||||
| /e2e | ||||
| /integration-tests | ||||
| /spec | ||||
| /test | ||||
| /test-etapi | ||||
| /node_modules | ||||
|  | ||||
|  | ||||
| # exceptions | ||||
| !/bin/copy-dist.ts | ||||
| !/bin/cleanupNodeModules.ts | ||||
|  | ||||
| # temporary exception to make copy-dist inside Docker build not fail | ||||
| # TriliumNextTODO: make copy-dist *not* requiring to copy these file for builds other than electron-forge | ||||
| !forge.config.cjs | ||||
| !/bin/tpl | ||||
| !/bin/electron-forge/desktop.ejs | ||||
| !/bin/electron-forge/sign-windows.cjs | ||||
| /npm-debug.log | ||||
| node_modules | ||||
|   | ||||
| @@ -1,23 +0,0 @@ | ||||
| root = true | ||||
|  | ||||
| [*.{js,ts}] | ||||
| charset = utf-8 | ||||
| end_of_line = lf | ||||
| indent_size = 4 | ||||
| indent_style = space | ||||
| insert_final_newline = true | ||||
| trim_trailing_whitespace = true | ||||
|  | ||||
| [{server,translation}.json] | ||||
| charset = utf-8 | ||||
| end_of_line = lf | ||||
| indent_size = 2 | ||||
| indent_style = space | ||||
| insert_final_newline = true | ||||
| trim_trailing_whitespace = true | ||||
|  | ||||
| [*.yml] | ||||
| indent_size = 2 | ||||
| indent_style = space | ||||
| insert_final_newline = true | ||||
| trim_trailing_whitespace = true | ||||
							
								
								
									
										13
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,13 +0,0 @@ | ||||
| package-lock.json linguist-generated=true | ||||
| **/package-lock.json linguist-generated=true | ||||
| src/public/app/doc_notes/en/User[[:space:]]Guide/** linguist-generated=true | ||||
| src/public/app/doc_notes/en/User[[:space:]]Guide/**/*.md eol=lf | ||||
|  | ||||
| demo/**/*.html eol=lf | ||||
| demo/**/*.json eol=lf | ||||
| demo/**/*.svg eol=lf | ||||
| demo/**/*.txt eol=lf | ||||
| demo/**/*.js eol=lf | ||||
| demo/**/*.css eol=lf | ||||
|  | ||||
| libraries/** linguist-vendored | ||||
							
								
								
									
										4
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,4 +1,4 @@ | ||||
| # These are supported funding model platforms | ||||
|  | ||||
| github: [eliandoran] | ||||
| custom: ["https://paypal.me/eliandoran"] | ||||
| github: [zadam] | ||||
| custom: ["https://paypal.me/za4am"] | ||||
|   | ||||
							
								
								
									
										40
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,18 +1,20 @@ | ||||
| name: Bug Report | ||||
| description: Report a bug | ||||
| type: "Bug" | ||||
| title: "(Bug report) " | ||||
| labels: "Type: Bug" | ||||
| body: | ||||
| - type: textarea | ||||
| - type: checkboxes | ||||
|   attributes: | ||||
|     label: Description | ||||
|     description: A clear and concise description of the bug and any additional information. | ||||
|   validations: | ||||
|     required: true | ||||
|     label: Preflight Checklist | ||||
|     description: Please ensure you've completed all of the following. | ||||
|     options: | ||||
|       - label: I have searched the [issue tracker](https://www.github.com/zadam/trilium/issues) for a bug report that matches the one I want to file, without success. | ||||
|         required: true | ||||
| - type: input | ||||
|   attributes: | ||||
|     label: TriliumNext Version | ||||
|     description: What version of TriliumNext are you using? | ||||
|     placeholder: 0.90.0-beta | ||||
|     label: Trilium Version | ||||
|     description: What version of Trilium are you using? | ||||
|     placeholder: 0.48.0-beta | ||||
|   validations: | ||||
|     required: true | ||||
| - type: dropdown | ||||
| @@ -28,8 +30,8 @@ body: | ||||
|     required: true | ||||
| - type: dropdown | ||||
|   attributes: | ||||
|     label: What is your setup? | ||||
|     description: https://triliumnext.github.io/Docs/Wiki/quick-start.html | ||||
|     label: What is your setup?  | ||||
|     description: https://github.com/zadam/trilium/wiki#choose-the-setup | ||||
|     options: | ||||
|       - Local (no sync) | ||||
|       - Local + server sync | ||||
| @@ -45,7 +47,17 @@ body: | ||||
|     required: true | ||||
| - type: textarea | ||||
|   attributes: | ||||
|     label: Error logs | ||||
|     description: Please provide error logs, see [wiki page](https://triliumnext.github.io/Docs/Wiki/error-logs.html) for instructions on how to submit them. | ||||
|     label: Expected Behavior | ||||
|     description: A clear and concise description of what you expected to happen. | ||||
|   validations: | ||||
|     required: false | ||||
|     required: true | ||||
| - type: textarea | ||||
|   attributes: | ||||
|     label: Actual Behavior | ||||
|     description: A clear description of what actually happens. | ||||
|   validations: | ||||
|     required: true | ||||
| - type: textarea | ||||
|   attributes: | ||||
|     label: Additional Information | ||||
|     description: If your problem needs further explanation, or if the issue you're seeing cannot be reproduced in a gist, please add more information here. | ||||
|   | ||||
							
								
								
									
										14
									
								
								.github/ISSUE_TEMPLATE/feature_request.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,11 +1,19 @@ | ||||
| name: Feature Request | ||||
| description: Ask for a new feature to be added | ||||
| type: "Feature" | ||||
| description: Report a bug | ||||
| title: "(Feature request) " | ||||
| labels: "Type: Enhancement" | ||||
| body: | ||||
| - type: checkboxes | ||||
|   attributes: | ||||
|     label: Preflight Checklist | ||||
|     description: Please ensure you've completed all of the following. | ||||
|     options: | ||||
|       - label: I have searched the [issue tracker](https://www.github.com/zadam/trilium/issues) for a feature request that matches the one I want to file, without success. | ||||
|         required: true | ||||
| - type: textarea | ||||
|   attributes: | ||||
|     label: Describe feature | ||||
|     description: A clear and concise description of what you want to be added. | ||||
|     description: A clear and concise description of what you want to be added.. | ||||
|   validations: | ||||
|     required: true | ||||
| - type: textarea | ||||
|   | ||||
							
								
								
									
										10
									
								
								.github/ISSUE_TEMPLATE/task.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,10 +0,0 @@ | ||||
| name: Task | ||||
| description: Create a new Task | ||||
| type: "Task" | ||||
| body: | ||||
| - type: textarea | ||||
|   attributes: | ||||
|     label: Describe Task | ||||
|     description: A clear and concise description of what the task is about. | ||||
|   validations: | ||||
|     required: true | ||||
							
								
								
									
										160
									
								
								.github/actions/build-electron/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,160 +0,0 @@ | ||||
| name: "Build Electron App" | ||||
| description: "Builds and packages the Electron app for different platforms" | ||||
|  | ||||
| inputs: | ||||
|   os: | ||||
|     description: "One of the supported platforms: macos, linux, windows" | ||||
|     required: true | ||||
|   arch: | ||||
|     description: "The architecture to build for: x64, arm64" | ||||
|     required: true | ||||
|   shell: | ||||
|     description: "Which shell to use" | ||||
|     required: true | ||||
|   forge_platform: | ||||
|     description: "The --platform to pass to Electron Forge" | ||||
|     required: true | ||||
|  | ||||
| runs: | ||||
|   using: composite | ||||
|   steps: | ||||
|   # Certificate setup | ||||
|   - name: Import Apple certificates | ||||
|     if: inputs.os == 'macos' | ||||
|     uses: apple-actions/import-codesign-certs@v3 | ||||
|     with: | ||||
|       p12-file-base64: ${{ env.APPLE_APP_CERTIFICATE_BASE64 }} | ||||
|       p12-password: ${{ env.APPLE_APP_CERTIFICATE_PASSWORD }} | ||||
|       keychain: build | ||||
|       keychain-password: ${{ github.run_id }} | ||||
|  | ||||
|   - name: Install Installer certificate | ||||
|     if: inputs.os == 'macos' | ||||
|     uses: apple-actions/import-codesign-certs@v3 | ||||
|     with: | ||||
|       p12-file-base64: ${{ env.APPLE_INSTALLER_CERTIFICATE_BASE64 }} | ||||
|       p12-password: ${{ env.APPLE_INSTALLER_CERTIFICATE_PASSWORD }} | ||||
|       keychain: build | ||||
|       keychain-password: ${{ github.run_id }} | ||||
|       # We don't need to create a keychain here because we're using the build keychain that was created in the previous step | ||||
|       create-keychain: false | ||||
|  | ||||
|   - name: Verify certificates | ||||
|     if: inputs.os == 'macos' | ||||
|     shell: ${{ inputs.shell }} | ||||
|     run: | | ||||
|       echo "Available signing identities:" | ||||
|       security find-identity -v -p codesigning build.keychain | ||||
|  | ||||
|   - name: Set up Python and other macOS dependencies | ||||
|     if: ${{ inputs.os == 'macos' }} | ||||
|     shell: ${{ inputs.shell }} | ||||
|     run: | | ||||
|       brew install python-setuptools | ||||
|       brew install create-dmg | ||||
|  | ||||
|   - name: Install dependencies for RPM and Flatpak package building | ||||
|     if: ${{ inputs.os == 'linux' }} | ||||
|     shell: ${{ inputs.shell }} | ||||
|     run: | | ||||
|       sudo apt-get update && sudo apt-get install rpm flatpak-builder elfutils | ||||
|       flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo | ||||
|       FLATPAK_ARCH=$(if [[ ${{ inputs.arch }} = 'arm64' ]]; then echo 'aarch64'; else echo 'x86_64'; fi) | ||||
|       FLATPAK_VERSION='24.08' | ||||
|       flatpak install --user --no-deps --arch $FLATPAK_ARCH --assumeyes runtime/org.freedesktop.Platform/$FLATPAK_ARCH/$FLATPAK_VERSION runtime/org.freedesktop.Sdk/$FLATPAK_ARCH/$FLATPAK_VERSION org.electronjs.Electron2.BaseApp/$FLATPAK_ARCH/$FLATPAK_VERSION | ||||
|  | ||||
|   # Build setup | ||||
|   - name: Install dependencies | ||||
|     shell: ${{ inputs.shell }} | ||||
|     run: npm ci | ||||
|  | ||||
|   - name: Update build info | ||||
|     shell: ${{ inputs.shell }} | ||||
|     run: npm run chore:update-build-info | ||||
|  | ||||
|   # Critical debugging configuration | ||||
|   - name: Run electron-forge build with enhanced logging | ||||
|     shell: ${{ inputs.shell }} | ||||
|     env: | ||||
|       # Pass through required environment variables for signing and notarization | ||||
|       APPLE_TEAM_ID: ${{ env.APPLE_TEAM_ID }} | ||||
|       APPLE_ID: ${{ env.APPLE_ID }} | ||||
|       APPLE_ID_PASSWORD: ${{ env.APPLE_ID_PASSWORD }} | ||||
|       WINDOWS_SIGN_EXECUTABLE: ${{ env.WINDOWS_SIGN_EXECUTABLE }} | ||||
|       TRILIUM_ARTIFACT_NAME_HINT: TriliumNextNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }} | ||||
|     run: npm run electron-forge:make -- --arch=${{ inputs.arch }} --platform=${{ inputs.forge_platform }} | ||||
|  | ||||
|   # Add DMG signing step | ||||
|   - name: Sign DMG | ||||
|     if: inputs.os == 'macos' | ||||
|     shell: ${{ inputs.shell }} | ||||
|     run: | | ||||
|       echo "Signing DMG file..." | ||||
|       dmg_file=$(find ./dist -name "*.dmg" -print -quit) | ||||
|       if [ -n "$dmg_file" ]; then | ||||
|         echo "Found DMG: $dmg_file" | ||||
|         # Get the first valid signing identity from the keychain | ||||
|         SIGNING_IDENTITY=$(security find-identity -v -p codesigning build.keychain | grep "Developer ID Application" | head -1 | sed -E 's/.*"([^"]+)".*/\1/') | ||||
|         if [ -z "$SIGNING_IDENTITY" ]; then | ||||
|           echo "Error: No valid Developer ID Application certificate found in keychain" | ||||
|           exit 1 | ||||
|         fi | ||||
|         echo "Using signing identity: $SIGNING_IDENTITY" | ||||
|         # Sign the DMG | ||||
|         codesign --force --sign "$SIGNING_IDENTITY" --options runtime --timestamp "$dmg_file" | ||||
|         # Notarize the DMG | ||||
|         xcrun notarytool submit "$dmg_file" --apple-id "$APPLE_ID" --password "$APPLE_ID_PASSWORD" --team-id "$APPLE_TEAM_ID" --wait | ||||
|         # Staple the notarization ticket | ||||
|         xcrun stapler staple "$dmg_file" | ||||
|       else | ||||
|         echo "No DMG found to sign" | ||||
|       fi | ||||
|  | ||||
|   - name: Verify code signing | ||||
|     if: inputs.os == 'macos' | ||||
|     shell: ${{ inputs.shell }} | ||||
|     run: | | ||||
|       echo "Verifying code signing for all artifacts..." | ||||
|  | ||||
|       # First check the .app bundle | ||||
|       echo "Looking for .app bundle..." | ||||
|       app_bundle=$(find ./dist -name "*.app" -print -quit) | ||||
|       if [ -n "$app_bundle" ]; then | ||||
|         echo "Found app bundle: $app_bundle" | ||||
|         echo "Verifying app bundle signing..." | ||||
|         codesign --verify --deep --strict --verbose=2 "$app_bundle" | ||||
|         echo "Displaying app bundle signing info..." | ||||
|         codesign --display --verbose=2 "$app_bundle" | ||||
|  | ||||
|         echo "Checking entitlements..." | ||||
|         codesign --display --entitlements :- "$app_bundle" | ||||
|  | ||||
|         echo "Checking notarization status..." | ||||
|         xcrun stapler validate "$app_bundle" || echo "Warning: App bundle not notarized yet" | ||||
|       else | ||||
|         echo "No .app bundle found to verify" | ||||
|       fi | ||||
|  | ||||
|       # Then check DMG if it exists | ||||
|       echo "Looking for DMG..." | ||||
|       dmg_file=$(find ./dist -name "*.dmg" -print -quit) | ||||
|       if [ -n "$dmg_file" ]; then | ||||
|         echo "Found DMG: $dmg_file" | ||||
|         echo "Verifying DMG signing..." | ||||
|         codesign --verify --deep --strict --verbose=2 "$dmg_file" | ||||
|         echo "Displaying DMG signing info..." | ||||
|         codesign --display --verbose=2 "$dmg_file" | ||||
|  | ||||
|         echo "Checking DMG notarization..." | ||||
|         xcrun stapler validate "$dmg_file" || echo "Warning: DMG not notarized yet" | ||||
|       else | ||||
|         echo "No DMG found to verify" | ||||
|       fi | ||||
|  | ||||
|       # Finally check ZIP if it exists | ||||
|       echo "Looking for ZIP..." | ||||
|       zip_file=$(find ./dist -name "*.zip" -print -quit) | ||||
|       if [ -n "$zip_file" ]; then | ||||
|         echo "Found ZIP: $zip_file" | ||||
|         echo "Note: ZIP files are not code signed, but their contents should be" | ||||
|       fi | ||||
							
								
								
									
										32
									
								
								.github/actions/build-server/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,32 +0,0 @@ | ||||
| inputs: | ||||
|   os: | ||||
|     description: "One of the supported platforms: windows" | ||||
|     required: true | ||||
|   arch: | ||||
|     description: "The architecture to build for: x64, arm64" | ||||
|     required: true | ||||
| runs: | ||||
|   using: composite | ||||
|   steps: | ||||
|     - name: Set up node & dependencies | ||||
|       uses: actions/setup-node@v4 | ||||
|       with: | ||||
|         node-version: 22 | ||||
|         cache: "npm" | ||||
|     - name: Install dependencies | ||||
|       shell: bash | ||||
|       run: npm ci | ||||
|     - name: Run Linux server build | ||||
|       env: | ||||
|         MATRIX_ARCH: ${{ inputs.arch }} | ||||
|       shell: bash | ||||
|       run: | | ||||
|         npm run chore:update-build-info | ||||
|         ./bin/build-server.sh | ||||
|     - name: Prepare artifacts | ||||
|       shell: bash | ||||
|       run: | | ||||
|         mkdir -p upload | ||||
|         file=$(find dist -name '*.tar.xz' -print -quit) | ||||
|         name=${{ github.ref_name }} | ||||
|         cp "$file" "upload/TriliumNextNotes-Server-${name//\//-}-${{ inputs.os }}-${{ inputs.arch }}.tar.xz" | ||||
							
								
								
									
										79
									
								
								.github/actions/report-size/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,79 +0,0 @@ | ||||
| name: 'Bundle size reporter' | ||||
| description: 'Post bundle size difference compared to another branch' | ||||
| inputs: | ||||
|   branch: | ||||
|     description: 'Branch to compare to' | ||||
|     required: true | ||||
|     default: 'main' | ||||
|   paths: | ||||
|     description: | ||||
|       'Paths to json file bundle size report or folder containing bundles' | ||||
|     required: true | ||||
|     default: '/' | ||||
|   onlyDiff: | ||||
|     description: 'Report only different sizes' | ||||
|     required: false | ||||
|     default: 'false' | ||||
|   filter: | ||||
|     description: 'Regex filter based on file path' | ||||
|     required: false | ||||
|   unit: | ||||
|     description: 'Size unit' | ||||
|     required: false | ||||
|     default: 'KB' | ||||
|  | ||||
|   # Comment inputs | ||||
|   comment: | ||||
|     description: 'Post comment' | ||||
|     required: false | ||||
|     default: 'true' | ||||
|   header: | ||||
|     description: 'Comment header' | ||||
|     required: false | ||||
|     default: 'Bundle size report' | ||||
|   append: | ||||
|     description: 'Append comment' | ||||
|     required: false | ||||
|     default: 'false' | ||||
|   ghToken: | ||||
|     description: 'Github token' | ||||
|     required: false | ||||
|  | ||||
| runs: | ||||
|   using: 'composite' | ||||
|   steps: | ||||
|     # Checkout branch to compare to [required] | ||||
|     - name: Checkout base branch | ||||
|       uses: actions/checkout@v4 | ||||
|       with: | ||||
|         ref: ${{ inputs.branch }} | ||||
|         path: br-base | ||||
|         token: ${{ inputs.ghToken }} | ||||
|  | ||||
|     # Generate the bundle size difference report [required] | ||||
|     - name: Generate report | ||||
|       id: bundleSize | ||||
|       uses: nejcm/bundle-size-reporter-action@v1.4.1 | ||||
|       with: | ||||
|         paths: ${{ inputs.paths }} | ||||
|         onlyDiff: ${{ inputs.onlyDiff }} | ||||
|         filter: ${{ inputs.filter }} | ||||
|         unit: ${{ inputs.unit }} | ||||
|  | ||||
|     # Post github action summary | ||||
|     - name: Post summary | ||||
|       if: ${{ steps.bundleSize.outputs.hasDifferences == 'true' }} # post only in case of changes | ||||
|       run: | | ||||
|         echo '${{ steps.bundleSize.outputs.summary }}' >> $GITHUB_STEP_SUMMARY | ||||
|       shell: bash | ||||
|  | ||||
|     # Post github action comment | ||||
|     - name: Post comment | ||||
|       uses: marocchino/sticky-pull-request-comment@v2 | ||||
|       if: ${{ steps.bundleSize.outputs.hasDifferences == 'true' }} # post only in case of changes | ||||
|       with: | ||||
|         number: ${{ github.event.pull_request.number }} | ||||
|         header: ${{ inputs.header }} | ||||
|         append: ${{ inputs.append }} | ||||
|         message: '${{ steps.bundleSize.outputs.summary }}' | ||||
|         GITHUB_TOKEN: ${{ inputs.ghToken }} | ||||
							
								
								
									
										100
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,100 +0,0 @@ | ||||
| # For most projects, this workflow file will not need changing; you simply need | ||||
| # to commit it to your repository. | ||||
| # | ||||
| # You may wish to alter this file to override the set of languages analyzed, | ||||
| # or to provide custom queries or build logic. | ||||
| # | ||||
| # ******** NOTE ******** | ||||
| # We have attempted to detect the languages in your repository. Please check | ||||
| # the `language` matrix defined below to confirm you have the correct set of | ||||
| # supported CodeQL languages. | ||||
| # | ||||
| name: "CodeQL Advanced" | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: [ "develop" ] | ||||
|   pull_request: | ||||
|     branches: [ "develop" ] | ||||
|   schedule: | ||||
|     - cron: '20 7 * * 0' | ||||
|  | ||||
| jobs: | ||||
|   analyze: | ||||
|     name: Analyze (${{ matrix.language }}) | ||||
|     # Runner size impacts CodeQL analysis time. To learn more, please see: | ||||
|     #   - https://gh.io/recommended-hardware-resources-for-running-codeql | ||||
|     #   - https://gh.io/supported-runners-and-hardware-resources | ||||
|     #   - https://gh.io/using-larger-runners (GitHub.com only) | ||||
|     # Consider using larger runners or machines with greater resources for possible analysis time improvements. | ||||
|     runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} | ||||
|     permissions: | ||||
|       # required for all workflows | ||||
|       security-events: write | ||||
|  | ||||
|       # required to fetch internal or private CodeQL packs | ||||
|       packages: read | ||||
|  | ||||
|       # only required for workflows in private repositories | ||||
|       actions: read | ||||
|       contents: read | ||||
|  | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         include: | ||||
|         - language: actions | ||||
|           build-mode: none | ||||
|         - language: javascript-typescript | ||||
|           build-mode: none | ||||
|         # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' | ||||
|         # Use `c-cpp` to analyze code written in C, C++ or both | ||||
|         # Use 'java-kotlin' to analyze code written in Java, Kotlin or both | ||||
|         # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both | ||||
|         # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, | ||||
|         # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. | ||||
|         # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how | ||||
|         # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages | ||||
|     steps: | ||||
|     - name: Checkout repository | ||||
|       uses: actions/checkout@v4 | ||||
|  | ||||
|     # Add any setup steps before running the `github/codeql-action/init` action. | ||||
|     # This includes steps like installing compilers or runtimes (`actions/setup-node` | ||||
|     # or others). This is typically only required for manual builds. | ||||
|     # - name: Setup runtime (example) | ||||
|     #   uses: actions/setup-example@v1 | ||||
|  | ||||
|     # Initializes the CodeQL tools for scanning. | ||||
|     - name: Initialize CodeQL | ||||
|       uses: github/codeql-action/init@v3 | ||||
|       with: | ||||
|         languages: ${{ matrix.language }} | ||||
|         build-mode: ${{ matrix.build-mode }} | ||||
|         # If you wish to specify custom queries, you can do so here or in a config file. | ||||
|         # By default, queries listed here will override any specified in a config file. | ||||
|         # Prefix the list here with "+" to use these queries and those in the config file. | ||||
|  | ||||
|         # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs | ||||
|         # queries: security-extended,security-and-quality | ||||
|  | ||||
|     # If the analyze step fails for one of the languages you are analyzing with | ||||
|     # "We were unable to automatically build your code", modify the matrix above | ||||
|     # to set the build mode to "manual" for that language. Then modify this step | ||||
|     # to build your code. | ||||
|     # ℹ️ Command-line programs to run using the OS shell. | ||||
|     # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun | ||||
|     - if: matrix.build-mode == 'manual' | ||||
|       shell: bash | ||||
|       run: | | ||||
|         echo 'If you are using a "manual" build mode for one or more of the' \ | ||||
|           'languages you are analyzing, replace this with the commands to build' \ | ||||
|           'your code, for example:' | ||||
|         echo '  make bootstrap' | ||||
|         echo '  make release' | ||||
|         exit 1 | ||||
|  | ||||
|     - name: Perform CodeQL Analysis | ||||
|       uses: github/codeql-action/analyze@v3 | ||||
|       with: | ||||
|         category: "/language:${{matrix.language}}" | ||||
							
								
								
									
										178
									
								
								.github/workflows/dev.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,178 +0,0 @@ | ||||
| name: Dev | ||||
| on: | ||||
|   push: | ||||
|     branches: [ develop ] | ||||
|   pull_request: | ||||
|     branches: [ develop ] | ||||
|  | ||||
| concurrency: | ||||
|   group: ${{ github.workflow }}-${{ github.ref }} | ||||
|   cancel-in-progress: true | ||||
|  | ||||
| env: | ||||
|   GHCR_REGISTRY: ghcr.io | ||||
|   DOCKERHUB_REGISTRY: docker.io | ||||
|   IMAGE_NAME: ${{ github.repository_owner }}/notes | ||||
|   TEST_TAG: ${{ github.repository_owner }}/notes:test | ||||
|  | ||||
| permissions: | ||||
|   pull-requests: write  # for PR comments | ||||
|  | ||||
| jobs: | ||||
|   report-electron-size: | ||||
|     name: Report Electron size | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout the repository | ||||
|         uses: actions/checkout@v4 | ||||
|  | ||||
|       - name: Set up node & dependencies | ||||
|         uses: actions/setup-node@v4 | ||||
|         with: | ||||
|           node-version: 22 | ||||
|           cache: "npm" | ||||
|  | ||||
|       - run: npm ci | ||||
|  | ||||
|       - name: Run the build | ||||
|         uses: ./.github/actions/build-electron | ||||
|         with: | ||||
|           os: linux | ||||
|           arch: x64 | ||||
|           shell: bash | ||||
|           forge_platform: linux | ||||
|  | ||||
|       - name: Run the Electron size report | ||||
|         uses: ./.github/actions/report-size | ||||
|         with: | ||||
|           paths: 'upload/**/*' | ||||
|           onlyDiff: 'true' | ||||
|           branch: 'develop' | ||||
|           header: 'Electron size report' | ||||
|           unit: "MB" | ||||
|           ghToken: ${{ secrets.GITHUB_TOKEN }} | ||||
|   report-server-size: | ||||
|     name: Report server size | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout the repository | ||||
|         uses: actions/checkout@v4 | ||||
|  | ||||
|       - name: Set up node & dependencies | ||||
|         uses: actions/setup-node@v4 | ||||
|         with: | ||||
|           node-version: 22 | ||||
|           cache: "npm" | ||||
|  | ||||
|       - run: npm ci | ||||
|  | ||||
|       - name: Run the build | ||||
|         uses: ./.github/actions/build-server | ||||
|         with: | ||||
|           os: linux | ||||
|           arch: x64 | ||||
|  | ||||
|       - name: Run the server size report | ||||
|         uses: ./.github/actions/report-size | ||||
|         with: | ||||
|           paths: 'upload/**/*' | ||||
|           onlyDiff: 'true' | ||||
|           branch: 'develop' | ||||
|           header: 'Server size report' | ||||
|           unit: "MB" | ||||
|           ghToken: ${{ secrets.GITHUB_TOKEN }} | ||||
|  | ||||
|   test_dev: | ||||
|     name: Test development | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout the repository | ||||
|         uses: actions/checkout@v4 | ||||
|  | ||||
|       - name: Set up node & dependencies | ||||
|         uses: actions/setup-node@v4 | ||||
|         with: | ||||
|           node-version: 22 | ||||
|           cache: "npm" | ||||
|  | ||||
|       - run: npm ci | ||||
|  | ||||
|       - name: Run the TypeScript build | ||||
|         run: npx tsc | ||||
|  | ||||
|       - name: Run the unit tests | ||||
|         run: npm run test | ||||
|  | ||||
|   build_docker: | ||||
|     name: Build Docker image | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: | ||||
|       - test_dev | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - name: Install dependencies | ||||
|         run: npm ci | ||||
|       - name: Update build info | ||||
|         run: npm run chore:update-build-info | ||||
|       - uses: docker/setup-buildx-action@v3 | ||||
|       - uses: docker/build-push-action@v6 | ||||
|         with: | ||||
|           context: . | ||||
|           cache-from: type=gha | ||||
|           cache-to: type=gha,mode=max | ||||
|   test_docker: | ||||
|     name: Check Docker build | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: | ||||
|       - build_docker | ||||
|     strategy: | ||||
|       matrix: | ||||
|         include: | ||||
|           - dockerfile: Dockerfile.alpine | ||||
|           - dockerfile: Dockerfile | ||||
|     steps: | ||||
|       - name: Checkout the repository | ||||
|         uses: actions/checkout@v4 | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         run: npm ci | ||||
|  | ||||
|       - name: Update build info | ||||
|         run: npm run chore:update-build-info | ||||
|  | ||||
|       - name: Set IMAGE_NAME to lowercase | ||||
|         run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV | ||||
|       - name: Set TEST_TAG to lowercase | ||||
|         run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV | ||||
|  | ||||
|       - name: Set up Docker Buildx | ||||
|         uses: docker/setup-buildx-action@v3 | ||||
|  | ||||
|       - name: Build and export to Docker | ||||
|         uses: docker/build-push-action@v6 | ||||
|         with: | ||||
|           context: . | ||||
|           file: ${{ matrix.dockerfile }} | ||||
|           load: true | ||||
|           tags: ${{ env.TEST_TAG }} | ||||
|           cache-from: type=gha | ||||
|           cache-to: type=gha,mode=max | ||||
|  | ||||
|       - name: Validate container run output | ||||
|         run: | | ||||
|           CONTAINER_ID=$(docker run -d --log-driver=journald --rm --name trilium_local ${{ env.TEST_TAG }}) | ||||
|           echo "Container ID: $CONTAINER_ID" | ||||
|  | ||||
|       - name: Wait for the healthchecks to pass | ||||
|         uses: stringbean/docker-healthcheck-action@v3 | ||||
|         with: | ||||
|           container: trilium_local | ||||
|           wait-time: 50 | ||||
|           require-status: running | ||||
|           require-healthy: true | ||||
|  | ||||
|       # Print the entire log of the container thus far, regardless if the healthcheck failed or succeeded | ||||
|       - name: Print entire log | ||||
|         if: always() | ||||
|         run: | | ||||
|           journalctl -u docker CONTAINER_NAME=trilium_local --no-pager | ||||
							
								
								
									
										53
									
								
								.github/workflows/docker.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,53 @@ | ||||
| name: Publish Docker image | ||||
| on: | ||||
|   push: | ||||
|     tags: [v*] | ||||
| jobs: | ||||
|   push_to_registries: | ||||
|     name: Push Docker image to multiple registries | ||||
|     runs-on: ubuntu-latest | ||||
|     permissions: | ||||
|       packages: write | ||||
|       contents: read | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v1 | ||||
|       - name: Docker meta | ||||
|         id: meta | ||||
|         uses: docker/metadata-action@v3 | ||||
|         with: | ||||
|           images: | | ||||
|             zadam/trilium | ||||
|             ghcr.io/zadam/trilium | ||||
|           tags: | | ||||
|             type=semver,pattern={{version}} | ||||
|             type=semver,pattern={{major}}.{{minor}}-latest | ||||
|             type=match,pattern=(\d+.\d+).\d+\-beta,enable=${{ endsWith(github.ref, 'beta') }},group=1,suffix=-latest | ||||
|       - name: Set up Docker Buildx | ||||
|         uses: docker/setup-buildx-action@v1 | ||||
|         with: | ||||
|           install: true | ||||
|       - name: Log in to Docker Hub | ||||
|         uses: docker/login-action@v1 | ||||
|         with: | ||||
|           username: ${{ secrets.DOCKER_USERNAME }} | ||||
|           password: ${{ secrets.DOCKER_PASSWORD }} | ||||
|       - name: Log in to GitHub Docker Registry | ||||
|         uses: docker/login-action@v1 | ||||
|         with: | ||||
|           registry: ghcr.io | ||||
|           username: ${{ github.repository_owner }} | ||||
|           password: ${{ secrets.GITHUB_TOKEN }} | ||||
|       - name: Create server-package.json | ||||
|         run: cat package.json | grep -v electron > server-package.json | ||||
|       - name: Build and Push | ||||
|         uses: docker/build-push-action@v2.7.0 | ||||
|         with: | ||||
|           context: . | ||||
|           platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 | ||||
|           push: true | ||||
|           cache-from: type=registry,ref=zadam/trilium:buildcache | ||||
|           cache-to: type=registry,ref=zadam/trilium:buildcache,mode=max | ||||
|           tags: ${{ steps.meta.outputs.tags }} | ||||
							
								
								
									
										287
									
								
								.github/workflows/main-docker.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,287 +0,0 @@ | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - "develop" | ||||
|       - "feature/update**" | ||||
|       - "feature/server_esm**" | ||||
|     paths-ignore: | ||||
|       - "docs/**" | ||||
|       - "bin/**" | ||||
|     tags: | ||||
|       - "v*" | ||||
|   workflow_dispatch: | ||||
|  | ||||
| env: | ||||
|   GHCR_REGISTRY: ghcr.io | ||||
|   DOCKERHUB_REGISTRY: docker.io | ||||
|   IMAGE_NAME: ${{ github.repository_owner }}/notes | ||||
|   TEST_TAG: ${{ github.repository_owner }}/notes:test | ||||
|  | ||||
| permissions: | ||||
|   contents: read | ||||
|   packages: write | ||||
|  | ||||
| jobs: | ||||
|   test_docker: | ||||
|     name: Check Docker build | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy: | ||||
|       matrix: | ||||
|         include: | ||||
|           - dockerfile: Dockerfile.alpine | ||||
|           - dockerfile: Dockerfile | ||||
|     steps: | ||||
|       - name: Checkout the repository | ||||
|         uses: actions/checkout@v4 | ||||
|  | ||||
|       - name: Set IMAGE_NAME to lowercase | ||||
|         run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV | ||||
|       - name: Set TEST_TAG to lowercase | ||||
|         run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV | ||||
|  | ||||
|       - name: Set up Docker Buildx | ||||
|         uses: docker/setup-buildx-action@v3 | ||||
|  | ||||
|       - name: Set up node & dependencies | ||||
|         uses: actions/setup-node@v4 | ||||
|         with: | ||||
|           node-version: 22 | ||||
|           cache: "npm" | ||||
|  | ||||
|       - name: Install npm dependencies | ||||
|         run: npm ci | ||||
|  | ||||
|       - name: Install Playwright Browsers | ||||
|         run: npx playwright install --with-deps | ||||
|  | ||||
|       - name: Run the TypeScript build | ||||
|         run: npx tsc | ||||
|  | ||||
|       - name: Build and export to Docker | ||||
|         uses: docker/build-push-action@v6 | ||||
|         with: | ||||
|           context: . | ||||
|           file: ${{ matrix.dockerfile }} | ||||
|           load: true | ||||
|           tags: ${{ env.TEST_TAG }} | ||||
|           cache-from: type=gha | ||||
|           cache-to: type=gha,mode=max | ||||
|  | ||||
|       - name: Validate container run output | ||||
|         run: | | ||||
|           CONTAINER_ID=$(docker run -d --log-driver=journald --rm --network=host -e TRILIUM_PORT=8082 --volume ./integration-tests/db:/home/node/trilium-data --name trilium_local ${{ env.TEST_TAG }}) | ||||
|           echo "Container ID: $CONTAINER_ID" | ||||
|  | ||||
|       - name: Wait for the healthchecks to pass | ||||
|         uses: stringbean/docker-healthcheck-action@v3 | ||||
|         with: | ||||
|           container: trilium_local | ||||
|           wait-time: 50 | ||||
|           require-status: running | ||||
|           require-healthy: true | ||||
|  | ||||
|       - name: Run Playwright tests | ||||
|         run: TRILIUM_DOCKER=1 npx playwright test | ||||
|       - uses: actions/upload-artifact@v4 | ||||
|         if: ${{ !cancelled() }} | ||||
|         with: | ||||
|           name: Playwright report (${{ matrix.dockerfile }}) | ||||
|           path: playwright-report/ | ||||
|           retention-days: 30 | ||||
|  | ||||
|       # Print the entire log of the container thus far, regardless if the healthcheck failed or succeeded | ||||
|       - name: Print entire log | ||||
|         if: always() | ||||
|         run: | | ||||
|           journalctl -u docker CONTAINER_NAME=trilium_local --no-pager | ||||
|  | ||||
|   build: | ||||
|     name: Build Docker images | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         include: | ||||
|           - dockerfile: Dockerfile.alpine | ||||
|             platform: linux/amd64 | ||||
|             image: ubuntu-latest | ||||
|           - dockerfile: Dockerfile | ||||
|             platform: linux/arm64 | ||||
|             image: ubuntu-24.04-arm | ||||
|           - dockerfile: Dockerfile | ||||
|             platform: linux/arm/v7 | ||||
|             image: ubuntu-24.04-arm | ||||
|     runs-on: ${{ matrix.image }} | ||||
|     needs: | ||||
|       - test_docker | ||||
|     permissions: | ||||
|       contents: read | ||||
|       packages: write | ||||
|       attestations: write | ||||
|       id-token: write | ||||
|     steps: | ||||
|       - name: Prepare | ||||
|         run: | | ||||
|           platform=${{ matrix.platform }} | ||||
|           echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV | ||||
|       - name: Set IMAGE_NAME to lowercase | ||||
|         run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV | ||||
|       - name: Set TEST_TAG to lowercase | ||||
|         run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV | ||||
|  | ||||
|  | ||||
|       - name: Checkout repository | ||||
|         uses: actions/checkout@v4 | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         run: npm ci | ||||
|  | ||||
|       - name: Update build info | ||||
|         run: npm run chore:update-build-info | ||||
|  | ||||
|       - name: Docker meta | ||||
|         id: meta | ||||
|         uses: docker/metadata-action@v5 | ||||
|         with: | ||||
|           images: | | ||||
|             ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }} | ||||
|             ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }} | ||||
|           tags: | | ||||
|             type=ref,event=branch | ||||
|             type=ref,event=tag | ||||
|             type=sha | ||||
|           flavor: | | ||||
|             latest=false | ||||
|  | ||||
|       - name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v3 | ||||
|  | ||||
|       - name: Set up Docker Buildx | ||||
|         uses: docker/setup-buildx-action@v3 | ||||
|  | ||||
|       - name: Login to GHCR | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: ${{ env.GHCR_REGISTRY }} | ||||
|           username: ${{ github.actor }} | ||||
|           password: ${{ secrets.GITHUB_TOKEN }} | ||||
|  | ||||
|       - name: Login to DockerHub | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: ${{ env.DOCKERHUB_REGISTRY }} | ||||
|           username: ${{ secrets.DOCKERHUB_USERNAME }} | ||||
|           password: ${{ secrets.DOCKERHUB_TOKEN }} | ||||
|  | ||||
|       - name: Build and push by digest | ||||
|         id: build | ||||
|         uses: docker/build-push-action@v6 | ||||
|         with: | ||||
|           context: . | ||||
|           file: ${{ matrix.dockerfile }} | ||||
|           platforms: ${{ matrix.platform }} | ||||
|           labels: ${{ steps.meta.outputs.labels }} | ||||
|           outputs: type=image,name=${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true | ||||
|  | ||||
|       - name: Export digest | ||||
|         run: | | ||||
|           mkdir -p /tmp/digests | ||||
|           digest="${{ steps.build.outputs.digest }}" | ||||
|           touch "/tmp/digests/${digest#sha256:}" | ||||
|  | ||||
|       - name: Upload digest | ||||
|         uses: actions/upload-artifact@v4 | ||||
|         with: | ||||
|           name: digests-${{ env.PLATFORM_PAIR }} | ||||
|           path: /tmp/digests/* | ||||
|           if-no-files-found: error | ||||
|           retention-days: 1 | ||||
|  | ||||
|   merge: | ||||
|     name: Merge manifest lists | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: | ||||
|       - build | ||||
|     steps: | ||||
|       - name: Download digests | ||||
|         uses: actions/download-artifact@v4 | ||||
|         with: | ||||
|           path: /tmp/digests | ||||
|           pattern: digests-* | ||||
|           merge-multiple: true | ||||
|       - name: Set IMAGE_NAME to lowercase | ||||
|         run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV | ||||
|       - name: Set TEST_TAG to lowercase | ||||
|         run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV | ||||
|  | ||||
|       - name: Set up Docker Buildx | ||||
|         uses: docker/setup-buildx-action@v3 | ||||
|  | ||||
|       - name: Docker meta | ||||
|         id: meta | ||||
|         uses: docker/metadata-action@v5 | ||||
|         with: | ||||
|           images: | | ||||
|             ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }} | ||||
|             ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }} | ||||
|           flavor: | | ||||
|             latest=false | ||||
|  | ||||
|       - name: Login to GHCR | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: ${{ env.GHCR_REGISTRY }} | ||||
|           username: ${{ github.actor }} | ||||
|           password: ${{ secrets.GITHUB_TOKEN }} | ||||
|  | ||||
|       - name: Login to DockerHub | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: ${{ env.DOCKERHUB_REGISTRY }} | ||||
|           username: ${{ secrets.DOCKERHUB_USERNAME }} | ||||
|           password: ${{ secrets.DOCKERHUB_TOKEN }} | ||||
|  | ||||
|       - name: Create manifest list and push | ||||
|         working-directory: /tmp/digests | ||||
|         run: | | ||||
|           # Extract the branch or tag name from the ref | ||||
|           REF_NAME=$(echo "${GITHUB_REF}" | sed 's/refs\/heads\///' | sed 's/refs\/tags\///') | ||||
|  | ||||
|           # Create and push the manifest list with both the branch/tag name and the commit SHA | ||||
|           docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ | ||||
|             -t ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:${REF_NAME} \ | ||||
|             $(printf '${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) | ||||
|  | ||||
|           docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ | ||||
|             -t ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${REF_NAME} \ | ||||
|             $(printf '${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) | ||||
|  | ||||
|           # If the ref is a tag, also tag the image as stable as this is part of a 'release' | ||||
|           # and only go in the `if` if there is NOT a `-` in the tag's name, due to tagging of `-alpha`, `-beta`, etc... | ||||
|           if [[ "${GITHUB_REF}" == refs/tags/* && ! "${REF_NAME}" =~ - ]]; then | ||||
|             # First create stable tags | ||||
|             docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ | ||||
|               -t ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:stable \ | ||||
|               $(printf '${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) | ||||
|  | ||||
|             docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ | ||||
|               -t ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:stable \ | ||||
|               $(printf '${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) | ||||
|  | ||||
|             # Small delay to ensure stable tag is fully propagated | ||||
|             sleep 5 | ||||
|  | ||||
|             # Now update latest tags | ||||
|             docker buildx imagetools create \ | ||||
|               -t ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:latest \ | ||||
|               ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:stable | ||||
|  | ||||
|             docker buildx imagetools create \ | ||||
|               -t ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest \ | ||||
|               ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:stable | ||||
|  | ||||
|           fi | ||||
|  | ||||
|       - name: Inspect image | ||||
|         run: | | ||||
|           docker buildx imagetools inspect ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }} | ||||
|           docker buildx imagetools inspect ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }} | ||||
							
								
								
									
										118
									
								
								.github/workflows/nightly.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,118 +0,0 @@ | ||||
| name: Nightly Release | ||||
| on: | ||||
|   # This can be used to automatically publish nightlies at UTC nighttime | ||||
|   schedule: | ||||
|     - cron: "0 2 * * *" # run at 2 AM UTC | ||||
|   # This can be used to allow manually triggering nightlies from the web interface | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     branches: | ||||
|       - renovate/electron-forge* | ||||
|   pull_request: | ||||
|     paths: | ||||
|       - .github/actions/build-electron/* | ||||
|       - forge.config.cjs | ||||
| env: | ||||
|   GITHUB_UPLOAD_URL: https://uploads.github.com/repos/TriliumNext/Notes/releases/179589950/assets{?name,label} | ||||
|   GITHUB_RELEASE_ID: 179589950 | ||||
| permissions: | ||||
|   contents: write | ||||
| jobs: | ||||
|   nightly-electron: | ||||
|     name: Deploy nightly | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         arch: [x64, arm64] | ||||
|         os: | ||||
|           - name: macos | ||||
|             image: macos-latest | ||||
|             shell: bash | ||||
|             forge_platform: darwin | ||||
|           - name: linux | ||||
|             image: ubuntu-latest | ||||
|             shell: bash | ||||
|             forge_platform: linux | ||||
|           - name: windows | ||||
|             image: win-signing | ||||
|             shell: cmd | ||||
|             forge_platform: win32 | ||||
|     runs-on: ${{ matrix.os.image }} | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - name: Set up node & dependencies | ||||
|         uses: actions/setup-node@v4 | ||||
|         with: | ||||
|           node-version: 22 | ||||
|       - name: Install dependencies | ||||
|         run: npm ci | ||||
|       - name: Update nightly version | ||||
|         run: npm run chore:ci-update-nightly-version | ||||
|       - name: Run the build | ||||
|         uses: ./.github/actions/build-electron | ||||
|         with: | ||||
|           os: ${{ matrix.os.name }} | ||||
|           arch: ${{ matrix.arch }} | ||||
|           shell: ${{ matrix.os.shell }} | ||||
|           forge_platform: ${{ matrix.os.forge_platform }} | ||||
|         env: | ||||
|           APPLE_APP_CERTIFICATE_BASE64: ${{ secrets.APPLE_APP_CERTIFICATE_BASE64 }} | ||||
|           APPLE_APP_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_APP_CERTIFICATE_PASSWORD }} | ||||
|           APPLE_INSTALLER_CERTIFICATE_BASE64: ${{ secrets.APPLE_INSTALLER_CERTIFICATE_BASE64 }} | ||||
|           APPLE_INSTALLER_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_INSTALLER_CERTIFICATE_PASSWORD }} | ||||
|           APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} | ||||
|           APPLE_ID: ${{ secrets.APPLE_ID }} | ||||
|           APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} | ||||
|           WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }} | ||||
|  | ||||
|       - name: Publish release | ||||
|         uses: softprops/action-gh-release@v2 | ||||
|         if: ${{ github.event_name != 'pull_request' }} | ||||
|         with: | ||||
|           make_latest: false | ||||
|           prerelease: true | ||||
|           draft: false | ||||
|           fail_on_unmatched_files: true | ||||
|           files: upload/*.* | ||||
|           tag_name: nightly | ||||
|           name: Nightly Build | ||||
|  | ||||
|       - name: Publish artifacts | ||||
|         uses: actions/upload-artifact@v4 | ||||
|         if: ${{ github.event_name == 'pull_request' }} | ||||
|         with: | ||||
|           name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }} | ||||
|           path: upload | ||||
|  | ||||
|   nightly-server: | ||||
|     name: Deploy server nightly | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         arch: [x64, arm64] | ||||
|         include: | ||||
|           - arch: x64 | ||||
|             runs-on: ubuntu-latest | ||||
|           - arch: arm64 | ||||
|             runs-on: ubuntu-24.04-arm | ||||
|     runs-on: ${{ matrix.runs-on }} | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|  | ||||
|       - name: Run the build | ||||
|         uses: ./.github/actions/build-server | ||||
|         with: | ||||
|           os: linux | ||||
|           arch: ${{ matrix.arch }} | ||||
|  | ||||
|       - name: Publish release | ||||
|         uses: softprops/action-gh-release@v2 | ||||
|         if: ${{ github.event_name != 'pull_request' }} | ||||
|         with: | ||||
|           make_latest: false | ||||
|           prerelease: true | ||||
|           draft: false | ||||
|           fail_on_unmatched_files: true | ||||
|           files: upload/*.* | ||||
|           tag_name: nightly | ||||
|           name: Nightly Build | ||||
							
								
								
									
										27
									
								
								.github/workflows/playwright.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,27 +0,0 @@ | ||||
| name: Playwright Tests | ||||
| on: | ||||
|   push: | ||||
|     branches: [ develop ] | ||||
|   pull_request: | ||||
|     branches: [ develop ] | ||||
| jobs: | ||||
|   test: | ||||
|     timeout-minutes: 60 | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@v4 | ||||
|     - uses: actions/setup-node@v4 | ||||
|       with: | ||||
|         node-version: lts/* | ||||
|     - name: Install dependencies | ||||
|       run: npm ci | ||||
|     - name: Install Playwright Browsers | ||||
|       run: npx playwright install --with-deps | ||||
|     - name: Run Playwright tests | ||||
|       run: npx playwright test | ||||
|     - uses: actions/upload-artifact@v4 | ||||
|       if: ${{ !cancelled() }} | ||||
|       with: | ||||
|         name: playwright-report | ||||
|         path: playwright-report/ | ||||
|         retention-days: 30 | ||||
							
								
								
									
										20
									
								
								.github/workflows/release-winget.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,20 +0,0 @@ | ||||
| name: Release to winget | ||||
| on: | ||||
|   release: | ||||
|     types: [ published ] | ||||
|   workflow_dispatch: | ||||
|     inputs: | ||||
|       release_tag: | ||||
|         description: 'Git tag to release from' | ||||
|         type: string | ||||
|         required: true | ||||
| jobs: | ||||
|   release-winget: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Publish to WinGet | ||||
|         uses: vedantmgoyal9/winget-releaser@main | ||||
|         with: | ||||
|           identifier: TriliumNext.Notes | ||||
|           token: ${{ secrets.token }} | ||||
|           release-tag:  ${{ github.event.inputs.release_tag || github.event.release.tag_name }} | ||||
							
								
								
									
										116
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,116 +0,0 @@ | ||||
| name: Release | ||||
| on: | ||||
|   push: | ||||
|     tags: | ||||
|       - "v*" | ||||
| permissions: | ||||
|   contents: write | ||||
| concurrency: | ||||
|   group: ${{ github.workflow }}-${{ github.ref }} | ||||
|   cancel-in-progress: true | ||||
|  | ||||
| jobs: | ||||
|   make-electron: | ||||
|     name: Make Electron | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         arch: [x64, arm64] | ||||
|         os: | ||||
|           - name: macos | ||||
|             image: macos-latest | ||||
|             shell: bash | ||||
|             forge_platform: darwin | ||||
|           - name: linux | ||||
|             image: ubuntu-latest | ||||
|             shell: bash | ||||
|             forge_platform: linux | ||||
|           - name: windows | ||||
|             image: win-signing | ||||
|             shell: cmd | ||||
|             forge_platform: win32 | ||||
|     runs-on: ${{ matrix.os.image }} | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - name: Set up node & dependencies | ||||
|         uses: actions/setup-node@v4 | ||||
|         with: | ||||
|           node-version: 22 | ||||
|       - name: Run the build | ||||
|         uses: ./.github/actions/build-electron | ||||
|         with: | ||||
|           os: ${{ matrix.os.name }} | ||||
|           arch: ${{ matrix.arch }} | ||||
|           shell: ${{ matrix.os.shell }} | ||||
|           forge_platform: ${{ matrix.os.forge_platform }} | ||||
|         env: | ||||
|           APPLE_APP_CERTIFICATE_BASE64: ${{ secrets.APPLE_APP_CERTIFICATE_BASE64 }} | ||||
|           APPLE_APP_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_APP_CERTIFICATE_PASSWORD }} | ||||
|           APPLE_INSTALLER_CERTIFICATE_BASE64: ${{ secrets.APPLE_INSTALLER_CERTIFICATE_BASE64 }} | ||||
|           APPLE_INSTALLER_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_INSTALLER_CERTIFICATE_PASSWORD }} | ||||
|           APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} | ||||
|           APPLE_ID: ${{ secrets.APPLE_ID }} | ||||
|           APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} | ||||
|           WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }} | ||||
|  | ||||
|       - name: Upload the artifact | ||||
|         uses: actions/upload-artifact@v4 | ||||
|         with: | ||||
|           name: release-desktop-${{ matrix.os.name }}-${{ matrix.arch }} | ||||
|           path: upload/*.* | ||||
|  | ||||
|   build_server: | ||||
|     name: Build Linux Server | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         arch: [x64, arm64] | ||||
|         include: | ||||
|           - arch: x64 | ||||
|             runs-on: ubuntu-latest | ||||
|           - arch: arm64 | ||||
|             runs-on: ubuntu-24.04-arm | ||||
|     runs-on: ${{ matrix.runs-on }} | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|  | ||||
|       - name: Run the build | ||||
|         uses: ./.github/actions/build-server | ||||
|         with: | ||||
|           os: linux | ||||
|           arch: ${{ matrix.arch }} | ||||
|  | ||||
|       - name: Upload the artifact | ||||
|         uses: actions/upload-artifact@v4 | ||||
|         with: | ||||
|           name: release-server-linux-${{ matrix.arch }} | ||||
|           path: upload/*.* | ||||
|  | ||||
|   publish_release: | ||||
|     name: Publish release | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: | ||||
|       - make-electron | ||||
|       - build_server | ||||
|     steps: | ||||
|       - run: mkdir upload | ||||
|  | ||||
|       - uses: actions/checkout@v4 | ||||
|         with: | ||||
|           sparse-checkout: | | ||||
|             docs/Release Notes | ||||
|  | ||||
|       - name: Download all artifacts | ||||
|         uses: actions/download-artifact@v4 | ||||
|         with: | ||||
|           merge-multiple: true | ||||
|           pattern: release-* | ||||
|           path: upload | ||||
|  | ||||
|       - name: Publish release | ||||
|         uses: softprops/action-gh-release@v2 | ||||
|         with: | ||||
|           draft: false | ||||
|           body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md | ||||
|           fail_on_unmatched_files: true | ||||
|           files: upload/*.* | ||||
							
								
								
									
										53
									
								
								.github/workflows_old/docker.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,53 +0,0 @@ | ||||
| name: Publish Docker image | ||||
| on: | ||||
|     push: | ||||
|         tags: [v*] | ||||
| jobs: | ||||
|     push_to_registries: | ||||
|         name: Push Docker image to multiple registries | ||||
|         runs-on: ubuntu-latest | ||||
|         permissions: | ||||
|             packages: write | ||||
|             contents: read | ||||
|         steps: | ||||
|             - name: Checkout | ||||
|               uses: actions/checkout@v2 | ||||
|             - name: Set up QEMU | ||||
|               uses: docker/setup-qemu-action@v1 | ||||
|             - name: Docker meta | ||||
|               id: meta | ||||
|               uses: docker/metadata-action@v3 | ||||
|               with: | ||||
|                   images: | | ||||
|                       zadam/trilium | ||||
|                       ghcr.io/zadam/trilium | ||||
|                   tags: | | ||||
|                       type=semver,pattern={{version}} | ||||
|                       type=semver,pattern={{major}}.{{minor}}-latest | ||||
|                       type=match,pattern=(\d+.\d+).\d+\-beta,enable=${{ endsWith(github.ref, 'beta') }},group=1,suffix=-latest | ||||
|             - name: Set up Docker Buildx | ||||
|               uses: docker/setup-buildx-action@v1 | ||||
|               with: | ||||
|                   install: true | ||||
|             - name: Log in to Docker Hub | ||||
|               uses: docker/login-action@v1 | ||||
|               with: | ||||
|                   username: ${{ secrets.DOCKER_USERNAME }} | ||||
|                   password: ${{ secrets.DOCKER_PASSWORD }} | ||||
|             - name: Log in to GitHub Docker Registry | ||||
|               uses: docker/login-action@v1 | ||||
|               with: | ||||
|                   registry: ghcr.io | ||||
|                   username: ${{ github.repository_owner }} | ||||
|                   password: ${{ secrets.GITHUB_TOKEN }} | ||||
|             - name: Create server-package.json | ||||
|               run: cat package.json | grep -v electron > server-package.json | ||||
|             - name: Build and Push | ||||
|               uses: docker/build-push-action@v2.7.0 | ||||
|               with: | ||||
|                   context: . | ||||
|                   platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 | ||||
|                   push: true | ||||
|                   cache-from: type=registry,ref=zadam/trilium:buildcache | ||||
|                   cache-to: type=registry,ref=zadam/trilium:buildcache,mode=max | ||||
|                   tags: ${{ steps.meta.outputs.tags }} | ||||
							
								
								
									
										43
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,50 +1,11 @@ | ||||
| .cache | ||||
| .DS_Store | ||||
| node_modules/ | ||||
| dist/ | ||||
| upload/ | ||||
| build/ | ||||
| coverage/ | ||||
| src/public/app-dist/ | ||||
| npm-debug.log | ||||
| yarn-error.log | ||||
| po-*/ | ||||
| .flatpak-builder/ | ||||
|  | ||||
| *.db | ||||
| !test/**/*.db | ||||
| !integration-tests/db/document.db | ||||
| !integration-tests/db/config.ini | ||||
| integration-tests/db/log | ||||
| integration-tests/db/sessions | ||||
| integration-tests/db/backup | ||||
| integration-tests/db/session_secret.txt | ||||
|  | ||||
| config.ini | ||||
| cert.key | ||||
| cert.crt | ||||
| server-package.json | ||||
| .idea/httpRequests/ | ||||
| .idea/shelf/ | ||||
| data/ | ||||
| data-test/ | ||||
| data-demo/ | ||||
| tmp/ | ||||
| .eslintcache | ||||
|  | ||||
| out/ | ||||
|  | ||||
| images/app-icons/mac/*.png | ||||
| /test-results/ | ||||
| /playwright-report/ | ||||
| /blob-report/ | ||||
| /playwright/.cache/ | ||||
| /playwright/.auth/ | ||||
|  | ||||
| data-docs/backup | ||||
| data-docs/log | ||||
| data-docs/session | ||||
| data-docs/session_secret.txt | ||||
| data-docs/document.* | ||||
|  | ||||
| # Webpack | ||||
| webpack-stats.json | ||||
| server-package.json | ||||
| @@ -2,9 +2,9 @@ image: | ||||
|   file: .gitpod.dockerfile | ||||
|  | ||||
| tasks: | ||||
|     - before: nvm install 20.15.1 && nvm use 20.15.1 | ||||
|     - before: nvm install 16.13.1 && nvm use 16.13.1 | ||||
|       init: npm install | ||||
|       command: npm run server:start | ||||
|       command: npm run start-server | ||||
|  | ||||
| ports: | ||||
|     - port: 8080 | ||||
|   | ||||
							
								
								
									
										8
									
								
								.idea/codeStyles/Project.xml
									
									
									
										generated
									
									
									
								
							
							
						
						| @@ -6,10 +6,8 @@ | ||||
|         <option name="TAB_SIZE" value="2" /> | ||||
|       </value> | ||||
|     </option> | ||||
|     <codeStyleSettings language="JSON"> | ||||
|       <indentOptions> | ||||
|         <option name="INDENT_SIZE" value="4" /> | ||||
|       </indentOptions> | ||||
|     </codeStyleSettings> | ||||
|     <JSCodeStyleSettings version="0"> | ||||
|       <option name="USE_EXPLICIT_JS_EXTENSION" value="TRUE" /> | ||||
|     </JSCodeStyleSettings> | ||||
|   </code_scheme> | ||||
| </component> | ||||
							
								
								
									
										4
									
								
								.idea/dataSources.xml
									
									
									
										generated
									
									
									
								
							
							
						
						| @@ -1,11 +1,11 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="DataSourceManagerImpl" format="xml" multifile-model="true"> | ||||
|     <data-source source="LOCAL" name="document.db" uuid="2a4ac1e6-b828-4a2a-8e4a-3f59f10aff26"> | ||||
|     <data-source source="LOCAL" name="SQLite - document.db" uuid="30cef30d-e704-484d-a4ca-5d3bfc2ece63"> | ||||
|       <driver-ref>sqlite.xerial</driver-ref> | ||||
|       <synchronize>true</synchronize> | ||||
|       <jdbc-driver>org.sqlite.JDBC</jdbc-driver> | ||||
|       <jdbc-url>jdbc:sqlite:$PROJECT_DIR$/data/document.db</jdbc-url> | ||||
|       <jdbc-url>jdbc:sqlite:$PROJECT_DIR$/../trilium-data/document.db</jdbc-url> | ||||
|       <working-dir>$ProjectFileDir$</working-dir> | ||||
|     </data-source> | ||||
|   </component> | ||||
|   | ||||
							
								
								
									
										15
									
								
								.idea/git_toolbox_prj.xml
									
									
									
										generated
									
									
									
								
							
							
						
						| @@ -1,15 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="GitToolBoxProjectSettings"> | ||||
|     <option name="commitMessageIssueKeyValidationOverride"> | ||||
|       <BoolValueOverride> | ||||
|         <option name="enabled" value="true" /> | ||||
|       </BoolValueOverride> | ||||
|     </option> | ||||
|     <option name="commitMessageValidationEnabledOverride"> | ||||
|       <BoolValueOverride> | ||||
|         <option name="enabled" value="true" /> | ||||
|       </BoolValueOverride> | ||||
|     </option> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										2
									
								
								.idea/inspectionProfiles/Project_Default.xml
									
									
									
										generated
									
									
									
								
							
							
						
						| @@ -1,7 +1,7 @@ | ||||
| <component name="InspectionProjectProfileManager"> | ||||
|   <profile version="1.0"> | ||||
|     <option name="myName" value="Project Default" /> | ||||
|     <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" /> | ||||
|     <inspection_tool class="JSUnfilteredForInLoop" enabled="false" level="WARNING" enabled_by_default="false" /> | ||||
|     <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false"> | ||||
|       <option name="processCode" value="true" /> | ||||
|       <option name="processLiterals" value="true" /> | ||||
|   | ||||
							
								
								
									
										3
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						| @@ -1,8 +1,9 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="JavaScriptSettings"> | ||||
|     <option name="languageLevel" value="ES6" /> | ||||
|   </component> | ||||
|   <component name="ProjectRootManager" version="2" languageLevel="JDK_16" default="true" project-jdk-name="openjdk-16" project-jdk-type="JavaSDK"> | ||||
|   <component name="ProjectRootManager" version="2" languageLevel="JDK_16" project-jdk-name="openjdk-16" project-jdk-type="JavaSDK"> | ||||
|     <output url="file://$PROJECT_DIR$/out" /> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										11
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,11 +0,0 @@ | ||||
| { | ||||
|   "recommendations": [ | ||||
|     "lokalise.i18n-ally", | ||||
|     "editorconfig.editorconfig", | ||||
|     "vitest.explorer", | ||||
|     "ms-playwright.playwright", | ||||
|     "tobermory.es6-string-html", | ||||
|     "dbaeumer.vscode-eslint", | ||||
|     "yzhang.markdown-all-in-one" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										33
									
								
								.vscode/i18n-ally-custom-framework.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,33 +0,0 @@ | ||||
| # An array of strings which contain Language Ids defined by VS Code | ||||
| # You can check available language ids here: https://code.visualstudio.com/docs/languages/identifiers | ||||
| languageIds: | ||||
|   - javascript | ||||
|   - typescript | ||||
|   - html | ||||
|  | ||||
| # An array of RegExes to find the key usage. **The key should be captured in the first match group**. | ||||
| # You should unescape RegEx strings in order to fit in the YAML file | ||||
| # To help with this, you can use https://www.freeformatter.com/json-escape.html | ||||
| usageMatchRegex: | ||||
|   # The following example shows how to detect `t("your.i18n.keys")` | ||||
|   # the `{key}` will be placed by a proper keypath matching regex, | ||||
|   # you can ignore it and use your own matching rules as well | ||||
|   - "[^\\w\\d]t\\(['\"`]({key})['\"`]" | ||||
|  | ||||
| # A RegEx to set a custom scope range. This scope will be used as a prefix when detecting keys | ||||
| # and works like how the i18next framework identifies the namespace scope from the | ||||
| # useTranslation() hook. | ||||
| # You should unescape RegEx strings in order to fit in the YAML file | ||||
| # To help with this, you can use https://www.freeformatter.com/json-escape.html | ||||
| scopeRangeRegex: "useTranslation\\(\\s*\\[?\\s*['\"`](.*?)['\"`]" | ||||
|  | ||||
| # An array of strings containing refactor templates. | ||||
| # The "$1" will be replaced by the keypath specified. | ||||
| refactorTemplates: | ||||
|   - t("$1") | ||||
|   - ${t("$1")} | ||||
|   - <%= t("$1") %> | ||||
|  | ||||
|  | ||||
| # If set to true, only enables this custom framework (will disable all built-in frameworks) | ||||
| monopoly: true | ||||
							
								
								
									
										20
									
								
								.vscode/i18n-ally-reviews.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,20 +0,0 @@ | ||||
| # Review comments generated by i18n-ally. Please commit this file. | ||||
|  | ||||
| reviews: | ||||
|   help.inPageSearch: | ||||
|     description: >- | ||||
|       Describes the shortcut which triggers a search within the current | ||||
|       page/note only | ||||
|   add_label.to_value: | ||||
|     locales: | ||||
|       fr: | ||||
|         comments: | ||||
|           - user: | ||||
|               name: Potjoe-97 | ||||
|               email: giann@LAPTOPT490-GF | ||||
|             id: QXec0JUoxfGmMlpch-B1S | ||||
|             comment: '' | ||||
|             suggestion: vers la valeur | ||||
|             type: request_change | ||||
|             time: '2024-10-15T16:57:06.188Z' | ||||
|             resolved: true | ||||
							
								
								
									
										38
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,22 +1,18 @@ | ||||
| { | ||||
|   "version": "0.2.0", | ||||
|   "configurations": [ | ||||
|     // nodemon should be installed globally, use npm i -g nodemon | ||||
|     { | ||||
|       "console": "integratedTerminal", | ||||
|       "internalConsoleOptions": "neverOpen", | ||||
|       "name": "nodemon start-server", | ||||
|       "program": "${workspaceFolder}/src/www", | ||||
|       "request": "launch", | ||||
|       "restart": true, | ||||
|       "runtimeExecutable": "nodemon", | ||||
|       "env": { | ||||
|         "TRILIUM_ENV": "dev", | ||||
|         "TRILIUM_DATA_DIR": "./data" | ||||
|       }, | ||||
|       "skipFiles": ["<node_internals>/**"], | ||||
|       "type": "node", | ||||
|       "outputCapture": "std" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
|     "version": "0.2.0", | ||||
|     "configurations": [ | ||||
|         { | ||||
|             "type": "node", | ||||
|             "request": "launch", | ||||
|             "name": "start-server", | ||||
|             "skipFiles": [ | ||||
|                 "<node_internals>/**" | ||||
|             ], | ||||
|             "env": { | ||||
|                 "TRILIUM_ENV": "dev" | ||||
|             }, | ||||
|             "outputCapture": "std", | ||||
|             "program": "${workspaceFolder}/src/www" | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										30
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,30 +0,0 @@ | ||||
| { | ||||
|   "editor.formatOnSave": false, | ||||
|   "editor.defaultFormatter": "esbenp.prettier-vscode", | ||||
|   "files.eol": "\n", | ||||
|   "typescript.tsdk": "node_modules/typescript/lib", | ||||
|   "i18n-ally.sourceLanguage": "en", | ||||
|   "i18n-ally.keystyle": "nested", | ||||
|   "i18n-ally.localesPaths": ["./src/public/translations", "./translations"], | ||||
|   "[jsonc]": { | ||||
|     "editor.defaultFormatter": "vscode.json-language-features" | ||||
|   }, | ||||
|   "[javascript]": { | ||||
|     "editor.defaultFormatter": "vscode.typescript-language-features" | ||||
|   }, | ||||
|   "[typescript]": { | ||||
|     "editor.defaultFormatter": "vscode.typescript-language-features" | ||||
|   }, | ||||
|   "github-actions.workflows.pinned.workflows": [".github/workflows/nightly.yml"], | ||||
|   "[css]": { | ||||
|     "editor.defaultFormatter": "vscode.css-language-features" | ||||
|   }, | ||||
|   "npm.exclude": [ | ||||
|     "**/build", | ||||
|     "**/dist", | ||||
|     "**/out/**" | ||||
|   ], | ||||
|   "[xml]": { | ||||
|     "editor.defaultFormatter": "redhat.vscode-xml" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										24
									
								
								.vscode/snippets.code-snippets
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,24 +0,0 @@ | ||||
| { | ||||
|     // Place your Notes workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and | ||||
|     // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope | ||||
|     // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is | ||||
|     // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: | ||||
|     // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. | ||||
|     // Placeholders with the same ids are connected. | ||||
|     // Example: | ||||
|     // "Print to console": { | ||||
|     // 	"scope": "javascript,typescript", | ||||
|     // 	"prefix": "log", | ||||
|     // 	"body": [ | ||||
|     // 		"console.log('$1');", | ||||
|     // 		"$2" | ||||
|     // 	], | ||||
|     // 	"description": "Log output to console" | ||||
|     // } | ||||
|  | ||||
|     "JQuery HTMLElement field": { | ||||
|         "scope": "typescript", | ||||
|         "prefix": "jqf", | ||||
|         "body": ["private $${1:name}!: JQuery<HTMLElement>;"] | ||||
|     } | ||||
| } | ||||
| @@ -1 +0,0 @@ | ||||
| Please treat each other with respect and understanding. | ||||
							
								
								
									
										66
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						| @@ -1,51 +1,29 @@ | ||||
| # Build stage | ||||
| FROM node:22.14.0-bullseye-slim AS builder | ||||
|  | ||||
| WORKDIR /usr/src/app/build | ||||
|  | ||||
| # Copy only necessary files for build | ||||
| COPY . . | ||||
|  | ||||
| # Build and cleanup in a single layer | ||||
| RUN npm ci && \ | ||||
|     npm run build:prepare-dist && \ | ||||
|     npm cache clean --force && \ | ||||
|     rm -rf build/node_modules && \ | ||||
|     mv build/* \ | ||||
|       start-docker.sh \ | ||||
|       /usr/src/app/ && \ | ||||
|     rm -rf \ | ||||
|       /usr/src/app/build \ | ||||
|       /tmp/node-compile-cache | ||||
|  | ||||
| #TODO: improve node_modules handling in copy-dist/Dockerfile -> remove duplicated work | ||||
| #      currently copy-dist will copy certain node_module folders, but in the Dockerfile we delete them again (to keep image size down), | ||||
| #      as we install necessary dependencies in runtime buildstage anyways | ||||
|  | ||||
| # Runtime stage | ||||
| FROM node:22.14.0-bullseye-slim | ||||
| FROM node:16.13.1-alpine | ||||
|  | ||||
| # Create app directory | ||||
| WORKDIR /usr/src/app | ||||
|  | ||||
| # Install only runtime dependencies | ||||
| RUN apt-get update && \ | ||||
|     apt-get install -y --no-install-recommends \ | ||||
|       gosu && \ | ||||
|     rm -rf \ | ||||
|       /var/lib/apt/lists/* \ | ||||
|       /var/cache/apt/* | ||||
| COPY server-package.json package.json | ||||
|  | ||||
| COPY --from=builder /usr/src/app ./ | ||||
| # Install app dependencies | ||||
| RUN set -x \ | ||||
|     && apk add --no-cache --virtual .build-dependencies \ | ||||
|         autoconf \ | ||||
|         automake \ | ||||
|         g++ \ | ||||
|         gcc \ | ||||
|         libtool \ | ||||
|         make \ | ||||
|         nasm \ | ||||
|         libpng-dev \ | ||||
|         python3 \ | ||||
|     && npm install --production \ | ||||
|     && apk del .build-dependencies | ||||
|  | ||||
| RUN sed -i "/electron/d" package.json && \ | ||||
|     npm ci --omit=dev && \ | ||||
|     node --experimental-strip-types ./bin/cleanupNodeModules.ts . --skip-prune-dev-deps && \ | ||||
|     npm cache clean --force && \ | ||||
|     rm -rf \ | ||||
|       /tmp/node-compile-cache \ | ||||
|       /usr/src/app/bin/cleanupNodeModules.ts | ||||
| # Bundle app source | ||||
| COPY . . | ||||
|  | ||||
| USER node | ||||
|  | ||||
| # Configure container | ||||
| EXPOSE 8080 | ||||
| CMD [ "./start-docker.sh" ] | ||||
| HEALTHCHECK --start-period=10s CMD exec gosu node node docker_healthcheck.js | ||||
| CMD [ "node", "./src/www" ] | ||||
|   | ||||
| @@ -1,49 +0,0 @@ | ||||
| # Build stage | ||||
| FROM node:22.14.0-alpine AS builder | ||||
|  | ||||
| WORKDIR /usr/src/app/build | ||||
|  | ||||
| # Copy only necessary files for build | ||||
| COPY . . | ||||
|  | ||||
| # Build and cleanup in a single layer | ||||
| RUN npm ci && \ | ||||
|     npm run build:prepare-dist && \ | ||||
|     npm cache clean --force && \ | ||||
|     rm -rf build/node_modules && \ | ||||
|     mv build/* \ | ||||
|       start-docker.sh \ | ||||
|       /usr/src/app/ && \ | ||||
|     rm -rf \ | ||||
|       /usr/src/app/build \ | ||||
|       /tmp/node-compile-cache | ||||
|  | ||||
| #TODO: improve node_modules handling in copy-dist/Dockerfile -> remove duplicated work | ||||
| #      currently copy-dist will copy certain node_module folders, but in the Dockerfile we delete them again (to keep image size down), | ||||
| #      as we install necessary dependencies in runtime buildstage anyways | ||||
|  | ||||
| # Runtime stage | ||||
| FROM node:22.14.0-alpine | ||||
|  | ||||
| # Install runtime dependencies | ||||
| RUN apk add --no-cache su-exec shadow | ||||
|  | ||||
| WORKDIR /usr/src/app | ||||
|  | ||||
| COPY --from=builder /usr/src/app ./ | ||||
|  | ||||
| RUN sed -i "/electron/d" package.json && \ | ||||
|     npm ci --omit=dev && \ | ||||
|     node --experimental-strip-types ./bin/cleanupNodeModules.ts . --skip-prune-dev-deps && \ | ||||
|     npm cache clean --force && \ | ||||
|     rm -rf \ | ||||
|       /tmp/node-compile-cache \ | ||||
|       /usr/src/app/bin/cleanupNodeModules.ts | ||||
|  | ||||
| # Add application user | ||||
| RUN adduser -s /bin/false node; exit 0 | ||||
|  | ||||
| # Configure container | ||||
| EXPOSE 8080 | ||||
| CMD [ "./start-docker.sh" ] | ||||
| HEALTHCHECK --start-period=10s CMD exec su-exec node node docker_healthcheck.js | ||||
							
								
								
									
										115
									
								
								README-ZH_CN.md
									
									
									
									
									
								
							
							
						
						| @@ -1,97 +1,62 @@ | ||||
| # TriliumNext Notes | ||||
| # Trilium笔记 | ||||
|  | ||||
| [English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) | ||||
| [English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md) | ||||
|  | ||||
| TriliumNext Notes 是一个层次化的笔记应用程序,专注于建立大型个人知识库。请参阅[屏幕截图](https://triliumnext.github.io/Docs/Wiki/screenshot-tour)以快速了解: | ||||
| [](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | ||||
| Trilium Notes是一个分层的笔记应用程序,专注于建立大型个人知识库。请参阅[屏幕截图](https://github.com/zadam/trilium/wiki/Screenshot-tour)以快速了解: | ||||
|  | ||||
| <a href="https://triliumnext.github.io/Docs/Wiki/screenshot-tour"><img src="https://github.com/TriliumNext/Docs/blob/main/Wiki/images/screenshot.png?raw=true" alt="Trilium Screenshot" width="1000"></a> | ||||
|  | ||||
|  | ||||
| ## ⚠️ 为什么选择TriliumNext? | ||||
| ## 特性 | ||||
|  | ||||
| [原始的Trilium项目目前处于维护模式](https://github.com/zadam/trilium/issues/4620) | ||||
| * 笔记可以排列成任意深的树。单个笔记可以放在树中的多个位置(请参阅[克隆](https://github.com/zadam/trilium/wiki/Cloning-notes)) | ||||
| * 丰富的所见即所得笔记编辑功能,包括带有markdown[自动格式化功能的](https://github.com/zadam/trilium/wiki/Text-notes#autoformat)表格,图像和[数学](https://github.com/zadam/trilium/wiki/Text-notes#math-support) | ||||
| * 支持编辑[使用源代码的笔记](https://github.com/zadam/trilium/wiki/Code-notes),包括语法高亮显示 | ||||
| * 笔记之间快速[导航](https://github.com/zadam/trilium/wiki/Note-navigation),全文搜索和[笔记挂起](https://github.com/zadam/trilium/wiki/Note-hoisting) | ||||
| * 无缝[笔记版本控制](https://github.com/zadam/trilium/wiki/Note-revisions) | ||||
| * 笔记[属性](https://github.com/zadam/trilium/wiki/Attributes)可用于笔记组织,查询和高级[脚本编写](https://github.com/zadam/trilium/wiki/Scripts) | ||||
| * [同步](https://github.com/zadam/trilium/wiki/Synchronization)与自托管同步服务器 | ||||
| * 具有按笔记粒度的强大的[笔记加密](https://github.com/zadam/trilium/wiki/Protected-notes) | ||||
| * [关系图](https://github.com/zadam/trilium/wiki/Relation-map)和[链接图](https://github.com/zadam/trilium/wiki/Link-map),用于可视化笔记及其关系 | ||||
| * [脚本](https://github.com/zadam/trilium/wiki/Scripts)-请参阅[高级展示](https://github.com/zadam/trilium/wiki/Advanced-showcases) | ||||
| * 可用性和性能均能很好地扩展至超过10万个笔记 | ||||
| * 针对智能手机和平板电脑进行触摸优化的[移动前端](https://github.com/zadam/trilium/wiki/Mobile-frontend) | ||||
| * [夜间主题](https://github.com/zadam/trilium/wiki/Themes) | ||||
| * [Evernote](https://github.com/zadam/trilium/wiki/Evernote-import)和[Markdown导入导出](https://github.com/zadam/trilium/wiki/Markdown) | ||||
| * [Web Clipper](https://github.com/zadam/trilium/wiki/Web-clipper)可轻松保存Web内容 | ||||
|  | ||||
| ## 🗭 与我们讨论 | ||||
| ## 构建 | ||||
|  | ||||
| 欢迎加入我们的官方讨论和社区。我们专注于Trilium的开发,乐于听取您对功能、建议或问题的意见! | ||||
| Trilium是作为桌面应用程序(Linux和Windows)或服务器上托管的Web应用程序(Linux)提供的。Mac OS桌面版本可用,但[不受支持](https://github.com/zadam/trilium/wiki/FAQ#mac-os-support)。 | ||||
|  | ||||
| - [Matrix](https://matrix.to/#/#triliumnext:matrix.org)(用于同步讨论) | ||||
| - [Github Discussions](https://github.com/TriliumNext/Notes/discussions)(用于异步讨论) | ||||
| - [Wiki](https://triliumnext.github.io/Docs/)(用于常见操作问题和用户指南) | ||||
| * 如果要在桌面上使用Trilium,请从[最新版本](https://github.com/zadam/trilium/releases/latest)下载适用于您平台的二进制[版本](https://github.com/zadam/trilium/releases/latest),解压缩该软件包并运行`trilium`可执行文件。 | ||||
| * 如果要在服务器上安装Trilium,请遵循[此页面](https://github.com/zadam/trilium/wiki/Server-installation)。 | ||||
|     * 当前仅支持(经过测试)最新的Chrome和Firefox浏览器。 | ||||
|  | ||||
| 上面链接的两个房间是镜像的,所以您可以在任意平台上使用XMPP或者Matrix来和我们交流。 | ||||
| ## 文档 | ||||
|  | ||||
| ### 非官方社区 | ||||
| [有关文档页面的完整列表,请参见Wiki。](https://github.com/zadam/trilium/wiki/) | ||||
|  | ||||
| [Trilium Rocks](https://discord.gg/aqdX9mXX4r) | ||||
| [中文Wiki在这里](https://github.com/baddate/trilium/wiki/) | ||||
|  | ||||
| ## 🎁 特性 | ||||
| 您还可以阅读[个人知识库模式](https://github.com/zadam/trilium/wiki/Patterns-of-personal-knowledge-base),以获取有关如何使用Trilium的灵感。 | ||||
|  | ||||
| * 笔记可以排列成任意深的树。单个笔记可以放在树中的多个位置(请参阅[克隆](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) | ||||
| * 丰富的所见即所得笔记编辑功能,包括带有 Markdown [自动格式化功能的](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat)表格,图像和[数学公式](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support) | ||||
| * 支持编辑[使用源代码的笔记](https://triliumnext.github.io/Docs/Wiki/code-notes),包括语法高亮显示 | ||||
| * 笔记之间快速[导航](https://triliumnext.github.io/Docs/Wiki/note-navigation),全文搜索和[提升笔记](https://triliumnext.github.io/Docs/Wiki/note-hoisting) | ||||
| * 无缝[笔记版本控制](https://triliumnext.github.io/Docs/Wiki/note-revisions) | ||||
| * 笔记[属性](https://triliumnext.github.io/Docs/Wiki/attributes)可用于笔记组织,查询和高级[脚本编写](https://triliumnext.github.io/Docs/Wiki/scripts) | ||||
| * [同步](https://triliumnext.github.io/Docs/Wiki/synchronization)与自托管同步服务器 | ||||
|   * 有一个[第三方提供的同步服务器托管服务](https://trilium.cc/paid-hosting) | ||||
| * 公开地[分享](https://triliumnext.github.io/Docs/Wiki/sharing)(发布)笔记到互联网 | ||||
| * 具有按笔记粒度的强大的[笔记加密](https://triliumnext.github.io/Docs/Wiki/protected-notes) | ||||
| * 使用自带的 Excalidraw 来绘制图表(笔记类型“画布”) | ||||
| * [关系图](https://triliumnext.github.io/Docs/Wiki/relation-map)和[链接图](https://triliumnext.github.io/Docs/Wiki/link-map),用于可视化笔记及其关系 | ||||
| * [脚本](https://triliumnext.github.io/Docs/Wiki/scripts) - 请参阅[高级功能展示](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) | ||||
| * 可用于自动化的 [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) | ||||
| * 在拥有超过 10 万条笔记时仍能保持良好的可用性和性能 | ||||
| * 针对智能手机和平板电脑进行优化的[用于移动设备的前端](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) | ||||
| * [夜间主题](https://triliumnext.github.io/Docs/Wiki/themes) | ||||
| * [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) 和 [Markdown 导入导出](https://triliumnext.github.io/Docs/Wiki/markdown)功能 | ||||
| * 使用[网页剪藏](https://triliumnext.github.io/Docs/Wiki/web-clipper)轻松保存互联网上的内容 | ||||
| ## 贡献 | ||||
|  | ||||
| ✨ 查看以下第三方资源,获取更多关于TriliumNext的好东西: | ||||
| 使用基于浏览器的开发环境 | ||||
|  | ||||
| - [awesome-trilium](https://github.com/Nriver/awesome-trilium):提供第三方主题、脚本、插件等资源的列表。 | ||||
| - [TriliumRocks!](https://trilium.rocks/):提供教程、指南等更多内容。 | ||||
| [](https://gitpod.io/#https://github.com/zadam/trilium) | ||||
|  | ||||
| ## 🏗 构建 | ||||
| 或在本地克隆并运行 | ||||
|  | ||||
| Trilium 可以用作桌面应用程序(Linux 和 Windows)或服务器(Linux)上托管的 Web 应用程序。虽然有 macOS 版本的桌面应用程序,但它[不受支持](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support)。 | ||||
|  | ||||
| * 如果要在桌面上使用 Trilium,请从[最新版本](https://github.com/TriliumNext/Notes/releases/latest)下载适用于您平台的二进制版本,解压缩该软件包并运行`trilium`可执行文件。 | ||||
| * 如果要在服务器上安装 Trilium,请参考[此页面](https://triliumnext.github.io/Docs/Wiki/server-installation)。 | ||||
|   * 当前仅支持(测试过)最近发布的 Chrome 和 Firefox 浏览器。 | ||||
|  | ||||
| Trilium 也提供 Flatpak: | ||||
|  | ||||
| [<img width="240" src="https://flathub.org/assets/badges/flathub-badge-en.png">](https://flathub.org/apps/details/com.github.zadam.trilium) | ||||
|  | ||||
| ## 📝 文档 | ||||
|  | ||||
| [有关文档页面的完整列表,请参见 Wiki。](https://triliumnext.github.io/Docs/) | ||||
|  | ||||
| * [Wiki 的中文翻译版本](https://github.com/baddate/trilium/wiki/) | ||||
|  | ||||
| 您还可以阅读[个人知识库模式](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge),以获取有关如何使用 Trilium 的灵感。 | ||||
|  | ||||
| ## 💻 贡献 | ||||
|  | ||||
|  | ||||
| 或者克隆本仓库到本地,并运行 | ||||
|  | ||||
| ```shell | ||||
| ``` | ||||
| npm install | ||||
| npm run server:start | ||||
| npm run start-server | ||||
| ``` | ||||
|  | ||||
| ## 👏 致谢 | ||||
| ## 致谢 | ||||
|  | ||||
| * [CKEditor 5](https://github.com/ckeditor/ckeditor5) - 市面上最好的所见即所得编辑器,拥有互动性强且聆听能力强的团队 | ||||
| * [FancyTree](https://github.com/mar10/fancytree) - 一个非常丰富的关于树的库,强大到没有对手。没有它,Trilium Notes 将不会如此。 | ||||
| * [CKEditor 5](https://github.com/ckeditor/ckeditor5) - 市场上最好的所见即所得编辑器,互动性强且聆听能力强的团队 | ||||
| * [FancyTree](https://github.com/mar10/fancytree) - 一个非常丰富的关于树的库,强大的没有对手。没有它,Trilium Notes将不会如此。 | ||||
| * [CodeMirror](https://github.com/codemirror/CodeMirror) - 支持大量语言的代码编辑器 | ||||
| * [jsPlumb](https://github.com/jsplumb/jsplumb) - 强大的可视化连接库。用于[关系图](https://triliumnext.github.io/Docs/Wiki/relation-map)和[链接图](https://triliumnext.github.io/Docs/Wiki/link-map) | ||||
|  | ||||
| ## 🤝 捐赠 | ||||
|  | ||||
| 你可以通过 GitHub Sponsors,[PayPal](https://paypal.me/za4am) 或者比特币 (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2) 来捐赠。 | ||||
|  | ||||
| ## 🔑 许可证 | ||||
|  | ||||
| 本程序是自由软件:你可以再发布本软件和/或修改本软件,只要你遵循 Free Software Foundation 发布的 GNU Affero General Public License 的第三版或者任何(由你选择)更晚的版本。 | ||||
| * [jsPlumb](https://github.com/jsplumb/jsplumb)强大的可视化连接库。- 用于[关系图](https://github.com/zadam/trilium/wiki/Relation-map)和[链接图](https://github.com/zadam/trilium/wiki/Link-map) | ||||
|   | ||||
							
								
								
									
										106
									
								
								README.es.md
									
									
									
									
									
								
							
							
						
						| @@ -1,106 +0,0 @@ | ||||
| # TriliumNext Notes | ||||
|  | ||||
| [English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) | ||||
|  | ||||
| TriliumNext Notes es una aplicación de toma de notas jerárquicas multi-plataforma y de código libre con un enfoque en la construcción de grandes bases de conocimiento personal. | ||||
|  | ||||
| Vea estas [capturas de pantalla](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) para un vistazo rápido: | ||||
|  | ||||
| <a href="https://triliumnext.github.io/Docs/Wiki/screenshot-tour"><img src="https://github.com/TriliumNext/Docs/blob/main/Wiki/images/screenshot.png?raw=true" alt="Trilium Screenshot" width="1000"></a> | ||||
|  | ||||
| ## ⚠️ ¿Por qué usar TriliumNext? | ||||
|  | ||||
| [El proyecto Trilium original está en modo de mantenimiento](https://github.com/zadam/trilium/issues/4620) | ||||
|  | ||||
| ### ¿Cómo migrar desde Trilium? | ||||
|  | ||||
| No hay pasos de migración especiales para migrar de una instancia de zadam/Trilium a una instancia de TriliumNext/Notes. Simplemente actualice su instancia de Trilium a la última versión e [instale TriliumNext/Notes como de costumbre](#-Instalación) | ||||
|  | ||||
| ## 💬 Discuta con nosotros | ||||
|  | ||||
| Siéntase libre de unirse a nuestras conversaciones oficiales. ¡Nos encantaría escuchar de las características, sugerencias o problemas que pueda tener! | ||||
|  | ||||
| - [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (Para discusiones síncronas) | ||||
|   - La sala `General` es replicada a [XMPP](xmpp:discuss@trilium.thisgreat.party?join) | ||||
| - [Discusiones de GitHub](https://github.com/TriliumNext/Notes/discussions) (Para discusiones asíncronas) | ||||
| - [Wiki](https://triliumnext.github.io/Docs/) (Para preguntas frecuentes y guías de usuario) | ||||
|  | ||||
| ## 🎁 Características | ||||
|  | ||||
| - Las notas pueden ser acomodadas en un árbol de profundidad arbitraria. Una sola nota puede ser colocada en múltiples lugares del árbol (vea [clonar](https://triliumnext.github.io/Docs/Wiki/cloning-notes) | ||||
| - Edición de notas WYSIWYG enriquecida que incluye, por ejemplo, tablas, imágenes y [matemáticas](https://triliumnext.github.io/Docs/Wiki/text-notes) con [autoformato](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) markdown | ||||
| - Soporte para editar [notas con código fuente](https://triliumnext.github.io/Docs/Wiki/code-notes), incluyendo resaltado de sintaxis | ||||
| - Rápida y sencilla [navegación entre notas](https://triliumnext.github.io/Docs/Wiki/note-navigation), búsqueda de texto completo y [elevación de notas](https://triliumnext.github.io/Docs/Wiki/note-hoisting) | ||||
| - [Versionado de notas](https://triliumnext.github.io/Docs/Wiki/note-revisions) sutil | ||||
| - Los [atributos](https://triliumnext.github.io/Docs/Wiki/attributes) de las notas pueden utilizarse para organización, realizar consultas y [scripts](https://triliumnext.github.io/Docs/Wiki/scripts) avanzados | ||||
| - [Sincronización](https://triliumnext.github.io/Docs/Wiki/synchronization) con servidor de sincronización propio | ||||
|   - existe un [servicio de terceros para alojar el servidor de sincronización](https://trilium.cc/paid-hosting) | ||||
| - [Compartir](https://triliumnext.github.io/Docs/Wiki/sharing) (publicar) notas al Internet público | ||||
| - Fuerte [encriptación de notas](https://triliumnext.github.io/Docs/Wiki/protected-notes) con granularidad para cada nota | ||||
| - Esbozo de diagramas con Excalidraw incorporado (tipo de nota «canvas») | ||||
| - [Mapas de relaciones](<https://triliumnext.github.io/Docs/Wiki/relation-map>) y [mapas de enlaces](https://triliumnext.github.io/Docs/Wiki/link-map) para visualizar las notas y sus relaciones | ||||
| - [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - vea [casos de uso avanzados](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) | ||||
| - [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) para automatización | ||||
| - Escala bien tanto en uso como en rendimiento a partir de 100,000 notas | ||||
| - [Interfaz móvil](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) optimizada para teléfonos inteligentes y tabletas | ||||
| - [Tema nocturno](https://triliumnext.github.io/Docs/Wiki/themes) | ||||
| - Importación y exportación de [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) y [Markdown](https://triliumnext.github.io/Docs/Wiki/markdown) | ||||
| - [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) para guardar fácilmente contenido web | ||||
|  | ||||
| ✨ Consulte los/las siguientes recursos/comunidades de terceros para obtener más información sobre complementos para TriliumNext: | ||||
|  | ||||
| - [awesome-trilium](https://github.com/Nriver/awesome-trilium) para temas, scripts, plugins y más de terceros. | ||||
| - [TriliumRocks!](https://trilium.rocks/) para tutoriales, guías y mucho más. | ||||
|  | ||||
| ## 🏗 Instalación | ||||
|  | ||||
| ### Escritorio | ||||
|  | ||||
| Para usar TriliumNext en su máquina de escritorio (Linux, MacOS y Windows) tiene algunas opciones: | ||||
|  | ||||
| - Descargue la versión binaria para su plataforma desde la [página de lanzamientos](https://github.com/TriliumNext/Notes/releases/latest), descomprima el paquete y ejecute el ejecutable `trilium`. | ||||
| - Acceda a TriliumNext a través de la interfaz web de una instalación de servidor (ver más abajo) | ||||
|   - Actualmente solo las últimas versiones de Chrome y Firefox son compatibles (y están probadas). | ||||
| - (Próximamente) TriliumNext también se proporcionará como un Flatpak | ||||
|  | ||||
| ### Móvil | ||||
|  | ||||
| Para usar TriliumNext en un dispositivo móvil: | ||||
|  | ||||
| - Utilice un navegador web móvil para acceder a la interfaz móvil de una instalación de servidor (ver más abajo) | ||||
| - El uso de una aplicación móvil aún no está soportado ([vea aquí](https://github.com/TriliumNext/Notes/issues/72)) para seguir las mejoras móviles. | ||||
|  | ||||
| ### Servidor | ||||
|  | ||||
| Para instalar TriliumNext en su servidor (incluyendo vía Docker desde [Dockerhub](https://hub.docker.com/r/triliumnext/notes)) siga la [documentación de instalación de servidor](https://triliumnext.github.io/Docs/Wiki/server-installation). | ||||
|  | ||||
| ## 📝 Documentación | ||||
|  | ||||
| [Vea la Wiki para la lista completa de páginas de documentación.](https://triliumnext.github.io/Docs) | ||||
|  | ||||
| También puede leer [Patrones para una base de conocimiento personal](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) para obtener un poco de inspiración de como podría usar TriliumNext. | ||||
|  | ||||
| ## 💻 Contribuir | ||||
|  | ||||
| Clone localmente y ejecute | ||||
|  | ||||
| ```shell | ||||
| npm install | ||||
| npm run server:start | ||||
| ``` | ||||
|  | ||||
| ## 👏 Reconocimientos | ||||
|  | ||||
| - [CKEditor 5](https://github.com/ckeditor/ckeditor5) - el mejor editor WYSIWYG en el mercado, equipo muy interactivo y atento | ||||
| - [FancyTree](https://github.com/mar10/fancytree) - biblioteca de árbol muy rica en funciones sin competencia real. TriliumNext Notes no sería lo mismo sin esta. | ||||
| - [CodeMirror](https://github.com/codemirror/CodeMirror) - editor de código con soporte para una gran cantidad de lenguajes | ||||
| - [jsPlumb](https://github.com/jsplumb/jsplumb) - biblioteca de conectividad visual sin competencia. Usado en [mapas de relación](https://triliumnext.github.io/Docs/Wiki/Relation-map) y [mapas de enlace](https://triliumnext.github.io/Docs/Wiki/Link-map) | ||||
|  | ||||
| ## 🤝 Soporte | ||||
|  | ||||
| Puede apoyar al desarrollador original de Trilium usando GitHub Sponsors, [PayPal](https://paypal.me/za4am) o Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). | ||||
| Apoyo para la organización TriliumNext será posible en un futuro próximo. | ||||
|  | ||||
| ## 🔑 Licencia | ||||
|  | ||||
| Este programa es software libre: puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de Affero GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a su elección) cualquier versión posterior. | ||||
							
								
								
									
										93
									
								
								README.it.md
									
									
									
									
									
								
							
							
						
						| @@ -1,93 +0,0 @@ | ||||
| # TriliumNext Notes | ||||
|  | ||||
| [English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) | ||||
|  | ||||
| TriliumNext Notes è un'applicazione per appunti ad organizzazione gerarchica, studiata per la costruzione di archivi di conoscenza personali di grandi dimensioni. | ||||
|  | ||||
| Vedi [fotografie](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) per una panoramica veloce: | ||||
|  | ||||
| <a href="https://triliumnext.github.io/Docs/Wiki/screenshot-tour"><img src="https://github.com/TriliumNext/Docs/blob/main/Wiki/images/screenshot.png?raw=true" alt="Trilium Screenshot" width="1000"></a> | ||||
|  | ||||
| ## ⚠️ Perchè TriliumNext? | ||||
| [Il progetto originale Trilium è in modalità di manutenzione](https://github.com/zadam/trilium/issues/4620) | ||||
|  | ||||
| ## 🗭 Discuti con noi | ||||
| Sentiti libero di unirti alle nostre discussioni ufficiali e alla nostra comunità. Siamo concentrati sullo sviluppo di Trilium e ci piacerebbe sapere quali funzioni, suggerimenti o eventuali problemi hai! | ||||
|  | ||||
| - [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (Per discussioni sincrone) | ||||
| - [Discussioni Github](https://github.com/TriliumNext/Notes/discussions) (Per discussioni asincrone) | ||||
| - [Wiki](https://triliumnext.github.io/Docs/) (Per le domande più comuni e le guide per l'utente) | ||||
|  | ||||
| Le due stanze linkate sopra sono connesse e contengono gli stessi messaggi, quindi puoi usare XMPP o Matrix da qualsiasi client tu preferisca, praticamente su qualsiasi piattaforma! | ||||
| ### Comunità non ufficiali | ||||
|  | ||||
| [Trilium Rocks](https://discord.gg/aqdX9mXX4r) | ||||
| ## 🎁 Funzionalità | ||||
|  | ||||
| * Gli appunti possono essere organizzati in un albero di profondità arbitraria. Un singolo appunto può essere collocato in più posti nell'albero (vedi [clonazione](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) | ||||
| * Ricco editor visuale (WYSIWYG), con supporto -tra l'altro- per tabelle, immagini ed [espressioni matematiche](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support) e con [formattazione automatica](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) per markdown | ||||
| * Supporto per la modifica di [appunti con codice sorgente](https://triliumnext.github.io/Docs/Wiki/code-notes), con evidenziazione della sintassi | ||||
| * [Navigazione veloce](https://triliumnext.github.io/Docs/Wiki/note-navigation) tra gli appunti, ricerca testuale completa e [fissaggio degli appunti](https://triliumnext.github.io/Docs/Wiki/note-hoisting) | ||||
| * Supporto integrato ed automatico per le [revisioni degli appunti](https://triliumnext.github.io/Docs/Wiki/note-revisions) | ||||
| * Gli [attributi](https://triliumnext.github.io/Docs/Wiki/attributes) degli appunti possono essere utilizzati per l'organizzazione, per l'interrogazione e per lo scripting avanzato (prorgrammazione). | ||||
| * [Sincronizzazione](https://triliumnext.github.io/Docs/Wiki/synchronization) con un server di sincronizzazione auto-ospitato | ||||
|   * c'è un [servizio di terze parti per ospitare server di sincronizzazione](https://trilium.cc/paid-hosting) | ||||
| * [Condivisione](https://triliumnext.github.io/Docs/Wiki/sharing)  (pubblicazione) di appunti sull'internet pubblico | ||||
| * Robusta [crittografia](https://triliumnext.github.io/Docs/Wiki/protected-notes) configurabile singolarmente per ogni appunto | ||||
| * Disegno di diagrammi con Excalidraw (tipo di appunto "canvas") | ||||
| * [Mappe relazionali](https://triliumnext.github.io/Docs/Wiki/relation-map) e [mappe di collegamenti](https://triliumnext.github.io/Docs/Wiki/link-map) per visualizzare gli appunti e le loro relazioni | ||||
| * [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - vedi [Esempi avanzati](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) | ||||
| * [API REST](https://triliumnext.github.io/Docs/Wiki/etapi) per l'automazione | ||||
| * Si adatta bene sia in termini di usabilità che di prestazioni fino ad oltre 100 000 appunti | ||||
| * Interfaccia utente ottimizzata per il [mobile](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) (smartphone e tablet) | ||||
| * [Tema Notturno](https://triliumnext.github.io/Docs/Wiki/themes) | ||||
| * Supporto per importazione ed esportazione da e per [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) e [Markdown import](https://triliumnext.github.io/Docs/Wiki/markdown) | ||||
| * [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) per il salvataggio facile di contenuti web | ||||
|  | ||||
| ✨ Dai un'occhiata alle seguenti risorse di terze parti per scoprire altre bellezze legate a TriliumNext: | ||||
|  | ||||
| -[awesome-trilium](https://github.com/Nriver/awesome-trilium) per temi, script, plugin e altro di terze parti. | ||||
| - [TriliumRocks!](https://trilium.rocks/) per tutorial, guide e molto altro. | ||||
| ## 🏗 Rilasci | ||||
|  | ||||
|  | ||||
| Trilium è fornito come applicazione desktop (Linux e Windows) o come applicazione web ospitata sul tuo server (Linux). La versione desktop per Mac OS è disponibile, ma [non è supportata](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support). | ||||
|  | ||||
| * Se vuoi usare Trilium sul tuo desktop, scarica il rilascio binario per la tua piattaforma dall'[ultimo rilascio](https://github.com/TriliumNext/Notes/releases/latest), decomprimi l'archivio e avvia l'eseguibile ```trilium```. | ||||
| * Se vuoi installare Trilium su un server, segui [questa pagina](https://triliumnext.github.io/Docs/Wiki/server-installation). | ||||
|   * Per ora solo Chrome e Firefox sono i browser supportati (testati). | ||||
|  | ||||
| TriliumNext sarà fornito anche come Flatpak: | ||||
|  | ||||
| <img width="240" src="https://flathub.org/assets/badges/flathub-badge-en.png"> | ||||
|  | ||||
| ## 📝 Documentazione | ||||
|  | ||||
| [Vedi la wiki per una lista completa delle pagine di documentazione.](https://triliumnext.github.io/Docs/) | ||||
|  | ||||
| Puoi anche leggere ["Patterns of personal knowledge base"](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) per avere un'ispirazione su come potresti utilizzare Trilium. | ||||
|  | ||||
| ## 💻 Contribuire | ||||
|  | ||||
| Clona localmente ed esegui | ||||
|  | ||||
| ```shell | ||||
| npm install | ||||
| npm run server:start | ||||
| ``` | ||||
|  | ||||
| ## 👏 Riconoscimenti | ||||
|  | ||||
| * [CKEditor 5](https://github.com/ckeditor/ckeditor5) - miglior editor visuale (WYSIWYG) sul mercato, squadra di sviluppo attenta e reattiva | ||||
| * [FancyTree](https://github.com/mar10/fancytree) -  libreria per alberi molto ricca di funzionalità, senza pari. Trilium Notes non sarebbe lo stesso senza di essa. | ||||
| * [CodeMirror](https://github.com/codemirror/CodeMirror) - editor di codice con supporto per un'enorme quantità di linguaggi. | ||||
| * [jsPlumb](https://github.com/jsplumb/jsplumb) - libreria per la  connettività visuale senza pari. Utilizzata per [mappe relazionali](https://triliumnext.github.io/Docs/Wiki/relation-map) e [mappe di collegamenti](https://triliumnext.github.io/Docs/Wiki/link-map). | ||||
|  | ||||
| ## 🤝 Supporto | ||||
|  | ||||
| Puoi sostenere lo sviluppatore originale di Trilium utilizzando gli sponsor di GitHub, [PayPal](https://paypal.me/za4am) o Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). | ||||
| Il supporto all'organizzazione TriliumNext sarà possibile nel prossimo futuro. | ||||
|  | ||||
| ## 🔑 Licenza | ||||
|  | ||||
| Questo programma è software libero: è possibile redistribuirlo e/o modificarlo nei termini della GNU Affero General Public License come pubblicata dalla Free Software Foundation, sia la versione 3 della Licenza, o (a propria scelta) qualsiasi versione successiva. | ||||
							
								
								
									
										73
									
								
								README.ja.md
									
									
									
									
									
								
							
							
						
						| @@ -1,73 +0,0 @@ | ||||
| # TriliumNext Notes | ||||
|  | ||||
| [English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) | ||||
|  | ||||
| Trilium Notes は、大規模な個人知識ベースの構築に焦点を当てた、階層型ノートアプリケーションです。概要は[スクリーンショット](https://triliumnext.github.io/Docs/Wiki/screenshot-tour)をご覧ください: | ||||
|  | ||||
| <a href="https://triliumnext.github.io/Docs/Wiki/screenshot-tour"><img src="https://raw.githubusercontent.com/wiki/zadam/trilium/images/screenshot.png" alt="Trilium Screenshot" width="1000"></a> | ||||
|  | ||||
| ## 🎁 特徴 | ||||
|  | ||||
| * ノートは、任意の深さのツリーに配置できます。単一のノートをツリー内の複数の場所に配置できます ([cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes) を参照) | ||||
| * マークダウン[オートフォーマット](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat)による、表、画像、[数学](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support)などの豊富な WYSIWYG ノート編集機能 | ||||
| * シンタックスハイライトを含む[ソースコード付きノート](https://triliumnext.github.io/Docs/Wiki/code-notes)の編集をサポート | ||||
| * [ノート間のナビゲーション](https://triliumnext.github.io/Docs/Wiki/note-navigation)、全文検索、[ノートホイスト](https://triliumnext.github.io/Docs/Wiki/note-hoisting)が高速かつ簡単に行えます | ||||
| * シームレスな[ノートのバージョン管理](https://triliumnext.github.io/Docs/Wiki/note-revisions) | ||||
| * ノート[属性](https://triliumnext.github.io/Docs/Wiki/Attributes)は、ノート整理、クエリ、高度な[スクリプト](https://triliumnext.github.io/Docs/Wiki/scripts)に使用できます | ||||
| * 自己ホスト型同期サーバーとの[同期](https://triliumnext.github.io/Docs/Wiki/synchronization) | ||||
|   * [同期サーバーをホストするサードパーティ・サービス](https://trilium.cc/paid-hosting)があります | ||||
| * 公開インターネットへのノートの[共有](https://triliumnext.github.io/Docs/Wiki/sharing)(公開) | ||||
| * ノートごとの粒度を持つ強力な[ノート暗号化](https://triliumnext.github.io/Docs/Wiki/protected-notes) | ||||
| * 組み込みの Excalidraw を使用した図のスケッチ (ノート タイプ"キャンバス") | ||||
| * ノートとその関係を可視化するための[関係図](https://triliumnext.github.io/Docs/Wiki/relation-map)と[リンクマップ](https://triliumnext.github.io/Docs/Wiki/link-map) | ||||
| * [スクリプティング](https://triliumnext.github.io/Docs/Wiki/scripts) - [高度なショーケース](https://triliumnext.github.io/Docs/Wiki/advanced-showcases)を参照 | ||||
| * 自動化のための [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) | ||||
| * ユーザビリティとパフォーマンスの両方で 100 000 ノート以上に拡張可能 | ||||
| * スマートフォンとタブレット向けのタッチ最適化[モバイルフロントエンド](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) | ||||
| * [ナイトテーマ](https://triliumnext.github.io/Docs/Wiki/themes) | ||||
| * [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) と [Markdown のインポートとエクスポート](https://triliumnext.github.io/Docs/Wiki/Markdown) | ||||
| * Web コンテンツを簡単に保存するための [Web クリッパー](https://triliumnext.github.io/Docs/Wiki/web-clipper) | ||||
|  | ||||
| サードパーティのテーマ、スクリプト、プラグインなどは、 [awesome-trilium](https://github.com/Nriver/awesome-trilium) をチェックしてください。 | ||||
|  | ||||
| ## 🏗 ビルド | ||||
|  | ||||
| Trilium は、デスクトップアプリケーション(Linux、Windows)またはサーバー上でホストされるウェブアプリケーション(Linux)として提供されます。 Mac OS のデスクトップビルドも利用可能ですが、 [unsupported](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support) となっています。 | ||||
|  | ||||
| * デスクトップで Trilium を使用したい場合は、 [latest release](https://github.com/TriliumNext/Notes/releases/latest) からお使いのプラットフォームのバイナリリリースをダウンロードし、パッケージを解凍して ``trilium`` の実行ファイルを実行してください。 | ||||
| * サーバーに Trilium をインストールする場合は、[このページ](https://triliumnext.github.io/Docs/Wiki/server-installation)に従ってください。 | ||||
|   * 現在、対応(動作確認)しているブラウザは、最近の Chrome と Firefox のみです。 | ||||
|  | ||||
| Trilium は Flatpak としても提供されます: | ||||
|  | ||||
| [<img width="240" src="https://flathub.org/assets/badges/flathub-badge-en.png">](https://flathub.org/apps/details/com.github.zadam.trilium) | ||||
|  | ||||
| ## 📝 ドキュメント | ||||
|  | ||||
| [ドキュメントページの全リストはwikiをご覧ください。](https://triliumnext.github.io/Docs/) | ||||
|  | ||||
| また、[個人的な知識基盤のパターン](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge)を読むと、 Trilium の使い方のヒントを得ることができます。 | ||||
|  | ||||
| ## 💻 コントリビュート | ||||
|  | ||||
| または、ローカルにクローンして実行 | ||||
|  | ||||
| ```shell | ||||
| npm install | ||||
| npm run server:start | ||||
| ``` | ||||
|  | ||||
| ## 📢 シャウトアウト | ||||
|  | ||||
| * [CKEditor 5](https://github.com/ckeditor/ckeditor5) - 市場で最高の WYSIWYG エディター、非常にインタラクティブで聞き上手なチーム | ||||
| * [FancyTree](https://github.com/mar10/fancytree) - 真の競争相手がいない、非常に機能豊富なツリーライブラリです。 Trilium Notes は、これなしでは成り立たないでしょう。 | ||||
| * [CodeMirror](https://github.com/codemirror/CodeMirror) - 膨大な数の言語をサポートするコードエディタ | ||||
| * [jsPlumb](https://github.com/jsplumb/jsplumb) - 競合のないビジュアルコネクティビティライブラリです。[関係図](https://triliumnext.github.io/Docs/Wiki/relation-map)、[リンク図](https://triliumnext.github.io/Docs/Wiki/link-map)で使用。 | ||||
|  | ||||
| ## 🤝 サポート | ||||
|  | ||||
| GitHub スポンサー、[PayPal](https://paypal.me/za4am)もしくは Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2) にて Trilium をサポートすることができます。 | ||||
|  | ||||
| ## 🔑 ライセンス | ||||
|  | ||||
| このプログラムはフリーソフトウェアです:フリーソフトウェア財団が発行した GNU Affero General Public License のバージョン3、またはそれ以降のバージョンのいずれかに従って、再配布および/または改変することができます。 | ||||
							
								
								
									
										135
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| @@ -1,122 +1,63 @@ | ||||
| # TriliumNext Notes | ||||
| # Trilium Notes | ||||
|  | ||||
|    | ||||
| [English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md) | ||||
|  | ||||
| [English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) | ||||
| [](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | ||||
| Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases. See [screenshots](https://github.com/zadam/trilium/wiki/Screenshot-tour) for quick overview: | ||||
|  | ||||
| TriliumNext Notes is an open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases. | ||||
|  | ||||
|  | ||||
| See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for quick overview: | ||||
| ## Features | ||||
|  | ||||
| <a href="https://triliumnext.github.io/Docs/Wiki/screenshot-tour"><img src="https://github.com/TriliumNext/Docs/blob/main/Wiki/images/screenshot.png?raw=true" alt="Trilium Screenshot" width="1000"></a> | ||||
|  | ||||
| ## ⚠️ Why TriliumNext? | ||||
|  | ||||
| [The original Trilium project is in maintenance mode](https://github.com/zadam/trilium/issues/4620) | ||||
|  | ||||
| ### Migrating from Trilium? | ||||
|  | ||||
| There are no special migration steps to migrate from a zadam/Trilium instance to a TriliumNext/Notes instance. Simply [install TriliumNext/Notes](#-installation) as usual and it will use your existing database. | ||||
|  | ||||
| Versions up to and including [v0.90.4](https://github.com/TriliumNext/Notes/releases/tag/v0.90.4) are compatible with the latest zadam/trilium version of [v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later versions of TriliumNext have their sync versions incremented. | ||||
|  | ||||
| ## 💬 Discuss with us | ||||
|  | ||||
| Feel free to join our official conversations. We would love to hear what features, suggestions, or issues you may have! | ||||
|  | ||||
| - [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous discussions) | ||||
|   - The `General` Matrix room is also bridged to [XMPP](xmpp:discuss@trilium.thisgreat.party?join) | ||||
| - [Github Discussions](https://github.com/TriliumNext/Notes/discussions) (For Asynchronous discussions) | ||||
| - [Wiki](https://triliumnext.github.io/Docs/) (For common how-to questions and user guides) | ||||
|  | ||||
| ## 🎁 Features | ||||
|  | ||||
| * Notes can be arranged into arbitrarily deep tree. Single note can be placed into multiple places in the tree (see [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) | ||||
| * Rich WYSIWYG note editing including e.g. tables, images and [math](https://triliumnext.github.io/Docs/Wiki/text-notes) with markdown [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) | ||||
| * Support for editing [notes with source code](https://triliumnext.github.io/Docs/Wiki/code-notes), including syntax highlighting | ||||
| * Fast and easy [navigation between notes](https://triliumnext.github.io/Docs/Wiki/note-navigation), full text search and [note hoisting](https://triliumnext.github.io/Docs/Wiki/note-hoisting) | ||||
| * Seamless [note versioning](https://triliumnext.github.io/Docs/Wiki/note-revisions) | ||||
| * Note [attributes](https://triliumnext.github.io/Docs/Wiki/attributes) can be used for note organization, querying and advanced [scripting](https://triliumnext.github.io/Docs/Wiki/scripts) | ||||
| * Direct OpenID and TOTP integration for more secure login | ||||
| * [Synchronization](https://triliumnext.github.io/Docs/Wiki/synchronization) with self-hosted sync server | ||||
|   * there's a [3rd party service for hosting synchronisation server](https://trilium.cc/paid-hosting) | ||||
| * [Sharing](https://triliumnext.github.io/Docs/Wiki/sharing) (publishing) notes to public internet | ||||
| * Strong [note encryption](https://triliumnext.github.io/Docs/Wiki/protected-notes) with per-note granularity | ||||
| * Sketching diagrams with built-in Excalidraw (note type "canvas") | ||||
| * [Relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map) and [link maps](https://triliumnext.github.io/Docs/Wiki/link-map) for visualizing notes and their relations | ||||
| * [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - see [Advanced showcases](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) | ||||
| * [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) for automation | ||||
| * Notes can be arranged into arbitrarily deep tree. Single note can be placed into multiple places in the tree (see [cloning](https://github.com/zadam/trilium/wiki/Cloning-notes)) | ||||
| * Rich WYSIWYG note editing including e.g. tables, images and [math](https://github.com/zadam/trilium/wiki/Text-notes#math-support) with markdown [autoformat](https://github.com/zadam/trilium/wiki/Text-notes#autoformat) | ||||
| * Support for editing [notes with source code](https://github.com/zadam/trilium/wiki/Code-notes), including syntax highlighting | ||||
| * Fast and easy [navigation between notes](https://github.com/zadam/trilium/wiki/Note-navigation), full text search and [note hoisting](https://github.com/zadam/trilium/wiki/Note-hoisting) | ||||
| * Seamless [note versioning](https://github.com/zadam/trilium/wiki/Note-revisions) | ||||
| * Note [attributes](https://github.com/zadam/trilium/wiki/Attributes) can be used for note organization, querying and advanced [scripting](https://github.com/zadam/trilium/wiki/Scripts) | ||||
| * [Synchronization](https://github.com/zadam/trilium/wiki/Synchronization) with self-hosted sync server | ||||
| * Strong [note encryption](https://github.com/zadam/trilium/wiki/Protected-notes) with per-note granularity | ||||
| * [Relation maps](https://github.com/zadam/trilium/wiki/Relation-map) and [link maps](https://github.com/zadam/trilium/wiki/Link-map) for visualizing notes and their relations | ||||
| * [Scripting](https://github.com/zadam/trilium/wiki/Scripts) - see [Advanced showcases](https://github.com/zadam/trilium/wiki/Advanced-showcases) | ||||
| * Scales well in both usability and performance upwards of 100 000 notes | ||||
| * Touch optimized [mobile frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) for smartphones and tablets | ||||
| * [Night theme](https://triliumnext.github.io/Docs/Wiki/themes) | ||||
| * [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) and [Markdown import & export](https://triliumnext.github.io/Docs/Wiki/markdown) | ||||
| * [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) for easy saving of web content | ||||
| * Touch optimized [mobile frontend](https://github.com/zadam/trilium/wiki/Mobile-frontend) for smartphones and tablets | ||||
| * [Night theme](https://github.com/zadam/trilium/wiki/Themes) | ||||
| * [Evernote](https://github.com/zadam/trilium/wiki/Evernote-import) and [Markdown import & export](https://github.com/zadam/trilium/wiki/Markdown) | ||||
| * [Web Clipper](https://github.com/zadam/trilium/wiki/Web-clipper) for easy saving of web content | ||||
|  | ||||
| ✨ Check out the following third-party resources/communities for more TriliumNext related goodies: | ||||
| ## Builds | ||||
|  | ||||
| - [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party themes, scripts, plugins and more. | ||||
| - [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more. | ||||
| Trilium is provided as either desktop application (Linux and Windows) or web application hosted on your server (Linux). Mac OS desktop build is available, but it is [unsupported](https://github.com/zadam/trilium/wiki/FAQ#mac-os-support). | ||||
|  | ||||
| ## 🏗 Installation | ||||
| * If you want to use Trilium on the desktop, download binary release for your platform from [latest release](https://github.com/zadam/trilium/releases/latest), unzip the package and run ```trilium``` executable. | ||||
| * If you want to install Trilium on server, follow [this page](https://github.com/zadam/trilium/wiki/Server-installation). | ||||
|   * Currently only recent Chrome and Firefox are supported (tested) browsers. | ||||
|  | ||||
| ### Desktop | ||||
| ## Documentation | ||||
|  | ||||
| To use TriliumNext on your desktop machine (Linux, MacOS, and Windows) you have a few options: | ||||
| [See wiki for complete list of documentation pages.](https://github.com/zadam/trilium/wiki/) | ||||
|  | ||||
| * Download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Notes/releases/latest), unzip the package and run the ```trilium``` executable. | ||||
| * Access TriliumNext via the web interface of a server installation (see below) | ||||
|     * Currently only the latest versions of Chrome & Firefox are supported (and tested). | ||||
| * TriliumNext is also provided as a Flatpak, but not yet published on FlatHub. | ||||
| You can also read [Patterns of personal knowledge base](https://github.com/zadam/trilium/wiki/Patterns-of-personal-knowledge-base) to get some inspiration on how you might use Trilium. | ||||
|  | ||||
| ### Mobile | ||||
| ## Contribute | ||||
|  | ||||
| To use TriliumNext on a mobile device, you can use a mobile web browser to access the mobile interface of a server installation (see below). | ||||
| Use a browser based dev environment | ||||
|  | ||||
| If you prefer a native Android app, you can use [TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). Report bugs and missing features at [their repository](https://github.com/FliegendeWurst/TriliumDroid). | ||||
| [](https://gitpod.io/#https://github.com/zadam/trilium) | ||||
|  | ||||
| See issue https://github.com/TriliumNext/Notes/issues/72 for more information on mobile app support. | ||||
|  | ||||
| ### Server | ||||
|  | ||||
| To install TriliumNext on your own server (including via Docker from [Dockerhub](https://hub.docker.com/r/triliumnext/notes)) follow [the server installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). | ||||
|  | ||||
| ## 📝 Documentation | ||||
|  | ||||
| [See wiki for complete list of documentation pages.](https://triliumnext.github.io/Docs) | ||||
|  | ||||
| You can also read [Patterns of personal knowledge base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) to get some inspiration on how you might use TriliumNext. | ||||
|  | ||||
| ## 💻 Contribute | ||||
|  | ||||
| ### Code | ||||
|  | ||||
| ```shell | ||||
| git clone https://github.com/TriliumNext/Notes.git | ||||
| cd Notes | ||||
| Or clone locally and run | ||||
| ``` | ||||
| npm install | ||||
| npm run server:start | ||||
| npm run start-server | ||||
| ``` | ||||
|  | ||||
| For more details, see the [development docs](https://github.com/TriliumNext/Notes/blob/develop/docs/Developer%20Guide/Developer%20Guide/Building%20and%20deployment/Running%20a%20development%20build.md). | ||||
|  | ||||
| ### Documentation | ||||
|  | ||||
| See the [documentation guide](https://github.com/TriliumNext/Notes/blob/develop/docs/Developer%20Guide/Developer%20Guide/Documentation.md) for details. | ||||
|  | ||||
| ## 👏 Shoutouts | ||||
| ## Shoutouts | ||||
|  | ||||
| * [CKEditor 5](https://github.com/ckeditor/ckeditor5) - best WYSIWYG editor on the market, very interactive and listening team | ||||
| * [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. TriliumNext Notes would not be the same without it. | ||||
| * [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. Trilium Notes would not be the same without it. | ||||
| * [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages | ||||
| * [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library without competition. Used in [relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) | ||||
| * [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library without competition. Used in [relation maps](https://github.com/zadam/trilium/wiki/Relation-map) and [link maps](https://github.com/zadam/trilium/wiki/Link-map) | ||||
|  | ||||
| ## 🤝 Support | ||||
|  | ||||
| Support for the TriliumNext organization will be possible in the near future. For now, you can: | ||||
| - Support continued development on TriliumNext by supporting our developers: [eliandoran](https://github.com/sponsors/eliandoran) (See the [repository insights]([developers]([url](https://github.com/TriliumNext/Notes/graphs/contributors))) for a full list) | ||||
| - Show a token of gratitude to the original Trilium developer ([zadam](https://github.com/sponsors/zadam)) via [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). | ||||
|  | ||||
|  | ||||
| ## 🔑 License | ||||
| ## License | ||||
|  | ||||
| This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. | ||||
|   | ||||
							
								
								
									
										70
									
								
								README.ru.md
									
									
									
									
									
								
							
							
						
						| @@ -1,59 +1,63 @@ | ||||
| # TriliumNext Notes | ||||
| # Trilium Notes | ||||
|  | ||||
| [English](./README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) | ||||
| [English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md) | ||||
|  | ||||
| Trilium Notes – это приложение для заметок с иерархической структурой, ориентированное на создание больших персональных баз знаний. Для быстрого ознакомления посмотрите [скриншот-тур](https://triliumnext.github.io/Docs/Wiki/screenshot-tour): | ||||
| [](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | ||||
| Trilium Notes – это приложение для заметок с иерархической структурой, ориентированное на создание больших персональных баз знаний. Для быстрого ознакомления посмотрите [скриншот-тур](https://github.com/zadam/trilium/wiki/Screenshot-tour): | ||||
|  | ||||
| <a href="https://triliumnext.github.io/Docs/Wiki/screenshot-tour"><img src="https://github.com/TriliumNext/Docs/blob/main/Wiki/images/screenshot.png?raw=true" alt="Trilium Screenshot" width="1000"></a> | ||||
|  | ||||
|  | ||||
| ## 🎁 Возможности | ||||
| ## Возможности | ||||
|  | ||||
| * Заметки можно расположить в виде дерева произвольной глубины. Отдельную заметку можно разместить в нескольких местах дерева (см. [клонирование](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) | ||||
| * Продвинутый визуальный редактор (WYSIWYG) позволяет работать с таблицами, изображениями, [формулами](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support) и разметкой markdown, имеет [автоформатирование](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) | ||||
| * Редактирование [заметок с исходным кодом](https://triliumnext.github.io/Docs/Wiki/code-notes), включая подсветку синтаксиса | ||||
| * Быстрая и простая [навигация между заметками](https://triliumnext.github.io/Docs/Wiki/note-navigation), полнотекстовый поиск и [выделение заметок](https://triliumnext.github.io/Docs/Wiki/note-hoisting) в отдельный блок | ||||
| * Бесшовное [версионирование заметки](https://triliumnext.github.io/Docs/Wiki/note-revisions) | ||||
| * Специальные [атрибуты](https://triliumnext.github.io/Docs/Wiki/attributes) позволяют гибко организовать структуру, используются для поиска и продвинутого [скриптинга](https://triliumnext.github.io/Docs/Wiki/scripts) | ||||
| * [Синхронизация](https://triliumnext.github.io/Docs/Wiki/synchronization) заметок со своим сервером | ||||
| * Надёжное [шифрование](https://triliumnext.github.io/Docs/Wiki/protected-notes) с детализацией по каждой заметке | ||||
| * [Карты связей](https://triliumnext.github.io/Docs/Wiki/relation-map) и [карты ссылок](https://triliumnext.github.io/Docs/Wiki/link-map) для визуализации их взяимосвязей | ||||
| * [Скрипты](https://triliumnext.github.io/Docs/Wiki/scripts) - см. [продвинутые примеры](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) | ||||
| * Заметки можно расположить в виде дерева произвольной глубины. Отдельную заметку можно разместить в нескольких местах дерева (см. [клонирование](https://github.com/zadam/trilium/wiki/Cloning-notes)) | ||||
| * Продвинутый визуальный редактор (WYSIWYG) позволяет работать с таблицами, изображениями, [формулами](https://github.com/zadam/trilium/wiki/Text-notes#math-support) и разметкой markdown, имеет [автоформатирование](https://github.com/zadam/trilium/wiki/Text-notes#autoformat) | ||||
| * Редактирование [заметок с исходным кодом](https://github.com/zadam/trilium/wiki/Code-notes), включая подсветку синтаксиса | ||||
| * Быстрая и простая [навигация между заметками](https://github.com/zadam/trilium/wiki/Note-navigation), полнотекстовый поиск и [выделение заметок](https://github.com/zadam/trilium/wiki/Note-hoisting) в отдельный блок | ||||
| * Бесшовное [версионирование заметки](https://github.com/zadam/trilium/wiki/Note-revisions) | ||||
| * Специальные [атрибуты](https://github.com/zadam/trilium/wiki/Attributes) позволяют гибко организовать структуру, используются для поиска и продвинутого [скриптинга](https://github.com/zadam/trilium/wiki/Scripts) | ||||
| * [Синхронизация](https://github.com/zadam/trilium/wiki/Synchronization) заметок со своим сервером | ||||
| * Надёжное [шифрование](https://github.com/zadam/trilium/wiki/Protected-notes) с детализацией по каждой заметке | ||||
| * [Карты связей](https://github.com/zadam/trilium/wiki/Relation-map) и [карты ссылок](https://github.com/zadam/trilium/wiki/Link-map) для визуализации их взяимосвязей | ||||
| * [Скрипты](https://github.com/zadam/trilium/wiki/Scripts) - см. [продвинутые примеры](https://github.com/zadam/trilium/wiki/Advanced-showcases) | ||||
| * Хорошо масштабируется, как по удобству использования, так и по производительности до 100000 заметок | ||||
| * Оптимизированный [мобильный фронтенд](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) смартфонов и планшетов | ||||
| * [Темная тема](https://triliumnext.github.io/Docs/Wiki/themes) | ||||
| * Импорт и экпорт [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) и данных в [markdown](https://triliumnext.github.io/Docs/Wiki/markdown) формате | ||||
| * [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) для удобного сохранения веб-контента | ||||
| * Оптимизированный [мобильный фронтенд](https://github.com/zadam/trilium/wiki/Mobile-frontend) смартфонов и планшетов | ||||
| * [Темная тема](https://github.com/zadam/trilium/wiki/Themes) | ||||
| * Импорт и экпорт [Evernote](https://github.com/zadam/trilium/wiki/Evernote-import) и данных в [markdown](https://github.com/zadam/trilium/wiki/Markdown) формате | ||||
| * [Web Clipper](https://github.com/zadam/trilium/wiki/Web-clipper) для удобного сохранения веб-контента | ||||
|  | ||||
| ## 🏗 Сборки | ||||
| ## Сборки | ||||
|  | ||||
| Trilium предоставляется в виде десктопного приложения (Linux и Windows) или веб-приложения, размещенного на вашем сервере (Linux). Доступна сборка Mac OS, но она [не поддерживается](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support). | ||||
| Trilium предоставляется в виде десктопного приложения (Linux и Windows) или веб-приложения, размещенного на вашем сервере (Linux). Доступна сборка Mac OS, но она [не поддерживается](https://github.com/zadam/trilium/wiki/FAQ#mac-os-support). | ||||
|  | ||||
| * Если вы хотите использовать Trilium на десктопе, скачайте архив для своей платформы со страницы [релизов](https://github.com/TriliumNext/Notes/releases/latest), распакуйте и запустите исполняемый файл ```trilium```. | ||||
| * Если вы хотите установить Trilium на сервере, следуйте этой [инструкции](https://triliumnext.github.io/Docs/Wiki/server-installation). | ||||
| * Если вы хотите использовать Trilium на десктопе, скачайте архив для своей платформы со страницы [релизов](https://github.com/zadam/trilium/releases/latest), распакуйте и запустите исполняемый файл ```trilium```. | ||||
| * Если вы хотите установить Trilium на сервере, следуйте этой [инструкции](https://github.com/zadam/trilium/wiki/Server-installation). | ||||
|   * В данный момент поддерживаются (протестированы) последние версии браузеров Chrome и Firefox. | ||||
|  | ||||
| ## 📝 Документация | ||||
| ## Документация | ||||
|  | ||||
| [Полный список страниц документации доступен в Wiki.](https://triliumnext.github.io/Docs/) | ||||
| [Полный список страниц документации доступен в Wiki.](https://github.com/zadam/trilium/wiki/) | ||||
|  | ||||
| Вы также можете ознакомиться с [шаблонами персональных баз знаний](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge), чтобы получить представление о том, как можно использовать Trilium. | ||||
| Вы также можете ознакомиться с [шаблонами персональных баз знаний](https://github.com/zadam/trilium/wiki/Patterns-of-personal-knowledge-base), чтобы получить представление о том, как можно использовать Trilium. | ||||
|  | ||||
| ## 💻 Участвуйте в разработке | ||||
| ## Участвуйте в разработке | ||||
|  | ||||
| Используйте онлайн среду разработки в браузере | ||||
|  | ||||
| [](https://gitpod.io/#https://github.com/zadam/trilium) | ||||
|  | ||||
| Или склонируйте на своё устройство и запустите | ||||
|  | ||||
| ```shell | ||||
| ``` | ||||
| npm install | ||||
| npm run server:start | ||||
| npm run start-server | ||||
| ``` | ||||
|  | ||||
| ## 👏 Благодарности | ||||
| ## Благодарности | ||||
|  | ||||
| * [CKEditor 5](https://github.com/ckeditor/ckeditor5) - лучший WYSIWYG редактор, очень активная и внимательная команда. | ||||
| * [FancyTree](https://github.com/mar10/fancytree) - многофункциональная библиотека для создания древовидных структур. Вне конкуренции. Без него Trilium Notes не были бы таким. | ||||
| * [CodeMirror](https://github.com/codemirror/CodeMirror) - редактор кода с поддержкой огромного количество языков. | ||||
| * [jsPlumb](https://github.com/jsplumb/jsplumb) - библиотека для визуализации связей. Вне конкуренции. Используется в [картах связей](https://triliumnext.github.io/Docs/Wiki/relation-map) и [картах ссылок](https://triliumnext.github.io/Docs/Wiki/link-map). | ||||
| * [jsPlumb](https://github.com/jsplumb/jsplumb) - библиотека для визуализации связей. Вне конкуренции. Используется в [картах связей](https://github.com/zadam/trilium/wiki/Relation-map) и [картах ссылок](https://github.com/zadam/trilium/wiki/Link-map). | ||||
|  | ||||
| ## 🔑 Лицензия | ||||
| ## Лицензия | ||||
|  | ||||
| Эта программа является бесплатным программным обеспечением: вы можете распространять и/или изменять ее в соответствии с условиями GNU Affero General Public License, опубликованной Free Software Foundation, либо версии 3 Лицензии, либо (по вашему выбору) любой более поздней версии. | ||||
|   | ||||
| @@ -10,4 +10,4 @@ Description above is a general rule and may be altered on case by case basis. | ||||
|  | ||||
| ## Reporting a Vulnerability | ||||
|  | ||||
| You can report low severity vulnerabilities as GitHub issues, more severe vulnerabilities should be reported to the email [contact@eliandoran.me](mailto:contact@eliandoran.me) | ||||
| You can report low severity vulnerabilities as GitHub issues, more severe vulnerabilities should be reported to the email zadam.apps@gmail.com | ||||
|   | ||||
							
								
								
									
										3
									
								
								TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | ||||
| - new icon | ||||
| - polish becca entities API | ||||
| - separate private and public APIs in becca entities | ||||
							
								
								
									
										
											BIN
										
									
								
								bin/better-sqlite3/linux-desktop-better_sqlite3.node
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								bin/better-sqlite3/linux-server-better_sqlite3.node
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								bin/better-sqlite3/mac-better_sqlite3.node
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								bin/better-sqlite3/win-better_sqlite3.node
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										22
									
								
								bin/build-debian.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,22 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| echo "Packaging debian x64 distribution..." | ||||
|  | ||||
| VERSION=`jq -r ".version" package.json` | ||||
|  | ||||
| ./node_modules/.bin/electron-installer-debian --config bin/deb-options.json --options.version=${VERSION} --arch amd64 | ||||
|  | ||||
|  | ||||
| # hacky stop-gag measure to produce debian compatible XZ compressed debs until this is fixed: https://github.com/electron-userland/electron-installer-debian/issues/272 | ||||
| cd dist | ||||
| ar x trilium_${VERSION}_amd64.deb | ||||
| rm trilium_${VERSION}_amd64.deb | ||||
| # recompress | ||||
| < control.tar.zst zstd -d | xz > control.tar.xz | ||||
| < data.tar.zst zstd -d | xz > data.tar.xz | ||||
| # create deb archive (I really do not know, what argument "sdsd" is for but something is required for ar to create the archive as desired) | ||||
| ar -m -c -a sdsd trilium_${VERSION}_amd64.deb debian-binary control.tar.xz data.tar.xz | ||||
|  | ||||
| rm control* data* debian-binary | ||||
|  | ||||
| echo "Converted to XZ deb" | ||||
| @@ -1,12 +1,12 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| set -e  # Fail on any command error | ||||
|  | ||||
| VERSION=`jq -r ".version" package.json` | ||||
| SERIES=${VERSION:0:4}-latest | ||||
|  | ||||
| sudo docker build -t triliumnext/notes:$VERSION --network host -t triliumnext/notes:$SERIES . | ||||
| cat package.json | grep -v electron > server-package.json | ||||
|  | ||||
| sudo docker build -t zadam/trilium:$VERSION --network host -t zadam/trilium:$SERIES . | ||||
|  | ||||
| if [[ $VERSION != *"beta"* ]]; then | ||||
|   sudo docker tag triliumnext/notes:$VERSION triliumnext/notes:latest | ||||
|   sudo docker tag zadam/trilium:$VERSION zadam/trilium:latest | ||||
| fi | ||||
|   | ||||
							
								
								
									
										48
									
								
								bin/build-linux-x64.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,48 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| SRC_DIR=./dist/trilium-linux-x64-src | ||||
|  | ||||
| if [ "$1" != "DONTCOPY" ] | ||||
| then | ||||
|     ./bin/copy-trilium.sh $SRC_DIR | ||||
| fi | ||||
|  | ||||
| rm -r $SRC_DIR/src/public/app-dist/*.mobile.* | ||||
|  | ||||
| echo "Copying required linux-x64 binaries" | ||||
|  | ||||
| cp -r bin/better-sqlite3/linux-desktop-better_sqlite3.node $SRC_DIR/node_modules/better-sqlite3/build/Release/better_sqlite3.node | ||||
|  | ||||
| echo "Packaging linux x64 electron build" | ||||
|  | ||||
| ./node_modules/.bin/electron-packager $SRC_DIR --asar --out=dist --executable-name=trilium --platform=linux --arch=x64 --overwrite | ||||
|  | ||||
| BUILD_DIR=./dist/trilium-linux-x64 | ||||
| rm -rf $BUILD_DIR | ||||
|  | ||||
| mv "./dist/Trilium Notes-linux-x64" $BUILD_DIR | ||||
|  | ||||
| cp images/app-icons/png/128x128.png $BUILD_DIR/icon.png | ||||
|  | ||||
| # removing software WebGL binaries because they are pretty huge and not necessary | ||||
| rm -r $BUILD_DIR/swiftshader | ||||
|  | ||||
| cp bin/tpl/trilium-portable.sh $BUILD_DIR/ | ||||
| chmod 755 $BUILD_DIR/trilium-portable.sh | ||||
|  | ||||
| cp bin/tpl/trilium-safe-mode.sh $BUILD_DIR/ | ||||
| chmod 755 $BUILD_DIR/trilium-safe-mode.sh | ||||
|  | ||||
| cp bin/tpl/trilium-no-cert-check.sh $BUILD_DIR/ | ||||
| chmod 755 $BUILD_DIR/trilium-no-cert-check.sh | ||||
|  | ||||
| echo "Packaging linux x64 electron distribution..." | ||||
| VERSION=`jq -r ".version" package.json` | ||||
|  | ||||
| cd dist | ||||
|  | ||||
| tar cJf trilium-linux-x64-${VERSION}.tar.xz trilium-linux-x64 | ||||
|  | ||||
| cd .. | ||||
|  | ||||
| bin/build-debian.sh | ||||
							
								
								
									
										33
									
								
								bin/build-mac-x64.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| SRC_DIR=./dist/trilium-mac-x64-src | ||||
|  | ||||
| if [ "$1" != "DONTCOPY" ] | ||||
| then | ||||
|     ./bin/copy-trilium.sh $SRC_DIR | ||||
| fi | ||||
|  | ||||
| echo "Copying required mac binaries" | ||||
|  | ||||
| cp -r bin/better-sqlite3/mac-better_sqlite3.node $SRC_DIR/node_modules/better-sqlite3/build/Release/better_sqlite3.node | ||||
|  | ||||
| rm -r $SRC_DIR/src/public/app-dist/*.mobile.* | ||||
|  | ||||
| echo "Packaging mac x64 electron build" | ||||
|  | ||||
| ./node_modules/.bin/electron-packager $SRC_DIR --asar --out=dist --executable-name=trilium --platform=darwin --arch=x64 --overwrite --icon=images/app-icons/mac/icon.icns | ||||
|  | ||||
| BUILD_DIR=./dist/trilium-mac-x64 | ||||
| rm -rf $BUILD_DIR | ||||
|  | ||||
| # Mac build has by default useless directory level | ||||
| mv "./dist/Trilium Notes-darwin-x64" $BUILD_DIR | ||||
|  | ||||
| echo "Zipping mac x64 electron distribution..." | ||||
|  | ||||
| VERSION=`jq -r ".version" package.json` | ||||
|  | ||||
| cd dist | ||||
|  | ||||
| rm trilium-mac-x64-${VERSION}.zip | ||||
| zip -r9 --symlinks trilium-mac-x64-${VERSION}.zip trilium-mac-x64 | ||||
| @@ -1,73 +1,33 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| set -e  # Fail on any command error | ||||
| PKG_DIR=dist/trilium-linux-x64-server | ||||
| NODE_VERSION=16.13.1 | ||||
|  | ||||
| # Debug output | ||||
| echo "Matrix Arch: $MATRIX_ARCH" | ||||
|  | ||||
| # Detect architecture from matrix input, fallback to system architecture | ||||
| if [ -n "$MATRIX_ARCH" ]; then | ||||
|     ARCH=$MATRIX_ARCH | ||||
| else | ||||
|     ARCH=$(uname -m) | ||||
|     # Convert system architecture to our naming convention | ||||
|     case $ARCH in | ||||
|         x86_64) ARCH="x64" ;; | ||||
|         aarch64) ARCH="arm64" ;; | ||||
|     esac | ||||
| if [ "$1" != "DONTCOPY" ] | ||||
| then | ||||
|     ./bin/copy-trilium.sh $PKG_DIR | ||||
| fi | ||||
|  | ||||
| # Debug output | ||||
| echo "Selected Arch: $ARCH" | ||||
|  | ||||
| # Set Node.js version and architecture-specific filename | ||||
| NODE_VERSION=22.14.0 | ||||
|  | ||||
| BUILD_DIR="./build" | ||||
| DIST_DIR="./dist" | ||||
| CLEANUP_SCRIPT="./bin/cleanupNodeModules.ts" | ||||
|  | ||||
|  | ||||
| # Trigger the build | ||||
| echo "Build start" | ||||
| npm run build:prepare-dist | ||||
| echo "Build finished" | ||||
|  | ||||
| # pruning of unnecessary files and devDeps in node_modules | ||||
| node --experimental-strip-types $CLEANUP_SCRIPT $BUILD_DIR | ||||
|  | ||||
| NODE_FILENAME=node-v${NODE_VERSION}-linux-${ARCH} | ||||
|  | ||||
| echo "Downloading Node.js runtime $NODE_FILENAME..." | ||||
| cd $BUILD_DIR | ||||
| wget -qO- https://nodejs.org/dist/v${NODE_VERSION}/${NODE_FILENAME}.tar.xz | tar xfJ - | ||||
| mv $NODE_FILENAME node | ||||
| cd dist | ||||
| wget https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz | ||||
| tar xfJ node-v${NODE_VERSION}-linux-x64.tar.xz | ||||
| rm node-v${NODE_VERSION}-linux-x64.tar.xz | ||||
| cd .. | ||||
|  | ||||
| mv dist/node-v${NODE_VERSION}-linux-x64 $PKG_DIR/node | ||||
|  | ||||
| rm -r $BUILD_DIR/node/lib/node_modules/{npm,corepack} \ | ||||
|     $BUILD_DIR/node/bin/{npm,npx,corepack} \ | ||||
|     $BUILD_DIR/node/CHANGELOG.md \ | ||||
|     $BUILD_DIR/node/include/node \ | ||||
|     $BUILD_DIR/node_modules/electron* \ | ||||
|     $BUILD_DIR/electron*.{js,map} | ||||
| rm -r $PKG_DIR/node/lib/node_modules/npm | ||||
| rm -r $PKG_DIR/node/include/node | ||||
|  | ||||
| printf "#!/bin/sh\n./node/bin/node src/main\n" > $BUILD_DIR/trilium.sh | ||||
| chmod 755 $BUILD_DIR/trilium.sh | ||||
| rm -r $PKG_DIR/node_modules/electron* | ||||
|  | ||||
| # TriliumNextTODO: is this still required? If yes → move to copy-dist/copy-trilium | ||||
| cp bin/tpl/anonymize-database.sql $BUILD_DIR/ | ||||
| cp -r bin/better-sqlite3/linux-server-better_sqlite3.node $PKG_DIR/node_modules/better-sqlite3/build/Release/better_sqlite3.node | ||||
|  | ||||
| printf "#!/bin/sh\n./node/bin/node src/www" > $PKG_DIR/trilium.sh | ||||
| chmod 755 $PKG_DIR/trilium.sh | ||||
|  | ||||
| VERSION=`jq -r ".version" package.json` | ||||
|  | ||||
| cd dist | ||||
|  | ||||
| ARCHIVE_NAME="TriliumNextNotes-Server-${VERSION}-linux-${ARCH}" | ||||
| echo "Creating Archive $ARCHIVE_NAME..." | ||||
|  | ||||
| mkdir $DIST_DIR | ||||
| cp -r "$BUILD_DIR" "$DIST_DIR/$ARCHIVE_NAME" | ||||
| cd $DIST_DIR | ||||
| tar cJf "$ARCHIVE_NAME.tar.xz" "$ARCHIVE_NAME" | ||||
| rm -rf "$ARCHIVE_NAME" | ||||
|  | ||||
| echo "Server Build Completed!" | ||||
| tar cJf trilium-linux-x64-server-${VERSION}.tar.xz trilium-linux-x64-server | ||||
|   | ||||
							
								
								
									
										37
									
								
								bin/build-win-x64.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,37 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| SRC_DIR=./dist/trilium-windows-x64-src | ||||
|  | ||||
| if [ "$1" != "DONTCOPY" ] | ||||
| then | ||||
|     ./bin/copy-trilium.sh $SRC_DIR | ||||
| fi | ||||
|  | ||||
| echo "Copying required windows binaries" | ||||
|  | ||||
| cp -r bin/better-sqlite3/win-better_sqlite3.node $SRC_DIR/node_modules/better-sqlite3/build/Release/better_sqlite3.node | ||||
|  | ||||
| rm -r $SRC_DIR/src/public/app-dist/*.mobile.* | ||||
|  | ||||
| echo "Packaging windows x64 electron build" | ||||
|  | ||||
| ./node_modules/.bin/electron-packager $SRC_DIR --asar --out=dist --executable-name=trilium --platform=win32  --arch=x64 --overwrite --icon=images/app-icons/win/icon.ico | ||||
|  | ||||
| BUILD_DIR=./dist/trilium-windows-x64 | ||||
| rm -rf $BUILD_DIR | ||||
|  | ||||
| mv "./dist/Trilium Notes-win32-x64" $BUILD_DIR | ||||
|  | ||||
| # removing software WebGL binaries because they are pretty huge and not necessary | ||||
| rm -r $BUILD_DIR/swiftshader | ||||
|  | ||||
| cp bin/tpl/trilium-portable.bat $BUILD_DIR/ | ||||
| cp bin/tpl/trilium-no-cert-check.bat $BUILD_DIR/ | ||||
| cp bin/tpl/trilium-safe-mode.bat $BUILD_DIR/ | ||||
|  | ||||
| echo "Zipping windows x64 electron distribution..." | ||||
| VERSION=`jq -r ".version" package.json` | ||||
|  | ||||
| cd dist | ||||
|  | ||||
| zip -r9 trilium-windows-x64-${VERSION}.zip trilium-windows-x64 | ||||
							
								
								
									
										23
									
								
								bin/build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,23 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| echo "Deleting existing builds" | ||||
|  | ||||
| rm -rf dist/* | ||||
|  | ||||
| SRC_DIR=dist/trilium-src | ||||
|  | ||||
| bin/copy-trilium.sh $SRC_DIR | ||||
|  | ||||
| # we'll just copy the same SRC dir to all the builds so we don't have to do npm install in each separately | ||||
| cp -r $SRC_DIR ./dist/trilium-linux-x64-src | ||||
| cp -r $SRC_DIR ./dist/trilium-linux-x64-server | ||||
| cp -r $SRC_DIR ./dist/trilium-windows-x64-src | ||||
| cp -r $SRC_DIR ./dist/trilium-mac-x64-src | ||||
|  | ||||
| bin/build-win-x64.sh DONTCOPY | ||||
|  | ||||
| bin/build-mac-x64.sh DONTCOPY | ||||
|  | ||||
| bin/build-linux-x64.sh DONTCOPY | ||||
|  | ||||
| bin/build-server.sh DONTCOPY | ||||
| @@ -1,109 +0,0 @@ | ||||
| import fs from "fs-extra"; | ||||
| import path from "path"; | ||||
| import type { Dirent } from "fs-extra"; | ||||
| import { execSync } from "node:child_process"; | ||||
|  | ||||
| /** | ||||
|  * Example usage with node >= v22: | ||||
|  *    node --experimental-strip-types bin/cleanupNodeModules.ts /path/to/build/folder [--skip-prune-dev-deps] | ||||
|  * Example usage with tsx: | ||||
|  *    tsx bin/cleanupNodeModules.ts /path/to/build/folder [--skip-prune-dev-deps] | ||||
|  */ | ||||
| function main() { | ||||
|  | ||||
|     if (process.argv.length > 4 || process.argv.length < 3) { | ||||
|         console.error("Usage: cleanupNodeModules.ts [path-to-build-folder] [--skip-prune-dev-deps]"); | ||||
|         process.exit(1); | ||||
|     } | ||||
|  | ||||
|     const basePath = process.argv[2]; | ||||
|     const pruneDevDeps = process.argv[3] !== "--skip-prune-dev-deps"; | ||||
|  | ||||
|     if (!fs.existsSync(basePath)) { | ||||
|         console.error(`Supplied path '${basePath}' does not exist. Aborting.`); | ||||
|         process.exit(1); | ||||
|     } | ||||
|  | ||||
|     console.log(`Starting pruning of node_modules ${!pruneDevDeps ? '(skipping npm pruning)' : ''} in '${basePath}'...`); | ||||
|     cleanupNodeModules(basePath, pruneDevDeps); | ||||
|     console.log("Successfully pruned node_modules."); | ||||
| } | ||||
|  | ||||
| function cleanupNodeModules(basePath: string, pruneDevDeps: boolean = true) { | ||||
|  | ||||
|     // This needs to run for the server and Docker build, | ||||
|     // but needs to be skipped for electron-forge: its | ||||
|     // built-in pruning takes care of it already | ||||
|     if (pruneDevDeps) { | ||||
|         execSync(`npm ci --omit=dev --prefix ${basePath}`); | ||||
|     } | ||||
|  | ||||
|     const nodeModulesDirPath = path.join(basePath, "node_modules"); | ||||
|     const nodeModulesContent = fs.readdirSync(nodeModulesDirPath, { recursive: true, withFileTypes: true }); | ||||
|     //const libDir = fs.readdirSync(path.join(basePath, "./libraries"), { recursive: true, withFileTypes: true }); | ||||
|  | ||||
|     /** | ||||
|      * Delete unnecessary folders | ||||
|      */ | ||||
|     const filterableDirs = new Set([ | ||||
|         "demo", | ||||
|         "demos", | ||||
|         "doc", | ||||
|         "docs", | ||||
|         "example", | ||||
|         "examples", | ||||
|         "test", | ||||
|         "tests" | ||||
|     ]); | ||||
|  | ||||
|     nodeModulesContent | ||||
|         .filter(el => el.isDirectory() && filterableDirs.has(el.name)) | ||||
|         .forEach(dir => removeDirent(dir)); | ||||
|  | ||||
|     /** | ||||
|      * Delete unnecessary files based on file extension | ||||
|      * TODO filter out useless (README).md files | ||||
|      */ | ||||
|     const filterableFileExt = new Set([ | ||||
|         "ts", | ||||
|         "map" | ||||
|     ]); | ||||
|  | ||||
|     nodeModulesContent | ||||
|         // TriliumNextTODO: check if we can improve this naive file ext matching, without introducing any additional dependency | ||||
|         .filter(el => el.isFile() && filterableFileExt.has(el.name.split(".").at(-1) || "")) | ||||
|         .forEach(dir => removeDirent(dir)); | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Delete specific unnecessary folders | ||||
|      * TODO: check if we want removeSync to throw an error, if path does not exist anymore -> currently it will silently fail | ||||
|      */ | ||||
|     const extraFoldersDelete = new Set([ | ||||
|         path.join(nodeModulesDirPath, ".bin"), | ||||
|         path.join(nodeModulesDirPath, "@excalidraw", "excalidraw", "dist", "dev"), | ||||
|         path.join(nodeModulesDirPath, "boxicons", "svg"), | ||||
|         path.join(nodeModulesDirPath, "boxicons", "node_modules"), | ||||
|         path.join(nodeModulesDirPath, "boxicons", "src"), | ||||
|         path.join(nodeModulesDirPath, "boxicons", "iconjar"), | ||||
|         path.join(nodeModulesDirPath, "@jimp", "plugin-print", "fonts"), | ||||
|         path.join(nodeModulesDirPath, "jimp", "dist", "browser") // missing "@" in front of jimp is not a typo here | ||||
|     ]); | ||||
|  | ||||
|     nodeModulesContent | ||||
|         .filter(el => el.isDirectory() && extraFoldersDelete.has(path.join(el.parentPath, el.name))) | ||||
|         .forEach(dir => removeDirent(dir)) | ||||
| } | ||||
|  | ||||
|  | ||||
| function removeDirent(el: Dirent) { | ||||
|     const elementToDelete = path.join(el.parentPath, el.name); | ||||
|     fs.removeSync(elementToDelete); | ||||
|  | ||||
|     if (process.env.VERBOSE) { | ||||
|         console.log(`Deleted ${elementToDelete}`); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| main() | ||||
| @@ -1,65 +0,0 @@ | ||||
| import fs from "fs-extra"; | ||||
| import path from "path"; | ||||
|  | ||||
| const DEST_DIR = "./build"; | ||||
|  | ||||
| const VERBOSE = process.env.VERBOSE; | ||||
|  | ||||
| function log(...args: any[]) { | ||||
|     if (VERBOSE) { | ||||
|         console.log(...args); | ||||
|     } | ||||
| } | ||||
|  | ||||
| try { | ||||
|  | ||||
|     const assetsToCopy = new Set([ | ||||
|         // copy node_module, to avoid downloading packages a 2nd time during pruning | ||||
|         "./node_modules", | ||||
|         "./images", | ||||
|         "./libraries", | ||||
|         "./translations", | ||||
|         "./db", | ||||
|         "./config-sample.ini", | ||||
|         "./package-lock.json", | ||||
|         "./package.json", | ||||
|         "./LICENSE", | ||||
|         "./README.md", | ||||
|         "./forge.config.cjs", | ||||
|         "./bin/tpl/", | ||||
|         "./bin/cleanupNodeModules.ts", | ||||
|         "./bin/electron-forge/desktop.ejs", | ||||
|         "./bin/electron-forge/sign-windows.cjs", | ||||
|         "./src/views/", | ||||
|         "./src/etapi/etapi.openapi.yaml", | ||||
|         "./src/routes/api/openapi.json", | ||||
|         "./src/public/icon.png", | ||||
|         "./src/public/manifest.webmanifest", | ||||
|         "./src/public/robots.txt", | ||||
|         "./src/public/fonts", | ||||
|         "./src/public/stylesheets", | ||||
|         "./src/public/translations", | ||||
|         "./packages/turndown-plugin-gfm/src" | ||||
|     ]); | ||||
|  | ||||
|     for (const asset of assetsToCopy) { | ||||
|         log(`Copying ${asset}`); | ||||
|         fs.copySync(asset, path.join(DEST_DIR, asset)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Directories to be copied relative to the project root into <resource_dir>/src/public/app-dist. | ||||
|      */ | ||||
|     const publicDirsToCopy = ["./src/public/app/doc_notes"]; | ||||
|     const PUBLIC_DIR = path.join(DEST_DIR, "src", "public", "app-dist"); | ||||
|     for (const dir of publicDirsToCopy) { | ||||
|         fs.copySync(dir, path.join(PUBLIC_DIR, path.basename(dir))); | ||||
|     } | ||||
|  | ||||
|     console.log("Copying complete!") | ||||
|  | ||||
| } catch(err) { | ||||
|     console.error("Error during copy:", err) | ||||
|     process.exit(1) | ||||
| } | ||||
|  | ||||
							
								
								
									
										51
									
								
								bin/copy-trilium.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,51 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| if [[ $# -eq 0 ]] ; then | ||||
|     echo "Missing argument of target directory" | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| n exec 16.13.1 npm run webpack | ||||
|  | ||||
| DIR=$1 | ||||
|  | ||||
| rm -rf $DIR | ||||
| mkdir $DIR | ||||
|  | ||||
| echo "Copying Trilium to build directory $DIR" | ||||
|  | ||||
| cp -r images $DIR/ | ||||
| cp -r libraries $DIR/ | ||||
| cp -r src $DIR/ | ||||
| cp -r db $DIR/ | ||||
| cp -r package.json $DIR/ | ||||
| cp -r package-lock.json $DIR/ | ||||
| cp -r README.md $DIR/ | ||||
| cp -r LICENSE $DIR/ | ||||
| cp -r config-sample.ini $DIR/ | ||||
| cp -r electron.js $DIR/ | ||||
| cp webpack-* $DIR/ | ||||
|  | ||||
| # run in subshell (so we return to original dir) | ||||
| (cd $DIR && n exec 16.13.1 npm install --only=prod) | ||||
|  | ||||
| # cleanup of useless files in dependencies | ||||
| rm -r $DIR/node_modules/image-q/demo | ||||
| rm -r $DIR/node_modules/better-sqlite3/Release | ||||
| rm -r $DIR/node_modules/better-sqlite3/deps/sqlite3.tar.gz | ||||
| rm -r $DIR/node_modules/@jimp/plugin-print/fonts | ||||
| rm -r $DIR/node_modules/jimp/browser | ||||
| rm -r $DIR/node_modules/jimp/fonts | ||||
|  | ||||
| # delete all tests (there are often large images as test file for jimp etc.) | ||||
| find $DIR/node_modules -name test -exec rm -rf {} \; | ||||
| find $DIR/node_modules -name docs -exec rm -rf {} \; | ||||
| find $DIR/node_modules -name demo -exec rm -rf {} \; | ||||
|  | ||||
| find $DIR/libraries -name "*.map" -type f -delete | ||||
|  | ||||
| rm -r $DIR/src/public/app | ||||
|  | ||||
| sed -i -e 's/app\/desktop.js/app-dist\/desktop.js/g' $DIR/src/views/desktop.ejs | ||||
| sed -i -e 's/app\/mobile.js/app-dist\/mobile.js/g' $DIR/src/views/mobile.ejs | ||||
| sed -i -e 's/app\/setup.js/app-dist\/setup.js/g' $DIR/src/views/setup.ejs | ||||
| @@ -1,7 +0,0 @@ | ||||
| #!/usr/bin/env node | ||||
|  | ||||
| import anonymizationService from "../src/services/anonymization.js"; | ||||
| import fs from "fs"; | ||||
| import path from "path"; | ||||
|  | ||||
| fs.writeFileSync(path.resolve(__dirname, "tpl", "anonymize-database.sql"), anonymizationService.getFullAnonymizationScript()); | ||||
| @@ -1,52 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| if ! command -v magick &> /dev/null; then | ||||
|   echo "This tool requires ImageMagick to be installed in order to create the icons." | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| if ! command -v inkscape &> /dev/null; then | ||||
|   echo "This tool requires Inkscape to be render sharper SVGs than ImageMagick." | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| if ! command -v icnsutil &> /dev/null; then | ||||
|   echo "This tool requires icnsutil to be installed in order to generate macOS icons." | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| script_dir=$(realpath $(dirname $0)) | ||||
| cd "${script_dir}/../images/app-icons" | ||||
| inkscape -w 180 -h 180 "../icon-color.svg" -o "./ios/apple-touch-icon.png" | ||||
|  | ||||
| # Build PNGs | ||||
| inkscape -w 128 -h 128 "../icon-color.svg" -o "./png/128x128.png" | ||||
| inkscape -w 256 -h 256 "../icon-color.svg" -o "./png/256x256.png" | ||||
|  | ||||
| # Build dev icons (including tray) | ||||
| inkscape -w 16 -h 16 "../icon-purple.svg" -o "./png/16x16-dev.png" | ||||
| inkscape -w 32 -h 32 "../icon-purple.svg" -o "./png/32x32-dev.png" | ||||
| inkscape -w 256 -h 256 "../icon-purple.svg" -o "./png/256x256-dev.png" | ||||
|  | ||||
| # Build Mac .icns | ||||
| declare -a sizes=("16" "32" "512" "1024") | ||||
| for size in "${sizes[@]}"; do | ||||
|   inkscape -w $size -h $size "../icon-color.svg" -o "./png/${size}x${size}.png" | ||||
| done | ||||
|  | ||||
| mkdir -p fakeapp.app | ||||
| npx iconsur set fakeapp.app -l -i "png/1024x1024.png" -o "mac/1024x1024.png" -s 0.8 | ||||
| declare -a sizes=("16x16" "32x32" "128x128" "512x512") | ||||
| for size in "${sizes[@]}"; do | ||||
|   magick "mac/1024x1024.png" -resize "${size}" "mac/${size}.png" | ||||
| done | ||||
| icnsutil compose -f "mac/icon.icns" ./mac/*.png | ||||
|  | ||||
| # Build Windows icon | ||||
| magick -background none "../icon-color.svg" -define icon:auto-resize=16,32,48,64,128,256 "./icon.ico" | ||||
|  | ||||
| # Build Windows setup icon | ||||
| magick -background none "../icon-installer.svg" -define icon:auto-resize=16,32,48,64,128,256 "./win/setup.ico" | ||||
|  | ||||
| # Build Squirrel splash image | ||||
| magick "./png/256x256.png" -background "#ffffff" -gravity center -extent 640x480 "./win/setup-banner.gif" | ||||
							
								
								
									
										14
									
								
								bin/deb-options.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | ||||
| { | ||||
|   "src": "dist/trilium-linux-x64", | ||||
|   "dest": "dist/", | ||||
|   "name": "trilium", | ||||
|   "productName": "Trilium Notes", | ||||
|   "genericName": "Note taker", | ||||
|   "description": "Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases.", | ||||
|   "sections": "misc", | ||||
|   "maintainer": "zadam.apps@gmail.com", | ||||
|   "homepage": "https://github.com/zadam/trilium", | ||||
|   "bin": "trilium", | ||||
|   "icon": "dist/trilium-linux-x64/icon.png", | ||||
|   "categories": [ "Office" ] | ||||
| } | ||||
| @@ -1,17 +0,0 @@ | ||||
| [Desktop Entry] | ||||
| <%= | ||||
| Object.entries({ | ||||
|     "Name": productName, | ||||
|     "Comment": description, | ||||
|     "GenericName": genericName, | ||||
|     "Exec": name ? `${name} %U` : undefined, | ||||
|     "Icon": name, | ||||
|     "Type": "Application", | ||||
|     "StartupNotify": "true", | ||||
|     "StartupWMClass": productName, | ||||
|     "Categories": categories?.length ? `${categories.join(";")};` : undefined, | ||||
|     "MimeType": mimeType?.length ? `${mimeType.join(";")};` : undefined | ||||
| }) | ||||
| .map(line => line[1] ? line.join("=") : undefined) | ||||
| .filter(line => !!line) | ||||
| .join("\n")%> | ||||
| @@ -1,14 +0,0 @@ | ||||
| const child_process = require("child_process"); | ||||
|  | ||||
| module.exports = function (filePath) { | ||||
|     const { WINDOWS_SIGN_EXECUTABLE } = process.env; | ||||
|  | ||||
|     if (!WINDOWS_SIGN_EXECUTABLE) { | ||||
|         console.warn("[Sign] Skip signing due to missing environment variable."); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const command = `${WINDOWS_SIGN_EXECUTABLE} --executable "${filePath}"`; | ||||
|     console.log(`[Sign] ${command}`); | ||||
|     child_process.execSync(command); | ||||
| } | ||||
| @@ -2,6 +2,6 @@ | ||||
|  | ||||
| SCHEMA_FILE_PATH=db/schema.sql | ||||
|  | ||||
| sqlite3 ./data/document.db .schema | grep -v "sqlite_sequence" > "$SCHEMA_FILE_PATH" | ||||
| sqlite3 ~/trilium-data/document.db .schema | grep -v "sqlite_sequence" > "$SCHEMA_FILE_PATH" | ||||
|  | ||||
| echo "DB schema exported to $SCHEMA_FILE_PATH" | ||||
| @@ -1,191 +0,0 @@ | ||||
| import { fileURLToPath } from "url"; | ||||
| import { dirname, join } from "path"; | ||||
| import swaggerJsdoc from "swagger-jsdoc"; | ||||
| import fs from "fs"; | ||||
|  | ||||
| /* | ||||
|  * Usage: npm run generate-openapi | tail -n1 > x.json | ||||
|  * | ||||
|  * Inspect generated file by opening it in https://editor-next.swagger.io/ | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| const options = { | ||||
|     definition: { | ||||
|         openapi: "3.1.1", | ||||
|         info: { | ||||
|             title: "Trilium Notes - Sync server API", | ||||
|             version: "0.96.6", | ||||
|             description: | ||||
|                 "This is the internal sync server API used by Trilium Notes / TriliumNext Notes.\n\n_If you're looking for the officially supported External Trilium API, see [here](https://triliumnext.github.io/Docs/Wiki/etapi.html)._\n\nThis page does not yet list all routes. For a full list, see the [route controller](https://github.com/TriliumNext/Notes/blob/v0.91.6/src/routes/routes.ts).", | ||||
|             contact: { | ||||
|                 name: "TriliumNext issue tracker", | ||||
|                 url: "https://github.com/TriliumNext/Notes/issues" | ||||
|             }, | ||||
|             license: { | ||||
|                 name: "GNU Free Documentation License 1.3 (or later)", | ||||
|                 url: "https://www.gnu.org/licenses/fdl-1.3" | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     apis: [ | ||||
|         // Put individual files here to have them ordered first. | ||||
|         "./src/routes/api/setup.ts", | ||||
|         // all other files | ||||
|         "./src/routes/api/*.ts", | ||||
|         "./bin/generate-openapi.js" | ||||
|     ] | ||||
| }; | ||||
|  | ||||
| const openapiSpecification = swaggerJsdoc(options); | ||||
| const scriptDir = dirname(fileURLToPath(import.meta.url)); | ||||
| const outputPath = join(scriptDir, "..", "src", "routes", "api", "openapi.json"); | ||||
| fs.writeFileSync(outputPath, JSON.stringify(openapiSpecification)); | ||||
| console.log("Saved to ", outputPath); | ||||
|  | ||||
| /** | ||||
|  * @swagger | ||||
|  * tags: | ||||
|  *   - name: auth | ||||
|  *     description: Authentication | ||||
|  *   - name: sync | ||||
|  *     description: Synchronization | ||||
|  *   - name: data | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @swagger | ||||
|  * components: | ||||
|  *   schemas: | ||||
|  *     Attribute: | ||||
|  *       type: object | ||||
|  *       properties: | ||||
|  *         attributeId: | ||||
|  *           type: string | ||||
|  *           example: "4G1DPrI58PAb" | ||||
|  *         noteId: | ||||
|  *           $ref: "#/components/schemas/NoteId" | ||||
|  *         type: | ||||
|  *           type: string | ||||
|  *           enum: ["attribute", "relation"] | ||||
|  *         name: | ||||
|  *           type: string | ||||
|  *           example: "internalLink" | ||||
|  *         value: | ||||
|  *           type: string | ||||
|  *           example: "hA8aHSpTRdZ6" | ||||
|  *           description: "If type = \"relation\", a note ID. Otherwise, the attribute content." | ||||
|  *         position: | ||||
|  *           type: integer | ||||
|  *           example: 20 | ||||
|  *         isInheritable: | ||||
|  *           type: boolean | ||||
|  *     Blob: | ||||
|  *       type: object | ||||
|  *       properties: | ||||
|  *         blobId: | ||||
|  *           type: string | ||||
|  *           example: "8iqMIB8eiY1tPYmElfjm" | ||||
|  *         content: | ||||
|  *           type: | ||||
|  *             - string | ||||
|  *             - 'null' | ||||
|  *           description: "`null` if not text." | ||||
|  *         contentLength: | ||||
|  *           type: integer | ||||
|  *         dateModified: | ||||
|  *           $ref: "#/components/schemas/DateTime" | ||||
|  *         utcDateModified: | ||||
|  *           $ref: "#/components/schemas/UtcDateTime" | ||||
|  *     Branch: | ||||
|  *       type: object | ||||
|  *       properties: | ||||
|  *         branchId: | ||||
|  *           $ref: "#/components/schemas/BranchId" | ||||
|  *         noteId: | ||||
|  *           $ref: "#/components/schemas/NoteId" | ||||
|  *         parentNoteId: | ||||
|  *           $ref: "#/components/schemas/NoteId" | ||||
|  *         notePosition: | ||||
|  *           type: integer | ||||
|  *           example: 20 | ||||
|  *         prefix: | ||||
|  *           type: | ||||
|  *             - string | ||||
|  *             - 'null' | ||||
|  *         isExpanded: | ||||
|  *           type: boolean | ||||
|  *     BranchId: | ||||
|  *       type: string | ||||
|  *       example: "WUjhaGp4EKah_ur11rSfHkzeV" | ||||
|  *       description: Equal to `{parentNoteId}_{noteId}` | ||||
|  *     DateTime: | ||||
|  *       type: string | ||||
|  *       example: "2025-02-14 08:19:59.203+0100" | ||||
|  *     EntityChange: | ||||
|  *       type: object | ||||
|  *       properties: | ||||
|  *         entityChange: | ||||
|  *           type: object | ||||
|  *           properties: | ||||
|  *             entityName: | ||||
|  *               type: string | ||||
|  *               example: "notes" | ||||
|  *               description: Database table for this entity. | ||||
|  *             changeId: | ||||
|  *               type: string | ||||
|  *               example: "changeId9630" | ||||
|  *               description: ID, referenced in `entity_changes` table. | ||||
|  *         entity: | ||||
|  *           type: object | ||||
|  *           description: Encoded entity data. Object has one property for each database column. | ||||
|  *     Note: | ||||
|  *       type: object | ||||
|  *       properties: | ||||
|  *         noteId: | ||||
|  *           $ref: "#/components/schemas/NoteId" | ||||
|  *         title: | ||||
|  *           type: string | ||||
|  *         isProtected: | ||||
|  *           type: boolean | ||||
|  *         type: | ||||
|  *           type: string | ||||
|  *           example: "text" | ||||
|  *           enum: ["text", "code", "render", "file", "image", "search", "relationMap", "book", "noteMap", "mermaid", "canvas", "webView", "launcher", "doc", "contentWidget", "mindMap", "geoMap"] | ||||
|  *           description: "[Reference list](https://github.com/TriliumNext/Notes/blob/v0.91.6/src/services/note_types.ts)" | ||||
|  *         mime: | ||||
|  *           type: string | ||||
|  *           example: "text/html" | ||||
|  *         blobId: | ||||
|  *           type: string | ||||
|  *           example: "z4PhNX7vuL3xVChQ1m2A" | ||||
|  *     NoteId: | ||||
|  *       type: string | ||||
|  *       example: "ur11rSfHkzeV" | ||||
|  *       description: "12-character note ID. Special values: \"none\"`, `\"root\"." | ||||
|  *     Timestamps: | ||||
|  *       type: object | ||||
|  *       properties: | ||||
|  *         dateCreated: | ||||
|  *           $ref: "#/components/schemas/DateTime" | ||||
|  *         dateModified: | ||||
|  *           $ref: "#/components/schemas/DateTime" | ||||
|  *         utcDateCreated: | ||||
|  *           $ref: "#/components/schemas/UtcDateTime" | ||||
|  *         utcDateModified: | ||||
|  *           $ref: "#/components/schemas/UtcDateTime" | ||||
|  *     UtcDateTime: | ||||
|  *       type: string | ||||
|  *       example: "2025-02-13T07:42:47.698Z" | ||||
|  *       description: "Result of `new Date().toISOString().replace('T', ' ')`" | ||||
|  *   securitySchemes: | ||||
|  *     user-password: | ||||
|  *       type: apiKey | ||||
|  *       name: trilium-cred | ||||
|  *       in: header | ||||
|  *       description: "Username and password, formatted as `user:password`" | ||||
|  *     session: | ||||
|  *       type: apiKey | ||||
|  *       in: cookie | ||||
|  *       name: trilium.sid | ||||
|  */ | ||||
| @@ -1,95 +0,0 @@ | ||||
| /** | ||||
|  * Usage: tsx ./generate_document.ts 1000 | ||||
|  * will create 1000 new notes and some clones into the current document.db | ||||
|  */ | ||||
|  | ||||
| import sqlInit from "../src/services/sql_init.js"; | ||||
| import noteService from "../src/services/notes.js"; | ||||
| import attributeService from "../src/services/attributes.js"; | ||||
| import cls from "../src/services/cls.js"; | ||||
| import cloningService from "../src/services/cloning.js"; | ||||
| import loremIpsum from "lorem-ipsum"; | ||||
| import "../src/becca/entity_constructor.js"; | ||||
|  | ||||
| const noteCount = parseInt(process.argv[2]); | ||||
|  | ||||
| if (!noteCount) { | ||||
|     console.error(`Please enter number of notes as program parameter.`); | ||||
|     process.exit(1); | ||||
| } | ||||
|  | ||||
| const notes = ["root"]; | ||||
|  | ||||
| function getRandomNoteId() { | ||||
|     const index = Math.floor(Math.random() * notes.length); | ||||
|  | ||||
|     return notes[index]; | ||||
| } | ||||
|  | ||||
| async function start() { | ||||
|     for (let i = 0; i < noteCount; i++) { | ||||
|         const title = loremIpsum.loremIpsum({ | ||||
|             count: 1, | ||||
|             units: "sentences", | ||||
|             sentenceLowerBound: 1, | ||||
|             sentenceUpperBound: 10 | ||||
|         }); | ||||
|  | ||||
|         const paragraphCount = Math.floor(Math.random() * Math.random() * 100); | ||||
|         const content = loremIpsum.loremIpsum({ | ||||
|             count: paragraphCount, | ||||
|             units: "paragraphs", | ||||
|             sentenceLowerBound: 1, | ||||
|             sentenceUpperBound: 15, | ||||
|             paragraphLowerBound: 3, | ||||
|             paragraphUpperBound: 10, | ||||
|             format: "html" | ||||
|         }); | ||||
|  | ||||
|         const { note } = noteService.createNewNote({ | ||||
|             parentNoteId: getRandomNoteId(), | ||||
|             title, | ||||
|             content, | ||||
|             type: "text" | ||||
|         }); | ||||
|  | ||||
|         console.log(`Created note ${i}: ${title}`); | ||||
|  | ||||
|         if (Math.random() < 0.04) { | ||||
|             const noteIdToClone = note.noteId; | ||||
|             const parentNoteId = getRandomNoteId(); | ||||
|             const prefix = Math.random() > 0.8 ? "prefix" : ""; | ||||
|  | ||||
|             const result = await cloningService.cloneNoteToBranch(noteIdToClone, parentNoteId, prefix); | ||||
|  | ||||
|             console.log(`Cloning ${i}:`, result.success ? "succeeded" : "FAILED"); | ||||
|         } | ||||
|  | ||||
|         // does not have to be for the current note | ||||
|         await attributeService.createAttribute({ | ||||
|             noteId: getRandomNoteId(), | ||||
|             type: "label", | ||||
|             name: "label", | ||||
|             value: "value", | ||||
|             isInheritable: Math.random() > 0.1 // 10% are inheritable | ||||
|         }); | ||||
|  | ||||
|         await attributeService.createAttribute({ | ||||
|             noteId: getRandomNoteId(), | ||||
|             type: "relation", | ||||
|             name: "relation", | ||||
|             value: getRandomNoteId(), | ||||
|             isInheritable: Math.random() > 0.1 // 10% are inheritable | ||||
|         }); | ||||
|  | ||||
|         note.saveRevision(); | ||||
|  | ||||
|         notes.push(note.noteId); | ||||
|     } | ||||
|  | ||||
|     process.exit(0); | ||||
| } | ||||
|  | ||||
| // @TriliumNextTODO sqlInit.dbReady never seems to resolve so program hangs | ||||
| // see https://github.com/TriliumNext/Notes/issues/1020 | ||||
| sqlInit.dbReady.then(cls.wrap(start)).catch((err) => console.error(err)); | ||||
| @@ -1,57 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| if [[ $# -eq 0 ]] ; then | ||||
|     echo "Missing argument of new version" | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| VERSION=$1 | ||||
|  | ||||
| if ! [[ ${VERSION} =~ ^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}(-.+)?$ ]] ; | ||||
| then | ||||
|     echo "Version ${VERSION} isn't in format X.Y.Z" | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| VERSION_DATE=$(git log -1 --format=%aI "v${VERSION}" | cut -c -10) | ||||
| VERSION_COMMIT=$(git rev-list -n 1 "v${VERSION}") | ||||
|  | ||||
| # expecting the directory at a specific path | ||||
| cd ~/trilium-flathub || exit | ||||
|  | ||||
| if ! git diff-index --quiet HEAD --; then | ||||
|     echo "There are uncommitted changes" | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| BASE_BRANCH=master | ||||
|  | ||||
| if [[ "$VERSION" == *"beta"* ]]; then | ||||
|     BASE_BRANCH=beta | ||||
| fi | ||||
|  | ||||
| git switch "${BASE_BRANCH}" | ||||
| git pull | ||||
|  | ||||
| BRANCH=b${VERSION} | ||||
|  | ||||
| git branch "${BRANCH}" | ||||
| git switch "${BRANCH}" | ||||
|  | ||||
| echo "Updating files with version ${VERSION}, date ${VERSION_DATE} and commit ${VERSION_COMMIT}" | ||||
|  | ||||
| flatpak-node-generator npm ../trilium/package-lock.json | ||||
|  | ||||
| xmlstarlet ed --inplace --update "/component/releases/release/@version" --value "${VERSION}" --update "/component/releases/release/@date" --value "${VERSION_DATE}" ./com.github.zadam.trilium.metainfo.xml | ||||
|  | ||||
| yq --inplace "(.modules[0].sources[0].tag = \"v${VERSION}\") | (.modules[0].sources[0].commit = \"${VERSION_COMMIT}\")" ./com.github.zadam.trilium.yml | ||||
|  | ||||
| git add ./generated-sources.json | ||||
| git add ./com.github.zadam.trilium.metainfo.xml | ||||
| git add ./com.github.zadam.trilium.yml | ||||
|  | ||||
| git commit -m "release $VERSION" | ||||
| git push --set-upstream origin "${BRANCH}" | ||||
|  | ||||
| gh pr create --fill -B "${BASE_BRANCH}" | ||||
| gh pr merge --auto --merge --delete-branch | ||||
| @@ -1,17 +1,12 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| set -e | ||||
| export GITHUB_REPO=trilium | ||||
|  | ||||
| if [[ $# -eq 0 ]] ; then | ||||
|     echo "Missing argument of new version" | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| if ! command -v jq &> /dev/null; then | ||||
|   echo "Missing command: jq" | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| VERSION=$1 | ||||
|  | ||||
| if ! [[ ${VERSION} =~ ^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}(-.+)?$ ]] ; | ||||
| @@ -27,20 +22,19 @@ fi | ||||
|  | ||||
| echo "Releasing Trilium $VERSION" | ||||
|  | ||||
| jq '.version = "'$VERSION'"' package.json > package.json.tmp | ||||
| mv package.json.tmp package.json | ||||
| jq '.version = "'$VERSION'"' package.json|sponge package.json | ||||
|  | ||||
| git add package.json | ||||
|  | ||||
| npm run chore:update-build-info | ||||
| echo 'module.exports = { buildDate:"'`date --iso-8601=seconds`'", buildRevision: "'`git log -1 --format="%H"`'" };' > src/services/build.js | ||||
|  | ||||
| git add src/services/build.ts | ||||
| git add src/services/build.js | ||||
|  | ||||
| TAG=v$VERSION | ||||
|  | ||||
| echo "Committing package.json version change" | ||||
|  | ||||
| git commit -m "chore(release): $VERSION" | ||||
| git commit -m "release $VERSION" | ||||
| git push | ||||
|  | ||||
| echo "Tagging commit with $TAG" | ||||
| @@ -48,10 +42,30 @@ echo "Tagging commit with $TAG" | ||||
| git tag $TAG | ||||
| git push origin $TAG | ||||
|  | ||||
| echo "Updating master" | ||||
| bin/build.sh | ||||
|  | ||||
| git fetch | ||||
| git checkout master | ||||
| git reset --hard origin/master | ||||
| git merge origin/develop | ||||
| git push | ||||
| LINUX_X64_BUILD=trilium-linux-x64-$VERSION.tar.xz | ||||
| DEBIAN_X64_BUILD=trilium_${VERSION}_amd64.deb | ||||
| WINDOWS_X64_BUILD=trilium-windows-x64-$VERSION.zip | ||||
| MAC_X64_BUILD=trilium-mac-x64-$VERSION.zip | ||||
| SERVER_BUILD=trilium-linux-x64-server-$VERSION.tar.xz | ||||
|  | ||||
| echo "Creating release in GitHub" | ||||
|  | ||||
| EXTRA= | ||||
|  | ||||
| if [[ $TAG == *"beta"* ]]; then | ||||
|   EXTRA=--prerelease | ||||
| fi | ||||
|  | ||||
| echo "$GITHUB_CLI_AUTH_TOKEN" | gh auth login --with-token | ||||
|  | ||||
| gh release create "$TAG" \ | ||||
|     --title "$TAG release" \ | ||||
|     --notes "" \ | ||||
|     $EXTRA \ | ||||
|     "dist/$DEBIAN_X64_BUILD" \ | ||||
|     "dist/$LINUX_X64_BUILD" \ | ||||
|     "dist/$WINDOWS_X64_BUILD" \ | ||||
|     "dist/$MAC_X64_BUILD" \ | ||||
|     "dist/$SERVER_BUILD" | ||||
|   | ||||
| @@ -1,52 +0,0 @@ | ||||
| UPDATE etapi_tokens SET tokenHash = 'API token hash value'; | ||||
| UPDATE notes SET title = 'title' | ||||
|              WHERE noteId NOT IN ('root', '_hidden', '_share') | ||||
|                AND SUBSTR(noteId, 1, 8) != '_options' | ||||
|                AND SUBSTR(noteId, 1, 3) != '_lb'; | ||||
| UPDATE blobs SET content = 'text' WHERE content IS NOT NULL; | ||||
| UPDATE revisions SET title = 'title'; | ||||
|  | ||||
| UPDATE attributes SET name  = 'name', value = 'value' WHERE type = 'label' | ||||
|   AND name NOT IN | ||||
|       ('inbox', 'disableVersioning', 'calendarRoot', 'archived', 'excludeFromExport', 'disableInclusion', 'appCss', | ||||
|        'appTheme', 'hidePromotedAttributes', 'readOnly', 'autoReadOnlyDisabled', 'cssClass', 'iconClass', | ||||
|        'keyboardShortcut', 'run', 'runOnInstance', 'runAtHour', 'customRequestHandler', 'customResourceProvider', | ||||
|        'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'revisionsWidgetDisabled', | ||||
|        'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass', | ||||
|        'workspaceTabBackgroundColor', 'workspaceCalendarRoot', 'workspaceTemplate', 'searchHome', 'workspaceInbox', | ||||
|        'workspaceSearchHome', 'sqlConsoleHome', 'datePattern', 'weekPattern', 'enableWeekNote', 'monthPattern', | ||||
|        'quarterPattern', 'yearPattern', 'enableQuarterNote', 'pageSize', 'viewType', 'mapRootNoteId', | ||||
|        'bookmarkFolder', 'sorted', 'sortDirection', 'sortFoldersFirst', 'sortNatural', 'sortLocale', 'top', | ||||
|        'fullContentWidth', 'shareHiddenFromTree', 'shareExternalLink', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription', | ||||
|        'shareRaw', 'shareDisallowRobotIndexing', 'shareIndex', 'displayRelations', 'hideRelations', 'titleTemplate', | ||||
|        'template', 'toc', 'color', 'keepCurrentHoisting', 'executeButton', 'executeDescription', 'newNotesOnTop', | ||||
|        'clipperInbox', 'internalLink', 'imageLink', 'relationMapLink', 'includeMapLink', 'runOnNoteCreation', | ||||
|        'runOnNoteTitleChange', 'runOnNoteChange', 'runOnNoteContentChange', 'runOnNoteDeletion', 'runOnBranchCreation', 'runOnBranchChange', | ||||
|        'runOnBranchDeletion', 'runOnChildNoteCreation', 'runOnAttributeCreation', 'runOnAttributeChange', 'template', | ||||
|        'inherit', 'widget', 'renderNote', 'shareCss', 'shareJs', 'shareTemplate', 'shareFavicon'); | ||||
| UPDATE attributes SET name = 'name' WHERE type = 'relation' | ||||
|   AND name NOT IN | ||||
|       ('inbox', 'disableVersioning', 'calendarRoot', 'archived', 'excludeFromExport', 'disableInclusion', 'appCss', | ||||
|        'appTheme', 'hidePromotedAttributes', 'readOnly', 'autoReadOnlyDisabled', 'cssClass', 'iconClass', | ||||
|        'keyboardShortcut', 'run', 'runOnInstance', 'runAtHour', 'customRequestHandler', 'customResourceProvider', | ||||
|        'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'revisionsWidgetDisabled', | ||||
|        'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass', | ||||
|        'workspaceTabBackgroundColor', 'workspaceCalendarRoot', 'workspaceTemplate', 'searchHome', 'workspaceInbox', | ||||
|        'workspaceSearchHome', 'sqlConsoleHome', 'datePattern', 'weekPattern', 'enableWeekNote', 'monthPattern', | ||||
|        'quarterPattern', 'yearPattern', 'enableQuarterNote', 'pageSize', 'viewType', 'mapRootNoteId', | ||||
|        'bookmarkFolder', 'sorted', 'sortDirection', 'sortFoldersFirst', 'sortNatural', 'sortLocale', 'top', | ||||
|        'fullContentWidth', 'shareHiddenFromTree', 'shareExternalLink', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription', | ||||
|        'shareRaw', 'shareDisallowRobotIndexing', 'shareIndex', 'displayRelations', 'hideRelations', 'titleTemplate', | ||||
|        'template', 'toc', 'color', 'keepCurrentHoisting', 'executeButton', 'executeDescription', 'newNotesOnTop', | ||||
|        'clipperInbox', 'internalLink', 'imageLink', 'relationMapLink', 'includeMapLink', 'runOnNoteCreation', | ||||
|        'runOnNoteTitleChange', 'runOnNoteChange', 'runOnNoteContentChange', 'runOnNoteDeletion', 'runOnBranchCreation', 'runOnBranchChange', | ||||
|        'runOnBranchDeletion', 'runOnChildNoteCreation', 'runOnAttributeCreation', 'runOnAttributeChange', 'template', | ||||
|        'inherit', 'widget', 'renderNote', 'shareCss', 'shareJs', 'shareTemplate', 'shareFavicon'); | ||||
| UPDATE branches SET prefix = 'prefix' WHERE prefix IS NOT NULL AND prefix != 'recovered'; | ||||
| UPDATE options SET value = 'anonymized' WHERE name IN | ||||
|       ('documentId', 'documentSecret', 'encryptedDataKey', | ||||
|        'passwordVerificationHash', 'passwordVerificationSalt', | ||||
|        'passwordDerivedKeySalt', 'username', 'syncServerHost', 'syncProxy') | ||||
|   AND value != ''; | ||||
|  | ||||
| VACUUM; | ||||
| @@ -1,23 +1,4 @@ | ||||
| @echo off | ||||
| :: Try to get powershell to launch Trilium since it deals with UTF-8 characters in current path | ||||
| :: If there's no powershell available, fallback to unicode enabled command interpreter | ||||
|  | ||||
| WHERE powershell.exe > NUL 2>&1 | ||||
| IF %ERRORLEVEL% NEQ 0 GOTO BATCH ELSE GOTO POWERSHELL | ||||
|  | ||||
| :POWERSHELL | ||||
| powershell -ExecutionPolicy Bypass -NonInteractive -NoLogo "Set-Item -Path Env:NODE_TLS_REJECT_UNAUTHORIZED -Value 0; ./trilium.exe" | ||||
| GOTO END | ||||
|  | ||||
| :BATCH | ||||
| :: Make sure we support UTF-8 characters | ||||
| chcp 65001 | ||||
|  | ||||
| :: Get Current Trilium executable directory and compute data directory | ||||
| SET DIR=%~dp0 | ||||
| set NODE_TLS_REJECT_UNAUTHORIZED=0 | ||||
| cd "%DIR%" | ||||
| cd %DIR% | ||||
| start trilium.exe | ||||
| GOTO END | ||||
|  | ||||
| :END | ||||
|   | ||||
| @@ -1,24 +1,4 @@ | ||||
| @echo off | ||||
| :: Try to get powershell to launch Trilium since it deals with UTF-8 characters in current path | ||||
| :: If there's no powershell available, fallback to unicode enabled command interpreter | ||||
|  | ||||
| WHERE powershell.exe > NUL 2>&1 | ||||
| IF %ERRORLEVEL% NEQ 0 GOTO BATCH ELSE GOTO POWERSHELL | ||||
|  | ||||
| :POWERSHELL | ||||
| powershell -ExecutionPolicy Bypass -NonInteractive -NoLogo "Set-Item -Path Env:TRILIUM_DATA_DIR -Value './trilium-data'; ./trilium.exe" | ||||
| GOTO END | ||||
|  | ||||
| :BATCH | ||||
| :: Make sure we support UTF-8 characters | ||||
| chcp 65001 | ||||
|  | ||||
| :: Get Current Trilium executable directory and compute data directory | ||||
| SET DIR=%~dp0 | ||||
| SET DIR=%DIR:~0,-1% | ||||
| SET TRILIUM_DATA_DIR=%DIR%\trilium-data | ||||
| cd "%DIR%" | ||||
| start trilium.exe | ||||
| GOTO END | ||||
|  | ||||
| :END | ||||
| cd %DIR% | ||||
| start trilium.exe | ||||
| @@ -1,23 +1,4 @@ | ||||
| @echo off | ||||
| :: Try to get powershell to launch Trilium since it deals with UTF-8 characters in current path | ||||
| :: If there's no powershell available, fallback to unicode enabled command interpreter | ||||
|  | ||||
| WHERE powershell.exe > NUL 2>&1 | ||||
| IF %ERRORLEVEL% NEQ 0 GOTO BATCH ELSE GOTO POWERSHELL | ||||
|  | ||||
| :POWERSHELL | ||||
| powershell -ExecutionPolicy Bypass -NonInteractive -NoLogo "Set-Item -Path Env:TRILIUM_SAFE_MODE -Value 1; ./trilium.exe --disable-gpu" | ||||
| GOTO END | ||||
|  | ||||
| :BATCH | ||||
| :: Make sure we support UTF-8 characters | ||||
| chcp 65001 | ||||
|  | ||||
| :: Get Current Trilium executable directory and compute data directory | ||||
| SET DIR=%~dp0 | ||||
| SET TRILIUM_SAFE_MODE=1 | ||||
| cd "%DIR%" | ||||
| start trilium.exe --disable-gpu | ||||
| GOTO END | ||||
|  | ||||
| :END | ||||
| cd %DIR% | ||||
| start trilium.exe | ||||
|   | ||||
| @@ -3,5 +3,5 @@ | ||||
| DIR=`dirname "$0"` | ||||
| export TRILIUM_SAFE_MODE=1 | ||||
|  | ||||
| "$DIR/trilium" --disable-gpu | ||||
| "$DIR/trilium" | ||||
|  | ||||
|   | ||||
| @@ -1,110 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| # -------------------------------------------------------------------------------------------------- | ||||
| # | ||||
| # Create PO files to make easier the labor of translation. | ||||
| # | ||||
| # Info: | ||||
| # 	https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html | ||||
| # 	https://docs.translatehouse.org/projects/translate-toolkit/en/latest/commands/json2po.html | ||||
| # | ||||
| # Dependencies: | ||||
| # 	jq | ||||
| # 	translate-toolkit | ||||
| # 		python-wcwidth | ||||
| # | ||||
| # Created by @hasecilu | ||||
| # | ||||
| # -------------------------------------------------------------------------------------------------- | ||||
|  | ||||
| number_of_keys() { | ||||
| 	[ -f "$1" ] && jq 'path(..) | select(length == 2) | .[1]' "$1" | wc -l || echo "0" | ||||
| } | ||||
|  | ||||
| stats() { | ||||
| 	# Print the number of existing strings on the JSON files for each locale | ||||
| 	s=$(number_of_keys "${paths[0]}/en/server.json") | ||||
| 	c=$(number_of_keys "${paths[1]}/en/translation.json") | ||||
| 	echo "| locale |server strings |client strings |" | ||||
| 	echo "|--------|---------------|---------------|" | ||||
| 	echo "|   en   |      ${s}      |     ${c}      |" | ||||
| 	for locale in "${locales[@]}"; do | ||||
| 		s=$(number_of_keys "${paths[0]}/${locale}/server.json") | ||||
| 		c=$(number_of_keys "${paths[1]}/${locale}/translation.json") | ||||
| 		n1=$(((8 - ${#locale}) / 2)) | ||||
| 		n2=$((n1 == 1 ? n1 + 1 : n1)) | ||||
| 		echo "|$(printf "%${n1}s")${locale}$(printf "%${n2}s")|      ${s}      |     ${c}      |" | ||||
| 	done | ||||
| } | ||||
|  | ||||
| update_1() { | ||||
| 	# Update PO files from English and localized JSON files as source | ||||
| 	# NOTE: if you want a new language you need to first create the JSON files | ||||
| 	# on their corresponding place with `{}` as content to avoid error on `json2po` | ||||
| 	local locales=("$@") | ||||
| 	for path in "${paths[@]}"; do | ||||
| 		for locale in "${locales[@]}"; do | ||||
| 			json2po -t "${path}/en" "${path}/${locale}" "${path}/po-${locale}" | ||||
| 		done | ||||
| 	done | ||||
| } | ||||
|  | ||||
| update_2() { | ||||
| 	# Recover translation from PO files to localized JSON files | ||||
| 	local locales=("$@") | ||||
| 	for path in "${paths[@]}"; do | ||||
| 		for locale in "${locales[@]}"; do | ||||
| 			po2json -t "${path}/en" "${path}/po-${locale}" "${path}/${locale}" | ||||
| 		done | ||||
| 	done | ||||
| } | ||||
|  | ||||
| help() { | ||||
| 	echo -e "\nDescription:" | ||||
| 	echo -e "\tCreate PO files to make easier the labor of translation" | ||||
| 	echo -e "\nUsage:" | ||||
| 	echo -e "\t./translation.sh [--stats] [--update1 <OPT_LOCALE>] [--update2 <OPT_LOCALE>]" | ||||
| 	echo -e "\nFlags:" | ||||
| 	echo -e "  --clear\n\tClear all po-* directories" | ||||
| 	echo -e "  --stats\n\tPrint the number of existing strings on the JSON files for each locale" | ||||
| 	echo -e "  --update1 <LOCALE>\n\tUpdate PO files from English and localized JSON files as source" | ||||
| 	echo -e "  --update2 <LOCALE>\n\tRecover translation from PO files to localized JSON files" | ||||
| } | ||||
|  | ||||
| # Main function ------------------------------------------------------------------------------------ | ||||
|  | ||||
| # Get script directory to set file path relative to it | ||||
| file_path="$( | ||||
| 	cd -- "$(dirname "${0}")" >/dev/null 2>&1 || exit | ||||
| 	pwd -P | ||||
| )" | ||||
| paths=("${file_path}/../translations/" "${file_path}/../src/public/translations/") | ||||
| locales=(cn de es fr pt_br ro tw) | ||||
|  | ||||
| if [ $# -eq 1 ]; then | ||||
| 	if [ "$1" == "--clear" ]; then | ||||
| 		for path in "${paths[@]}"; do | ||||
| 			for locale in "${locales[@]}"; do | ||||
| 				[ -d "${path}/po-${locale}" ] && rm -r "${path}/po-${locale}" | ||||
| 			done | ||||
| 		done | ||||
| 	elif [ "$1" == "--stats" ]; then | ||||
| 		stats | ||||
| 	elif [ "$1" == "--update1" ]; then | ||||
| 		update_1 "${locales[@]}" | ||||
| 	elif [ "$1" == "--update2" ]; then | ||||
| 		update_2 "${locales[@]}" | ||||
| 	else | ||||
| 		help | ||||
| 	fi | ||||
| elif [ $# -eq 2 ]; then | ||||
| 	if [ "$1" == "--update1" ]; then | ||||
| 		update_1 "$2" | ||||
| 	elif [ "$1" == "--update2" ]; then | ||||
| 		update_2 "$2" | ||||
| 	else | ||||
| 		help | ||||
| 	fi | ||||
| else | ||||
| 	help | ||||
| fi | ||||
| @@ -1 +0,0 @@ | ||||
| <svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="1"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-bookmark"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M18 7v14l-6 -4l-6 4v-14a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4z" /></svg> | ||||
| Before Width: | Height: | Size: 383 B | 
| @@ -1,39 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| if ! command -v magick &> /dev/null; then | ||||
|   echo "This tool requires ImageMagick to be installed in order to create the icons." | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| if ! command -v inkscape &> /dev/null; then | ||||
|   echo "This tool requires Inkscape to be render sharper SVGs than ImageMagick." | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| script_dir=$(realpath $(dirname $0)) | ||||
| images_dir="$script_dir/../../images" | ||||
| output_dir="$images_dir/app-icons/tray" | ||||
|  | ||||
| function generateDpiScaledIcons { | ||||
|   file=$1 | ||||
|   suffix=$2 | ||||
|   name="$(basename $file .svg)$suffix" | ||||
|   inkscape -w 16 -h 16 "$file" -o "$output_dir/$name.png" | ||||
|   inkscape -w 20 -h 20 "$file" -o "$output_dir/$name@1.25x.png" | ||||
|   inkscape -w 24 -h 24 "$file" -o "$output_dir/$name@1.5x.png" | ||||
|   inkscape -w 32 -h 32 "$file" -o "$output_dir/$name@2x.png" | ||||
| } | ||||
|  | ||||
| generateDpiScaledIcons "$images_dir/icon-black.svg" "Template" | ||||
| generateDpiScaledIcons "$images_dir/icon-color.svg" | ||||
| generateDpiScaledIcons "$images_dir/icon-purple.svg" | ||||
|  | ||||
| for file in *.svg; do | ||||
|     name="$(basename $file .svg)Template" | ||||
|     generateDpiScaledIcons "$file" "Template" | ||||
|     magick "$output_dir/$name.png" -channel RGB -negate "$output_dir/$name-inverted.png" | ||||
|     magick "$output_dir/$name@1.25x.png" -channel RGB -negate "$output_dir/$name-inverted@1.25x.png" | ||||
|     magick "$output_dir/$name@1.5x.png" -channel RGB -negate "$output_dir/$name-inverted@1.5x.png" | ||||
|     magick "$output_dir/$name@2x.png" -channel RGB -negate "$output_dir/$name-inverted@2x.png" | ||||
| done | ||||
|  | ||||
| @@ -1 +0,0 @@ | ||||
| <svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="1"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-x"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M18 6l-12 12" /><path d="M6 6l12 12" /></svg> | ||||
| Before Width: | Height: | Size: 356 B | 
| @@ -1 +0,0 @@ | ||||
| <svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="1"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-plus"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 5l0 14" /><path d="M5 12l14 0" /></svg> | ||||
| Before Width: | Height: | Size: 357 B | 
| @@ -1 +0,0 @@ | ||||
| <svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="1"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-history"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 8l0 4l2 2" /><path d="M3.05 11a9 9 0 1 1 .5 4m-.5 5v-5h5" /></svg> | ||||
| Before Width: | Height: | Size: 387 B | 
| @@ -1 +0,0 @@ | ||||
| <svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="1"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-calendar-star"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M11 21h-5a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v3.5" /><path d="M16 3v4" /><path d="M8 3v4" /><path d="M4 11h11" /><path d="M17.8 20.817l-2.172 1.138a.392 .392 0 0 1 -.568 -.41l.415 -2.411l-1.757 -1.707a.389 .389 0 0 1 .217 -.665l2.428 -.352l1.086 -2.193a.392 .392 0 0 1 .702 0l1.086 2.193l2.428 .352a.39 .39 0 0 1 .217 .665l-1.757 1.707l.414 2.41a.39 .39 0 0 1 -.567 .411l-2.172 -1.138z" /></svg> | ||||
| Before Width: | Height: | Size: 734 B | 
| @@ -1,21 +0,0 @@ | ||||
| import child_process from "child_process"; | ||||
| import fs from "fs"; | ||||
|  | ||||
| function getBuildDate() { | ||||
|     const now = new Date(); | ||||
|     now.setMilliseconds(0); | ||||
|     return now.toISOString().replace(".000", ""); | ||||
| } | ||||
|  | ||||
| function getGitRevision() { | ||||
|     return child_process.execSync('git log -1 --format="%H"').toString("utf-8").trimEnd(); | ||||
| } | ||||
|  | ||||
| const output = `\ | ||||
| export default { | ||||
|     buildDate: "${getBuildDate()}", | ||||
|     buildRevision: "${getGitRevision()}" | ||||
| }; | ||||
| `; | ||||
|  | ||||
| fs.writeFileSync("src/services/build.ts", output); | ||||
| @@ -1,46 +0,0 @@ | ||||
| /** | ||||
|  * @module | ||||
|  * | ||||
|  * The nightly version works uses the version described in `package.json`, just like any release. | ||||
|  * The problem with this approach is that production builds have a very aggressive cache, and | ||||
|  * usually running the nightly with this cached version of the application will mean that the | ||||
|  * user might run into module not found errors or styling errors caused by an old cache. | ||||
|  * | ||||
|  * This script is supposed to be run in the CI, which will update locally the version field of | ||||
|  * `package.json` to contain the date. For example, `0.90.9-beta` will become `0.90.9-test-YYMMDD-HHMMSS`. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| import { fileURLToPath } from "url"; | ||||
| import { dirname, join } from "path"; | ||||
| import fs from "fs"; | ||||
|  | ||||
| function processVersion(version) { | ||||
|     // Remove the beta suffix if any. | ||||
|     version = version.replace("-beta", ""); | ||||
|  | ||||
|     // Add the nightly suffix, plus the date. | ||||
|     const referenceDate = new Date().toISOString().substring(2, 19).replace(/[-:]*/g, "").replace("T", "-"); | ||||
|     version = `${version}-test-${referenceDate}`; | ||||
|  | ||||
|     return version; | ||||
| } | ||||
|  | ||||
| function main() { | ||||
|     const scriptDir = dirname(fileURLToPath(import.meta.url)); | ||||
|     const packageJsonPath = join(scriptDir, "..", "package.json"); | ||||
|  | ||||
|     // Read the version from package.json and process it. | ||||
|     const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8")); | ||||
|     const currentVersion = packageJson.version; | ||||
|     const adjustedVersion = processVersion(currentVersion); | ||||
|     console.log("Current version is", currentVersion); | ||||
|     console.log("Adjusted version is", adjustedVersion); | ||||
|  | ||||
|     // Write the adjusted version back in. | ||||
|     packageJson.version = adjustedVersion; | ||||
|     const formattedJson = JSON.stringify(packageJson, null, 4); | ||||
|     fs.writeFileSync(packageJsonPath, formattedJson); | ||||
| } | ||||
|  | ||||
| main(); | ||||
| @@ -1,16 +0,0 @@ | ||||
| import chokidar from "chokidar"; | ||||
| import fs from "fs"; | ||||
| import path from "path"; | ||||
|  | ||||
| const emptyCallback = () => {}; | ||||
|  | ||||
| function onFileChanged(sourceFile: string) { | ||||
|     const destFile = path.join("dist", sourceFile); | ||||
|     console.log(`${sourceFile} -> ${destFile}`); | ||||
|     fs.copyFile(sourceFile, destFile, emptyCallback); | ||||
| } | ||||
|  | ||||
| const sourceDir = "src/public"; | ||||
|  | ||||
| chokidar.watch(sourceDir).on("change", onFileChanged); | ||||
| console.log(`Watching for changes to ${sourceDir}...`); | ||||
| @@ -8,50 +8,16 @@ noAuthentication=false | ||||
| # set to true to disable backups (e.g. because of limited space on server) | ||||
| noBackup=false | ||||
|  | ||||
| # Disable automatically generating desktop icon | ||||
| # noDesktopIcon=true | ||||
|  | ||||
| [Network] | ||||
| # host setting is relevant only for web deployments - set the host on which the server will listen | ||||
| # host=0.0.0.0 | ||||
| # port setting is relevant only for web deployments, desktop builds run on a fixed port (changeable with TRILIUM_PORT environment variable) | ||||
| port=8080 | ||||
| # true for TLS/SSL/HTTPS (secure), false for HTTP (insecure). | ||||
| # true for TLS/SSL/HTTPS (secure), false for HTTP (unsecure). | ||||
| https=false | ||||
| # path to certificate (run "bash bin/generate-cert.sh" to generate self-signed certificate). Relevant only if https=true | ||||
| certPath= | ||||
| keyPath= | ||||
| # setting to give trust to reverse proxies, a comma-separated list of trusted rev. proxy IPs can be specified (CIDR notation is permitted), | ||||
| # alternatively 'true' will make use of the leftmost IP in X-Forwarded-For, ultimately an integer can be used to tell about the number of hops between | ||||
| # Trilium (which is hop 0) and the first trusted rev. proxy.  | ||||
| # once set, expressjs will use the X-Forwarded-For header set by the rev. proxy to determinate the real IPs of clients. | ||||
| # expressjs shortcuts are supported: loopback(127.0.0.1/8, ::1/128), linklocal(169.254.0.0/16, fe80::/10), uniquelocal(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7) | ||||
| trustedReverseProxy=false | ||||
|  | ||||
| # setting the CORS headers for cross-origin requests | ||||
| # corsAllowOrigin='*' | ||||
| # corsAllowMethods='GET,POST,PUT,DELETE,PATCH' | ||||
| # corsAllowHeaders='Content-Type,Authorization' | ||||
|  | ||||
|  | ||||
| [Session] | ||||
| # Use this setting to set a custom value for the "Max-Age" Attribute of the session cookie. | ||||
| # This controls how long your session will be valid, before it expires and you need to log in again, when you use the "Remember Me" option. | ||||
| # Value needs to be entered in Seconds. | ||||
| # Default value is 1814400 Seconds, which is 21 Days. | ||||
| cookieMaxAge=1814400 | ||||
|  | ||||
| [Sync] | ||||
| #syncServerHost= | ||||
| #syncServerTimeout= | ||||
| #syncServerProxy= | ||||
|  | ||||
| [MultiFactorAuthentication] | ||||
| # Set the base URL for OAuth/OpenID authentication | ||||
| # This is the URL of the service that will be used to verify the user's identity | ||||
| oauthBaseUrl= | ||||
|  | ||||
| # Set the client ID for OAuth/OpenID authentication | ||||
| # This is the ID of the client that will be used to verify the user's identity | ||||
| oauthClientId= | ||||
|  | ||||
| # Set the client secret for OAuth/OpenID authentication | ||||
| # This is the secret of the client that will be used to verify the user's identity | ||||
| oauthClientSecret= | ||||
|   | ||||
| @@ -1,42 +0,0 @@ | ||||
| [General] | ||||
| # Instance name can be used to distinguish between different instances using backend api.getInstanceName() | ||||
| instanceName= | ||||
|  | ||||
| # set to true to allow using Trilium without authentication (makes sense for server build only, desktop build doesn't need password) | ||||
| noAuthentication=false | ||||
|  | ||||
| # set to true to disable backups (e.g. because of limited space on server) | ||||
| noBackup=false | ||||
|  | ||||
| # Disable automatically generating desktop icon | ||||
| # noDesktopIcon=true | ||||
|  | ||||
| [Network] | ||||
| # host setting is relevant only for web deployments - set the host on which the server will listen | ||||
| # host=0.0.0.0 | ||||
| # port setting is relevant only for web deployments, desktop builds run on a fixed port (changeable with TRILIUM_PORT environment variable) | ||||
| port=8080 | ||||
| # true for TLS/SSL/HTTPS (secure), false for HTTP (insecure). | ||||
| https=false | ||||
| # path to certificate (run "bash bin/generate-cert.sh" to generate self-signed certificate). Relevant only if https=true | ||||
| certPath= | ||||
| keyPath= | ||||
| # setting to give trust to reverse proxies, a comma-separated list of trusted rev. proxy IPs can be specified (CIDR notation is permitted), | ||||
| # alternatively 'true' will make use of the leftmost IP in X-Forwarded-For, ultimately an integer can be used to tell about the number of hops between | ||||
| # Trilium (which is hop 0) and the first trusted rev. proxy.  | ||||
| # once set, expressjs will use the X-Forwarded-For header set by the rev. proxy to determinate the real IPs of clients. | ||||
| # expressjs shortcuts are supported: loopback(127.0.0.1/8, ::1/128), linklocal(169.254.0.0/16, fe80::/10), uniquelocal(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7) | ||||
| trustedReverseProxy=false | ||||
|  | ||||
|  | ||||
| [Session] | ||||
| # Use this setting to set a custom value for the "Max-Age" Attribute of the session cookie. | ||||
| # This controls how long your session will be valid, before it expires and you need to log in again, when you use the "Remember Me" option. | ||||
| # Value needs to be entered in Seconds. | ||||
| # Default value is 1814400 Seconds, which is 21 Days. | ||||
| cookieMaxAge=1814400 | ||||
|  | ||||
| [Sync] | ||||
| #syncServerHost= | ||||
| #syncServerTimeout= | ||||
| #syncServerProxy= | ||||
| @@ -1,5 +1,11 @@ | ||||
| - drop branches.utcDateCreated - not used for anything | ||||
| - drop options.utcDateCreated - not used for anything | ||||
| - isDeleted = 0 by default | ||||
| - rename openTabs to openNoteContexts | ||||
| - migrate black theme to dark theme | ||||
| - unify readOnly handling to a single attribute: | ||||
|   * readOnly - like now | ||||
|   * readOnly=auto - like without readOnly (used to override inherited readOnly) | ||||
|   * readOnly=never - like autoReadOnlyDisabled | ||||
| - remove focusOnAttributesKeyboardShortcut | ||||
| - rename white theme to "light" theme (it's not completely white and matches well to dark theme) | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								db/demo.zip
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 4.4 KiB | 
							
								
								
									
										15
									
								
								db/migrations/0184__add_excludeFromNoteMap_to_journal.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,15 @@ | ||||
| const becca = require('../../src/becca/becca'); | ||||
| const beccaLoader = require('../../src/becca/becca_loader'); | ||||
| const cls = require('../../src/services/cls'); | ||||
|  | ||||
| module.exports = () => { | ||||
|     cls.init(() => { | ||||
|         beccaLoader.load(); | ||||
|  | ||||
|         for (const note of Object.values(becca.notes)) { | ||||
|             if (note.hasLabel('calendarRoot')) { | ||||
|                 note.addLabel('excludeFromNoteMap', "", true); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
| }; | ||||
							
								
								
									
										4
									
								
								db/migrations/0185__migrate_black_theme_to_dark.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | ||||
| -- black theme has been removed, dark is closest replacement | ||||
| UPDATE options SET value = 'dark' WHERE name = 'theme' AND value = 'black'; | ||||
|  | ||||
| UPDATE options SET value = 'light' WHERE name = 'theme' AND value = 'white'; | ||||
| @@ -0,0 +1,2 @@ | ||||
| ALTER TABLE branches DROP COLUMN utcDateCreated; | ||||
| ALTER TABLE options DROP COLUMN utcDateCreated; | ||||
							
								
								
									
										23
									
								
								db/migrations/0187__add_changeId_to_entity_changes.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,23 @@ | ||||
| CREATE TABLE IF NOT EXISTS "mig_entity_changes" ( | ||||
|                                                 `id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, | ||||
|                                                 `entityName`	TEXT NOT NULL, | ||||
|                                                 `entityId`	TEXT NOT NULL, | ||||
|                                                 `hash`	TEXT NOT NULL, | ||||
|                                                 `isErased` INT NOT NULL, | ||||
|                                                 `changeId` TEXT NOT NULL, | ||||
|                                                 `sourceId` TEXT NOT NULL, | ||||
|                                                 `isSynced` INTEGER NOT NULL, | ||||
|                                                 `utcDateChanged` TEXT NOT NULL | ||||
| ); | ||||
|  | ||||
| INSERT INTO mig_entity_changes (entityName, entityId, hash, isErased, changeId, sourceId, isSynced, utcDateChanged) | ||||
|     SELECT entityName, entityId, hash, isErased, '', sourceId, isSynced, utcDateChanged FROM entity_changes; | ||||
|  | ||||
| DROP TABLE  entity_changes; | ||||
|  | ||||
| ALTER TABLE mig_entity_changes RENAME TO entity_changes; | ||||
|  | ||||
| CREATE UNIQUE INDEX `IDX_entityChanges_entityName_entityId` ON "entity_changes" ( | ||||
|                                                                                  `entityName`, | ||||
|                                                                                  `entityId` | ||||
|     ); | ||||
| @@ -1,13 +0,0 @@ | ||||
| CREATE TABLE IF NOT EXISTS "blobs" ( | ||||
|                                                `blobId`	TEXT NOT NULL, | ||||
|                                                `content`	TEXT NULL DEFAULT NULL, | ||||
|                                                `dateModified` TEXT NOT NULL, | ||||
|                                                `utcDateModified` TEXT NOT NULL, | ||||
|                                                PRIMARY KEY(`blobId`) | ||||
| ); | ||||
|  | ||||
| ALTER TABLE notes ADD blobId TEXT DEFAULT NULL; | ||||
| ALTER TABLE note_revisions ADD blobId TEXT DEFAULT NULL; | ||||
|  | ||||
| CREATE INDEX IF NOT EXISTS IDX_notes_blobId on notes (blobId); | ||||
| CREATE INDEX IF NOT EXISTS IDX_note_revisions_blobId on note_revisions (blobId); | ||||
| @@ -1,75 +0,0 @@ | ||||
| import sql from "../../src/services/sql"; | ||||
| import utils from "../../src/services/utils"; | ||||
|  | ||||
| interface NoteContentsRow { | ||||
|     noteId: string; | ||||
|     content: string | Buffer; | ||||
|     dateModified: string; | ||||
|     utcDateModified: string; | ||||
| } | ||||
|  | ||||
| interface NoteRevisionContents { | ||||
|     noteRevisionId: string; | ||||
|     content: string | Buffer; | ||||
|     utcDateModified: string; | ||||
| } | ||||
|  | ||||
| export default () => { | ||||
|     const existingBlobIds = new Set(); | ||||
|  | ||||
|     for (const noteId of sql.getColumn<string>(/*sql*/`SELECT noteId FROM note_contents`)) { | ||||
|         const row = sql.getRow<NoteContentsRow>(/*sql*/`SELECT noteId, content, dateModified, utcDateModified FROM note_contents WHERE noteId = ?`, [noteId]); | ||||
|         const blobId = utils.hashedBlobId(row.content); | ||||
|  | ||||
|         if (!existingBlobIds.has(blobId)) { | ||||
|             existingBlobIds.add(blobId); | ||||
|  | ||||
|             sql.insert("blobs", { | ||||
|                 blobId, | ||||
|                 content: row.content, | ||||
|                 dateModified: row.dateModified, | ||||
|                 utcDateModified: row.utcDateModified | ||||
|             }); | ||||
|  | ||||
|             sql.execute("UPDATE entity_changes SET entityName = 'blobs', entityId = ? WHERE entityName = 'note_contents' AND entityId = ?", [blobId, row.noteId]); | ||||
|         } else { | ||||
|             // duplicates | ||||
|             sql.execute("DELETE FROM entity_changes WHERE entityName = 'note_contents' AND entityId = ?", [row.noteId]); | ||||
|         } | ||||
|  | ||||
|         sql.execute("UPDATE notes SET blobId = ? WHERE noteId = ?", [blobId, row.noteId]); | ||||
|     } | ||||
|  | ||||
|     for (const noteRevisionId of sql.getColumn(/*sql*/`SELECT noteRevisionId FROM note_revision_contents`)) { | ||||
|         const row = sql.getRow<NoteRevisionContents>(/*sql*/`SELECT noteRevisionId, content, utcDateModified FROM note_revision_contents WHERE noteRevisionId = ?`, [noteRevisionId]); | ||||
|         const blobId = utils.hashedBlobId(row.content); | ||||
|  | ||||
|         if (!existingBlobIds.has(blobId)) { | ||||
|             existingBlobIds.add(blobId); | ||||
|  | ||||
|             sql.insert("blobs", { | ||||
|                 blobId, | ||||
|                 content: row.content, | ||||
|                 dateModified: row.utcDateModified, | ||||
|                 utcDateModified: row.utcDateModified | ||||
|             }); | ||||
|  | ||||
|             sql.execute("UPDATE entity_changes SET entityName = 'blobs', entityId = ? WHERE entityName = 'note_revision_contents' AND entityId = ?", [blobId, row.noteRevisionId]); | ||||
|         } else { | ||||
|             // duplicates | ||||
|             sql.execute("DELETE FROM entity_changes WHERE entityName = 'note_revision_contents' AND entityId = ?", [row.noteRevisionId]); | ||||
|         } | ||||
|  | ||||
|         sql.execute("UPDATE note_revisions SET blobId = ? WHERE noteRevisionId = ?", [blobId, row.noteRevisionId]); | ||||
|     } | ||||
|  | ||||
|     const notesWithoutBlobIds = sql.getColumn("SELECT noteId FROM notes WHERE blobId IS NULL"); | ||||
|     if (notesWithoutBlobIds.length > 0) { | ||||
|         throw new Error("BlobIds were not filled correctly in notes: " + JSON.stringify(notesWithoutBlobIds)); | ||||
|     } | ||||
|  | ||||
|     const noteRevisionsWithoutBlobIds = sql.getColumn("SELECT noteRevisionId FROM note_revisions WHERE blobId IS NULL"); | ||||
|     if (noteRevisionsWithoutBlobIds.length > 0) { | ||||
|         throw new Error("BlobIds were not filled correctly in note revisions: " + JSON.stringify(noteRevisionsWithoutBlobIds)); | ||||
|     } | ||||
| }; | ||||
| @@ -1,4 +0,0 @@ | ||||
| DROP TABLE note_contents; | ||||
| DROP TABLE note_revision_contents; | ||||
|  | ||||
| DELETE FROM entity_changes WHERE entityName IN ('note_contents', 'note_revision_contents'); | ||||
| @@ -1,26 +0,0 @@ | ||||
| CREATE TABLE IF NOT EXISTS "revisions" (`revisionId`	TEXT NOT NULL PRIMARY KEY, | ||||
|                                         `noteId`	TEXT NOT NULL, | ||||
|                                         type TEXT DEFAULT '' NOT NULL, | ||||
|                                         mime TEXT DEFAULT '' NOT NULL, | ||||
|                                         `title`	TEXT NOT NULL, | ||||
|                                         `isProtected`	INT NOT NULL DEFAULT 0, | ||||
|                                         blobId TEXT DEFAULT NULL, | ||||
|                                         `utcDateLastEdited` TEXT NOT NULL, | ||||
|                                         `utcDateCreated` TEXT NOT NULL, | ||||
|                                         `utcDateModified` TEXT NOT NULL, | ||||
|                                         `dateLastEdited` TEXT NOT NULL, | ||||
|                                         `dateCreated` TEXT NOT NULL); | ||||
|  | ||||
| INSERT INTO revisions (revisionId, noteId, type, mime, title, isProtected, utcDateLastEdited, utcDateCreated, utcDateModified, dateLastEdited, dateCreated, blobId) | ||||
| SELECT noteRevisionId, noteId, type, mime, title, isProtected, utcDateLastEdited, utcDateCreated, utcDateModified, dateLastEdited, dateCreated, blobId FROM note_revisions; | ||||
|  | ||||
| DROP TABLE note_revisions; | ||||
|  | ||||
| CREATE INDEX `IDX_revisions_noteId` ON `revisions` (`noteId`); | ||||
| CREATE INDEX `IDX_revisions_utcDateCreated` ON `revisions` (`utcDateCreated`); | ||||
| CREATE INDEX `IDX_revisions_utcDateLastEdited` ON `revisions` (`utcDateLastEdited`); | ||||
| CREATE INDEX `IDX_revisions_dateCreated` ON `revisions` (`dateCreated`); | ||||
| CREATE INDEX `IDX_revisions_dateLastEdited` ON `revisions` (`dateLastEdited`); | ||||
| CREATE INDEX IF NOT EXISTS IDX_revisions_blobId on revisions (blobId); | ||||
|  | ||||
| UPDATE entity_changes SET entityName = 'revisions' WHERE entityName = 'note_revisions'; | ||||
| @@ -1,23 +0,0 @@ | ||||
| CREATE TABLE IF NOT EXISTS "attachments" | ||||
| ( | ||||
|     attachmentId      TEXT not null primary key, | ||||
|     ownerId       TEXT not null, | ||||
|     role         TEXT not null, | ||||
|     mime         TEXT not null, | ||||
|     title         TEXT not null, | ||||
|     isProtected    INT  not null DEFAULT 0, | ||||
|     position     INT  default 0 not null, | ||||
|     blobId    TEXT DEFAULT null, | ||||
|     dateModified TEXT NOT NULL, | ||||
|     utcDateModified TEXT not null, | ||||
|     utcDateScheduledForErasureSince TEXT DEFAULT NULL, | ||||
|     isDeleted    INT  not null, | ||||
|     deleteId    TEXT DEFAULT NULL); | ||||
|  | ||||
| CREATE INDEX IDX_attachments_ownerId_role | ||||
|     on attachments (ownerId, role); | ||||
|  | ||||
| CREATE INDEX IDX_attachments_utcDateScheduledForErasureSince | ||||
|     on attachments (utcDateScheduledForErasureSince); | ||||
|  | ||||
| CREATE INDEX IF NOT EXISTS IDX_attachments_blobId on attachments (blobId); | ||||
| @@ -1,26 +0,0 @@ | ||||
| import becca from "../../src/becca/becca"; | ||||
| import becca_loader from "../../src/becca/becca_loader"; | ||||
| import cls from "../../src/services/cls"; | ||||
| import log from "../../src/services/log"; | ||||
| import sql from "../../src/services/sql"; | ||||
|  | ||||
| export default () => { | ||||
|     cls.init(() => { | ||||
|         // emergency disabling of image compression since it appears to make problems in migration to 0.61 | ||||
|         sql.execute(/*sql*/`UPDATE options SET value = 'false' WHERE name = 'compressImages'`); | ||||
|  | ||||
|         becca_loader.load(); | ||||
|  | ||||
|         for (const note of Object.values(becca.notes)) { | ||||
|             try { | ||||
|                 const attachment = note.convertToParentAttachment({ autoConversion: true }); | ||||
|  | ||||
|                 if (attachment) { | ||||
|                     log.info(`Auto-converted note '${note.noteId}' into attachment '${attachment.attachmentId}'.`); | ||||
|                 } | ||||
|             } catch (e) { | ||||
|                 log.error(`Cannot convert note '${note.noteId}' to attachment: ${e.message} ${e.stack}`); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
| }; | ||||
| @@ -1,2 +0,0 @@ | ||||
| DELETE FROM options WHERE name = 'hideIncludedImages_main'; | ||||
| DELETE FROM entity_changes WHERE entityName = 'options' AND entityId = 'hideIncludedImages_main'; | ||||