diff --git a/.editorconfig b/.editorconfig
index 9a922b74d..22620cfbf 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -10,3 +10,6 @@ insert_final_newline = true
[{*.js,*.ts(x)}]
insert_final_newline = true
+
+[*.tex]
+insert_final_newline = false
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c05a6ce2a..e74f42127 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -4,10 +4,9 @@ on: [ pull_request ]
jobs:
ChangedCodePathsFilter:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
outputs:
rcOutput: ${{ steps.filter.outputs.rcImportsHaveChanged }}
- texOutput: ${{ steps.filter.outputs.texFilesHaveChanged }}
steps:
- name: Clone repository
uses: actions/checkout@v3
@@ -22,11 +21,10 @@ jobs:
- 'temp-runners/rc_authors_to_process.txt'
- 'temp-runners/rc_ids_to_ignore.txt'
- 'temp-runners/rc_ids_to_process.txt'
- texFilesHaveChanged: 'LaTeX/**/*.tex'
Build:
needs: ChangedCodePathsFilter
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- name: Clone repository
uses: actions/checkout@v3
@@ -49,7 +47,7 @@ jobs:
ImportFromRCBasedOnAuthorsOrIds:
needs: [ ChangedCodePathsFilter, Build ]
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
if: needs.ChangedCodePathsFilter.outputs.rcOutput == 'true'
steps:
- name: Clone repository
@@ -90,7 +88,7 @@ jobs:
AutoUpdateMeta:
needs: [ Build ]
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- name: Clone repository
uses: actions/checkout@v3
@@ -119,20 +117,3 @@ jobs:
env:
CI: true
FORCE_COLOR: 2
-
- CompileLaTeX:
- needs: [ ChangedCodePathsFilter, Build ]
- runs-on: ubuntu-latest
- if: needs.ChangedCodePathsFilter.outputs.texOutput == 'true'
- steps:
- - name: Clone repository
- uses: actions/checkout@v3
- with:
- ref: ${{ github.event.pull_request.head.ref }}
-
- - name: Compile BES Conduct LaTeX doc
- uses: xu-cheng/latex-action@v3
- with:
- root_file: BES_Conduct_Afisaj.tex
- working_directory: LaTeX/conduct/
- latexmk_shell_escape: true
diff --git a/.github/workflows/deploy_to_gdrive.yml b/.github/workflows/deploy_to_gdrive.yml
index f9ce55963..0220f783d 100644
--- a/.github/workflows/deploy_to_gdrive.yml
+++ b/.github/workflows/deploy_to_gdrive.yml
@@ -16,7 +16,7 @@ on:
jobs:
DeployToGDrive:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- name: Checkout bes-lyrics repo
uses: actions/checkout@v3
diff --git a/.github/workflows/latex_conduct_release.yml b/.github/workflows/latex_conduct_release.yml
index f62b908f6..0b3f30f11 100644
--- a/.github/workflows/latex_conduct_release.yml
+++ b/.github/workflows/latex_conduct_release.yml
@@ -10,7 +10,7 @@ on:
jobs:
LaTeXConductRelease:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- name: Clone repository
uses: actions/checkout@v3
@@ -34,6 +34,6 @@ jobs:
files: 'LaTeX/conduct/BES_Conduct_Afisaj.pdf'
tag_name: ${{ steps.tag.outputs.release_tag }}
fail_on_unmatched_files: true
- draft: true
+ draft: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/latex_songbook_release.yml b/.github/workflows/latex_songbook_release.yml
new file mode 100644
index 000000000..bbdced5aa
--- /dev/null
+++ b/.github/workflows/latex_songbook_release.yml
@@ -0,0 +1,58 @@
+name: 'LaTeX Songbook (no chords))'
+
+on:
+ push:
+ branches:
+ - leadsheets-without-chords
+ # paths:
+ # - 'verified/trupe_lauda_si_inchinare/**'
+ workflow_dispatch:
+
+jobs:
+ LaTeXSongbookRelease:
+ runs-on: ubuntu-24.04
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v3
+ with:
+ ref: ${{ github.event.pull_request.head.ref }}
+
+ - name: Install Fonts
+ run: |
+ sudo apt-get update
+ echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | sudo debconf-set-selections
+ sudo apt-get install --reinstall ttf-mscorefonts-installer
+ sudo fc-cache -fv # Refresh the font cache
+
+ - name: Use Node.js 20.x
+ uses: actions/setup-node@v3
+ with:
+ node-version: 20.x
+
+ - name: Run Build songbook TEX
+ run: |
+ npm i && npm run songbook:convert
+ env:
+ CI: true
+
+ - name: Compile BES Songbook LaTeX doc
+ uses: xu-cheng/latex-action@v3
+ with:
+ root_file: bes-songbook.tex
+ working_directory: LaTeX/songbook/
+ latexmk_shell_escape: true
+ latexmk_use_xelatex: true
+
+ - name: Generate Release Tag
+ id: tag
+ run: echo "{name}={release_tag::BES_Songbook_$(date +"%Y-%B-%d-%H%M")}" >> $GITHUB_OUTPUT
+
+ - name: Release
+ uses: softprops/action-gh-release@v1
+ with:
+ files: 'LaTeX/songbook/bes-songbook.pdf'
+ tag_name: ${{ steps.tag.outputs.release_tag }}
+ fail_on_unmatched_files: true
+ draft: false
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 40fa11c6b..910eb098c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,9 @@
+/.idea/aws.xml
+/.idea/cssdialects.xml
+/.idea/nx-console.xml
+/.idea/git_toolbox_blame.xml
+/.idea/git_toolbox_prj.xml
+/.idea/webResources.xml
node_modules/
**/*.aux
**/*.fdb_latexmk
@@ -9,8 +15,6 @@ node_modules/
**/*.out
**/*.thm
**/*.xdv
-**/*.bes-songbook.tex
-target-tex-common-songbook
-/.idea/aws.xml
-/.idea/cssdialects.xml
-/.idea/nx-console.xml
+bes-songbook.tex
+bes-songbook.pdf
+target-tex
diff --git a/.idea/bes-lyrics.iml b/.idea/bes-lyrics.iml
index f40ddf713..e80e39b20 100644
--- a/.idea/bes-lyrics.iml
+++ b/.idea/bes-lyrics.iml
@@ -2,6 +2,7 @@
+
@@ -9,7 +10,4 @@
-
-
-
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 000000000..b5af900ec
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/git_toolbox_blame.xml b/.idea/git_toolbox_blame.xml
new file mode 100644
index 000000000..7dc124965
--- /dev/null
+++ b/.idea/git_toolbox_blame.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/git_toolbox_prj.xml b/.idea/git_toolbox_prj.xml
new file mode 100644
index 000000000..02b915b85
--- /dev/null
+++ b/.idea/git_toolbox_prj.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/Compile_Leadsheet_Songs_Once__Latexmk___xelatex_.xml b/.idea/runConfigurations/Compile_Leadsheet_Songs_Once__Latexmk___xelatex_.xml
new file mode 100644
index 000000000..78a09dfc3
--- /dev/null
+++ b/.idea/runConfigurations/Compile_Leadsheet_Songs_Once__Latexmk___xelatex_.xml
@@ -0,0 +1,24 @@
+
+
+
+ LATEXMK
+
+
+ BUILT-IN-PDF-VIEWER
+
+ -pdf -xelatex -f -gg -interaction=nonstopmode
+
+
+ $PROJECT_DIR$/LaTeX/songbook/bes-songbook.tex
+ $PROJECT_DIR$/LaTeX/songbook
+ {projectDir}/auxil
+ false
+ PDF
+ TEXLIVE
+ true
+ []
+ []
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/Compile_Leadsheet_Songs_Once___Stop_On_Error__Latexmk___xelatex_.xml b/.idea/runConfigurations/Compile_Leadsheet_Songs_Once___Stop_On_Error__Latexmk___xelatex_.xml
new file mode 100644
index 000000000..5c2d9c3c4
--- /dev/null
+++ b/.idea/runConfigurations/Compile_Leadsheet_Songs_Once___Stop_On_Error__Latexmk___xelatex_.xml
@@ -0,0 +1,24 @@
+
+
+
+ LATEXMK
+
+
+ BUILT-IN-PDF-VIEWER
+
+ -pdf -xelatex -f -gg -interaction=nonstopmode -halt-on-error
+
+
+ $PROJECT_DIR$/LaTeX/songbook/bes-songbook.tex
+ $PROJECT_DIR$/leadsheet
+ {projectDir}/auxil
+ false
+ PDF
+ TEXLIVE
+ true
+ []
+ []
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations/Run___Temp__add_songs_from_rc_by_ids.xml b/.idea/runConfigurations/Run___Temp__add_songs_from_rc_by_ids.xml
index c67bc6733..64e307364 100644
--- a/.idea/runConfigurations/Run___Temp__add_songs_from_rc_by_ids.xml
+++ b/.idea/runConfigurations/Run___Temp__add_songs_from_rc_by_ids.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml
index 6ae48b5f8..23a0ffc2f 100644
--- a/.idea/watcherTasks.xml
+++ b/.idea/watcherTasks.xml
@@ -1,7 +1,7 @@
-
+
@@ -41,7 +41,7 @@
-
+
@@ -61,5 +61,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/webResources.xml b/.idea/webResources.xml
index 259ad7de2..89bb66600 100644
--- a/.idea/webResources.xml
+++ b/.idea/webResources.xml
@@ -12,6 +12,9 @@
+
+
+
diff --git a/.run/Run_ [Temp] add songs from rc by authors.run.xml b/.run/Run_ [Temp] add songs from rc by authors.run.xml
index fffd99be5..17c7dd630 100644
--- a/.run/Run_ [Temp] add songs from rc by authors.run.xml
+++ b/.run/Run_ [Temp] add songs from rc by authors.run.xml
@@ -1,5 +1,5 @@
-
+
-
\ No newline at end of file
+
diff --git a/.run/Run_ [Temp] cherry pick songs we have in church.run.xml b/.run/Run_ [Temp] cherry pick songs we have in church.run.xml
index 1407b4e8d..22170a391 100644
--- a/.run/Run_ [Temp] cherry pick songs we have in church.run.xml
+++ b/.run/Run_ [Temp] cherry pick songs we have in church.run.xml
@@ -1,5 +1,5 @@
-
+
-
\ No newline at end of file
+
diff --git a/LaTeX/conduct/BES_Conduct_Afisaj.pdf b/LaTeX/conduct/BES_Conduct_Afisaj.pdf
new file mode 100644
index 000000000..c081785c4
Binary files /dev/null and b/LaTeX/conduct/BES_Conduct_Afisaj.pdf differ
diff --git a/LaTeX/songbook/bes-songbook-config.tex b/LaTeX/songbook/bes-songbook-config.tex
new file mode 100644
index 000000000..819c0fb5a
--- /dev/null
+++ b/LaTeX/songbook/bes-songbook-config.tex
@@ -0,0 +1,128 @@
+%See https://tex.stackexchange.com/questions/718798/leadsheets-package-for-songs-height-prop-undefined
+\ExplSyntaxOn
+\UseName{prop_new:c}{l__leadsheets_songs_height_prop}
+\ExplSyntaxOff
+
+\usepackage{tocloft} % For customizing ToC
+% TOC customize
+\setlength{\cftsecnumwidth}{2em} % Adjust width for section numbers in ToC
+
+% Adjust the font size of section entries in the ToC
+\renewcommand{\cftsecfont}{\normalsize} % Normal size for sections
+\renewcommand{\cftsecpagefont}{\normalsize} % Normal size for page numbers
+\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} % Use dotted leaders
+
+% Adjust vertical spacing between section entries in the ToC
+\setlength{\cftbeforesecskip}{0.3em} % Space before each section
+\setlength{\cftbeforesubsecskip}{0.15em} % Space before each subsection
+
+% Translations
+\newversetype{prechorus}
+
+\DeclareTranslation{English}{leadsheets/major}{Major}
+\DeclareTranslation{English}{leadsheets/minor}{Minor}
+\DeclareTranslation{English}{leadsheets/composer}{Compozitor}
+\DeclareTranslation{English}{leadsheets/lyrics}{Versuri}
+\DeclareTranslation{English}{leadsheets/key}{Gama}
+\DeclareTranslation{English}{leadsheets/capo}{Capo}
+\DeclareTranslation{English}{leadsheets/fret}{Fret}
+\DeclareTranslation{English}{leadsheets/interpret}{Interpret}
+
+\DeclareTranslation{English}{leadsheets/intro}{Intro}
+\DeclareTranslation{English}{leadsheets/interlude}{Interludiu}
+\DeclareTranslation{English}{leadsheets/bridge}{Bridge}
+\DeclareTranslation{English}{leadsheets/chorus}{Refren}
+% Hack - We use it for the ending
+\DeclareTranslation{English}{leadsheets/outro}{End}
+\DeclareTranslation{English}{leadsheets/prechorus}{Prerefren}
+\DeclareTranslation{English}{leadsheets/solo}{Solo}
+\DeclareTranslation{English}{leadsheets/verse}{Vers}
+
+\defineversetypetemplate{framed}
+{%
+ \expandcode{%
+ \noexpand\mdframed[
+ \ifversestarred{}{%
+ frametitle={%
+ \noexpand\tikz[baseline=(current bounding box.east),outer sep=0pt]
+ \noexpand\node[anchor=east,rectangle,fill=gray!20,rounded corners=2pt]
+ {\noexpand\strut\noexpand\verselabel};
+ }%
+ },
+ roundcorner = 5pt ,
+ linecolor = gray!20 ,
+ linewidth = 2pt,
+ topline = true,
+ frametitleaboveskip = \dimexpr-\ht\strutbox\relax ,
+ ]%
+ }%
+ \setlength\parindent{0pt}
+ \setlength\parskip{\parsep}
+ \ifobeylines
+ {\setleadsheets{ obey-lines-parskip=\parskip }\setlength\parskip{0pt}}
+ {\vspace*{-\parskip}}%
+}
+{%
+ \endmdframed
+ \addvspace{\baselineskip}%
+}
+
+% Redefine section titles
+\usepackage{titlesec}
+% Section with custom fonts for number and title
+\titleformat{\section}
+ {\large\bfseries\color{darkgray}} % Custom font, bold, dark gray
+ {Nr. \thesection} % Include the number
+ {1.5em}
+ {} % Convert title to uppercase
+
+\definesongtitletemplate{bes-title-template}{
+ \ifsongmeasuring
+ {\section*}
+ {\section}%
+ {\songproperty{title}}
+ \begingroup\footnotesize
+ \begin{tabular}{
+ @{}
+ >{\raggedright\arraybackslash}p{.5\linewidth}
+ @{}
+ >{\raggedleft\arraybackslash}p{.5\linewidth}
+ @{}
+ }
+ \ifsongproperty{interpret}
+ {\GetTranslation{leadsheets/interpret}}
+ {}%
+ \ifsongproperty{composer}
+ {%
+ &
+ \GetTranslation{leadsheets/composer}: %
+ \printsongpropertylist{composer}{ \& }{, }{ \& }
+ \ifsongproperty{lyrics}
+ {
+ \\ &
+ \GetTranslation{leadsheets/lyrics}: %
+ \printsongpropertylist{lyrics}{ \& }{, }{ \& }
+ }
+ {}%
+ }
+ {}%
+ \ifsongproperty{interpret}{\\}{\ifsongproperty{composer}{\\}{}}%
+ \ifsongproperty{genre}
+ {& Genre: \songproperty{genre} \\}
+ {}%
+ \ifsongproperty{tempo}
+ {& Tempo: \songproperty{tempo} \\}
+ {}%
+ \ifsongproperty{key}
+ {%
+ & \setchords{
+ major = -\GetTranslation{leadsheets/major} ,
+ minor = -\GetTranslation{leadsheets/minor}
+ }%
+ \GetTranslation{leadsheets/key}: %
+ \expandcode{\writechord{\songproperty{key}}} \\%
+ }
+ {}%
+ \end{tabular}
+ \par\endgroup
+}
\ No newline at end of file
diff --git a/LaTeX/songbook/bes-songbook.template.txt b/LaTeX/songbook/bes-songbook.template.txt
new file mode 100644
index 000000000..7fc0b346a
--- /dev/null
+++ b/LaTeX/songbook/bes-songbook.template.txt
@@ -0,0 +1,145 @@
+% =====================================================================
+% This file is auto-generated.
+%
+% Copyright (c) 2024 BES (ioan.lucut88@gmail.com)
+%
+% Do not edit this file directly. Do it only in the template (.template.txt).
+% Any changes made will be overwritten the next time the file is generated.
+% =====================================================================
+
+\documentclass{scrartcl}
+
+\usepackage{scrextend} % Compatibility layer
+\usepackage[full]{leadsheets}
+
+\usepackage{array}
+
+% For adding color
+\usepackage{xcolor}
+
+% For frame in chorus
+\usepackage{mdframed}
+\usepackage{tikz}
+
+% https://mirrors.nxthost.com/ctan/macros/latex/contrib/leadsheets/leadsheets_en.pdf
+% Page 50
+% Loading the external library allows to include complete leadsheet documents (i. e., with preamble) into a main document.
+\useleadsheetslibraries{external}
+
+% https://tex.stackexchange.com/questions/352804/setmainfont-vs-fontspec
+\usepackage{fontspec}
+\usepackage[12pt]{extsizes}
+%\usepackage{librecaslon}
+%\usepackage{librecaslon}
+%\setmainfont{Fira Sans}
+%\setmainfont{Lato}
+%\setmainfont{Roboto}
+%\setmainfont{Crimson Pro}
+
+%\usepackage[T1]{fontenc}
+%\setmainfont{Georgia} % A pleasant serif font for lyrics
+%\newfontfamily\chordfont{Arial} % A clear sans-serif font for chords
+
+% https://tex.stackexchange.com/questions/664/why-should-i-use-usepackaget1fontenc
+% Diacriticile nu functioneaza cu fontenc
+%\usepackage[T1]{fontenc}
+
+% Use copyright, see https://tex.stackexchange.com/questions/1676/how-to-get-good-looking-copyright-and-registered-symbols
+\usepackage{textcomp}
+
+% https://tex.stackexchange.com/questions/641189/what-is-the-function-usepackageutf8inputenc-used-for-and-why-we-should-add
+\usepackage[utf8]{inputenc}
+
+% For links
+%\usepackage{hyperref}
+\usepackage[colorlinks=true, linkcolor=darkgray, urlcolor=darkgray, citecolor=darkgray]{hyperref}
+
+% Global configs for the leadhseets class
+\setleadsheets{
+ title-template = bes-title-template,
+ bar-shortcuts,
+ verse/numbered,
+ verse/named = false,
+ verses-format =,
+ verses-label-format = \bfseries,
+ info/format = \itshape,
+% chorus/format = \itshape,
+ bar-shortcuts = true,
+ obey-lines = false,
+ smash-chords = false,
+% after-song = AS,
+% after-title = AT,
+}
+
+% Setup for headers and footers
+\usepackage[automark]{scrlayer-scrpage}
+
+% Clear existing headers and footers
+\clearpairofpagestyles
+
+% Define headers with underline
+\ihead{\textit{Caiet de cântece BES.}\par\noindent\rule{\textwidth}{0.4pt}} % Inner (left) header with underline
+\ohead{\textbf{Pagina \thepage}\par\noindent\rule{\textwidth}{0.4pt}} % Outer (right) header with underline
+\cfoot{\textit{\textcopyright\ 2025 BES. Toate drepturile rezervate.}} % Centered footer
+
+\input{bes-songbook-config.tex}
+
+\begin{document}
+
+ \begin{titlepage}
+ \begin{center}
+ % Add some vertical space at the top
+ \vspace*{2cm}
+
+ % Title
+ {\Huge \textbf{Caiet de Cântece}} \\
+ \vspace{0.5cm}
+ {\LARGE \textbf{BES - 2025}} \\
+
+ % Add a decorative horizontal line
+ \vspace{1cm}
+ \rule{\textwidth}{0.5mm}
+ \vspace{0.5cm}
+
+ % Subtitle or description
+ {\Large Compilat cu dragoste pentru comunitate} \\
+
+ % Spacer to align elements nicely
+ \vspace{\fill}
+
+ % Footer with credits
+ {\small Creat cu Leadsheets} \\
+ {\footnotesize\url{https://github.com/ioanlucut/bes-lyrics}}
+
+ % Spacer to push content upwards
+ \vspace{2cm}
+ \end{center}
+ \end{titlepage}
+
+ % Table of content
+ % Set a custom title for the Table of Contents in another language
+ \renewcommand{\contentsname}{\textbf{Cuprins}}
+
+ % Set a custom title for the Table of Contents
+ \renewcommand{\contentsname}{Conținut} % Suppress the default "Contents" title
+
+ % Add the title to the Table of Contents without numbering
+ \addcontentsline{toc}{section}{\contentsname}
+
+ % Display the Table of Contents
+ \begin{center}
+ \vspace*{1cm}
+ {\Huge \textbf{Cuprins}} % Center the title
+ \vspace*{0.5cm}
+ \end{center}
+
+ \tableofcontents
+
+ \vspace{1cm} % Add spacing after the Table of Contents
+ \noindent\rule{\textwidth}{0.5mm} % Add a decorative horizontal rule
+ \vspace{1cm}
+ % End - Table of content
+
+ % Leadsheets
+ {{REPLACE_ME}}
+\end{document}
diff --git a/LaTeX/songbook/convertToSongbookTex.ts b/LaTeX/songbook/convertToSongbookTex.ts
new file mode 100644
index 000000000..8885bff9e
--- /dev/null
+++ b/LaTeX/songbook/convertToSongbookTex.ts
@@ -0,0 +1,118 @@
+import chalk from 'chalk';
+import dotenv from 'dotenv';
+import fs from 'fs';
+import fsExtra from 'fs-extra';
+import { flatten } from 'lodash-es';
+import pMap from 'p-map';
+import path from 'path';
+import * as process from 'process';
+import { fileURLToPath } from 'url';
+import {
+ EMPTY_STRING,
+ logFileWithLinkInConsole,
+ logProcessingFile,
+ NEW_LINE,
+ padForTex,
+ parse,
+ readTxtFilesRecursively,
+ TEX_EXTENSION,
+ TEX_MUSICAL_NOTATIONS,
+ TXT_EXTENSION,
+} from '../../src/index.js';
+import { convertSongToLeadsheet } from '../../src/songToLeadsheetConverter.js';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+
+dotenv.config();
+
+const TEMPLATE_FILE = 'bes-songbook.template.txt';
+const BES_SONGBOOK_FILE = 'bes-songbook.tex';
+const TEX_OUTPUT = 'target-tex';
+
+const escapeRequiredChars = (songMetaContent: string) =>
+ songMetaContent.replaceAll(/&/g, '\\&');
+
+const readFiles = async (dir: string) =>
+ (await readTxtFilesRecursively(dir)).map((filePath) => {
+ const contentAsString = fs.readFileSync(filePath).toString();
+
+ return {
+ fileName: path.basename(filePath),
+ filePath,
+ songAST: parse(contentAsString, { rejoinSubsections: true }),
+ contentAsString,
+ };
+ });
+
+const runForDirs = async (songsDirs: string[]) => {
+ const generatedFiles = await pMap(
+ flatten(await Promise.all(songsDirs.map(readFiles))).sort(
+ ({ songAST: songASTa }, { songAST: songASTb }) =>
+ [
+ songASTa.title,
+ songASTa.alternative,
+ songASTa.composer,
+ songASTa.arranger,
+ songASTa.band,
+ songASTa.genre,
+ songASTa.version,
+ ]
+ .join(EMPTY_STRING)
+ .localeCompare(
+ [
+ songASTb.title,
+ songASTb.alternative,
+ songASTb.composer,
+ songASTb.arranger,
+ songASTb.band,
+ songASTb.genre,
+ songASTb.version,
+ ].join(EMPTY_STRING),
+ ),
+ ),
+ async ({ contentAsString, fileName, filePath, songAST }) => {
+ logProcessingFile(
+ fileName,
+ `Converting to TEX the song with title: ${songAST.title}.`,
+ );
+ logFileWithLinkInConsole(filePath);
+
+ if (!contentAsString.includes(TEX_MUSICAL_NOTATIONS)) {
+ console.warn(
+ `The song does not have musical notations present: "${chalk.yellow(
+ filePath,
+ )}"`,
+ );
+ }
+
+ const contentAsTex = convertSongToLeadsheet(songAST);
+
+ // Use absolute path here
+ const absoluteFilePath = path.join(
+ __dirname,
+ TEX_OUTPUT,
+ fileName.replace(TXT_EXTENSION, TEX_EXTENSION),
+ );
+ fs.writeFileSync(absoluteFilePath, contentAsTex);
+
+ return absoluteFilePath;
+ },
+ );
+
+ const dynamicLeadsheetSongs = generatedFiles
+ .filter(Boolean)
+ .map((relativeFilePath) =>
+ padForTex(2)(`\\includeleadsheet{${relativeFilePath}}`),
+ )
+ .join(NEW_LINE);
+
+ const compiledTemplate = fs
+ .readFileSync(path.join(__dirname, TEMPLATE_FILE))
+ .toString()
+ .replace('{{REPLACE_ME}}', dynamicLeadsheetSongs);
+
+ fs.writeFileSync(path.join(__dirname, BES_SONGBOOK_FILE), compiledTemplate);
+};
+
+fsExtra.ensureDirSync(path.join(__dirname, TEX_OUTPUT));
+await runForDirs([`${process.env.VERIFIED_DIR}/trupe_lauda_si_inchinare`]);
diff --git a/bin/lyricsIdUniquenessValidator.ts b/bin/lyricsIdUniquenessValidator.ts
index 0c8ce6739..953056fe2 100644
--- a/bin/lyricsIdUniquenessValidator.ts
+++ b/bin/lyricsIdUniquenessValidator.ts
@@ -15,7 +15,7 @@ import * as process from 'process';
import {
COMMA,
EMPTY_STRING,
- NEW_LINE_TUPLE,
+ NEW_LINE,
parse,
readTxtFilesRecursively,
} from '../src/index.js';
@@ -47,7 +47,7 @@ const runValidator = async (dir: string) => {
isEmpty(maybeSongsWithoutId),
`There are missing IDS: ${maybeSongsWithoutId
.map(({ id, fileName }) => `${fileName} with wrong/missing id: "${id}"`)
- .join(NEW_LINE_TUPLE)}`,
+ .join(NEW_LINE)}`,
);
assert.equal(
diff --git a/bin/lyricsRomanianDictionaryAnalyzer.ts b/bin/lyricsRomanianDictionaryAnalyzer.ts
index f046f277f..b204a23e1 100644
--- a/bin/lyricsRomanianDictionaryAnalyzer.ts
+++ b/bin/lyricsRomanianDictionaryAnalyzer.ts
@@ -25,7 +25,6 @@ import {
CHARS_SEPARATORS,
ERROR_CODE,
NEW_LINE,
- NEW_LINE_TUPLE,
SongSection,
TEST_FILE,
TXT_EXTENSION,
@@ -126,7 +125,7 @@ const speller = nspell(romanianDictionary).personal(
);
const rawWords = await analyzeAndGet(process.env.VERIFIED_DIR, speller);
-const unknownOrIncorrectWords = without(uniq(rawWords).sort(), NEW_LINE_TUPLE);
+const unknownOrIncorrectWords = without(uniq(rawWords).sort(), NEW_LINE);
if (!isEmpty(unknownOrIncorrectWords)) {
console.log(
diff --git a/candidates/Agape/Agape - Aici te astept azi.txt b/candidates/Agape/Agape - Aici te astept azi.txt
deleted file mode 100644
index 36fbcd556..000000000
--- a/candidates/Agape/Agape - Aici te astept azi.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-[title]
-Aici te astept azi {alternative: {*}, composer: {Agape}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {1013}, id: {pgzbysuo7F9LH8PusFSVV6}, contentHash: {3bbd8f}}
-
-[sequence]
-v1,c
-
-[v1]
-Aici Te aștept azi,
-Locuiește-n min’, Te rog.
-Tânjesc după Tine din nou,
-M-ascunzi în iubirea-Ți,
-Du-mă pe genunchi,
-Să Te cunosc vreau tot mai mult.
-
-[c]
-Trăiește-n min’,
-Viața mea inund-o,
-Respiri în min’,
-Să mă-nalț pe aripi spre Tin’.
diff --git a/candidates/Agape/Agape - Si pe mine si pe tine.txt b/candidates/Agape/Agape - Si pe mine si pe tine.txt
deleted file mode 100644
index 1c258470a..000000000
--- a/candidates/Agape/Agape - Si pe mine si pe tine.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-[title]
-Si pe mine si pe tine {alternative: {*}, composer: {Agape}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {5066}, id: {e7XfxjREiZGnzsuaH61whW}, contentHash: {9e1c78}}
-
-[sequence]
-c,v1,c
-
-[c]
-/: Și pe mine, și pe tine
-Ne-a salvat Isus,
-Și ne-a pregătit un loc,
-’
-Colo-n ceruri, sus. :/
-
-[v1]
-Haină albă ca zăpada
-Domnul Isus ne-a promis
-Că ne duce-n veșnicie,
-În cerescul paradis.
diff --git a/candidates/Agape/Agape - Stam uniti in adorare.txt b/candidates/Agape/Agape - Stam uniti in adorare.txt
deleted file mode 100644
index 4a10cdcbb..000000000
--- a/candidates/Agape/Agape - Stam uniti in adorare.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-[title]
-Stam uniti in adorare {alternative: {*}, composer: {Agape}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {6879}, id: {hpcb7tCLPe8hU3kvz8Ed5G}, contentHash: {6171e9}}
-
-[sequence]
-v1,c,v2,c2
-
-[v1]
-Estamos todos unidos adorandote señor,
-Alabanza se les damos en tu presencia hoy.
-
-[c]
-Le cantamos eres digno de suprema exaltación
-Las canciones cantaran digno eres,
-O, digno del gloria, digno eres Tu.
-
-[v2]
-Stăm uniți în adorare
-În prezența Domnului
-Înălțăm laudele noastre
-Dându-I glorie numai Lui
-
-[c2]
-Îți cântăm: vrednic de laudă
-Ești deasupra tuturor
-Azi Biserica îți cântă
-Tu ești vrednic, Mielul lui Dumnezeu.
-Vrednic ești doar Tu.
diff --git a/candidates/BBSO/BBSO - Inainte sa-ntelegem harul tau (doar prin crucea ta ).txt b/candidates/BBSO/BBSO - Inainte sa-ntelegem harul tau (doar prin crucea ta ).txt
deleted file mode 100644
index 65df49c38..000000000
--- a/candidates/BBSO/BBSO - Inainte sa-ntelegem harul tau (doar prin crucea ta ).txt
+++ /dev/null
@@ -1,35 +0,0 @@
-[title]
-Inainte sa-ntelegem harul tau (doar prin crucea ta ) {alternative: {*}, composer: {BBSO}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {234970}, id: {aecVsNWxsx52dwz8CvivEU}, contentHash: {f4440d}}
-
-[sequence]
-v1,b,c,v2,b,c,e
-
-[v1]
-Inainte sa-ntelegem harul Tau bogat
-Tu cuvantul viu din Tatal sfant si adorat
-Ne-ai deschis cararea vietii
-Sa pasim spre cer
-Ne-ai zdrobit din suflet moartea
-Te-ai jertfit ca Miel
-
-[b]
-Tu esti primul, inceputul, esti Dumnezeu
-Tu esti chipul Celui Vesnic esti Domnul Meu
-Tu esti primul, inceputul, esti Dumnezeu
-Tu esti chipul Celui Vesnic esti Domnul Meu
-
-[c]
-Doar prin crucea Ta mareata sunt nascut din nou,
-Ai murit sa-mi dai viata, m-ai facut al Tau X2
-Doar prin crucea Ta mareata sunt nascut din nou
-Ai murit sa-mi dai viata, m-ai facut al Tau X2
-Doar prin crucea Ta mareata sunt nascut din nou
-Ai murit sa-mi dai viata, m-ai facut al Tau X2
-
-[v2]
-Noaptea lumii se destrama, esti lumina mea
-Viata noua azi renaste prin iubirea Ta
-
-[e]
-Te iubesc Isus, Te iubesc Isus, Te iubesc Isus
-Sunt al Tau pe veci! X2
diff --git a/candidates/Elim Harmony Band/Elim Harmony Band - Isus m-ai binecuvantat.txt b/candidates/Elim Harmony Band/Elim Harmony Band - Isus m-ai binecuvantat.txt
deleted file mode 100644
index b1bf7d4ff..000000000
--- a/candidates/Elim Harmony Band/Elim Harmony Band - Isus m-ai binecuvantat.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-[title]
-Isus m-ai binecuvantat {alternative: {*}, composer: {Elim Harmony Band}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {232705}, id: {ssbGDd4Zm4wnudUYZs1R8W}, contentHash: {95a531}}
-
-[sequence]
-v1,v2,b,c,v3,b,c,b2,e
-
-[v1]
-Mi-Ești lumină în noapte
-Când sunt trist îmi dai pace
-Când sunt apăsat de povara
-Ești cu mine, aproape.
-
-[v2]
-Doar Tu ești Adevărul
-Mă îmbraci cu credință
-Când simt că totul s-a prăbușit
-Tu îmi dai biruință!
-
-[b]
-Tu ești pacea mea, Te voi urma, Vreau să-mi vorbești.
-
-[c]
-Doar la Tine eu alerg,
-În Tine mă încred
-Tu viața mi-ai schimbat!
-Când Prin lumina Ta privesc
-Orice umbră-ndepărtezi, Tu m-ai binecuvântat!
-/: Isus, oh :/ Isus, Tu m-ai binecuvântat
- /: Isus, oh :/ Isus...
-
-[v3]
-Mă îmbraci cu putere
-Când cei răi mă-nconjoară
-Tu mă asculți când strig spre Tine
-Îmi iei orice povară!
-
-[b2]
-Inima Tu-mi poți vindeca
-Mă-nchin liber în prezența Ta
-Nu-i prea târziu sa fiu salvat
-Mă chemi pe nume!
-Dragostea Ta m-a cucerit
-În brațul Tău eu mă simt iubit
-Cu tot ce sunt mă dăruiesc
-Trăiesc prin Tine!
-Inima Tu-mi poți vindeca
-Mă-nchin liber în prezența Ta
-Nu-i prea târziu să fiu salvat
-Mă chemi pe nume!
-Dragostea Ta m-a cucerit
-În brațul Tău eu mă simt iubit
-Cu tot ce sunt mă dăruiesc
-Mă dăruiesc!
-
-[e]
-/: Isus, oh :/ x3
-Când prin lumina Ta privesc
-Orice umbră-ndepărtezi
-Tu m-ai binecuvântat!
-/: Isus, Isus, Isus.. Tu m-ai binecuvântat :/ x2
diff --git a/candidates/Elim Harmony Band/Elim Harmony Band - Promisiuni.txt b/candidates/Elim Harmony Band/Elim Harmony Band - Promisiuni.txt
deleted file mode 100644
index 060e958ab..000000000
--- a/candidates/Elim Harmony Band/Elim Harmony Band - Promisiuni.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-[title]
-Promisiuni {alternative: {*}, composer: {Elim Harmony Band}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {158412}, id: {9dJLLzxMHEz3TRTT7ckPLB}, contentHash: {4f9dd2}}
-
-[sequence]
-v1,c,v2,c2,e
-
-[v1]
-Eu nu ți-am spus vreodată, că-ți voi da bogății,
-Nici că frigul nopții sau văpaia, nu le vei simți.
-Am promis că prin toate, Eu lângă tine sunt!
-Și să nu uiți, viața e doar un drum!
-Eu n-am promis, că tu, fără teamă vei trăi,
-Sau că niciodată, singur, tu nu te vei simți,
-Dar să nu uiți, mereu te voi însoți!
-Totdeauna, Eu te voi sprijini!
-
-[c]
-Căci voi împlini întocmai, așa cum ți-am promis,
-Al Meu har te-nsoțește și îți va fi de ajuns.
-Îți dau a Mea iubire, ca ancoră și scut,
-Voi fi cu tine, voi fi cu tine, Eu îți promit!
-
-[v2]
-Nicicând nu ți-am promis, că prieteni falși nu vei avea,
-Și nici că-ntotdeauna lumea te va admira,
-Dar ți-am spus, că ades, vei fi disprețuit!
-Doar cei vrednici, calea o vor sfârși!
-Eu nu ți-am spus că n-ai să simți al morții trist sărut,
-Și nici că poți intra-n odihnă, Iordanul ocolind,
-Dar ți-am spus, că te întâmpin’, pe malul celălalt.
-Și-ți voi șterge cu dragoste lacrima!
-
-[c2]
-Căci voi împlini întocmai, așa cum ți-am promis,
-Și în curând, când voi veni, în ochi Mă vei privi,
-Cu îngerii alături, vei cânta în veșnicii,
-Vei fi cu Mine, vei fi cu Mine: Eu îți promit!
-
-[e]
-Deci, mergi înainte, niciun pas nu ezita,
-În ceața nopții densă, ai lumina Mea!
-Nimic din lumea aceasta, nu ne va despărți,
-/: Voi fi cu tine, voi fi cu tine, Eu îți promit! :/
diff --git a/candidates/Elim Harmony Band/Elim Harmony Band - Psalmul.txt b/candidates/Elim Harmony Band/Elim Harmony Band - Psalmul.txt
deleted file mode 100644
index 326a33560..000000000
--- a/candidates/Elim Harmony Band/Elim Harmony Band - Psalmul.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-[title]
-Psalmul {alternative: {*}, composer: {Elim Harmony Band}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {220850}, id: {nF391wU7tyJBXfntH3SAak}, contentHash: {9ea1d1}}
-
-[sequence]
-v1,c,v2,b,c
-
-[v1]
-Ia aminte Doamne la rugăciunea mea
-Ascultă-mi șoaptă inimii
-Prin cuvinte Tată nu pot exprima
-Cât de mult doresc prezența Ta
-Da eu știu, ajutor doar la Tine eu găsesc
-Ești un turn de adăpost
-de vrăjmași mă ocrotești
-
-[c]
-Du-mă pe stânca, ce n-o pot ajunge
-Neclintit să fiu mereu pe calea Ta
-Voi rămâne în Tine, ancorat pe vecie
-Voi cântă neîncetat numele Tău
-
-[v2]
-Tu îmi ești răsplata, și moștenirea mea
-Credincios în veci Doamne Tu ești
-Mă incred în Tine, Tu nu mă vei lăsa
-Chiar de îmi e mâhnită inima
-Da eu știu, ajutor doar la Tine eu găsesc
-Ești un turn de adăpost
-de vrăjmași mă ocrotești
-
-[b]
-Eu în Tin’ mă odihnesc
-Pace și adăpost eu găsesc
-Bunătatea Ta umple viața mea
diff --git a/candidates/Eliza Pirosca/Eliza Pirosca - Aleluia.txt b/candidates/Eliza Pirosca/Eliza Pirosca - Aleluia.txt
deleted file mode 100644
index 58d5ca415..000000000
--- a/candidates/Eliza Pirosca/Eliza Pirosca - Aleluia.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-[title]
-Aleluia {alternative: {*}, composer: {Eliza Pirosca}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {85669}, id: {qvyebbYozvxz6gN86DaTnu}, contentHash: {634116}}
-
-[sequence]
-c,v1,c,v2,c,v3,c
-
-[c]
-/: Aleluia! :/ x4
-Domnul slavei,
-Regele meu,
-Îți cânt :
-/: Aleluia! :/ x4
-
-[v1]
-Într-un cor de îngeri
-Vreau să-ți cânt,
-Pentru veșnicii!
-Fața Ta luminoasă
-Să-mi încălzească sufletul!
-
-[v2]
-Ca un vultur
-Mă vei înălța
-Spre cerul Tău!
-În sfârșit, voi fi liber
-Și voi sta la tronul Tău!
-
-[v3]
-Ce minunat va fi
-Când nu va mai trebui
-Să plâng!
-Cerul Tău va vindeca
-Sufletul meu!
diff --git a/candidates/Eliza Pirosca/Eliza Pirosca - Atat de mic.txt b/candidates/Eliza Pirosca/Eliza Pirosca - Atat de mic.txt
deleted file mode 100644
index 35cc6eddb..000000000
--- a/candidates/Eliza Pirosca/Eliza Pirosca - Atat de mic.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-[title]
-Atat de mic {alternative: {*}, composer: {Eliza Pirosca}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {94107}, id: {a4RkbFuQEWSxFc5t1UVtRj}, contentHash: {f801bb}}
-
-[sequence]
-v1,c,e
-
-[v1]
-/: O, Doamne, sunt atât de mic,
-Atât de mic pe când încerc
-În raze să-mi ridic
-O lacrimă din umăr de privire
-Peste așa pustiire.
-Și nu pot decât până la poale
-Să văd muntele din raza de soare,
-Să regăsesc poteca și urmele de pași
-Din Tine rămași. :/
-
-[c]
-/: Nu-s decât o gândire singură și ciudată,
-Cu ecou uneori, cu ecou altădată,
-Ca o înghițire de sentiment rătăcit
-În intestine de chit. :/
-
-[e]
-/: Alerg și întreb :/
-Poate cândva aripa ce mă ține va dispărea
-Și va rămâne doar pomul din care, dulce,
-Ți-ai făcut o cruce.
diff --git a/candidates/Eliza Pirosca/Eliza Pirosca - Cred in tine.txt b/candidates/Eliza Pirosca/Eliza Pirosca - Cred in tine.txt
deleted file mode 100644
index fc01d307d..000000000
--- a/candidates/Eliza Pirosca/Eliza Pirosca - Cred in tine.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-[title]
-Cred in tine {alternative: {*}, composer: {Eliza Pirosca}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {58945}, id: {cf4fzymYpLYWeJiNT3Erwy}, contentHash: {361a6f}}
-
-[sequence]
-v1,v2,c,v3,c,v4,c,e
-
-[v1]
-Credința mea
-Nu este pe nisip
-Eu am crezut
-Și Domnul a-mplinit
-Eu cred în El
-Chiar dacă drumul este greu
-Pot să am în fața mea uși închise: nu îmi pasă
-Eu cred în Dumnezeu.
-
-[v2]
-Credința mea
-M-ajută-n încercări
-Eu cred în El
-Și El îmi dă puteri
-Când am trecut
-Prin valea umbrei morții
-El a fost Păstorul meu și m-a păzit, m-a ajutat
-Și eu am biruit
-
-[c]
-Cred în Tine
-Cred în Tine
-O, Domnul meu
-Turnul meu de scăpare
-Cred în Tine
-Cred în Tine
-Căci ești Dumnezeu,
-Ești ajutorul meu
-Eu cred în Tine.
-
-[v3]
-Credința mea
-Mereu m-a ajutat
-Eu am crezut
-Și El m-a binecuvântat
-Chiar dacă uneori am fost descurajat
-Domnul meu mi-a arătat că-i lângă mine
-Chiar de nu-L văd
-E lângă mine.
-
-[v4]
-Credința mea
-M-a apropiat de cer
-Peste munți și peste văi
-Într-o zi eu sper
-Că voi putea să zbor mai repede că gândul
-Domnul meu, eu am încredere în Tine
-Și-ți mulțumesc că Te-ai jertfit pentru mine.
-
-[e]
-Chiar și când întunericul e greu
-Chiar și când păcatul m-apăsă
-Tu ești mereu adăpostul meu
-Și nu îmi pasă de cel rău
-Căci eu cred..
diff --git a/candidates/Eliza Pirosca/Eliza Pirosca - Gara vietii.txt b/candidates/Eliza Pirosca/Eliza Pirosca - Gara vietii.txt
deleted file mode 100644
index 175577254..000000000
--- a/candidates/Eliza Pirosca/Eliza Pirosca - Gara vietii.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-[title]
-Gara vietii {alternative: {*}, composer: {Eliza Pirosca}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {113287}, id: {hTUtFdazzX3hg4Yj2AJkx7}, contentHash: {82b7b6}}
-
-[sequence]
-v1,c,v2,b,c
-
-[v1]
-Sunt în Gara Vieții și aștept cam de mult
-Au trecut ani peste mine și-am pierdut vreo două trenuri
-Anotimpuri nu se mai perindă de mult timp pe aici
-Nu știu dacă am îmbătrânit, dar nici nu-mi pasă.
-Aștept, aștept să vină Cineva și să-mi spună
-Ce tren să iau, ce bilet să-mi cumpăr...
-Aștept, aștept, poate-or veni vara, toamna si iarna
-Ca să știu dacă mai sunt sau nu in viață.
-
-[c]
-Tatăl meu, știu că privești de sus
-Chiar nu ai nimic de spus?
-Dă-mi te rog un semn că mă mai iubești
-Chiar dacă greșesc...
-Mai trimite-mi un tren și pentru mine.
-Tatăl meu, știu ca El e trimis de sus
-Mi-a spus că se numește ISUS!
-Mi-a arătat drumul spre Tine
-N-a mai trebuit sa aștept
-M-a facut atât de fericit.
-
-[v2]
-Încep să nu mai am răbdare, răceala m-a cuprins
-Mi-e dor de viață și de soare, mi-e dor de infinit...
-Trenuri nu mai opresc, oare ce trebuie să fac?
-Mi-e teamă că voi rămâne singur pentru totdeauna.
-Aștept, aștept, iată Cineva se ivește
-Îl recunosc, are o privire atât de blândă!
-Mă strânge la piept și-apoi mă ia de mâna
-Nu-mi mai este frig și nici teamă.
-
-[b]
-Tatăl meu, știu că El e trimis de sus
-Mi-a spus că se numește ISUS!
-M-am dus cu El într-un Loc
-Atât de liniștit și de frumos
-M-a învățat să fiu fericit!
diff --git a/candidates/Eliza Pirosca/Eliza Pirosca - Orice lacrima.txt b/candidates/Eliza Pirosca/Eliza Pirosca - Orice lacrima.txt
deleted file mode 100644
index 356eb78b1..000000000
--- a/candidates/Eliza Pirosca/Eliza Pirosca - Orice lacrima.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-[title]
-Orice lacrima {alternative: {*}, composer: {Eliza Pirosca}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {114747}, id: {goQ3vSRmvQnvXtKCEYeFqa}, contentHash: {4bcd65}}
-
-[sequence]
-v1,v2,c
-
-[v1]
-Orice lacrimă de pe-obrazul tău va fi ștearsă
-Nu vor mai fi regrete, nici dureri
-Nu te voi lăsa singur să pășești pe cale
-Mâna ta va fi mereu în Mâna Mea
-Vino la tronul Meu de slavă
-Și pace vei primi
-Sufletul tău va fi binecuvântat
-Și orice păcat va fi spălat prin Sângele lui Isus
-
-[v2]
-Știu că drumu-i greu, știu că tu ai obosit
-Știu că cerul este iar întunecat
-Dar copilul Meu, să nu-ți fie niciodată teamă
-Eu te voi purta pe aripa ?
-Vino pe genunchi să te-odihnești
-Și îngrijorarea ta va trece
-Sufletul tău va fi binecuvântat
-Inima ta se va umple de bucurii eterne
-
-[c]
-Vino la Mine, vino să îți așezi
-Capul obosit pe Pieptul Meu
-Vino la Mine, vino să te încrezi
-În Tatăl Tău
diff --git a/candidates/Grup Eldad/Eldad - A frant temeliile mortii.txt b/candidates/Grup Eldad/Eldad - A frant temeliile mortii.txt
deleted file mode 100644
index a87a7c237..000000000
--- a/candidates/Grup Eldad/Eldad - A frant temeliile mortii.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-[title]
-A frânt temeliile morții {alternative: {*}, composer: {Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {191607}, id: {wxKJfgNZw8bGwiTmw6HXpt}, contentHash: {747843}}
-
-[sequence]
-v1,c,v2,c,v3,c,e,c
-
-[v1]
-Ascultă porunca cea mai mare:
-„Să iubești pe Domnul Dumnezeul tău!”
-Dar nu oricum, pune valoare,
-Cu toată inima și cugetul tău!
-
-[c]
-Lasă-L să pătrundă în inima ta!
-S-a stins ca să-ți spele păcatul,
-Tu știi cine-ai fost, ce alegi să fii mâine,
-A frânt temeliile morții chiar pentru tine.
-
-[v2]
-El știa c-aveai nevoie de iubire,
-Pe când singur te loveai cu-atât amar,
-Ne-a iertat pe toți, deși în mulțime
-Eram noi și totuși ne-a dat har.
-
-[v3]
-Avem și pâine și tot ce ne dorim,
-Chiar Isus ne-a învățat cum să cerem,
-Ne-a izbăvit de cel rău, noi Îi dăm prea puțin,
-Isus ne este Domn și cu El vrem să mergem.
-
-[e]
-/: A frânt temeliile morții,
-El a frânt temeliile morții,
-Isus a frânt temeliile morții
-Chiar pentru tine. :/
diff --git a/candidates/Grup Eldad/Eldad - Al cui esti.txt b/candidates/Grup Eldad/Eldad - Al cui esti.txt
deleted file mode 100644
index 8ab76c0ed..000000000
--- a/candidates/Grup Eldad/Eldad - Al cui esti.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-[title]
-Al cui ești? {alternative: {*}, composer: {Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {174125}, id: {5GQmBUD5KfbtrdNx82zBJt}, contentHash: {701fa1}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Spune-mi de unde vii?
-Spune-mi unde te duci?
-Cărui stăpân îi slujești?
-Spune-mi pe ce drum pășești?
-Ești sigur că e drumul bun?
-Ești sigur că nu rătăcești?
-Știi sigur spre ce veșnicie alergi?
-
-[c]
-/: Al cui ești când ai să pleci?
-Cine te va lua de mână?
-Spre cine ochii îți vei îndrepta?
-Primește-odihna în Hristos,
-Sau veșnica osândă! :/
-
-[v2]
-Mergi înspre lume grăbit,
-Crezi că plăcerea e locul finit,
-Tu spui că păcatu-ai lăsat,
-Dar te simți și mai murdărit.
-Ești sigur că ești împlinit?
-Știai tu că Tatăl te-așteaptă?
-Trezește-te omule-acum la viață!
diff --git a/candidates/Grup Eldad/Eldad - Ce este viata fara El.txt b/candidates/Grup Eldad/Eldad - Ce este viata fara El.txt
deleted file mode 100644
index c37dae7ef..000000000
--- a/candidates/Grup Eldad/Eldad - Ce este viata fara El.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-[title]
-Ce este viața fără El? {alternative: {*}, composer: {Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {197729}, id: {jT2VhKfv5KfWsKoSa1DeBb}, contentHash: {d1cdeb}}
-
-[sequence]
-v1,c
-
-[v1]
-Ce este viața fără El? E disperare.
-Un șir de zile fără sens, cu nopți amare.
-Fericit nu ești, chiar dacă tu zâmbești
-Și soare nu-i, chiar dacă vrei să-mi spui.
-Ce este viața fără El? O căutare,
-Un vis pe care îl plătești cu-n preț prea mare.
-Plânsul tău ascuns, îți poate fi răspuns.
-Dar viață fără Isus este de nepătruns:
-Dacă nu respiri prin El, degeaba tu trăiești,
-Dacă nu e bucuria ta, degeaba tu zâmbești.
-
-[c]
-/: Fără El nu ai viață, bucurie și speranță,
-Fără El nu cunoști ce-nseamnă a iubi,
-Fără El nu ai soare, nu ai zâmbet, nici culoare,
-Fără El e imposibil, mă întreb cum poți trăi :/
diff --git a/candidates/Grup Eldad/Eldad - Curgi ca un rau.txt b/candidates/Grup Eldad/Eldad - Curgi ca un rau.txt
deleted file mode 100644
index ec3a0d5ef..000000000
--- a/candidates/Grup Eldad/Eldad - Curgi ca un rau.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-[title]
-Curgi ca un râu {alternative: {*}, composer: {Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {240802}, id: {kLcfs4UKK9srG1dvxPXFUJ}, contentHash: {923b94}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Curgi ca un râu de slavă, curgi printre noi,
-Dai viață, dai lumină și speranță, fiindcă ești Dumnezeu.
-Te așteptăm să vii, să vii ca să mângâi a noastre inimi ce-s zdrobite,
-Mai lasă sfântul nor, balsam vindecător, prezintă-Te, o, scump Părinte!
-
-[c]
-/: Stăm ‘naintea Ta, :/
-/: În prezența Ta, :/
-Privește Isus spre adunare!
-/: Vrem prin Duhul Tău :/
-/: să ne-atingi din nou :/
-O, Doamne, vrem să faci o cercetare!
-
-[v2]
-Sunt atâția ce strigă, ce trec prin greutăți,
-Oprește-te și-n dreptul lor o clipă, izbăvire strigă toți.
-Sunt suflete rănite, sunt inimi împărțite, ce nu cunosc a Ta cărare,
-Prin valurile vieții, te așteptăm cu toții, dă un răspuns la fiecare!
diff --git a/candidates/Grup Eldad/Eldad - Doamne bun.txt b/candidates/Grup Eldad/Eldad - Doamne bun.txt
deleted file mode 100644
index 60068cc34..000000000
--- a/candidates/Grup Eldad/Eldad - Doamne bun.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-[title]
-Doamne bun {alternative: {*}, composer: {Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {230300}, id: {9RxMXToh69yvtBSKqmm1aF}, contentHash: {7df1c9}}
-
-[sequence]
-v1,v2,e
-
-[v1]
-Cum pot să bat cu pumnu-n piept
-Să spun ca sunt creștin
-Când țin departe legământul
-Ce mă leagă de Țin’.
-De încercat aș fii ca Iov
-De-aș ține în picioare
-Nădejdea, dragostea, credința
-La fel până la moarte.
-
-[v2]
-Doar prin Hristos, puternic sunt
-Și crucea am s-o port
-Aici jos lacrimile-a șters
-Și m-a-nvățat să lupt.
-Înțelepciune îmi va da,
-Căci Dumnezeul ce mă ține
-Iubește ai Săi copii.
-
-[e]
-Doar Domnul îmi da puteri
-Si-n necaz eu voi biruii
-Minunat e Cel cea fost
-Și este din veșnicii
-Din veșnicii
diff --git a/candidates/Grup Eldad/Eldad - El este Mielul.txt b/candidates/Grup Eldad/Eldad - El este Mielul.txt
deleted file mode 100644
index ceedc02f0..000000000
--- a/candidates/Grup Eldad/Eldad - El este Mielul.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-El este Mielul {alternative: {*}, composer: {Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {238290}, id: {hdHFThBPLKktDdWSJcq9VS}, contentHash: {52f266}}
-
-[sequence]
-c,v1,c,v2,c
-
-[c]
-El este Mielul ce va lua
-Păcatul lumii asupra Sa
-El este Cel ce va îndruma
-Lumea întreagă cerul să aleagă,
-Va porunci bolii să plece,
-Va fi curat, fără păcat,
-Se va pleca la cel ce-i singur
-Și va da robilor libertatea.
-
-[v1]
-Un plan ceresc, divin, se împlinea
-În trup sfios de om se întrupa,
-De ceruri s-a desprins, un Fiu iubit,
-Privirea Tatălui L-a ocrotit.
-Fiul era Isus!
-
-[v2]
-Gândește-te doar la Emanuel,
-Chiar tu ai fost ceea ce a ales El.
-Să-și de-a viața Lui pentru a ta
-Era motivul pentru care se năștea.
-Tu ești motivul Lui!
diff --git a/candidates/Grup Eldad/Eldad - Mielule.txt b/candidates/Grup Eldad/Eldad - Mielule.txt
deleted file mode 100644
index 7ebaa5e54..000000000
--- a/candidates/Grup Eldad/Eldad - Mielule.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-[title]
-Mielule {alternative: {*}, composer: {Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {188101}, id: {85h9J9DhH7yVUyR8Ajwh5m}, contentHash: {cbc6cf}}
-
-[sequence]
-v1,c,v2,c,e
-
-[v1]
-Dragostea pentru noi pân’ la moarte
-L-a condus pentru-a noastre păcate
-Ai murit răstignit.
-Cuie-n mâini i-au batut pentru mine
-Ai murit în prea mare suspine
-Dar a treia zi ai inviat.
-
-[c]
-/: Mielule, oare cum să-Ți mulțumesc?
-Caci prin jertfa de pe cruce astazi eu traiesc.
-Eliberat, al Tău sânge m-a spălat
-Speranța mântuirii Tu mi-ai dat. :/
-
-[v2]
-Chinuit pe un lemn pentru mine
-Pentru noi, pentru toți, pentru tine
-Ai murit răstignit
-Dezbrăcat de-a Sa slava cerească
-S-a smerit lumea să mântuiască
-Să fie-a Lui în veci de veci.
-
-[e]
-Prin trăirea mea astazi vreau să-Ți mulțumesc
-Și zi de zi spre ceruri să înaintez,
-Pășind frumos vreau să merg pe calea Ta
-Făcând doar voia Ta, nu voia mea.
diff --git a/candidates/Grup Eldad/Eldad - Se duce timpul de chemare.txt b/candidates/Grup Eldad/Eldad - Se duce timpul de chemare.txt
deleted file mode 100644
index e72682b1e..000000000
--- a/candidates/Grup Eldad/Eldad - Se duce timpul de chemare.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-Se duce timpul de chemare {alternative: {*}, composer: {Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {174961}, id: {1ih3kifMZJKfavvrofrbrH}, contentHash: {b7e2db}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-Se duce timpul de chemare,
-Iar tu rămâi în stare grea.
-Vin zile când în plâns și jale
-‘Naintea Domnului vei sta.
-
-[c]
-/: Că totul trece-n astă lume
-Și omu-i, omu-i trecător
-Dumnezeu mereu rămâne
-Ca Domn atotstăpânitor. :/
-
-[v2]
-Răpi-va Domnul pe ai săi
-În bucurii și fericiri.
-Cei ce lasă fără teamă
-Vor plănge-n lacrimi și suspine.
-
-[v3]
-Vei plânge viața ta trăită
-Trecutul tău îngrez
-Târzie îți va fi căința
-Vei rămâne pe pământ jos.
diff --git a/candidates/Grup Eldad/Eldad - Vino vino Doamne.txt b/candidates/Grup Eldad/Eldad - Vino vino Doamne.txt
deleted file mode 100644
index ca61256c7..000000000
--- a/candidates/Grup Eldad/Eldad - Vino vino Doamne.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-[title]
-Vino, vino, Doamne {alternative: {*}, composer: {Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {174960}, id: {hVgtqQV1DcsEYrxikU527R}, contentHash: {789f1e}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-Tu vezi lacrimi ce ne brăzdează fața
-Pe-acest pământ cu-atâtea încercări.
-Noi te rugăm, o, adă dimineața,
-Urmând întregile noastre dureri.
-La Cortul Întâlnirii azi Isuse,
-Noi te-așteptăm să vii ca și-nvechime
-Te cheamă sufletele de durere,
-O, vino să le dai azi mângâiere.
-
-[c]
-Vino, vino Doamne
-Vino, vino Doamne.
-La strigătele atâtor mii de vii,
-Ridicăne la toți astăzi durerea
-Și-n brațul minunat să ne mângâi.
-
-[v2]
-Se-apropie ziua măreață, sfântă
-Și-n dragoste-ntărește-ne Isus
-Cu toți cei ce aleși au fost de Tine
-La Tine să ne ei când ai să vii.
-Mai dă-ne azi prin Duhul de credință
-Putere din iubirea cea dintâi
-Ridică-ne din starea de pierință
-De partea noastră veșnic să rămâi.
-
-[v3]
-Așa dorim prin toate să rămânem
-Statornici în credință și-n cuvânt
-Ca veșnicul în clipele din urmă
-Să ne găsești pe-ogorul Tău lucrând
-Să ne găsești cu rugăciuni prea tare
-Și bucuroși cu toți să arătăm
-Că dragostea Ta e nespus de mare
-Cu lacrimi pe față să-ți cântăm.
diff --git a/candidates/Grup Eldad/Grupul Eldad - Aleg sa cred.txt b/candidates/Grup Eldad/Grupul Eldad - Aleg sa cred.txt
deleted file mode 100644
index 78365daa2..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Aleg sa cred.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-[title]
-Aleg sa cred {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {233596}, id: {iWEMHB2hEYp81wRMiNZQQ7}, contentHash: {0ffb29}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Chiar de am, în fața mea, uși închise
-Și zadarnic bat sperând la un răspuns,
-Gândul că m-ai părăsit se-ntipărise
-În sufletul meu și Doamne m-am ascuns.
-Sunt zdrobit din luptele ce le-am avut
-Nu mai văd, ’naintea mea, a Tale urme
-Când acei din jur îmi spun că Te-am pierdut
-Și zadarnic vor nădejdea să mi-o curme.
-
-[c]
-/: Eu aleg să cred în Tine
-Chiar de munții s-ar muta.
-Pacea ce o am în mine
-Nimeni nu mi-o va lua.
-Zborul meu nimic nu-l frânge,
-lar când drumul este greu,
-Capul mi-l aplec în taină,
-Liniștit, la pieptul Tău. :/
-
-[v2]
-Chiar de zorile îmi par îndepărtate
-Bucuria mea în noapte a dispărut,
-Ochii-mi umezi de lacrimi necurmate
-Din atâtea răni ce-adesea au durut.
-Nu pot fi învins chiar dacă-s frânt ades,
-Prăbușit, de-aș fi, să zac neputincios,
-Vine-o zi când rodul meu va fi cules,
-Pân-atunci alerg, aștept și spun voios.
diff --git a/candidates/Grup Eldad/Grupul Eldad - Astazi Duhul Domnului.txt b/candidates/Grup Eldad/Grupul Eldad - Astazi Duhul Domnului.txt
deleted file mode 100644
index d64b98827..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Astazi Duhul Domnului.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-[title]
-Astazi Duhul Domnului {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {203943}, id: {ttmR5RYptaYKRNhqubHLaE}, contentHash: {9259ee}}
-
-[sequence]
-v1,c,v2,c,v3,c,v4,c,v5,c
-
-[v1]
-/: Astăzi Duhul Domnului este prezent aici :/
-E aici în fața Ta, hai deschideți inima
-Astăzi Duhul Domnului este prezent aici.
-
-[c]
-Mai toarnă și astăzi undelemn
-De pe pământ noi te chemăm
-Și fă din nou, o viorare să simtă astăzi fiecare
-Astăzi Duhul Domnului este prezent aici.
-
-[v2]
-/: Astăzi Duhul Domnului este prezent aici :/
-Hai deschideți inima, ca să simți prezența Sa
-Astăzi Duhul Domnului este prezent aici.
-
-[v3]
-Mare este Dumnezeu, mare este Dumnezeu
-Simt în a mea viață, Isus îmi e sperantă
-Mare este Dumnezeu, îl simt în a mea viață
-Isus îmi e speranță, mare este Dumnezeu.
-
-[v4]
-/: El e și azi vindecător :/
-/: El vindecă ori ce boală, pune balsam pe rană
-El e Domnul Domnilor. :/
-
-[v5]
-/: Isus din nou va veni :/
-/: Să și ducă, a Sa mireasă
-Celui Sfânt acasă, de pe pământ, o va răpii. :/
diff --git a/candidates/Grup Eldad/Grupul Eldad - Cand domnul porunceste.txt b/candidates/Grup Eldad/Grupul Eldad - Cand domnul porunceste.txt
deleted file mode 100644
index 45da49bb7..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Cand domnul porunceste.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-[title]
-Cand Domnul porunceste {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {225280}, id: {c2tJUY4wvNKoPerSY4V95U}, contentHash: {735c0b}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Atâta timp cât zorii se arată
-Și poți să vezi lumina zi de zi
-Iar pacea-n suflet încă ți-este dată
-E-un har măreț, e-un dar ceresc, să știi
-Atâta timp cât încă ai speranță
-Chiar dacă-n viața ta nu-i cer senin,
-Dar drumul ce de Domnu-i pus e-n față,
-Să mergi pe el, să mergi pe el senin
-
-[c]
-Când Domnul poruncește, ia ființă
-Și când vorbeste El, ascultă tot
-/: Chiar munte-nalt sau vale-adâncă de-ar fi
-Tu să n-ai frică
-Căci El e Domnul Savaot :/
-
-[v2]
-De stai și-aștepți în taină o mângâiere
-Sau un răspuns la tot ce nu-nțelegi
-Și simți că-n suflet crește-a ta durere
-Să nu oprești, continuă să mergi
-Pe cale-aceasta e multă luptă crudă
-De multe ori ești singur, părăsit
-Dar să nu uiți: Isus este la cârmă
-Și orice-ar fi, tu ești de El păzit.
diff --git a/candidates/Grup Eldad/Grupul Eldad - Cine e oare cel mai sfant sub soare.txt b/candidates/Grup Eldad/Grupul Eldad - Cine e oare cel mai sfant sub soare.txt
deleted file mode 100644
index 9e12610d6..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Cine e oare cel mai sfant sub soare.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-[title]
-Cine e oare cel mai sfant sub soare? {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {168119}, id: {uuiiqXSzecepd79DW83srY}, contentHash: {f98234}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-Cine e oare, cel mai sfânt sub soare?
-Se strigă astazi în Sion.
-Cine e-n stare să vindece boala,
-Cine e singurul Domn?
-E Dumnezeu, e Dumnezeu!
-Să-L laude pământul, să-L laude și marea,
-El este Domn și în ceruri domnește in veci!
-
-[c]
-Veniți să lăudăm pe cel Atotputernic!
-Veniți să ridicăm mâinile spre cer,
-Osana să se-audă în zările albastre,
-Și cântul nostru azi să ajungă pân’ la cer!
-
-[v2]
-Haideți cu toții s-aducem mărire,
-Și glorie Sfântului Miel,
-El pentru mine ca și pentru tine,
-A murit răstignit pe un lemn.
-El Dumnezeu, El Dumnezeu,
-Suferind ocara lumii
-Ca dar să putem avea,
-Viață eternă și mântuire în dar!
-
-[v3]
-Tu drag prieten
-Ce asculți azi chemarea,
-Te-ntreb astăzi de Îl cunoști
-Pe Cel ce-i Sfânt,
-Ce aduce salvarea,
-Oare-L cunoști pe Hristos?
-Pe Dumnezeu, pe Dumnezeu!
-Azi predă-ți viața Lui,
-Bucurie vei avea
-Și viață eterna primi-vei în dar!
diff --git a/candidates/Grup Eldad/Grupul Eldad - Din dragoste.txt b/candidates/Grup Eldad/Grupul Eldad - Din dragoste.txt
deleted file mode 100644
index 8533b2c4f..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Din dragoste.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-[title]
-Din dragoste {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {176814}, id: {tk4h1oh6SXCBFcScdP8det}, contentHash: {0c61f9}}
-
-[sequence]
-v1,c,v2,b,c,e
-
-[v1]
-Viața cu Dumnezeu e-un dar venit de sus,
-Din dragoste, din dragoste.
-Fiindcă ne-a iubit, trimis-a pe Isus să se jertfească
-Din dragoste...
-
-[c]
-Să ne iubim, cât timp trăim,
-În dragoste frați toți să fim.
-Să ne iubim, cât timp trăim,
-Ca viața veșnică s-o moștenim.
-Să ne iubim, cât timp trăim,
-În dragoste, frați toți să fim.
-Să ne iubim, cât timp trăim,
-Ca viața veșnică s-o moștenim.
-
-[v2]
-Pe cruce la Calvar, Domnul a dovedit
-Doar dragoste, doar dragoste.
-Și chiar dacă nu înțeleg, prin harul Său azi eu trăiesc,
-Prin dragoste, prin dragoste...
-
-[b]
-Poți să dai orice, chiar trupul ca să-ți fie ars,
-De n-ai dragoste, toate-s în zadar...
-Poți fi-nvățător, ades’ pe alții să-i înveți,
-Dar ne-mplinitor, în ură să trăiești...
-
-[e]
-Căci dragostea Sa, e nesfârșită,
-El e Domnul Vieții pe pământ.
-În dragostea Sa nemărginită,
-El ne iubește pe toți la fel,
-El ne iubește pe toți la fel!
diff --git a/candidates/Grup Eldad/Grupul Eldad - E noapte-n Betleem.txt b/candidates/Grup Eldad/Grupul Eldad - E noapte-n Betleem.txt
deleted file mode 100644
index bcb861969..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - E noapte-n Betleem.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-[title]
-E noapte-n Betleem {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {183289}, id: {jxTNAeEm1oMtDCNpN8f95v}, contentHash: {097f92}}
-
-[sequence]
-v1,v1,c,v2,c,b,c
-
-[v1]
-E noapte-n Betleem
-Iosif și Maria
-Alergând grăbiți
-Caută găzduire
-Că timpul a sosit
-Pruncul cel vestit
-Va veni in lume
-Cum a fost profețit
-b Dar numai este loc în casă pentru ei
-Doar un staul și-o iesle săracă
-Așa veni în lume Fiu de Dumnezeu
-S-aducă lumii speranță
-
-[c]
-Haideți să-i cântăm
-Pruncului de Sus
-Sfetnic Împărat
-Minunat Isus
-Ceru-ntreg îi cântă
-Haideți și noi să ne unim
-Inimile și să îl slăvim
-Inimile și să-l preamărim
-
-[v2]
-Magii din răsărit
-La Betleem au sosit
-Pe Irod au intrebat
-Unde-i al vostru Împărat
-Căci steaua cea de sus
-Aici ne-a călăuzit
-Pruncului să ne-nchinăm
-Daruri multe să îi dăm
-
-[b]
-Dar preoții cei mai de seamă și Irod
-S-au sfătuit pe Prunc să-L omoare
-Dar Dumnezeu știa ’nainte planul lor
-Și-n vis pe magi, i-a înștiințat
diff --git a/candidates/Grup Eldad/Grupul Eldad - Esti minunat.txt b/candidates/Grup Eldad/Grupul Eldad - Esti minunat.txt
deleted file mode 100644
index 30f312cdf..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Esti minunat.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-[title]
-Esti minunat {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {176805}, id: {xxixjAynWsYjKJtXecA6hP}, contentHash: {0a7b02}}
-
-[sequence]
-v1,c,b,c
-
-[v1]
-Laudă, cinste, mărire
-Astăzi, cu toții-ți cântăm
-Vrem să-Ți aducem onoare
-Numele Tău inălțăm!
-Ești cunoscut de popoare
-Domnul oștirilor
-Biruitor peste moarte
-Adonai e Numele Tău!
-
-[c]
-Ești minunat, adevărat
-Vrednic de laudă și vrednic de cinste
-Domn Preainalt!
-Ești minunat, adevărat
-Domnul Domnilor și Rege-al Regilor
-In veci al Tău Nume rămâne Biruitor!
-Ești minunat, adevărat
-Vrednic de laudă și vrednic de cinste
-Domn Preainalt!
-Ești minunat, adevărat
-Domnul Domnilor și Rege-al Regilor
-In veci al Tău Nume rămâne Biruitor!
-
-[b]
-Te voi lăuda toată viața mea
-Și in numele Tău mâinile ridicăm
-In prezența Ta!
diff --git a/candidates/Grup Eldad/Grupul Eldad - Fara dumnezeu.txt b/candidates/Grup Eldad/Grupul Eldad - Fara dumnezeu.txt
deleted file mode 100644
index 5adb36423..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Fara dumnezeu.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-[title]
-Fara Dumnezeu {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {195915}, id: {wDJSBBAQEM59yz43gR7Vgy}, contentHash: {17f1c7}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-/: Fără Dumnezeu viața ar fi un gol
-Deșert și arșiță în inimă aș avea
-Aș fi o floare uscată
-Un cântec fără dor
-Aș fi un nor, atât de departe de cer :/
-
-[c]
-/: Eu n-aș putea răzbi furtuna ce mă înconjoară
-Singur nu pot să-nving tot greul ce mă împresoară
-Dar știu că este Dumnezeu ce-a despărțit și marea
-Și stie El ce-mi stă-nainte drumul tot și calea :/
-/: Eu n-aș putea răzbi furtuna ce mă înconjoară
-Singur nu pot să-nving tot greul ce mă împresoară
-Dar știu că este Dumnezeu ce-a despărțit și marea
-Și stie El ce-mi stă-nainte drumul tot și calea :/ x3
-
-[v2]
-/: Ce liniște ar fi în univers
-Și taine n-ar mai fi de înțeles
-Nici stelele n-ar mai luci fără de El
-Tot cerul ar fi tăcut în lipsa Lui :/
diff --git a/candidates/Grup Eldad/Grupul Eldad - Fiindca atat de mult.txt b/candidates/Grup Eldad/Grupul Eldad - Fiindca atat de mult.txt
deleted file mode 100644
index 73068a1de..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Fiindca atat de mult.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-Fiindca atat de mult {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {176808}, id: {r1aNDg37wxxfPxYx2Z6SMN}, contentHash: {14430d}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-Tâlharul de pe cruce, de tot ce-a făcut rău
-S-a pocăit îndată, și-a fost născut din nou.
-Și eu tâlhar odată, la moarte osândit,
-Am fost adus la viață, de-al meu Isus iubit.
-
-[c]
-Fiindc-atât de mult, Tatăl ne-a iubit
-Că a dat la moarte pe Singurul Său Fiu,
-Ca oricine crede în El și-n jertfa Sa,
-Să primească viața și mântuirea-n dar!
-
-[v2]
-Oricine ești în viață, și oriunde te-ai afla,
-Prietene degrabă, crede, nu amâna!
-Fiindcă ziua de mâine, nu ști dacă-i a ta,
-Acum este momentul să-ți schimbi viața ta.
-
-[v3]
-De ești căzut în patimi, și-n grele făr’delegi
-Și osândit de ele te lupți ca să trăiești,
-Tu nu uita că încă mai e belșug de har,
-Cum a fost sus pe cruce pentru acel tâlhar...
diff --git a/candidates/Grup Eldad/Grupul Eldad - Framantat de pacat.txt b/candidates/Grup Eldad/Grupul Eldad - Framantat de pacat.txt
deleted file mode 100644
index 822149e95..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Framantat de pacat.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-[title]
-Framantat de pacat {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {176809}, id: {ky9dTGB3Zk6urK9XfYh7X4}, contentHash: {1ccd75}}
-
-[sequence]
-v1,v2,e
-
-[v1]
-Frământat de păcat pământul, ne oprește jos privirea,
-Nu mai știm s-ascultăm vântul, să privim în ochi Iubirea.
-Ne mulțumim cu deșertăciunea unei vieți fără de rost
-Și-alergăm în felul lumii, depărtați tot mai mult de Hristos...
-R: Trăiești în lumină, te lupți să fii mai sfânt?
-Sau calci legământul prin fapte și cuvânt?
-Trăiești pentru alții, iubind ca Hristos?
-O viață-n biruință, trăiești tu cu folos?
-
-[v2]
-Nimic nu e nou sub soare, tot ce-a fost iarăși va fi,
-Cu deșertăciuni amare viața nu-ți vei mulțumi.
-Sufletul tău e valoarea ce-ai primit-o aici jos,
-Și prin el tu vei decide, vei trăi-n veșnicii cu Hristos?
-
-[e]
-Tot ce-ai trăit, cum ai umblat, cum ai gândit și ai îndrumat,
-Sunt fapte în lumină?
-Spune-I azi Lui trecutul tău, El îl va șterge de tot ce-i rău
-Și destinația ta va fi cea bună!
diff --git a/candidates/Grup Eldad/Grupul Eldad - Glorie.txt b/candidates/Grup Eldad/Grupul Eldad - Glorie.txt
deleted file mode 100644
index 536770cf7..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Glorie.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-Glorie {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {249920}, id: {rV8gQoGVg4btY3N5FjFaWq}, contentHash: {9bfd23}}
-
-[sequence]
-c,v1,c,v2,c,e
-
-[c]
-/: Glorie, glorie, mărire
-Cinste, onoare doar Ție
-Ești viu și în veci de veci domnești
-Regele nostru etern :/
-
-[v1]
-/: A înviat, nu este-aici
-Boldul morții El l-a învins
-Viața și har noi am primit
-Prin Isus cel răstignit :/
-
-[v2]
-/: Să-L preamărim, să-L proslăvim
-Să-I dăm slavă căci mult ne-a iubit
-Și-a dat viața pentru mine și tin’
-Ca să fim iertați și mântuiți :/
-
-[e]
-/: A înviat, a înviat
-Isus este cel mai minunat :/
-A înviat, a înviat
-El nu e mort, trăiește cu-adevărat!
diff --git a/candidates/Grup Eldad/Grupul Eldad - Imparte-ti painea.txt b/candidates/Grup Eldad/Grupul Eldad - Imparte-ti painea.txt
deleted file mode 100644
index b6c5e7246..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Imparte-ti painea.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-[title]
-Imparte-ti painea {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {225478}, id: {rxLeT7Qe3QJnbXK5XN3kZh}, contentHash: {a6be04}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-Iubind voia Tatălui mai presus de voia firii
-E-un drum așa sigur spre cerul neatins
-/: Dacă în palme strâng prețul iubirii
-Voi căpăta cununa acolo sus :/
-
-[c]
-/: Împarte-ți pâinea azi
-Mergi înainte știind
-Că Domnul va rasplăti,
-El vede totul și puținu-ți va-nmulți :/
-
-[v2]
-Ulei adunat cu greu
-E greu să dai și la alții
-Si ție-ți va împlini la timp ce n-ai avut
-/: Domnul iubirii, care are toți talanții
-Va fi cu tine oriunde vei păși :/
-
-[v3]
-Împarte-ti pâinea
-El vede totul și îți va-nmulți
-Imparte-ți pâinea
-Domnul te va răsplati!
-Imparte-ți pâinea
diff --git a/candidates/Grup Eldad/Grupul Eldad - Invesmantat in glorie.txt b/candidates/Grup Eldad/Grupul Eldad - Invesmantat in glorie.txt
deleted file mode 100644
index 1b4bebdf6..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Invesmantat in glorie.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-[title]
-Invesmantat in glorie {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {176810}, id: {pRDnYwRguN18sGHEcawsEh}, contentHash: {fa15d4}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Înveșmântat în glorie, domnești pe tron
-Îți cântă heruvimii, căci Tu ești Domn.
-Bătrânii se pleacă cu adorare,
-Aruncă cununi pentru-a Ta splendoare,
-Căci mare ești!
-
-[c]
-Sfânt e, sfânt e, în veci e sfânt,
-Lauda Lui cuprinde-ntreg pământ.
-Uniți cu cerul, în duh ne închinăm
-Și-n adevăr un cânt nou Îi cântăm, /x2
-Prin Duhul Sfânt!
-/ Sfânt e, sfânt e, în veci e sfânt,
-Lauda Lui cuprinde-ntreg pământ.
-Uniți cu cerul, în duh ne închinăm
-Și-n adevăr un cânt nou Îi cântăm, /x3
-Prin Duhul Sfânt!
-
-[v2]
-Tu meriți toată lauda, Miel înjunghiat,
-Creația-ntregă-Ți cânta, ești Împărat.
-Prin al meu vers nu pot să exprim
-Puterea Ta și-al Tău har divin,
-Ești necuprins!
diff --git a/candidates/Grup Eldad/Grupul Eldad - Israele.txt b/candidates/Grup Eldad/Grupul Eldad - Israele.txt
deleted file mode 100644
index 492d61a65..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Israele.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-[title]
-Israele {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {196502}, id: {pEnEQpoXetavYKVsLV9i51}, contentHash: {265a83}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-/: De ești departe și ești de lume copleșit,
-Nu ai nădejde, te simți pierdut și părăsit,
-Ești pasărea ce-a pierdut stolul
-Și-a venit frigul, te-a înghețat
-Dar ai un Tată, ce-n a Lui inimă te-a luat! :/
-
-[c]
-/: Israele, pune-ți credința în Dumnezeu,
-Nu te lăsa de valul lumii dus
-Nu ești pierdut! Pe Golgota ai fost găsit!
-Ești în casa Tatălui ce te-a iubit :/
-
-[v2]
-/: De ai nevoie să te audă cineva,
-Cauți lumina prin bezna nopții undeva,
-Ești floarea ce n-a răsărit sau frunza care s-a uscat,
-Dar ai un Tată, ce-n a Lui inimă te-a luat! :/
diff --git a/candidates/Grup Eldad/Grupul Eldad - Luptam.txt b/candidates/Grup Eldad/Grupul Eldad - Luptam.txt
deleted file mode 100644
index 1917ba152..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Luptam.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-[title]
-Luptam {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {232879}, id: {eHeNewuHiSu5hy3fKpcLEL}, contentHash: {1953bc}}
-
-[sequence]
-v1,b,c,v2,b,c,e,c
-
-[v1]
-Într-o luptă în care ne-am înrolat
-Când Isus destinul la toți ne-a schimbat
-Luptăm! Luptăm!
-Chiar de valuri vin și e înnorat
-Și furtuna peste lume s-a lăsat
-Luptăm! Luptăm!
-
-[b]
-Privim ’nainte, nu dăm ’napoi
-Isus e ținta și e cu noi
-Ne întărește prin Duhul cel Sfânt
-În rugăciune stăruitori
-Și laude închinători
-Ne dă puteri mereu să biruim.
-
-[c]
-Suntem biruitori, prin Isus învingători
-Prin jertfa de la Calvar, am primit iertarea în dar
-Și astăzi suntem liberi prin al Său har
-Suntem biruitori, prin Isus învingători
-Prin jertfa de la Calvar, a schimbat istoria
-Și azi e Domnul Domnilor și e suveran
-
-[v2]
-Într-o luptă în care ne-am înrolat
-Când Isus destinul la toți ne-a schimbat
-Luptăm! Luptăm!
-Biruință mereu vom primi
-Chiar de tot în jur se va nărui
-Prin El, biruim!
-
-[e]
-/: Voi înălța, voi proclama,
-Voi lăuda al Tău Nume măreț
-Și în veci, cu gura mea,
-Cu inima, voi preamări,
-Doamne, puterea Ta! :/ ×3
diff --git a/candidates/Grup Eldad/Grupul Eldad - M-ating de tine dar nu oricum.txt b/candidates/Grup Eldad/Grupul Eldad - M-ating de tine dar nu oricum.txt
deleted file mode 100644
index e43527320..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - M-ating de tine dar nu oricum.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-[title]
-M-ating de Tine dar nu oricum {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {228227}, id: {gbJvjwbpfeNyAEq9nNnLkW}, contentHash: {fad1de}}
-
-[sequence]
-v1,c,v2,c,e,c
-
-[v1]
-Trecand prin fata mea Isus
-Fața Lui curata ma cheama
-Sa cred ca poate sa dea vindecare
-Trupului meu slabit si pacatos
-
-[c]
-/: M-ating de Tine dar nu oricum
-M-ating sa primesc har
-Sa curga din Tine putere
-Privirea Ta mi-e dar :/
-
-[v2]
-Pe genunchi cu mana intinsa
-Astept sa ajungi in dreptul meu
-Sa apuc sa-Ti vad fata senina
-Sa-mi dea vindecare chipul Tau
-
-[e]
-/: O ce vrednic E Isus
-De laudele noastre
-Viata Lui in viata noastra
-Astazi sa se arate
-Cand atingem haina Lui
-Cu credinta mare
-Cu putere negresit
-Primim vindecare :/
diff --git a/candidates/Grup Eldad/Grupul Eldad - Ma uit in jur.txt b/candidates/Grup Eldad/Grupul Eldad - Ma uit in jur.txt
deleted file mode 100644
index aa59a1518..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Ma uit in jur.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-[title]
-Ma uit in jur {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {176812}, id: {jEwayir6fzsDoW2vF3AwFm}, contentHash: {2d56bd}}
-
-[sequence]
-v1,c,v2,c,v3,c,e
-
-[v1]
-Mă uit in jur și mă gândesc la mine
-Oh Doamne, sunt nemulțumitor
-Atâția oameni in lacrimi și suspine,
-Trăiesc fără nici-un ajutor.
-
-[c]
-Nu au ce mânca, nu au ce bea
-Trăiesc de azi pe maine
-Nu au ce mânca, nu au ce bea
-Și-au pus nădejdea-n Tine!
-
-[v2]
-Mă uit in jur și mă gândesc la mine
-Ades eu ma compar cu cei bogați
-Și vreau mai mult să strâng in astă lume
-Uitând ades de ai mei frați
-
-[v3]
-Mă uit in jur și mă gândesc la Tine
-Cum ai venit intr-un loc sarac
-O Doamne suferit-ai pentru mine
-Și astăzi oare eu ce fac?
-
-[e]
-Sunt mântuit și a mea viață
-De multe ori n-o prețuiesc
-Am uitat că Tu imi ești speranță
-Pe toți la fel Tu ne iubești!
-Ajută-ne să ne trezim
-De lume să ne despărțim
-Căci tot ce-am strâns aicea jos
-Vom lăsa,
-Vom lăsa,
-Vom lăsa.
diff --git a/candidates/Grup Eldad/Grupul Eldad - Pacea lui.txt b/candidates/Grup Eldad/Grupul Eldad - Pacea lui.txt
deleted file mode 100644
index 723a10a1a..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Pacea lui.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-[title]
-Pacea Lui {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {232880}, id: {pAsP4vwkf9qfwKiCkRi5Ec}, contentHash: {678dce}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Deseori, ai văzut doar norii negri de tristețe
-Ce-au ascuns a cerului frumusețe
-Și, plângând, ai căzut descurajat.
-Apăsat de povara tot mai grea a îngrijorării,
-Ce-ți răpește bucuria închinării,
-Te simți singur, obosit, abandonat.
-
-[c]
-/: Pacea Lui liniștește valul și orice furtună
-Și la pieptul Său pe cei răniți adună.
-Pacea Lui îți înviorează sufletul și viața
-Și aduce după noapte dimineața :/
-Care-ți risipește teama prin credință.
-
-[v2]
-Ai curaj să ridici privirea tristă din țărână,
-Înspre tine e întinsă azi o mână
-Care rupe orice lanț ce te-a legat.
-Tu să știi, e putere în sângele jertfei Sale,
-Pentru cei pierduți care doresc salvare.
-Ești sub ocrotirea Celui Preaînalt.
diff --git a/candidates/Grup Eldad/Grupul Eldad - Sa fiu neprihanit.txt b/candidates/Grup Eldad/Grupul Eldad - Sa fiu neprihanit.txt
deleted file mode 100644
index 0a093fe80..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Sa fiu neprihanit.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-Sa fiu neprihanit {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {216500}, id: {2VPa3M9htAL42xb69CgBfy}, contentHash: {dcdb0e}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-Plăcute-Ti sunt, o Doamne, faptele curate
-În cer vor locui doar cei neprihaniti
-Curate ne vor fi a noastre haine-atuncea
-În ziua cea măreață când Tu vei veni.
-
-[c]
-Tu mă ajuți să fiu neprihanit, o Doamne
-Căci doar curat pot înspre cer să-naintez
-Firav eu sunt, dar Tu îmi ești Puterea
-Și nu mă lași, și nu mă părăsești.
-
-[v2]
-Plăcute-Ti sunt, o Tată, faptele curate
-De îmi arăt iubirea chiar când sunt rănit
-Ajută-mă să-ntind o mână caldă celui
-Ce slab fiind, tristețe mi-a pricinuit.
-
-[v3]
-Iubit Îți este omul ce are blândețe
-Ce vrea să fie drept și-n văz și în ascuns
-Să fiu și eu, ajută-mă, Părinte!
-Tot ce promit să împlinesc, Isus
diff --git a/candidates/Grup Eldad/Grupul Eldad - Se clatina lumea.txt b/candidates/Grup Eldad/Grupul Eldad - Se clatina lumea.txt
deleted file mode 100644
index faace0ecf..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Se clatina lumea.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-[title]
-Se clatina lumea {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {198906}, id: {bE7WfjQ4AzzfQzmNJm2cKq}, contentHash: {48d540}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-/: Se clatină lumea și se înspăimântă
-De valul și groaza ce i-a învăluit
-Dar noi vrem să spunem a noastră speranță
-E în mâna Celui ce ne-a mântuit :/
-
-[c]
-/: Noi nu, nu ne temem
-Privirea noastră o ridicăm în sus
-Nimic nu ne poate opri așteptarea
-Să ne ia din suflet dorul și cântarea
-Prin care Îți spunem: ”
-Revino Isus!” :/
-
-[v2]
-/: Prin tot ce se întâmplă Scriptura vestește
-Ca totul se-ndreaptă spre-un grabnic final
-Dorim o Părinte să fii tu la cârmă
-Să duci barca noastră prin valuri spre mal :/
diff --git a/candidates/Grup Eldad/Grupul Eldad - Te asteptam sa vii din nou isuse.txt b/candidates/Grup Eldad/Grupul Eldad - Te asteptam sa vii din nou isuse.txt
deleted file mode 100644
index 1c9790154..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Te asteptam sa vii din nou isuse.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-[title]
-Te asteptam sa vii din nou Isuse {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {154102}, id: {bnp7VJAYkGpqbFWLGT5LXd}, contentHash: {e109cf}}
-
-[sequence]
-v1,c,v2,c2,v3,c2
-
-[v1]
-Te așteptăm să vii din nou, Isuse,
-Prin Duhul Sfânt să Te cobori!
-A noastre inimi spre Tine sunt deschise,
-Revarsă-Ți, Doamne, harul Tău azi peste noi!
-
-[c]
-Să ne atingi prin Duhul Sfânt,
-Cobori în cercetare!
-Să Te lăudăm și-al nostru cânt
-Să străpungă zarea!
-
-[v2]
-Te așteptăm să cercetezi și azi mulțimea
-Cu-al Tău Cuvânt să îi pătrunzi.
-Te așteptăm să le arăți iubirea,
-Iubirea Ta ce schimbă și-astăzi vieți!
-
-[c2]
-Să se coboare slava Ta,
-Puterea Ta cea mare!
-Și vrem ca azi, și pururea
-Să Îți aducem Osanale!
-
-[v3]
-Ne închinăm, smeriți venim la Tine,
-La altarul sfânt să ne primești;
-Și Te chemăm din inimă, Stăpâne,
-Rămâi în viața noastră să domnești!
diff --git a/candidates/Grup Eldad/Grupul Eldad - Tie iti cantam.txt b/candidates/Grup Eldad/Grupul Eldad - Tie iti cantam.txt
deleted file mode 100644
index 4f3e83ade..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Tie iti cantam.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-Tie iti cantam {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {204289}, id: {xkqbhyJ3ocxC6ZQZaSR6Gx}, contentHash: {6a32bd}}
-
-[sequence]
-c,s,c,s2,c,s3,c
-
-[c]
-Ție Îți cântăm, pe Tine Te-adorăm
-Tu ești Domn, în veci de veci
-Ne-ai răscumpărat, viață Tu ne-ai dat
-Doamne-n veci fii lăudat
-
-[s]
-Bucuroși la Tine, Doamne, noi venim
-Noi venim și-Ți mulțumim
-Pentru harul Tău ceresc și minunat
-Tu să fii glorificat
-
-[s2]
-În prezența Ta, Isus, noi astăzi stăm
-Astăzi stăm și ne-nchinăm
-Te glorificăm, al nostru Împărat
-Tu ești cel mai minunat
-
-[s3]
-Aleluia, slavă, glorie-Ți cântăm
-Noi Îți cântăm, Te lăudăm
-Pentru bunătatea Ta, Isus iubit
-Tu, pe noi ne-ai mântuit
diff --git a/candidates/Grup Eldad/Grupul Eldad - Vas de lut.txt b/candidates/Grup Eldad/Grupul Eldad - Vas de lut.txt
deleted file mode 100644
index 49101df38..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Vas de lut.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-[title]
-Vas de lut {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {196668}, id: {nagsNhg4wpjM3PAXhrbhFg}, contentHash: {096ded}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-/: Vas de lut sunt doar un slujnic
-Azi umplut, mâine vărsat
-De Stăpânul meu puternic
-Ce cu drag m-a modelat :/
-
-[c]
-Voi striga în gloată mare
-Că Isus e domn măreț
-Să nu tacă robii Lui, pe care El i-a ales
-Voi cânta cu glas puternic, de războinic neînfricat
-Cred în Tatăl ce promite biruință neîncetat
-/: Voi striga în gloată mare
-Că Isus e domn măreț
-Să nu tacă robii Lui, pe care El i-a ales
-Voi cânta cu glas puternic, de războinic neînfricat
-Cred în Tatăl ce promite biruință neîncetat :/
-
-[v2]
-Boabe de muștar credința semanată prin Isus
-El e Fiul ce pe cruce, mai multă credință a pus
-Sună-n cântec o putere, revărsată prin Duh Sfânt
-Se coboară peste mine și mă scoate din mormânt
-
-[v3]
-Vas de lut sunt doar un slujnic
-Azi umplut, mâine vărsat
-De Stăpânul meu puternic
-Ce cu drag m-a modelat
diff --git a/candidates/Grup Eldad/Grupul Eldad - Vin inaintea Ta.txt b/candidates/Grup Eldad/Grupul Eldad - Vin inaintea Ta.txt
deleted file mode 100644
index 393b33152..000000000
--- a/candidates/Grup Eldad/Grupul Eldad - Vin inaintea Ta.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-[title]
-Vin inaintea Ta {alternative: {*}, composer: {Grupul Eldad}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {176813}, id: {rAs3t9HKUosfxKG6uYDahs}, contentHash: {ef6b70}}
-
-[sequence]
-v1,c,v2,c,v3,c,e
-
-[v1]
-Vin inaintea Ta Isus
-Și cad iarăși pe genunchi
-Aduc aceleași rugăciuni
-Căci vreau să vii să te induri
-
-[c]
-De ce mă lași ades să cred
-Să simt că Tu m-ai părăsit
-Mă rog dar parcă nu mă asculți
-Totuși continui să te chem.
-Cuvinte multe am de spus
-Nici nu mai știu cu ce să incep
-Ajung mereu Doamne să spun:
-”
-Indură-te atât aștept!”
-Cu mintea incerc să-ndepărtez
-Atâtea indoieli și temeri
-Ce s-au născut in ființa mea
-Dar iarăși simt că n-am putere
-Cuvinte caut, să Te-nduplec
-Imi plâng din nou starea grea
-Mă lupt cu gândurile mele
-Și parcă incep să simt ceva.
-Iți mulțumesc acum Părinte
-Că Tu veghezi asupra mea
-Chiar și atunci când mi se pare
-Că m-ai lăsat din mâna Ta
-Promisiunea Ta rămane
-Că ești alăturea mereu
-De cel ce strigă după Tine
-Și-l scapi din ce-I pare mai greu.
-
-[v2]
-Incep in ruga mea acum
-Prin a-Ți cere iar iertare
-Cuvintele greu se aud
-Dar sufletul meu strigă tare.
-
-[v3]
-Din plânsul de amărăciune
-Incepe-al bucuriei plâns
-Dispare orice-ngrijorare
-Și cu iubire sunt cuprins
-
-[e]
-Tu credincios rămai in toate
-Chiar de multe eu nu sunt
-Cuvintele le simt sarace
-Sa-Ți mulțumesc că al Tău sunt,
-Iți mulțumesc că al Tău sunt.
diff --git a/candidates/Iovan Miclea/Iovan Miclea - Hai veniti la betleem.txt b/candidates/Iovan Miclea/Iovan Miclea - Hai veniti la betleem.txt
deleted file mode 100644
index fdf409797..000000000
--- a/candidates/Iovan Miclea/Iovan Miclea - Hai veniti la betleem.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-[title]
-Hai veniti la betleem {alternative: {*}, composer: {Iovan Miclea}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {1460}, id: {uAApTk7ib3BCxB9vX3bEs8}, contentHash: {0840f3}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-Hai, veniți la Betleem
-La Betleem
-Lui Isus să ne închinăm
-La Betleem.
-Pruncului din cer venit
-La Betleem
-Ca să fie preamărit.
-
-[c]
-Într-o iesle S-a născut
-Fiul cel făr´ de început.
-Mântuire-n El s-avem
-La Betleem.
-
-[v2]
-Pruncu-n scutece înfășat
-La Betleem
-Este Fiul de Împărat
-La Betleem.
-El ne-așteaptă cu iubire
-La Betleem
-Să-I aducem mulțumire
-La Betleem.
-
-[v3]
-Să-I cântăm cu bucurie
-La Betleem
-De acum până-n vecie
-La Betleem
-Lui Mesia, Pruncul sfânt
-La Betleem
-Domnul nostru pe pământ.
-La Betleem.
diff --git a/candidates/Iovan Miclea/Iovan Miclea - Slava ta o cant isuse.txt b/candidates/Iovan Miclea/Iovan Miclea - Slava ta o cant isuse.txt
deleted file mode 100644
index c1cb6b036..000000000
--- a/candidates/Iovan Miclea/Iovan Miclea - Slava ta o cant isuse.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-[title]
-Slava ta o cant Isuse {alternative: {*}, composer: {Iovan Miclea}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {1265}, id: {kfMaJE63JYnSLfnRV97MGn}, contentHash: {c2b20f}}
-
-[sequence]
-v1,c,v2,c,v3,c,v4,c
-
-[v1]
-Slava Ta o cânt, Isuse,
-Pentru că m--ai mântuit,
-Prin jertfirea Ta pe cruce
-M--ai iertat, m--ai curățit.
-
-[c]
-Slăvit Miel divin,
-Slăvit Miel divin,
-Slăvit Miel divin,
-Aici și--n veșnicii.
-
-[v2]
-Tu povara de păcate
-Mi--ai luat-o, m--ai scăpat,
-Și în schimbul remușcării,
-Pace sfântă Tu mi--ai dat.
-
-[v3]
-Și de ce să nu cânt oare
-Când Tu viață--mi dăruiești?
-N--am pe nimenea sub soare
-Mai măreț decât Tu ești!
-
-[v4]
-Sunt al Tău în întregime,
-Bunule Păstor divin!
-Cu ce am și sunt, de--a pururi,
-Ție, Doamne, mă închin!
diff --git a/candidates/Iovan Miclea/Iovan Miclea - Un nume mai presus de toate.txt b/candidates/Iovan Miclea/Iovan Miclea - Un nume mai presus de toate.txt
deleted file mode 100644
index 70791f656..000000000
--- a/candidates/Iovan Miclea/Iovan Miclea - Un nume mai presus de toate.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-Un nume mai presus de toate {alternative: {*}, composer: {Iovan Miclea}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {208668}, id: {tj1c1DD1WQ8cBsreBLFnHL}, contentHash: {4a697c}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-Pentru mine, pentru tine,
-Pentru tot ce-i păcătos,
-A venit din cer anume
-Domnul sfânt, Isus Hristos.
-
-[c]
-/: Un nume mai presus de toate
-E numele ce-l poartă El.
-Cu inimi și sfințiri curate
-Lăudați-L pe Emanuel! :/
-
-[v2]
-Să ne scape de pierzare
-El pe cruce a murit.
-În iubirea Lui cea mare
-Pace-n veci ne-a dăruit.
-
-[v3]
-Fericită ne e viața,
-Însorită de Isus.
-El ne-a întărit credința
-Că vom merge-n ceruri sus.
diff --git a/candidates/Iovan Miclea/Iovan Miclea - Viata tinereasca.txt b/candidates/Iovan Miclea/Iovan Miclea - Viata tinereasca.txt
deleted file mode 100644
index e61ca1205..000000000
--- a/candidates/Iovan Miclea/Iovan Miclea - Viata tinereasca.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-Viata tinereasca {alternative: {*}, composer: {Iovan Miclea}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {4826}, id: {ma2VeviKwhs5XAhSDgBQgX}, contentHash: {5574ed}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-Viață tinerească plină de elan.
-Frumusețe, daruri, toate câte am
-Le închin de-a-ntregul pentru Dumnezeu.
-De viața mea dispune Domnul meu.
-
-[c]
-Învățător este Isus
-Conducător este Isus
-Eu nu cunosc niciun altul
-Decât Isus Hristos.
-
-[v2]
-Să nu mă-ntristeze duhul celui rău
-Să nu mă atragă jos din brațul Său
-Inima și gândul să le umple dar
-Pe deplin Isus slăvitul cu-al Său har.
-
-[v3]
-Cât de fericit viața mi-o trăiesc
-În Isus aflat-am tot ce eu doresc.
-El mi-a dat iertare, mântuirea Sa.
-Sunt salvat prin jertfa de pe Golgota.
diff --git a/candidates/Kari Jobe/Kari Jobe - In veci El e glorificat - forever.txt b/candidates/Kari Jobe/Kari Jobe - In veci El e glorificat - forever.txt
deleted file mode 100644
index a96cc0d5a..000000000
--- a/candidates/Kari Jobe/Kari Jobe - In veci El e glorificat - forever.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-[title]
-In veci El e glorificat {alternative: {Forever}, composer: {Kari Jobe}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {130377}, id: {bUcCtBd46ojEkjqfXqD69a}, contentHash: {b9a442}}
-
-[sequence]
-v1,v2,c,b,c
-
-[v1]
-Intreg pamant a plans
-Chiar soarele s-a stins
-El, Salvator Divin, lovit e
-Pe cruce e strapuns
-Tot sangele i-a curs
-Blestemul lumii-ntregi purtand
-
-[v2]
-Un ultim suflu greu
-Chiar parasit de cer
-Mielul e lasat sa moara
-O lupta in mormant
-Pe moarte El calcand
-Puterea iadului e-nvinsa
-Pamanul tremura
-Mormantul s-a deschis
-Nimic nu i-a tinut iubirea Sa
-O, Moarte unde esti?
-C-al nostru Imparat
-Puterea in veci ti-a luat
-
-[c]
-In veci El e Glorificat
-In veci El este Inaltat
-In veci El e glorificat
-El este viu, Isus este viu
-
-[b]
-Eu cant Aleluia, Eu cant Aleluia,
-Eu cant Aleluia, Mielul a invins
diff --git a/candidates/Marius Pop/Marius Pop - Da-i inima ta lui isus.txt b/candidates/Marius Pop/Marius Pop - Da-i inima ta lui isus.txt
deleted file mode 100644
index 5d884a7fe..000000000
--- a/candidates/Marius Pop/Marius Pop - Da-i inima ta lui isus.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-[title]
-Da-i inima ta lui Isus {alternative: {*}, composer: {Marius Pop}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {157187}, id: {82K3WAWyMJtb3p7tt5AgUw}, contentHash: {b1b384}}
-
-[sequence]
-v1,c,e
-
-[v1]
-Dumnezeu atât ne-a iubit
-Că a dat pe Fiul Său,
-Ca oricine, crede în El
-Să nu piară, ci să aibă viață veșnică!
-Prin profeți a fost vestit
-Mesia a fost numit,
-S-a dezbrăcat de slava cerească
-Să ne mântuiască
-Azi te chem să vii să-I dai...
-
-[c]
-Inima ta lui Isus
-Primește viață, e darul nespus,
-Pace la oameni a dat
-Să-I cântăm, ne închinăm, Regelui, Domnului!
- Dă-I inima ta lui Isus
-Primește viață, e darul nespus,
-Pace la oameni a dat
-Să-I cântăm, ne închinăm, Regelui, Domnului! x3.
-
-[e]
-/: A venit, S-a născut Salvatorul
-A adus o speranță în El,
-A împăcat omenirea cu Tatăl
-S-a născut Isus! :/
diff --git a/candidates/Marius Pop/Marius Pop - Dragostea lui.txt b/candidates/Marius Pop/Marius Pop - Dragostea lui.txt
deleted file mode 100644
index 8e5a63c67..000000000
--- a/candidates/Marius Pop/Marius Pop - Dragostea lui.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-[title]
-Dragostea lui {alternative: {*}, composer: {Marius Pop}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {90961}, id: {o8vzF64iz3Rkgu6MNUekg4}, contentHash: {0f8ea2}}
-
-[sequence]
-v1,c,v2,c,e
-
-[v1]
-Privesc spre jertfa de pe cruce la Calvar
-Și mă gândesc la tot ce El mi-a dat în dar
-El vina a purtat în locul meu și-al tău
-Mielul lui Dumnezeu s-a dăruit
-
-[c]
-Dragostea Lui e fără de margini
-Întinderea Lui e fără apus
-Iubirea Lui e asemănată
-Cu infinit
-Îmbrăcat în putere și-n slavă și-n glorie
-Domnește în veci El e fără sfârșit
-Cer și pământ îi vestesc pe vecie
-Ești necuprins
-
-[v2]
-Privesc spre jertfa de pe cruce la Calvar
-Vreau să-nțeleg iubirea-ți fără de hotar
-În palma Ta străpunsă Tu ne-ai mântuit
-Ce har nemeritat să fiu iertat
-
-[e]
-Neștiute suferinți lacrimi tainice fierbinți
-Dăruite pentru mine la Calvar
-Dumnezeu crucificat, pentru om sacrificat
-Boldul morții ai învins la Golgota
diff --git a/candidates/Marius Pop/Marius Pop - In fata regelui.txt b/candidates/Marius Pop/Marius Pop - In fata regelui.txt
deleted file mode 100644
index a8acba605..000000000
--- a/candidates/Marius Pop/Marius Pop - In fata regelui.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-[title]
-In fata regelui {alternative: {*}, composer: {Marius Pop}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {158876}, id: {jJmdWbsGdQ38QDL72sXUa9}, contentHash: {e92b71}}
-
-[sequence]
-v1,v2,c,v2,c,e,c
-
-[v1]
-În fața Regelui ne smerim,
-Aducem jertfele, ne sfințim!
-Toarnă din Duhul Tău, peste popor,
-Lasă să curgă-acum al Tău izvor!
-
-[v2]
-Vrem revărsarea Ta, cu untdelemn,
-Vrem bucuria Ta, să o vedem!
-Vino și umple-ne, cu slava Ta,
-Să lumineze-n noi iubirea Ta!
-
-[c]
-/: Glorie, Îți cântăm,
-Doar pe Tine Te onorăm!
-Ne-aducem inima-n dar,
-Jertfă vie pe altar! :/
-
-[e]
-/:
-/: Sfânt ești, Tu, Isus! :/
-Vrem să Te lăudăm pe Tine, tot mai mult!
-/: Sfânt ești, Tu, Isus! :/
-Vrem să Te onorăm pe Tine, tot mai mult! :
-/:/
diff --git a/candidates/Marius Pop/Marius Pop - Psalmul.txt b/candidates/Marius Pop/Marius Pop - Psalmul.txt
deleted file mode 100644
index d719ea0c3..000000000
--- a/candidates/Marius Pop/Marius Pop - Psalmul.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-[title]
-Psalmul {alternative: {*}, composer: {Marius Pop}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {146293}, id: {rhDaxGQDXGFJPkkrcNP6Pi}, contentHash: {4c2ea5}}
-
-[sequence]
-v1,b,c
-
-[v1]
-/: Domnul e Păstorul meu,
-Eu lipsă n-am să duc.
-El mă paște-n verzi pășuni
-Și odihnă-mi dă. :/
-
-[b]
-/: Tu mă înviorezi,
-Mereu mă cercetezi,
-Toiagul și nuiaua Ta mă mângâie. :/
-
-[c]
-Fericirea și-ndurarea mă vor însoți,
-Bunătatea ți iertarea mă vor acoperi.
-Untdelemn sfânt, Isuse, în inimă-mi reverși,
-/: Paharul meu e plin și dă peste el. :/
diff --git a/candidates/Messis/Messis - Cantec din iubire.txt b/candidates/Messis/Messis - Cantec din iubire.txt
deleted file mode 100644
index 64ff9e6e4..000000000
--- a/candidates/Messis/Messis - Cantec din iubire.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-[title]
-Cantec din iubire {alternative: {*}, composer: {Messis}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {114825}, id: {3XUfHKzWH8KyeBzcLcxRo5}, contentHash: {f6530a}}
-
-[sequence]
-v1,c,v2,c,e
-
-[v1]
-E un cântec ce-a fost scris doar din iubire
-E o taină ce ne poartă în zbor semeț
-Și un cântec ce ne-nvață că iubirea
-/: Pe pământ dar și în ceruri e de preț. :/
-Sunt atâția care caută fericirea
-Și voi știți care e calea s-o aveți
-Voi în dragoste-ați aflat că viața-aceasta
-/: E frumoasă dacă în Domnul vă-ncredeți. :/
-
-[c]
-/: Dar voi nu, nu vă îngrijorați
-Voi în Domnul viața voastr-o ancorați
-Prin furtună și prin ploi veți vedea că e cu voi
-Veți fi tari în mâna-I tare amândoi. :/
-
-[v2]
-Veți afla că-n viață totul e credința
-Și că dragostea-i al slavei dar măreț
-Și-mpreună veți afla că biruința
-/: E atunci când unul pe-altul vă aveți. :/
-
-[e]
-Prin furtună și prin ploi veți vedea că e cu voi
-Veți fi tari în mâna-I tare amândoi.
diff --git a/candidates/Messis/Messis - Iata s-a nascut.txt b/candidates/Messis/Messis - Iata s-a nascut.txt
deleted file mode 100644
index c60235678..000000000
--- a/candidates/Messis/Messis - Iata s-a nascut.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-[title]
-Iata s-a nascut {alternative: {*}, composer: {Messis}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {237516}, id: {8FbjV5S6JTdRP6FanaYAYS}, contentHash: {a998f9}}
-
-[sequence]
-v1,c,v2,c,e
-
-[v1]
-Auziți ce veste,
-Despre-un Prunc în iesle,
-Despre mântuire,
-Despre pace dată-n dar.
-Îngerul ne spune,
-Despre o minune,
-Câtă bucurie,
-Viață-n dar El ne-a adus,
-Mantuire ne-a adus.
-Să cântăm toți:
-
-[c]
-Cerul iată s-a deschis,
-S-a împlinit ce Domnul ne-a promis.
-Să ne-nchinăm cu toți la ieslea Sa
-Și viata-ntreagă ne-o va lumina.
-Iată S-a născut!
-Iată S-a născut!
-Cerul iată s-a deschis,
-S-a împlinit ce Domnul ne-a promis.
-Să ne-nchinăm cu toți la ieslea Sa
-Și viata-ntreagă ne-o va lumina.
-Iată S-a născut!
-Iată S-a născut!
-Iată S-a născut!
-Iată S-a născut!
-
-[v2]
-Stai acum și-ascultă
-Pentru cine cântă
-Îngerii din ceruri,
-Poate e colinda ta.
-O, ce veste mare,
-O, ce sărbătoare,
-N-o lăsa să treacă,
-Vino-acum și vei vedea
-Viața îți va lumina.
-Pe vecie:
-
-[e]
-Pentru cine vine,
-Pentru cei ca tine,
-Pentru orișicine,
-E venirea Sa.
diff --git a/candidates/Messis/Messis - In prezenta ta sunt frant.txt b/candidates/Messis/Messis - In prezenta ta sunt frant.txt
deleted file mode 100644
index 29d8a5845..000000000
--- a/candidates/Messis/Messis - In prezenta ta sunt frant.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-[title]
-In prezenta ta sunt frant {alternative: {*}, composer: {Messis}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {160699}, id: {dnUkE9iuCAd2GcjMLuSoYZ}, contentHash: {fd3ace}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-În prezența Ta sunt frânt,
-Ca un vas cu mir turnat,
-Tot ce am, cu tot ce sunt,
-Frânt mă plec-naintea Ta!
-
-[c]
-Eu pun viața mea
-În mâna Ta,
-În mâna Ta,
-Cuvinte n-am s-aduc,
-Dar voia mea e voia Ta!
-
-[v2]
-Doamne măreția Ta,
-Mă aduce pe genunchi,
-Nu voi fi nicicând la fel,
-În Hristos nădejdea-mi pun!
diff --git a/candidates/Messis/Messis - Inconjurat de slava.txt b/candidates/Messis/Messis - Inconjurat de slava.txt
deleted file mode 100644
index 756ff5be0..000000000
--- a/candidates/Messis/Messis - Inconjurat de slava.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-[title]
-Inconjurat de slava {alternative: {*}, composer: {Messis}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {158386}, id: {aUHeGdpq5XVWqjwNVj2stq}, contentHash: {dd0549}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Înconjurat de slavă,
-Te laudă bolta-ntreagă,
-Și îngerii Îți cântă, Doamne!
-Te laudă-a Ta creație,
-Cu Cerul întreg dă glorie,
-Cu inima deschisă, m-alătur lor.
-
-[c]
-/: Și Îți cânt glorie, Doamne,
-Eu Îți cânt glorie, în veci!
-Tu Te cobori și-mi umpli sufletul, de pace!
-Și Îți cânt glorie, Doamne,
-Eu Îți cânt glorie, în veci!
-Tu mă-nconjori și mă păstrezi mereu în brațe, Doamne! :/
-
-[v2]
-Ți-ai arătat puterea,
-Mi-ai dat și mângâierea,
-În veci de veci, Tu, Doamne, domnești!
-Bătrâni cu bucurie, în cer se-nchină Ție,
-Cu inima deschisă, mă-nchin și eu!
diff --git a/candidates/Messis/Messis - Nu pot uita.txt b/candidates/Messis/Messis - Nu pot uita.txt
deleted file mode 100644
index 6e3bcfe4c..000000000
--- a/candidates/Messis/Messis - Nu pot uita.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-[title]
-Nu pot uita {alternative: {*}, composer: {Messis}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {240061}, id: {n2BKUiV1D6wmCjQwXu1gBt}, contentHash: {66c496}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Gândul meu sus la cruce se îndreaptă,
-Spre-acel loc, unde sânge a curs.
-Îmi înalț azi privirea spre cruce,
-Ca să văd pe-al meu Domn răstignit.
-Văd și azi cum Acel fără vină e lovit!
-
-[c]
-Nu pot uita cum pe crucea grea,
-Mureai pentru mine! Dureri și suspine
-Adânc sufereai! Și-atunci mă iubeai
-Tu pe mine!
-
-[v2]
-Ostenit duce crucea spre Golgota.
-Al meu Domn varsă lacrimi, părăsit.
-Ca un Miel poartă a mea povară,
-Fără glas, chiar și când e lovit.
-În smerenie deschis-a El calea. Fii slăvit!
diff --git a/candidates/Messis/Messis - Spui ca tu cauti viata.txt b/candidates/Messis/Messis - Spui ca tu cauti viata.txt
deleted file mode 100644
index 5e9619b66..000000000
--- a/candidates/Messis/Messis - Spui ca tu cauti viata.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-Spui ca tu cauti viata {alternative: {*}, composer: {Messis}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {225313}, id: {ksCKVyCFF5a6VCFZWjmfmg}, contentHash: {32d472}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Te-ai oprit doar o clipă
-Să te-ntrebi unde te duci
-Poate n-ai nicio țintă dar alergi
-Te-ai pornit cu așa grabă
-Insa oare unde ajungi
-E acesta sfârșitul ce-l alegi?
-
-[c]
-/: Spui că tu cauți viața
-În schimb ți-ai pierdut speranța
-Tot ce credeai etern acum e-un abur risipit
-Azi vreau să-ți dau de știre
-E vie a Lui iubire
-Încă te-așteaptă ca să vii. :/
-
-[v2]
-A plătit pentru tine
-Cu al său sânge curat
-Ca să ai azi viață s-a jertfit
-Poți să ai mântuire
-Să fii liber de păcat
-Poți să fii cu Isus pân’ la sfârșit.
diff --git a/candidates/Messis/Messis - Voi chema numele tau.txt b/candidates/Messis/Messis - Voi chema numele tau.txt
deleted file mode 100644
index bc8c6601f..000000000
--- a/candidates/Messis/Messis - Voi chema numele tau.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-[title]
-Voi chema numele tau {alternative: {*}, composer: {Messis}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {158158}, id: {wufSspT8hQcmQcY2aRGzvB}, contentHash: {328812}}
-
-[sequence]
-v1,c,v2,c,e
-
-[v1]
-Mă chemi și azi să merg pe ape,
-Spre-un viitor necunoscut.
-Și valuri vin să mă doboare,
-Dar mă încred și încă lupt.
-
-[c]
-Eu voi chema Numele Tău,
-Spre cer Isus, privesc mereu.
-Când valuri vin, sunt liniștit în brațul Tău,
-Ești Domnul meu și sunt al Tău.
-Eu voi chema Numele Tău,
-Spre cer Isus, privesc mereu.
-Când valuri vin, sunt liniștit în brațul Tău,
-Ești Domnul meu și sunt al Tău.
-
-[v2]
-Iar harul Tău mă însoțește,
-Când toți se-ascund, cu mine fii!
-Oricât de mare-ar fi furtuna,
-Tu, Dumnezeu, vei birui!
-
-[e]
-/: O, Duh Sfânt ce mă-ntărești, să-mi fii aproape,
-Ca să pot păși pe ape, când Domnul meu mă cheamă.
-Călăuză-mi fii în noapte acolo unde
-Doar credința mai rămâne, alungă a mea teamă! :/ x4
diff --git a/candidates/Samuel Bratu/Samuel Bratu - Crezand in el vom trai.txt b/candidates/Samuel Bratu/Samuel Bratu - Crezand in el vom trai.txt
deleted file mode 100644
index fa607c12a..000000000
--- a/candidates/Samuel Bratu/Samuel Bratu - Crezand in el vom trai.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-[title]
-Crezand in el vom trai {alternative: {*}, composer: {Samuel Bratu}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {202974}, id: {21A8T31FvVsyazpiHU2i9H}, contentHash: {c51e2b}}
-
-[sequence]
-v1,v2,v3
-
-[v1]
-L-am văzut suspinând,
-Crucea-n spate ducând.
-Spre Golgota, trudit,
-Se ducea.
-/: Mâinile l-au străpuns,
-Cu tâlharii L-au pus.
-Iar preoții din jur
-Îl huleau. :/
-
-[v2]
-Când pe cruce murea
-Jertfa Lui ne ierta,
-Chinuit, pentru noi,
-Se ruga.
-/: Suferind El știa
-Că din morți va-nvia.
-Și crezând doar în El
-Vom trăi. :/
-
-[v3]
-Harul Lui cel bogat
-Și pentru noi s-a arătat,
-Pentru cei ce pe Isus
-L-au acceptat.
-/: Sângele-I sfânt, curat
-Și pe noi ne-a spălat.
-Viață-n dar, prin Isus,
-Am primit. :/
diff --git a/candidates/Samuel Bratu/Samuel Bratu - Doar un nume sfant.txt b/candidates/Samuel Bratu/Samuel Bratu - Doar un nume sfant.txt
deleted file mode 100644
index 845c74637..000000000
--- a/candidates/Samuel Bratu/Samuel Bratu - Doar un nume sfant.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-[title]
-Doar un nume sfant {alternative: {*}, composer: {Samuel Bratu}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {203125}, id: {cDcvCar3iF6xaTTzwHHd7N}, contentHash: {b8b5ed}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-El, măcar că avea chip de Dumnezeu
-La slavă a renunțat, cu smerenie S-a îmbrăcat.
-A trăit pe pământ, chip de om a luat,
-Chiar la cruce S-a dus, pe lemn crucificat.
-
-[c]
-Doar un Nume Sfânt sub soare ni s-a dat,
-În care orice om poate fi salvat.
-El e singurul născut din Dumnezeu.
-În fața Lui, salvat mă-nchin și eu.
-
-[v2]
-De aceea Dumnezeu
-L-a înălțat mai presus.
-Alt nume nu s-a dat
-Mai măreț ca și Isus.
-Orice neam sau limbă
-Să proclame ne-ncetat
-Că Isus Hristos
-E Domn și Împărat.
diff --git a/candidates/Samuel Bratu/Samuel Bratu - Dumnezeu s-a apropiat de noi.txt b/candidates/Samuel Bratu/Samuel Bratu - Dumnezeu s-a apropiat de noi.txt
deleted file mode 100644
index 2afc729ba..000000000
--- a/candidates/Samuel Bratu/Samuel Bratu - Dumnezeu s-a apropiat de noi.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-[title]
-Dumnezeu s-a apropiat de noi {alternative: {*}, composer: {Samuel Bratu}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {203711}, id: {g77JibVcoyckYvDDopFncN}, contentHash: {78c25c}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Vestea minunată ce a venit de sus,
-A umplut pământul, pace i-a adus.
-Născut din Duhul Sfânt, în lume a venit.
-Dumnezeu adevărat spre noi S-a aplecat.
-
-[c]
-/: Emanuel, Dumnezeul așteptat,
-E cu noi, de moarte ne-a scăpat.
-Salvați, prin El, suntem fii de Împărat,
-Prin iubirea Lui ne-a câștigat. :/
-
-[v2]
-Cel născut în iesle știe cum e jos.
-Încă mai primește orice păcătos.
-Ar vrea să se nască și-n viața ta.
-Azi e timpul să-L primești, deschide-ți inima!
diff --git a/candidates/Samuel Bratu/Samuel Bratu - In palma ta.txt b/candidates/Samuel Bratu/Samuel Bratu - In palma ta.txt
deleted file mode 100644
index 955b75fe3..000000000
--- a/candidates/Samuel Bratu/Samuel Bratu - In palma ta.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-In palma ta {alternative: {*}, composer: {Samuel Bratu}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {202346}, id: {oQjbVB3fj9rfa5bnHY79wt}, contentHash: {506194}}
-
-[sequence]
-v1,c,v2,c
-
-[v1]
-Chiar dacă rod nu ar mai fi
-Și orice bun dac-ar lipsi
-Chiar dacă totul s-ar usca,
-Și niciun pom n-ar înflori.
-În Tine mă voi bucura
-În Tine e tăria mea.
-
-[c]
-În palma Ta, Doamne eu voi fi
-Ești sprijinul ce nu îmi va lipsi
-Și orice griji, Ție Ți le voi da,
-Tu ai promis că nu mă vei lăsa.
-
-[v2]
-Tu mereu ești credincios,
-Neschimbat în veci rămâi.
-Și chiar din valul furios
-Auzi strigătul oricui.
-De la munți de-aș aștepta
-Ajutor nu voi primi.
-Stânca mea rămâi doar Tu,
-Și salvare îmi vei fi.
diff --git a/candidates/Samuel Bratu/Samuel Bratu - Pruncul imparat.txt b/candidates/Samuel Bratu/Samuel Bratu - Pruncul imparat.txt
deleted file mode 100644
index a609d8a1e..000000000
--- a/candidates/Samuel Bratu/Samuel Bratu - Pruncul imparat.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-[title]
-Pruncul imparat {alternative: {*}, composer: {Samuel Bratu}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {206964}, id: {fr4Xh9ZbrVJTU3A4G1wY4g}, contentHash: {5d2067}}
-
-[sequence]
-v1,c,v2,c2
-
-[v1]
-Cel ce e mai mare decât Universu-ntreg
-Printr-un Prunc se naște în ieslea din Betleem.
-Slava din cer a schimbat-o cu micul sălaș,
-Creatorul lumii a găsit loc doar într-un grajd.
-
-[c]
-Dar El rămâne neschimbat,
-Chiar și-n iesle e Împărat
-Azi cu toții ne aplecăm
-Regelui închinare să-I dăm,
-Lui ne închinăm o, o, o, o.
-
-[v2]
-A trăit printre oameni, cu iubire El aștepta
-Orice suflet să creadă pe deplin în Jertfa Sa.
-Și-a dat viața pe cruce, salvarea prin El a venit,
-Ne-a adus mântuirea, prin El viață am primit.
-
-[c2]
-Bucuroși în veci Îi cântăm,
-Pe Isus Îl înălțăm.
-Prințul păcii, Domn minunat,
-El ne-a salvat o, o, o, o.
diff --git a/candidates/resurse_crestine_raw/Otniel Stirb - Cel ce sta sub ocrotirea celui preainalt.txt b/candidates/resurse_crestine_raw/Otniel Stirb - Cel ce sta sub ocrotirea celui preainalt.txt
deleted file mode 100644
index 2e0b19e0a..000000000
--- a/candidates/resurse_crestine_raw/Otniel Stirb - Cel ce sta sub ocrotirea celui preainalt.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-[title]
-Cel ce sta sub ocrotirea celui preainalt {alternative: {*}, composer: {Otniel Stirb}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {189709}, id: {epQYmmEZYZM62UG4f2GY4P}, contentHash: {13a18c}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-Cel ce stă sub ocrotirea Celui Preaînalt
-Și la umbra Lui se odihnește
-Poate zice despre Domnul: „
-El mi-e adăpost,
-Ajutor la greu, ce nu lipsește.”
-
-[c]
-/: Nu te teme, frate, nu te teme!
-Domnu-i locul tău de adăpost!
-Marea-I îndurare-n orice vreme
-Din atâtea încercări ne-a scos. :/
-
-[v2]
-De săgeți ce zboară ziua tu să nu temi,
-Pavăză-i a Lui credincioșie;
-Chiar în miez de noapte vine, când smerit Îl chemi,
-Cum să-i scape pe ai Săi, El știe.
-
-[v3]
-Sub a Lui aripă sfântă când ne-adăpostim,
-Pot să vină vremuri de-ncercare;
-Izbăvirea noastră-i Domnul, noi spre El privim,
-Cel Preaînalt e turnul de scăpare.
diff --git a/candidates/resurse_crestine_raw/Ovidiu Liteanu - Hai in rai.txt b/candidates/resurse_crestine_raw/Ovidiu Liteanu - Hai in rai.txt
deleted file mode 100644
index c3562958b..000000000
--- a/candidates/resurse_crestine_raw/Ovidiu Liteanu - Hai in rai.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-[title]
-Hai in rai {alternative: {*}, composer: {Ovidiu Liteanu}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {6285}, id: {aybnekmKRovxdSy7tsLvBu}, contentHash: {ddee44}}
-
-[sequence]
-v1,c,v2,c,v3,c,v4,c
-
-[v1]
-Sfânta chemare, se aude.
-Vino să pornești de azi pe-al vieții drum.
-Domnul din Ceruri, te iubește.
-Te îndeamnă să pornești spre El acum.
-
-[c]
-/: Hai în Rai, ce mai stai,
-Vino să trăiești în slăvile Cerești, hai în Rai :/
-
-[v2]
-Ce mare-i Harul, Mântuirii.
-Duhul Sfânt te cercetează-n drumul tău
-Te mântuiește, ieși din lume.
-Azi mai poți să te întorci la Dumnezeu.
-
-[v3]
-Nu pierde șansa, Mântuirii.
-Domnul vrea să-ți scrie numele în Cer.
-Primi-vei pace, bucurie.
-Și vei fi răpit în Ceruri pentru El.
-
-[v4]
-Crede că Domnul, pentru tine.
-Pe o cruce a murit în locul tău.
-Acum spune-i, o Isuse.
-Vin plângând Te rog mă iartă Domnul meu.
diff --git a/candidates/resurse_crestine_raw/Puiu Chibici - Calatori spre tara sfanta.txt b/candidates/resurse_crestine_raw/Puiu Chibici - Calatori spre tara sfanta.txt
deleted file mode 100644
index 910e2d941..000000000
--- a/candidates/resurse_crestine_raw/Puiu Chibici - Calatori spre tara sfanta.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-[title]
-Calatori spre tara sfanta {alternative: {*}, composer: {Puiu Chibici}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {57626}, id: {am8RLwDpqpZAbSzi6K99mj}, contentHash: {ff7042}}
-
-[sequence]
-v1,v2,v3,v4
-
-[v1]
-Călători spre țara sfântă
-Noi suntem aicea jos,
-Cerul e a noastră țintă
-Și-al nost´ Mire drag Hristos.
-
-[v2]
-Haideți toți cu bucurie
-Către patria de sus
-Să cântăm o veșnicie
-Împreună cu Isus.
-
-[v3]
-În umblarea noastră scurtă
-Aici suntem trecători,
-Dar sfârșind această luptă
-Vom fi-n cer nemuritori.
-
-[v4]
-Prin furtuni și prin talazuri
-Zi de zi cu greu răzbim,
-Prin dureri și prin necazuri
-Doar cu Isus biruim.
diff --git a/candidates/resurse_crestine_raw/Puiu Chibici - De ce stai mut.txt b/candidates/resurse_crestine_raw/Puiu Chibici - De ce stai mut.txt
deleted file mode 100644
index f74ae649b..000000000
--- a/candidates/resurse_crestine_raw/Puiu Chibici - De ce stai mut.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-[title]
-De ce stai mut {alternative: {*}, composer: {Puiu Chibici}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {6571}, id: {4H5g9M9GTKrPQFknWZXBLt}, contentHash: {1ecb33}}
-
-[sequence]
-v1,c,v2,c,v3,c
-
-[v1]
-De ce stai mut când îți vorbesc
-Și nu mă mustri când greșesc,
-De ce mi-e cerul nepătruns,
-De ce de mine Te-ai ascuns,
-De ce nu-mi dai, Doamne, răspuns?
-
-[c]
-O, unde ești, o, unde ești?
-De ce nu poți să mă privești?
-Știu c-am greșit, știu că sunt rău,
-Dar știu că-I mare harul Tău.
-
-[v2]
-De-atâta vreme-s în cuptor,
-Ard și n-am niciun ajutor,
-Vrei oare să mă curățești,
-Sau poate să mă nimicești,
-Sau așa-mi spui că mă iubești?
-
-[v3]
-Te rog frumos, Stăpânul meu,
-Preasfânt și mare Dumnezeu,
-Smerit, plecat, umil, supus,
-Vin în Numele lui Isus,
-Fă ruga mea s-ajungă sus.
diff --git a/candidates/resurse_crestine_raw/Puiu Chibici - Intr-un sat ne-nsemnat.txt b/candidates/resurse_crestine_raw/Puiu Chibici - Intr-un sat ne-nsemnat.txt
deleted file mode 100644
index 2e8171013..000000000
--- a/candidates/resurse_crestine_raw/Puiu Chibici - Intr-un sat ne-nsemnat.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-[title]
-Intr-un sat ne-nsemnat {alternative: {*}, composer: {Puiu Chibici}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {60417}, id: {u8SYWFhZ4T7dC1bFEW8qZt}, contentHash: {f9c19b}}
-
-[sequence]
-v1,v2,v3,v4
-
-[v1]
-Într-un sat ne-nsemnat
-În țara lui Israel
-S-a născut un Împărat
-Pe nume Emanuel.
-
-[v2]
-Niște magi din răsărit
-Au văzut pe cer o stea
-Și în grabă au venit
-Să-L vadă pe Mesia.
-
-[v3]
-Daruri multe au adus
-Cu iubire acolo jos,
-Pentru Pruncul mic Isus,
-Pentru Regele Hristos.
-
-[v4]
-Când păstorii au aflat,
-La staul au alergat
-Și cu îngerii din cer
-Slavă, slavă au cântat,
-Cu oștirea cea de sus,
-Slavă, slavă lui Isus.
diff --git a/candidates/resurse_crestine_raw/Traian Dorz - Ma iubesti tu mai mult decat ceilalti.txt b/candidates/resurse_crestine_raw/Traian Dorz - Ma iubesti tu mai mult decat ceilalti.txt
deleted file mode 100644
index 09846f329..000000000
--- a/candidates/resurse_crestine_raw/Traian Dorz - Ma iubesti tu mai mult decat ceilalti.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-[title]
-Ma iubesti tu mai mult decat ceilalti {alternative: {*}, composer: {Traian Dorz}, writer: {*}, arranger: {*}, interpreter: {*}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {203635}, id: {4vNUPwBz2t2XS7RkeDA6u3}, contentHash: {a2f2fe}}
-
-[sequence]
-v1,c,v2,c,v3,c,v4,c
-
-[v1]
-Mă iubești tu mai mult decât ceilalți,
-Mă iubești ca pe-un frate ceresc,
-Mă iubești tu, ca rod din iubire?
-/: Eu așa, Eu așa te iubesc! :/
-
-[c]
-Mă iubești tu, când sunt lângă tine,
-Dar și-atunci când te simți părăsit?
-Mă iubești și-ntre flori și-ntre suliți?!
-/: Eu așa, Eu așa te-am iubit! :/
-Mă iubești tu, când sunt lângă tine,
-Dar și-atunci când te simți părăsit?
-Mă iubești și-ntre flori și-ntre suliți?!
-/: Eu așa, Eu așa te-am iubit! :/
-Mă iubești tu, când sunt lângă tine,
-Dar și-atunci când te simți părăsit?
-Mă iubești și-ntre flori și-ntre suliți?!
-/: Eu așa, Eu așa te-am iubit! :/
-Mă iubești tu, când sunt lângă tine,
-Dar și-atunci când te simți părăsit?
-Mă iubești și-ntre flori și-ntre suliți?!
-/: Eu așa, Eu așa te-am iubit! :/
-
-[v2]
-Mă iubești tu mai mult decât ceilalți,
-Mai presus de-orice gând pământesc,
-Mai presus de-orice dragoste-a firii,
-/: Eu așa, Eu așa te iubesc! :/
-
-[v3]
-Mă iubești tu, mai mult decât ceilalți,
-Decât cei ce arar Mă-nsoțesc,
-Mă iubești, tu, privind veșnicia?!
-/: Eu așa, Eu așa te iubesc! :/
-
-[v4]
-Simți că-n lume străine-ți sunt toate,
-Simți că-n Mine-ți sunt totu-mplinit,
-Mă iubești, tu, mai mult ca pe tine?!
-/: Eu așa, Eu așa te-am iubit! :/
diff --git a/temp-runners/importSongsFromRcByAuthors.ts b/import-songs-temp-runners/importSongsFromRcByAuthors.ts
similarity index 100%
rename from temp-runners/importSongsFromRcByAuthors.ts
rename to import-songs-temp-runners/importSongsFromRcByAuthors.ts
diff --git a/temp-runners/importSongsFromRcByIds.ts b/import-songs-temp-runners/importSongsFromRcByIds.ts
similarity index 100%
rename from temp-runners/importSongsFromRcByIds.ts
rename to import-songs-temp-runners/importSongsFromRcByIds.ts
diff --git a/temp-runners/manual_picks.txt b/import-songs-temp-runners/manual_picks.txt
similarity index 100%
rename from temp-runners/manual_picks.txt
rename to import-songs-temp-runners/manual_picks.txt
diff --git a/temp-runners/manual_picks_rest.txt b/import-songs-temp-runners/manual_picks_rest.txt
similarity index 100%
rename from temp-runners/manual_picks_rest.txt
rename to import-songs-temp-runners/manual_picks_rest.txt
diff --git a/temp-runners/moveExistingWorshipSongsToDir.ts b/import-songs-temp-runners/moveExistingWorshipSongsToDir.ts
similarity index 100%
rename from temp-runners/moveExistingWorshipSongsToDir.ts
rename to import-songs-temp-runners/moveExistingWorshipSongsToDir.ts
diff --git a/import-songs-temp-runners/rc_authors_to_process.txt b/import-songs-temp-runners/rc_authors_to_process.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/temp-runners/rc_ids_to_ignore.txt b/import-songs-temp-runners/rc_ids_to_ignore.txt
similarity index 100%
rename from temp-runners/rc_ids_to_ignore.txt
rename to import-songs-temp-runners/rc_ids_to_ignore.txt
diff --git a/import-songs-temp-runners/rc_ids_to_process.txt b/import-songs-temp-runners/rc_ids_to_process.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/jest.config.ts b/jest.config.ts
index 50fa7c77b..6c7a6acce 100644
--- a/jest.config.ts
+++ b/jest.config.ts
@@ -1,7 +1,9 @@
-import type { JestConfigWithTsJest } from 'ts-jest';
+import { createDefaultEsmPreset, type JestConfigWithTsJest } from 'ts-jest';
+
+const defaultEsmPreset = createDefaultEsmPreset();
const jestConfig: JestConfigWithTsJest = {
- preset: 'ts-jest/presets/default-esm',
+ ...defaultEsmPreset,
moduleDirectories: ['', 'node_modules'],
moduleNameMapper: {
'^(\\.{1,2}/.*)\\.js$': '$1',
@@ -19,9 +21,9 @@ const jestConfig: JestConfigWithTsJest = {
useESM: true,
},
],
+ '^.+.tsx?$': ['ts-jest', {}],
},
// https://github.com/jestjs/jest/issues/14305#issuecomment-1627346697
prettierPath: null,
};
-
export default jestConfig;
diff --git a/package-lock.json b/package-lock.json
index 44402e05a..0e2a659ca 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,27 +13,27 @@
"@types/nspell": "^2.1.6",
"@types/string-similarity": "^4.0.2",
"chalk": "^4.1.2",
- "crlf-normalize": "^1.0.19",
- "dictionary-ro": "^2.1.0",
- "dotenv": "^16.3.1",
- "fs-extra": "^11.1.1",
+ "crlf-normalize": "^1.0.20",
+ "dictionary-ro": "^3.0.0",
+ "dotenv": "^16.4.5",
+ "fs-extra": "^11.2.0",
"iconv": "^3.0.1",
"is-ci": "^3.0.1",
"lodash-es": "^4.17.21",
"nspell": "^2.1.5",
"p-map": "^4.0.0",
"recursive-readdir": "^2.2.3",
- "short-uuid": "^4.2.2",
+ "short-uuid": "^5.2.0",
"string-similarity": "^4.0.4"
},
"devDependencies": {
- "@tsconfig/node-lts": "^18.12.5",
+ "@tsconfig/node-lts": "^22.0.0",
"@types/fs-extra": "^11.0.4",
"@types/iconv": "^3.0.4",
- "@types/jest": "^29.5.8",
- "@types/lodash": "^4.14.201",
- "@types/lodash-es": "^4.17.11",
- "@types/node": "^20.9.2",
+ "@types/jest": "^29.5.14",
+ "@types/lodash": "^4.17.13",
+ "@types/lodash-es": "^4.17.12",
+ "@types/node": "^22.9.0",
"@types/recursive-readdir": "^2.2.4",
"@typescript-eslint/eslint-plugin": "^6.11.0",
"@typescript-eslint/parser": "^6.11.0",
@@ -41,17 +41,18 @@
"eslint-plugin-require-extensions": "^0.1.3",
"is-ci-cli": "^2.2.0",
"jest": "^29.7.0",
- "jest-runner-eslint": "^2.1.2",
+ "jest-runner-eslint": "^2.2.1",
"jest-snapshot": "^29.7.0",
"jest-watch-typeahead": "^2.2.2",
"lodash": "^4.17.21",
- "prettier": "^3.1.0",
+ "prettier": "^3.3.3",
"prettier-plugin-latex": "^2.0.1",
- "prettier-plugin-organize-imports": "^3.2.4",
- "prettier-plugin-packagejson": "^2.4.6",
- "ts-jest": "^29.1.1",
- "ts-node": "^10.9.1",
- "tslib": "^2.6.2",
+ "prettier-plugin-organize-imports": "^4.1.0",
+ "prettier-plugin-packagejson": "^2.5.3",
+ "rimraf": "^6.0.1",
+ "ts-jest": "^29.2.5",
+ "ts-node": "^10.9.2",
+ "tslib": "^2.8.1",
"typescript": "5.1.6"
}
},
@@ -788,18 +789,18 @@
}
},
"node_modules/@eslint-community/regexpp": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz",
- "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==",
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
"node_modules/@eslint/eslintrc": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz",
- "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
@@ -820,22 +821,23 @@
}
},
"node_modules/@eslint/js": {
- "version": "8.54.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz",
- "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==",
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@humanwhocodes/config-array": {
- "version": "0.11.13",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
- "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
"dev": true,
"dependencies": {
- "@humanwhocodes/object-schema": "^2.0.1",
- "debug": "^4.1.1",
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
"minimatch": "^3.0.5"
},
"engines": {
@@ -856,11 +858,108 @@
}
},
"node_modules/@humanwhocodes/object-schema": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
- "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
"dev": true
},
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -1425,19 +1524,11 @@
"node": ">= 8"
}
},
- "node_modules/@pkgr/utils": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz",
- "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==",
+ "node_modules/@pkgr/core": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
+ "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
"dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "fast-glob": "^3.3.0",
- "is-glob": "^4.0.3",
- "open": "^9.1.0",
- "picocolors": "^1.0.0",
- "tslib": "^2.6.0"
- },
"engines": {
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
},
@@ -1470,9 +1561,9 @@
}
},
"node_modules/@tsconfig/node-lts": {
- "version": "18.12.5",
- "resolved": "https://registry.npmjs.org/@tsconfig/node-lts/-/node-lts-18.12.5.tgz",
- "integrity": "sha512-KJZX0kQ5FBv77WDVzmQ9y1dUjaJCNXAAz3LSsg5cMwH0AUijVdDQtII+IVprEXdb13U9GjVOBxBzyRvr/ozPxw==",
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node-lts/-/node-lts-22.0.0.tgz",
+ "integrity": "sha512-6y6CBFe0etz2xU1s0rGOj7pLsvbYXM9l/RNmBQOKI3S5DFrp1jigxx8uYupG5O6cCNXNlOE/1gquoQH01+kz5w==",
"dev": true
},
"node_modules/@tsconfig/node10": {
@@ -1601,9 +1692,9 @@
}
},
"node_modules/@types/jest": {
- "version": "29.5.8",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz",
- "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==",
+ "version": "29.5.14",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz",
+ "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==",
"dev": true,
"dependencies": {
"expect": "^29.0.0",
@@ -1626,26 +1717,26 @@
}
},
"node_modules/@types/lodash": {
- "version": "4.14.201",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz",
- "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==",
+ "version": "4.17.13",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz",
+ "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==",
"dev": true
},
"node_modules/@types/lodash-es": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.11.tgz",
- "integrity": "sha512-eCw8FYAWHt2DDl77s+AMLLzPn310LKohruumpucZI4oOFJkIgnlaJcy23OKMJxx4r9PeTF13Gv6w+jqjWQaYUg==",
+ "version": "4.17.12",
+ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+ "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"dev": true,
"dependencies": {
"@types/lodash": "*"
}
},
"node_modules/@types/node": {
- "version": "20.9.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz",
- "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==",
+ "version": "22.9.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz",
+ "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==",
"dependencies": {
- "undici-types": "~5.26.4"
+ "undici-types": "~6.19.8"
}
},
"node_modules/@types/nspell": {
@@ -1680,9 +1771,9 @@
}
},
"node_modules/@types/semver": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz",
- "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==",
+ "version": "7.5.8",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
"dev": true
},
"node_modules/@types/stack-utils": {
@@ -1718,16 +1809,16 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz",
- "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
+ "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.5.1",
- "@typescript-eslint/scope-manager": "6.11.0",
- "@typescript-eslint/type-utils": "6.11.0",
- "@typescript-eslint/utils": "6.11.0",
- "@typescript-eslint/visitor-keys": "6.11.0",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/type-utils": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
"debug": "^4.3.4",
"graphemer": "^1.4.0",
"ignore": "^5.2.4",
@@ -1753,15 +1844,15 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz",
- "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
+ "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
"dev": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "6.11.0",
- "@typescript-eslint/types": "6.11.0",
- "@typescript-eslint/typescript-estree": "6.11.0",
- "@typescript-eslint/visitor-keys": "6.11.0",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
"debug": "^4.3.4"
},
"engines": {
@@ -1781,13 +1872,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz",
- "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
+ "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.11.0",
- "@typescript-eslint/visitor-keys": "6.11.0"
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0"
},
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -1798,13 +1889,13 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz",
- "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
+ "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
"dev": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "6.11.0",
- "@typescript-eslint/utils": "6.11.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
"debug": "^4.3.4",
"ts-api-utils": "^1.0.1"
},
@@ -1825,9 +1916,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz",
- "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
+ "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
"dev": true,
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -1838,16 +1929,17 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz",
- "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
+ "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.11.0",
- "@typescript-eslint/visitor-keys": "6.11.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
+ "minimatch": "9.0.3",
"semver": "^7.5.4",
"ts-api-utils": "^1.0.1"
},
@@ -1864,18 +1956,42 @@
}
}
},
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/@typescript-eslint/utils": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz",
- "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
+ "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
"@types/json-schema": "^7.0.12",
"@types/semver": "^7.5.0",
- "@typescript-eslint/scope-manager": "6.11.0",
- "@typescript-eslint/types": "6.11.0",
- "@typescript-eslint/typescript-estree": "6.11.0",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
"semver": "^7.5.4"
},
"engines": {
@@ -1890,12 +2006,12 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz",
- "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==",
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
+ "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.11.0",
+ "@typescript-eslint/types": "6.21.0",
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
@@ -2172,9 +2288,9 @@
}
},
"node_modules/acorn": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -2318,6 +2434,12 @@
"node": ">=8"
}
},
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true
+ },
"node_modules/babel-jest": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
@@ -2424,27 +2546,6 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
- "node_modules/big-integer": {
- "version": "1.6.51",
- "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
- "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==",
- "dev": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/bplist-parser": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz",
- "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==",
- "dev": true,
- "dependencies": {
- "big-integer": "^1.6.44"
- },
- "engines": {
- "node": ">= 5.10.0"
- }
- },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -2521,21 +2622,6 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
},
- "node_modules/bundle-name": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz",
- "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==",
- "dev": true,
- "dependencies": {
- "run-applescript": "^5.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -2750,9 +2836,9 @@
"dev": true
},
"node_modules/crlf-normalize": {
- "version": "1.0.19",
- "resolved": "https://registry.npmjs.org/crlf-normalize/-/crlf-normalize-1.0.19.tgz",
- "integrity": "sha512-cpV1h7YwFtIA36NHtyWuMMMPGxUp6zrzxjRnFEDLh1ZH0SPNUqCWmM8RlKVycxvKHgZOxWXs3XxX/DAlBAjFzA==",
+ "version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/crlf-normalize/-/crlf-normalize-1.0.20.tgz",
+ "integrity": "sha512-h/rBerTd3YHQGfv7tNT25mfhWvRq2BBLCZZ80GFarFxf6HQGbpW6iqDL3N+HBLpjLfAdcBXfWAzVlLfHkRUQBQ==",
"dependencies": {
"ts-type": ">=2"
}
@@ -2817,162 +2903,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/default-browser": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz",
- "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==",
- "dev": true,
- "dependencies": {
- "bundle-name": "^3.0.0",
- "default-browser-id": "^3.0.0",
- "execa": "^7.1.1",
- "titleize": "^3.0.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/default-browser-id": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz",
- "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==",
- "dev": true,
- "dependencies": {
- "bplist-parser": "^0.2.0",
- "untildify": "^4.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/default-browser/node_modules/execa": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz",
- "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.1",
- "human-signals": "^4.3.0",
- "is-stream": "^3.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^5.1.0",
- "onetime": "^6.0.0",
- "signal-exit": "^3.0.7",
- "strip-final-newline": "^3.0.0"
- },
- "engines": {
- "node": "^14.18.0 || ^16.14.0 || >=18.0.0"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/default-browser/node_modules/human-signals": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
- "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
- "dev": true,
- "engines": {
- "node": ">=14.18.0"
- }
- },
- "node_modules/default-browser/node_modules/is-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
- "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/default-browser/node_modules/mimic-fn": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
- "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/default-browser/node_modules/npm-run-path": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
- "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
- "dev": true,
- "dependencies": {
- "path-key": "^4.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/default-browser/node_modules/onetime": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
- "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
- "dev": true,
- "dependencies": {
- "mimic-fn": "^4.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/default-browser/node_modules/path-key": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
- "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/default-browser/node_modules/strip-final-newline": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
- "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/define-lazy-prop": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
- "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/detect-indent": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz",
@@ -2992,9 +2922,9 @@
}
},
"node_modules/dictionary-ro": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/dictionary-ro/-/dictionary-ro-2.1.0.tgz",
- "integrity": "sha512-8wZunLH9V5gOW99O/JhePsjn4YRMp3+KlOhDpWZyzN/JTKu7Aw+bI9faHL5qR6dxUmCquPGADDYogoeYrrbEvQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dictionary-ro/-/dictionary-ro-3.0.0.tgz",
+ "integrity": "sha512-kcR0BSFq16g1jCKpn15jpyio3ztMMS+O3PK4TE8ird8XjBgSAr2RRH0VoLG4uzMG1CFQNix/cHLne1wBu3CcTg==",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -3058,14 +2988,35 @@
}
},
"node_modules/dotenv": {
- "version": "16.3.1",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
- "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
"engines": {
"node": ">=12"
},
"funding": {
- "url": "https://github.com/motdotla/dotenv?sponsor=1"
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "dev": true,
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
"node_modules/electron-to-chromium": {
@@ -3123,16 +3074,17 @@
}
},
"node_modules/eslint": {
- "version": "8.54.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz",
- "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==",
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.3",
- "@eslint/js": "8.54.0",
- "@humanwhocodes/config-array": "^0.11.13",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0",
@@ -3419,6 +3371,36 @@
"node": "^10.12.0 || >=12.0.0"
}
},
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -3448,28 +3430,73 @@
}
},
"node_modules/flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dev": true,
"dependencies": {
- "flatted": "^3.1.0",
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
"rimraf": "^3.0.2"
},
"engines": {
"node": "^10.12.0 || >=12.0.0"
}
},
+ "node_modules/flat-cache/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/flatted": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
- "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
"dev": true
},
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/fs-extra": {
- "version": "11.1.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
- "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
@@ -3598,9 +3625,9 @@
}
},
"node_modules/globals": {
- "version": "13.23.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
- "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
@@ -3688,9 +3715,9 @@
}
},
"node_modules/ignore": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
- "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"engines": {
"node": ">= 4"
@@ -3850,21 +3877,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-docker": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
- "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
- "dev": true,
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -3904,24 +3916,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-inside-container": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
- "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
- "dev": true,
- "dependencies": {
- "is-docker": "^3.0.0"
- },
- "bin": {
- "is-inside-container": "cli.js"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -3973,33 +3967,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-wsl/node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "dev": true,
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -4081,6 +4048,39 @@
"node": ">=8"
}
},
+ "node_modules/jackspeak": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz",
+ "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/jake": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
+ "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
+ "dev": true,
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/jest": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
@@ -4720,9 +4720,9 @@
}
},
"node_modules/jest-runner-eslint": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/jest-runner-eslint/-/jest-runner-eslint-2.1.2.tgz",
- "integrity": "sha512-XONe3I5YMPPyQ55EoPKk+RT59fZ/4A+NvmTCmwFLhw5+OONxGL73yojVwXZO1x2mvhH0IigknfE+mKQ5ki1RnA==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/jest-runner-eslint/-/jest-runner-eslint-2.2.1.tgz",
+ "integrity": "sha512-BSAB65hGhtr/Kmb7tSkfqFmK9LYwCMK8L1xcp+XaSToPFqr7sY1jleMZUeDhV0ITA33pW+JUCx5a02veVD2Q2w==",
"dev": true,
"dependencies": {
"chalk": "^4.0.0",
@@ -5987,6 +5987,12 @@
"node": ">=4"
}
},
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -6028,6 +6034,15 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
"node_modules/kleur": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -6104,15 +6119,12 @@
"dev": true
},
"node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz",
+ "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==",
"dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
"engines": {
- "node": ">=10"
+ "node": "20 || >=22"
}
},
"node_modules/make-dir": {
@@ -6193,6 +6205,15 @@
"node": "*"
}
},
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -6270,24 +6291,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/open": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz",
- "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==",
- "dev": true,
- "dependencies": {
- "default-browser": "^4.0.0",
- "define-lazy-prop": "^3.0.0",
- "is-inside-container": "^1.0.0",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/optionator": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
@@ -6358,6 +6361,12 @@
"node": ">=6"
}
},
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -6421,6 +6430,22 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
+ "node_modules/path-scurry": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
+ "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
@@ -6531,9 +6556,9 @@
}
},
"node_modules/prettier": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz",
- "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
"dev": true,
"bin": {
"prettier": "bin/prettier.cjs"
@@ -6559,33 +6584,29 @@
}
},
"node_modules/prettier-plugin-organize-imports": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.4.tgz",
- "integrity": "sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz",
+ "integrity": "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==",
"dev": true,
"peerDependencies": {
- "@volar/vue-language-plugin-pug": "^1.0.4",
- "@volar/vue-typescript": "^1.0.4",
"prettier": ">=2.0",
- "typescript": ">=2.9"
+ "typescript": ">=2.9",
+ "vue-tsc": "^2.1.0"
},
"peerDependenciesMeta": {
- "@volar/vue-language-plugin-pug": {
- "optional": true
- },
- "@volar/vue-typescript": {
+ "vue-tsc": {
"optional": true
}
}
},
"node_modules/prettier-plugin-packagejson": {
- "version": "2.4.6",
- "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.4.6.tgz",
- "integrity": "sha512-5JGfzkJRL0DLNyhwmiAV9mV0hZLHDwddFCs2lc9CNxOChpoWUQVe8K4qTMktmevmDlMpok2uT10nvHUyU59sNw==",
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.3.tgz",
+ "integrity": "sha512-ATMEEXr+ywls1kgrZEWl4SBPEm0uDdyDAjyNzUC0/Z8WZTD3RqbJcQDR+Dau+wYkW9KHK6zqQIsFyfn+9aduWg==",
"dev": true,
"dependencies": {
- "sort-package-json": "2.6.0",
- "synckit": "0.8.5"
+ "sort-package-json": "2.10.1",
+ "synckit": "0.9.2"
},
"peerDependencies": {
"prettier": ">= 1.16.0"
@@ -6773,33 +6794,69 @@
}
},
"node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz",
+ "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==",
"dev": true,
"dependencies": {
- "glob": "^7.1.3"
+ "glob": "^11.0.0",
+ "package-json-from-dist": "^1.0.0"
},
"bin": {
- "rimraf": "bin.js"
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/run-applescript": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz",
- "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==",
+ "node_modules/rimraf/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz",
+ "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==",
"dev": true,
"dependencies": {
- "execa": "^5.0.0"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^4.0.1",
+ "minimatch": "^10.0.0",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^2.0.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
},
"engines": {
- "node": ">=12"
+ "node": "20 || >=22"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/minimatch": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
+ "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/run-parallel": {
@@ -6826,13 +6883,10 @@
}
},
"node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
"bin": {
"semver": "bin/semver.js"
},
@@ -6862,15 +6916,15 @@
}
},
"node_modules/short-uuid": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/short-uuid/-/short-uuid-4.2.2.tgz",
- "integrity": "sha512-IE7hDSGV2U/VZoCsjctKX6l5t5ak2jE0+aeGJi3KtvjIUNuZVmHVYUjNBhmo369FIWGDtaieRaO8A83Lvwfpqw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/short-uuid/-/short-uuid-5.2.0.tgz",
+ "integrity": "sha512-296/Nzi4DmANh93iYBwT4NoYRJuHnKEzefrkSagQbTH/A6NTaB68hSPDjm5IlbI5dx9FXdmtqPcj6N5H+CPm6w==",
"dependencies": {
"any-base": "^1.1.0",
- "uuid": "^8.3.2"
+ "uuid": "^9.0.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=14"
}
},
"node_modules/signal-exit": {
@@ -6916,9 +6970,9 @@
"dev": true
},
"node_modules/sort-package-json": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.6.0.tgz",
- "integrity": "sha512-XSQ+lY9bAYA8ZsoChcEoPlgcSMaheziEp1beox1JVxy1SV4F2jSq9+h2rJ+3mC/Dhu9Ius1DLnInD5AWcsDXZw==",
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.10.1.tgz",
+ "integrity": "sha512-d76wfhgUuGypKqY72Unm5LFnMpACbdxXsLPcL27pOsSrmVqH3PztFp1uq+Z22suk15h7vXmTesuh2aEjdCqb5w==",
"dev": true,
"dependencies": {
"detect-indent": "^7.0.1",
@@ -6927,6 +6981,7 @@
"git-hooks-list": "^3.0.0",
"globby": "^13.1.2",
"is-plain-obj": "^4.1.0",
+ "semver": "^7.6.0",
"sort-object-keys": "^1.1.3"
},
"bin": {
@@ -7054,6 +7109,21 @@
"node": ">=8"
}
},
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -7066,6 +7136,19 @@
"node": ">=8"
}
},
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-bom": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
@@ -7120,13 +7203,13 @@
}
},
"node_modules/synckit": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz",
- "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==",
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
+ "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
"dev": true,
"dependencies": {
- "@pkgr/utils": "^2.3.1",
- "tslib": "^2.5.0"
+ "@pkgr/core": "^0.1.0",
+ "tslib": "^2.6.2"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -7161,18 +7244,6 @@
"integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
"dev": true
},
- "node_modules/titleize": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz",
- "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -7217,40 +7288,42 @@
}
},
"node_modules/ts-api-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz",
- "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz",
+ "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==",
"dev": true,
"engines": {
- "node": ">=16.13.0"
+ "node": ">=16"
},
"peerDependencies": {
"typescript": ">=4.2.0"
}
},
"node_modules/ts-jest": {
- "version": "29.1.1",
- "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz",
- "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==",
+ "version": "29.2.5",
+ "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz",
+ "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==",
"dev": true,
"dependencies": {
- "bs-logger": "0.x",
- "fast-json-stable-stringify": "2.x",
+ "bs-logger": "^0.2.6",
+ "ejs": "^3.1.10",
+ "fast-json-stable-stringify": "^2.1.0",
"jest-util": "^29.0.0",
"json5": "^2.2.3",
- "lodash.memoize": "4.x",
- "make-error": "1.x",
- "semver": "^7.5.3",
- "yargs-parser": "^21.0.1"
+ "lodash.memoize": "^4.1.2",
+ "make-error": "^1.3.6",
+ "semver": "^7.6.3",
+ "yargs-parser": "^21.1.1"
},
"bin": {
"ts-jest": "cli.js"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0"
},
"peerDependencies": {
"@babel/core": ">=7.0.0-beta.0 <8",
+ "@jest/transform": "^29.0.0",
"@jest/types": "^29.0.0",
"babel-jest": "^29.0.0",
"jest": "^29.0.0",
@@ -7260,6 +7333,9 @@
"@babel/core": {
"optional": true
},
+ "@jest/transform": {
+ "optional": true
+ },
"@jest/types": {
"optional": true
},
@@ -7272,9 +7348,9 @@
}
},
"node_modules/ts-node": {
- "version": "10.9.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
- "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
"dev": true,
"dependencies": {
"@cspotcode/source-map-support": "^0.8.0",
@@ -7334,9 +7410,9 @@
}
},
"node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
},
"node_modules/type-check": {
"version": "0.4.0",
@@ -7390,9 +7466,9 @@
}
},
"node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
},
"node_modules/unified": {
"version": "10.1.2",
@@ -7434,15 +7510,6 @@
"node": ">= 10.0.0"
}
},
- "node_modules/untildify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
- "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/update-browserslist-db": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
@@ -7483,9 +7550,13 @@
}
},
"node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
"bin": {
"uuid": "dist/bin/uuid"
}
@@ -7591,6 +7662,24 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -7619,12 +7708,6 @@
"node": ">=10"
}
},
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
"node_modules/yaml": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
diff --git a/package.json b/package.json
index 74db05318..61238d1b5 100644
--- a/package.json
+++ b/package.json
@@ -9,27 +9,27 @@
"@types/nspell": "^2.1.6",
"@types/string-similarity": "^4.0.2",
"chalk": "^4.1.2",
- "crlf-normalize": "^1.0.19",
- "dictionary-ro": "^2.1.0",
- "dotenv": "^16.3.1",
- "fs-extra": "^11.1.1",
+ "crlf-normalize": "^1.0.20",
+ "dictionary-ro": "^3.0.0",
+ "dotenv": "^16.4.5",
+ "fs-extra": "^11.2.0",
"iconv": "^3.0.1",
"is-ci": "^3.0.1",
"lodash-es": "^4.17.21",
"nspell": "^2.1.5",
"p-map": "^4.0.0",
"recursive-readdir": "^2.2.3",
- "short-uuid": "^4.2.2",
+ "short-uuid": "^5.2.0",
"string-similarity": "^4.0.4"
},
"devDependencies": {
- "@tsconfig/node-lts": "^18.12.5",
+ "@tsconfig/node-lts": "^22.0.0",
"@types/fs-extra": "^11.0.4",
"@types/iconv": "^3.0.4",
- "@types/jest": "^29.5.8",
- "@types/lodash": "^4.14.201",
- "@types/lodash-es": "^4.17.11",
- "@types/node": "^20.9.2",
+ "@types/jest": "^29.5.14",
+ "@types/lodash": "^4.17.13",
+ "@types/lodash-es": "^4.17.12",
+ "@types/node": "^22.9.0",
"@types/recursive-readdir": "^2.2.4",
"@typescript-eslint/eslint-plugin": "^6.11.0",
"@typescript-eslint/parser": "^6.11.0",
@@ -37,22 +37,23 @@
"eslint-plugin-require-extensions": "^0.1.3",
"is-ci-cli": "^2.2.0",
"jest": "^29.7.0",
- "jest-runner-eslint": "^2.1.2",
+ "jest-runner-eslint": "^2.2.1",
"jest-snapshot": "^29.7.0",
"jest-watch-typeahead": "^2.2.2",
"lodash": "^4.17.21",
- "prettier": "^3.1.0",
+ "prettier": "^3.3.3",
"prettier-plugin-latex": "^2.0.1",
- "prettier-plugin-organize-imports": "^3.2.4",
- "prettier-plugin-packagejson": "^2.4.6",
- "ts-jest": "^29.1.1",
- "ts-node": "^10.9.1",
- "tslib": "^2.6.2",
+ "prettier-plugin-organize-imports": "^4.1.0",
+ "prettier-plugin-packagejson": "^2.5.3",
+ "rimraf": "^6.0.1",
+ "ts-jest": "^29.2.5",
+ "ts-node": "^10.9.2",
+ "tslib": "^2.8.1",
"typescript": "5.1.6"
},
"type": "module",
"scripts": {
- "format": "node --no-warnings=ExperimentalWarning --loader ts-node/esm ./node_modules/.bin/prettier --log-level error --write \"./verified/**/*.txt\" {src,bin,mocks,temp-runners}/**/*.ts README.md \"./LaTeX/**/*.tex\"",
+ "format": "node --no-warnings=ExperimentalWarning --loader ts-node/esm ./node_modules/.bin/prettier --log-level error --write \"./verified/**/*.txt\" {src,bin,mocks,import-songs-temp-runners}/**/*.ts README.md \"./LaTeX/**/*.tex\"",
"test:ci": "NODE_ENV=test jest --runInBand --no-cache",
"test:watch": "NODE_ENV=test TZ='Europe/Berlin' jest --watch --logHeapUsage --no-cache",
"test": "is-ci-cli test:ci test:watch",
@@ -69,10 +70,16 @@
"dictionary:update": "node --no-warnings=ExperimentalWarning --loader ts-node/esm ./bin/lyricsRomanianDictionaryAnalyzer.ts --saveToDictionary",
"reprocess:content": "node --no-warnings=ExperimentalWarning --loader ts-node/esm ./bin/lyricsTextReprocessorRunner.ts",
"reprocess:filename": "node --no-warnings=ExperimentalWarning --loader ts-node/esm ./bin/lyricsFileNameReprocessorRunner.ts",
- "import:rc:by-authors": "node --no-warnings=ExperimentalWarning --loader ts-node/esm ./temp-runners/importSongsFromRcByAuthors.ts",
- "import:rc:by-ids": "node --no-warnings=ExperimentalWarning --loader ts-node/esm ./temp-runners/importSongsFromRcByIds.ts",
+ "import:rc:by-authors": "node --no-warnings=ExperimentalWarning --loader ts-node/esm ./import-songs-temp-runners/importSongsFromRcByAuthors.ts",
+ "import:rc:by-ids": "node --no-warnings=ExperimentalWarning --loader ts-node/esm ./import-songs-temp-runners/importSongsFromRcByIds.ts",
"import:rc:ci": "npm run import:rc:by-authors && npm run import:rc:by-ids && npm run reprocess:filename && npm run format",
"build:ci": "npm run lint && npm run test && npm run verify:file-extensions && npm run verify:uniqueness-of-ids && npm run verify",
- "meta:ci": "npm run verify:file-extensions && npm run verify:uniqueness-of-ids && npm run reprocess:filename && npm run reprocess:content && npm run verify && npm run format"
+ "meta:ci": "npm run verify:file-extensions && npm run verify:uniqueness-of-ids && npm run reprocess:filename && npm run reprocess:content && npm run verify && npm run format",
+ "songbook:clean:aux": "latexmk -xelatex -quiet -output-directory=./LaTeX/songbook/ ./LaTeX/songbook/bes-songbook.tex -c",
+ "songbook:clean:all": "latexmk -xelatex -quiet -output-directory=./LaTeX/songbook/ ./LaTeX/songbook/bes-songbook.tex -C",
+ "songbook:convert": "rimraf ./LaTeX/songbook/target-tex && node --no-warnings=ExperimentalWarning --loader ts-node/esm ./LaTeX/songbook/convertToSongbookTex.ts",
+ "songbook:compile": "npm run songbook:clean:all && latexmk -pdf -xelatex -quiet -interaction=nonstopmode -output-directory=./LaTeX/songbook/ ./LaTeX/songbook/bes-songbook.tex -gg -f",
+ "songbook:compile:watch": "npm run songbook:clean:all && latexmk -pdf -xelatex -quiet -interaction=nonstopmode -output-directory=./LaTeX/songbook/ ./LaTeX/songbook/bes-songbook.tex --preview -gg -f",
+ "songbook:dist": "npm run songbook:convert && npm run songbook:clean:all && npm run songbook:compile"
}
}
diff --git a/src/constants.ts b/src/constants.ts
index e391cbf0a..ddc20db36 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -1,6 +1,6 @@
export const EMPTY_STRING = '';
-export const EMPTY_SPACE = ' ';
+export const SPACE_CHAR = ' ';
export const NAME_SEPARATOR = ' - ';
@@ -18,7 +18,10 @@ export const SLASH = '/';
export const DOT = '.';
+export const TEX_MUSICAL_NOTATIONS = '^';
+
export const TXT_EXTENSION = '.txt';
+export const TEX_EXTENSION = '.tex';
export const DS_STORE_FILE = '.DS_Store';
export const GIT_KEEP_FILE = '.gitkeep';
@@ -32,8 +35,6 @@ export const ALLOWED_CHARS =
export const NEW_LINE = '\n';
-export const NEW_LINE_TUPLE = `${NEW_LINE}`;
-
export const DOUBLE_LINE_TUPLE = `${NEW_LINE}${NEW_LINE}`;
export const CHARS_SEPARATORS = /[ !(),./:;?”„\n]+/;
diff --git a/src/core.ts b/src/core.ts
index 5a20b4a6f..ea39d186a 100644
--- a/src/core.ts
+++ b/src/core.ts
@@ -1,6 +1,7 @@
import chalk from 'chalk';
import * as crypto from 'crypto';
import {
+ constant,
filter,
first,
flattenDeep,
@@ -8,6 +9,7 @@ import {
isEqual,
last,
parseInt,
+ range,
size,
trim,
uniq,
@@ -20,10 +22,10 @@ import {
COLON,
COMMA,
DOUBLE_LINE_TUPLE,
- EMPTY_SPACE,
EMPTY_STRING,
- NEW_LINE_TUPLE,
+ NEW_LINE,
SEMICOLON,
+ SPACE_CHAR,
TEST_ENV,
TXT_EXTENSION,
} from './constants.js';
@@ -140,7 +142,7 @@ My custom title: {ANY_alternative}, arranger: {ANY_arranger}, band: {ANY_band},
${desiredSequence.join(COMMA)}
${desiredSections
- .map((sequence) => `[${sequence}]${NEW_LINE_TUPLE}Content for ${sequence}`)
+ .map((sequence) => `[${sequence}]${NEW_LINE}Content for ${sequence}`)
.join(DOUBLE_LINE_TUPLE)}`;
export const createAdvancedSongMock = (
@@ -157,7 +159,7 @@ ${
}
${tuples
- .map(([sequence, content]) => `[${sequence}]${NEW_LINE_TUPLE}${content}`)
+ .map(([sequence, content]) => `[${sequence}]${NEW_LINE}${content}`)
.join(DOUBLE_LINE_TUPLE)}`;
export const convertSequenceToNumber = (sequenceOrderQualifier: string) =>
@@ -194,9 +196,12 @@ export const getMetaSectionsFromTitle = (titleContent: string) => {
};
export const multiToSingle = (text: string) =>
- text?.split(SEMICOLON)?.map(trim).join(`${SEMICOLON}${EMPTY_SPACE}`);
+ text?.split(SEMICOLON)?.map(trim).join(`${SEMICOLON}${SPACE_CHAR}`);
export const readTxtFilesRecursively = async (dir: string) =>
(await recursive(dir)).filter((filePath) =>
isEqual(TXT_EXTENSION, path.extname(filePath)),
);
+
+export const padForTex = (chars: number) => (content?: string) =>
+ `${range(0, chars).map(constant(SPACE_CHAR)).join(EMPTY_STRING)}${content}`;
diff --git a/src/index.ts b/src/index.ts
index 18c9da5fc..6d14fafdf 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -7,4 +7,5 @@ export * from './core.js';
export * as lyricsFileNameReprocessor from './lyricsFileNameReprocessor.js';
export * from './songParser.js';
export * from './songPrinter.js';
+export * as songToLeadsheetConverter from './songToLeadsheetConverter.js';
export * from './types.js';
diff --git a/src/songParser.spec.ts b/src/songParser.spec.ts
index bf577b9da..d41074d55 100644
--- a/src/songParser.spec.ts
+++ b/src/songParser.spec.ts
@@ -46,58 +46,72 @@ describe('Song parser', () => {
"[b2]": {
"content": "Row for b2",
"sectionIdentifier": "[b2]",
+ "sectionSequenceType": "b",
},
"[b3]": {
"content": "Row for b3",
"sectionIdentifier": "[b3]",
+ "sectionSequenceType": "b",
},
"[b]": {
"content": "Row for b",
"sectionIdentifier": "[b]",
+ "sectionSequenceType": "b",
},
"[c2]": {
"content": "Row for c2",
"sectionIdentifier": "[c2]",
+ "sectionSequenceType": "c",
},
"[c3]": {
"content": "Row for c3",
"sectionIdentifier": "[c3]",
+ "sectionSequenceType": "c",
},
"[c]": {
"content": "Row for c",
"sectionIdentifier": "[c]",
+ "sectionSequenceType": "c",
},
"[p2]": {
"content": "Row for p2",
"sectionIdentifier": "[p2]",
+ "sectionSequenceType": "p",
},
"[p3]": {
"content": "Row for p3",
"sectionIdentifier": "[p3]",
+ "sectionSequenceType": "p",
},
"[p]": {
"content": "Row for p",
"sectionIdentifier": "[p]",
+ "sectionSequenceType": "p",
},
"[sequence]": {
"content": "v1,v2,v3,p,p2,p3,c,c2,c3,b,b2,b3",
"sectionIdentifier": "[sequence]",
+ "sectionSequenceType": "s",
},
"[title]": {
"content": "My main title {alternative: { alternative 1; alternative 2 }, composer: {composer 1; composer 2}, writer: {writer 1; writer 2}, arranger: {arranger 1;arranger 2}, interpreter: {interpreter 1;interpreter 2}, band: {band 1;band 2}, key: {*}, tempo: {*}, tags: {tags 1; tags 2}, version: {ii}, genre: {genre 1; genre 2}, rcId: {*}, id: {7RURbpko41pWYEgVkHD4Pq}, contentHash: {655954}}",
"sectionIdentifier": "[title]",
+ "sectionSequenceType": "",
},
"[v1]": {
"content": "Row for v1",
"sectionIdentifier": "[v1]",
+ "sectionSequenceType": "v",
},
"[v2]": {
"content": "Row for v2",
"sectionIdentifier": "[v2]",
+ "sectionSequenceType": "v",
},
"[v3]": {
"content": "Row for v3",
"sectionIdentifier": "[v3]",
+ "sectionSequenceType": "v",
},
},
"sequence": [
@@ -155,58 +169,72 @@ describe('Song parser', () => {
"[b2]": {
"content": "Row for b2",
"sectionIdentifier": "[b2]",
+ "sectionSequenceType": "b",
},
"[b3]": {
"content": "Row for b3",
"sectionIdentifier": "[b3]",
+ "sectionSequenceType": "b",
},
"[b]": {
"content": "Row for b",
"sectionIdentifier": "[b]",
+ "sectionSequenceType": "b",
},
"[c2]": {
"content": "Row for c2",
"sectionIdentifier": "[c2]",
+ "sectionSequenceType": "c",
},
"[c3]": {
"content": "Row for c3",
"sectionIdentifier": "[c3]",
+ "sectionSequenceType": "c",
},
"[c]": {
"content": "Row for c",
"sectionIdentifier": "[c]",
+ "sectionSequenceType": "c",
},
"[p2]": {
"content": "Row for p2",
"sectionIdentifier": "[p2]",
+ "sectionSequenceType": "p",
},
"[p3]": {
"content": "Row for p3",
"sectionIdentifier": "[p3]",
+ "sectionSequenceType": "p",
},
"[p]": {
"content": "Row for p",
"sectionIdentifier": "[p]",
+ "sectionSequenceType": "p",
},
"[sequence]": {
"content": "v1,v2,v3,p,p2,p3,c,c2,c3,b,b2,b3",
"sectionIdentifier": "[sequence]",
+ "sectionSequenceType": "s",
},
"[title]": {
"content": "My main title {alternative: { alternative 1; alternative 2 }, composer: {composer 1; composer 2}, writer: {writer 1; writer 2}, arranger: {arranger 1;arranger 2}, interpreter: {interpreter 1;interpreter 2}, band: {band 1;band 2}, key: {*}, tempo: {*}, tags: {tags 1; tags 2}, version: {ii}, genre: {genre 1; genre 2}, rcId: {*}, id: {*}, contentHash: {655954}}",
"sectionIdentifier": "[title]",
+ "sectionSequenceType": "",
},
"[v1]": {
"content": "Row for v1",
"sectionIdentifier": "[v1]",
+ "sectionSequenceType": "v",
},
"[v2]": {
"content": "Row for v2",
"sectionIdentifier": "[v2]",
+ "sectionSequenceType": "v",
},
"[v3]": {
"content": "Row for v3",
"sectionIdentifier": "[v3]",
+ "sectionSequenceType": "v",
},
},
"sequence": [
@@ -261,6 +289,7 @@ Să se-aprindă-n adunare
Jertfa laudei de-nchinare
Ca pe muntele cel Sfânt!",
"sectionIdentifier": "[c1.1]",
+ "sectionSequenceType": "c",
},
"[c1.2]": {
"content": "Să cunoască fiecare
@@ -268,14 +297,17 @@ Că Tu ești în adunare
Și-nsoțești a Ta lucrare
Cu puteri prin Duhul Sfânt! :/",
"sectionIdentifier": "[c1.2]",
+ "sectionSequenceType": "c",
},
"[sequence]": {
"content": "v1.1,v1.2,c1.1,c1.2,v2.1,v2.2,c1.1,c1.2",
"sectionIdentifier": "[sequence]",
+ "sectionSequenceType": "s",
},
"[title]": {
"content": "My custom title {version: {ii}, alternative: {Când eram fără speranță}, composer: {Betania Dublin}, contentHash: {cd856b}, id: {7RURbpko41pWYEgVkHD4Pq}}",
"sectionIdentifier": "[title]",
+ "sectionSequenceType": "",
},
"[v1.1]": {
"content": "Aici să fie casa Celui veșnic Sfânt,
@@ -283,6 +315,7 @@ Aici s-aducem laudă și-nchinare,
Acelui care este veșnic viu și Sfânt
Și merită doar cinste și onoare!",
"sectionIdentifier": "[v1.1]",
+ "sectionSequenceType": "v",
},
"[v1.2]": {
"content": "Aici să fie casa unde frații mei
@@ -290,6 +323,7 @@ Cădea-vor în genunchi în fața Ta,
Cu mâinile întinse către ceruri, ei
Un legământ cu Tine vor avea!",
"sectionIdentifier": "[v1.2]",
+ "sectionSequenceType": "v",
},
"[v2.1]": {
"content": "Aici să fie casa unde ochii Tăi,
@@ -297,6 +331,7 @@ Zi și noapte, zilnic, vor privi,
Aici să fie casa unde frații mei
Cu rugăciuni, cu laude, vor veni!",
"sectionIdentifier": "[v2.1]",
+ "sectionSequenceType": "v",
},
"[v2.2]": {
"content": "Atunci când va veni aici străinul,
@@ -304,6 +339,96 @@ Din pricina Numelui Tău Sfânt,
Să fie ascultat, să-i dai alinul,
Că Tu ești Dumnezeu și Tu ești Sfânt!",
"sectionIdentifier": "[v2.2]",
+ "sectionSequenceType": "v",
+ },
+ },
+ "sequence": [
+ "v1.1",
+ "v1.2",
+ "c1.1",
+ "c1.2",
+ "v2.1",
+ "v2.2",
+ "c1.1",
+ "c1.2",
+ ],
+ "tags": "*",
+ "tempo": "*",
+ "title": "My custom title",
+ "version": "ii",
+ "writer": "*",
+}
+`);
+ });
+
+ it('should parse a song (w/ subsections) by un-split them correctly (when option is set)', () => {
+ expect(
+ parse(SONG_WITH_SUBSECTIONS_MOCK_FILE_CONTENT, {
+ rejoinSubsections: true
+ })
+).toMatchInlineSnapshot(`
+{
+ "alternative": "Când eram fără speranță",
+ "arranger": "*",
+ "band": "*",
+ "composer": "Betania Dublin",
+ "contentHash": "085aa8",
+ "genre": "*",
+ "id": "7RURbpko41pWYEgVkHD4Pq",
+ "interpreter": "*",
+ "key": "*",
+ "rcId": "*",
+ "sectionOrder": [
+ "[v1]",
+ "[c1]",
+ "[v2]",
+ ],
+ "sectionsMap": {
+ "[c1]": {
+ "content": "/: Din cântare în cântare,
+Să se-aprindă-n adunare
+Jertfa laudei de-nchinare
+Ca pe muntele cel Sfânt!
+Să cunoască fiecare
+Că Tu ești în adunare
+Și-nsoțești a Ta lucrare
+Cu puteri prin Duhul Sfânt! :/",
+ "sectionIdentifier": "[c1]",
+ "sectionSequenceType": "c",
+ },
+ "[sequence]": {
+ "content": "v1.1,v1.2,c1.1,c1.2,v2.1,v2.2,c1.1,c1.2",
+ "sectionIdentifier": "[sequence]",
+ "sectionSequenceType": "s",
+ },
+ "[title]": {
+ "content": "My custom title {version: {ii}, alternative: {Când eram fără speranță}, composer: {Betania Dublin}, contentHash: {cd856b}, id: {7RURbpko41pWYEgVkHD4Pq}}",
+ "sectionIdentifier": "[title]",
+ "sectionSequenceType": "",
+ },
+ "[v1]": {
+ "content": "Aici să fie casa Celui veșnic Sfânt,
+Aici s-aducem laudă și-nchinare,
+Acelui care este veșnic viu și Sfânt
+Și merită doar cinste și onoare!
+Aici să fie casa unde frații mei
+Cădea-vor în genunchi în fața Ta,
+Cu mâinile întinse către ceruri, ei
+Un legământ cu Tine vor avea!",
+ "sectionIdentifier": "[v1]",
+ "sectionSequenceType": "v",
+ },
+ "[v2]": {
+ "content": "Aici să fie casa unde ochii Tăi,
+Zi și noapte, zilnic, vor privi,
+Aici să fie casa unde frații mei
+Cu rugăciuni, cu laude, vor veni!
+Atunci când va veni aici străinul,
+Din pricina Numelui Tău Sfânt,
+Să fie ascultat, să-i dai alinul,
+Că Tu ești Dumnezeu și Tu ești Sfânt!",
+ "sectionIdentifier": "[v2]",
+ "sectionSequenceType": "v",
},
},
"sequence": [
@@ -348,14 +473,17 @@ Că Tu ești Dumnezeu și Tu ești Sfânt!",
"[sequence]": {
"content": "v1,c",
"sectionIdentifier": "[sequence]",
+ "sectionSequenceType": "s",
},
"[title]": {
"content": "My custom title {version: {ii}, alternative: {Când eram fără speranță}, composer: {Betania Dublin}, contentHash: {cd856b}, id: {7RURbpko41pWYEgVkHD4Pq}}",
"sectionIdentifier": "[title]",
+ "sectionSequenceType": "",
},
"[v1]": {
"content": "Row 1",
"sectionIdentifier": "[v1]",
+ "sectionSequenceType": "v",
},
},
"sequence": [
@@ -403,58 +531,72 @@ Că Tu ești Dumnezeu și Tu ești Sfânt!",
"[b2]": {
"content": "Row for b2",
"sectionIdentifier": "[b2]",
+ "sectionSequenceType": "b",
},
"[b3]": {
"content": "Row for b3",
"sectionIdentifier": "[b3]",
+ "sectionSequenceType": "b",
},
"[b]": {
"content": "Row for b",
"sectionIdentifier": "[b]",
+ "sectionSequenceType": "b",
},
"[c2]": {
"content": "Row for c2",
"sectionIdentifier": "[c2]",
+ "sectionSequenceType": "c",
},
"[c3]": {
"content": "Row for c3",
"sectionIdentifier": "[c3]",
+ "sectionSequenceType": "c",
},
"[c]": {
"content": "Row for c",
"sectionIdentifier": "[c]",
+ "sectionSequenceType": "c",
},
"[p2]": {
"content": "Row for p2",
"sectionIdentifier": "[p2]",
+ "sectionSequenceType": "p",
},
"[p3]": {
"content": "Row for p3",
"sectionIdentifier": "[p3]",
+ "sectionSequenceType": "p",
},
"[p]": {
"content": "Row for p",
"sectionIdentifier": "[p]",
+ "sectionSequenceType": "p",
},
"[sequence]": {
"content": "v1",
"sectionIdentifier": "[sequence]",
+ "sectionSequenceType": "s",
},
"[title]": {
"content": "My custom title {version: {ii}, alternative: {Când eram fără speranță}, composer: {Betania Dublin}, contentHash: {cd856b}, id: {7RURbpko41pWYEgVkHD4Pq}}",
"sectionIdentifier": "[title]",
+ "sectionSequenceType": "",
},
"[v1]": {
"content": "Row for v1",
"sectionIdentifier": "[v1]",
+ "sectionSequenceType": "v",
},
"[v2]": {
"content": "Row for v2",
"sectionIdentifier": "[v2]",
+ "sectionSequenceType": "v",
},
"[v3]": {
"content": "Row for v3",
"sectionIdentifier": "[v3]",
+ "sectionSequenceType": "v",
},
},
"sequence": [
@@ -533,14 +675,17 @@ Că Tu ești Dumnezeu și Tu ești Sfânt!",
"[sequence]": {
"content": "v1",
"sectionIdentifier": "[sequence]",
+ "sectionSequenceType": "s",
},
"[title]": {
"content": "My custom title: {ANY_alternative}, arranger: {ANY_arranger}, band: {ANY_band}, composer: {ANY_composer}, contentHash: {ANY_contentHash}, genre: {ANY_genre}, id: {ANY_id}, interpreter: {ANY_interpreter}, key: {ANY_key}, rcId: {ANY_rcId}, tags: {ANY_tags}, tempo: {ANY_tempo}, version: {ANY_version}, writer: {ANY_writer}",
"sectionIdentifier": "[title]",
+ "sectionSequenceType": "",
},
"[v1]": {
"content": "*_{}&!()][\\,-./1234567890:;?ABCDEFGHIJKLMNOPRSTUVWXZYQabcdefghijklmnopqrstuvwxyzÎâîăÂȘșĂȚț‘’”„",
"sectionIdentifier": "[v1]",
+ "sectionSequenceType": "v",
},
},
"sequence": [
diff --git a/src/songParser.ts b/src/songParser.ts
index ede2c8785..b5ff4ad90 100644
--- a/src/songParser.ts
+++ b/src/songParser.ts
@@ -1,15 +1,17 @@
-import { isEqual } from 'lodash-es';
-import { COMMA, EMPTY_STRING, UNSET_META } from './constants.js';
+import { first, groupBy, isEqual, transform } from 'lodash-es';
+import { COMMA, DOT, EMPTY_STRING, NEW_LINE, UNSET_META } from './constants.js';
import {
assertUniqueness,
computeUniqueContentHash,
+ getCharWithMarkup,
+ getCharWithoutMarkup,
getMetaSectionsFromTitle,
getSongInSectionTuples,
getTitleWithoutMeta,
getUniqueId,
multiToSingle,
} from './core.js';
-import { SongAST, SongSection } from './types.js';
+import { Section, SequenceChar, SongAST, SongSection } from './types.js';
/**
* Parses the content of a song to its basic AST structure.
@@ -24,8 +26,10 @@ export const parse = (
songAsString: string,
{
ignoreUniquenessErrors,
+ rejoinSubsections,
}: {
ignoreUniquenessErrors?: boolean;
+ rejoinSubsections?: boolean;
} = {},
) => {
const sectionTuples = getSongInSectionTuples(songAsString);
@@ -51,8 +55,21 @@ export const parse = (
const sectionContent = sectionTuples[sectionIndex + 1];
const sectionIdentifier = sectionTuples[sectionIndex] as string;
+ const maybeSectionSequenceType = first(
+ getCharWithoutMarkup(sectionIdentifier)
+ .replaceAll('[^a-zA-Z0-9 -]', EMPTY_STRING)
+ .replace(DOT, EMPTY_STRING),
+ ) as SequenceChar;
+
+ const sectionSequenceType = Object.values(SequenceChar).includes(
+ maybeSectionSequenceType,
+ )
+ ? maybeSectionSequenceType
+ : (EMPTY_STRING as SequenceChar);
+
songAST.sectionsMap[sectionIdentifier] = {
sectionIdentifier,
+ sectionSequenceType,
content: sectionContent,
};
@@ -115,5 +132,34 @@ export const parse = (
assertUniqueness(songAST.sectionOrder);
}
+ if (rejoinSubsections) {
+ songAST.sectionsMap = transform(
+ groupBy(songAST.sectionsMap, (sequence) => {
+ if (!sequence.sectionIdentifier.includes(DOT)) {
+ return sequence.sectionIdentifier;
+ }
+
+ return getCharWithMarkup(
+ first(
+ getCharWithoutMarkup(sequence.sectionIdentifier).split(DOT),
+ ) as string,
+ );
+ }),
+ (acc, value, key) => {
+ acc[key] = {
+ sectionIdentifier: key,
+ sectionSequenceType: first(value)?.sectionSequenceType,
+ content: value.map(({ content }) => content).join(NEW_LINE),
+ } as Section;
+ },
+ {} as Record,
+ );
+
+ songAST.sectionOrder = Object.keys(songAST.sectionsMap).filter(
+ (sectionIdentifier) =>
+ ![SongSection.TITLE, SongSection.SEQUENCE].includes(sectionIdentifier),
+ );
+ }
+
return songAST;
};
diff --git a/src/songPrinter.spec.ts b/src/songPrinter.spec.ts
index 620b3df51..0c39d6431 100644
--- a/src/songPrinter.spec.ts
+++ b/src/songPrinter.spec.ts
@@ -61,94 +61,102 @@ describe('songPrinter', () => {
const parsedSong = parse(SONG_WITH_SUBSECTIONS_MOCK_FILE_CONTENT);
expect(parsedSong).toMatchInlineSnapshot(`
- {
- "alternative": "Când eram fără speranță",
- "arranger": "*",
- "band": "*",
- "composer": "Betania Dublin",
- "contentHash": "085aa8",
- "genre": "*",
- "id": "7RURbpko41pWYEgVkHD4Pq",
- "interpreter": "*",
- "key": "*",
- "rcId": "*",
- "sectionOrder": [
- "[v1.1]",
- "[v1.2]",
- "[c1.1]",
- "[c1.2]",
- "[v2.1]",
- "[v2.2]",
- ],
- "sectionsMap": {
- "[c1.1]": {
- "content": "/: Din cântare în cântare,
- Să se-aprindă-n adunare
- Jertfa laudei de-nchinare
- Ca pe muntele cel Sfânt!",
- "sectionIdentifier": "[c1.1]",
- },
- "[c1.2]": {
- "content": "Să cunoască fiecare
- Că Tu ești în adunare
- Și-nsoțești a Ta lucrare
- Cu puteri prin Duhul Sfânt! :/",
- "sectionIdentifier": "[c1.2]",
- },
- "[sequence]": {
- "content": "v1.1,v1.2,c1.1,c1.2,v2.1,v2.2,c1.1,c1.2",
- "sectionIdentifier": "[sequence]",
- },
- "[title]": {
- "content": "My custom title {version: {ii}, alternative: {Când eram fără speranță}, composer: {Betania Dublin}, contentHash: {cd856b}, id: {7RURbpko41pWYEgVkHD4Pq}}",
- "sectionIdentifier": "[title]",
- },
- "[v1.1]": {
- "content": "Aici să fie casa Celui veșnic Sfânt,
- Aici s-aducem laudă și-nchinare,
- Acelui care este veșnic viu și Sfânt
- Și merită doar cinste și onoare!",
- "sectionIdentifier": "[v1.1]",
- },
- "[v1.2]": {
- "content": "Aici să fie casa unde frații mei
- Cădea-vor în genunchi în fața Ta,
- Cu mâinile întinse către ceruri, ei
- Un legământ cu Tine vor avea!",
- "sectionIdentifier": "[v1.2]",
- },
- "[v2.1]": {
- "content": "Aici să fie casa unde ochii Tăi,
- Zi și noapte, zilnic, vor privi,
- Aici să fie casa unde frații mei
- Cu rugăciuni, cu laude, vor veni!",
- "sectionIdentifier": "[v2.1]",
- },
- "[v2.2]": {
- "content": "Atunci când va veni aici străinul,
- Din pricina Numelui Tău Sfânt,
- Să fie ascultat, să-i dai alinul,
- Că Tu ești Dumnezeu și Tu ești Sfânt!",
- "sectionIdentifier": "[v2.2]",
- },
- },
- "sequence": [
- "v1.1",
- "v1.2",
- "c1.1",
- "c1.2",
- "v2.1",
- "v2.2",
- "c1.1",
- "c1.2",
- ],
- "tags": "*",
- "tempo": "*",
- "title": "My custom title",
- "version": "ii",
- "writer": "*",
- }
- `);
+{
+ "alternative": "Când eram fără speranță",
+ "arranger": "*",
+ "band": "*",
+ "composer": "Betania Dublin",
+ "contentHash": "085aa8",
+ "genre": "*",
+ "id": "7RURbpko41pWYEgVkHD4Pq",
+ "interpreter": "*",
+ "key": "*",
+ "rcId": "*",
+ "sectionOrder": [
+ "[v1.1]",
+ "[v1.2]",
+ "[c1.1]",
+ "[c1.2]",
+ "[v2.1]",
+ "[v2.2]",
+ ],
+ "sectionsMap": {
+ "[c1.1]": {
+ "content": "/: Din cântare în cântare,
+Să se-aprindă-n adunare
+Jertfa laudei de-nchinare
+Ca pe muntele cel Sfânt!",
+ "sectionIdentifier": "[c1.1]",
+ "sectionSequenceType": "c",
+ },
+ "[c1.2]": {
+ "content": "Să cunoască fiecare
+Că Tu ești în adunare
+Și-nsoțești a Ta lucrare
+Cu puteri prin Duhul Sfânt! :/",
+ "sectionIdentifier": "[c1.2]",
+ "sectionSequenceType": "c",
+ },
+ "[sequence]": {
+ "content": "v1.1,v1.2,c1.1,c1.2,v2.1,v2.2,c1.1,c1.2",
+ "sectionIdentifier": "[sequence]",
+ "sectionSequenceType": "s",
+ },
+ "[title]": {
+ "content": "My custom title {version: {ii}, alternative: {Când eram fără speranță}, composer: {Betania Dublin}, contentHash: {cd856b}, id: {7RURbpko41pWYEgVkHD4Pq}}",
+ "sectionIdentifier": "[title]",
+ "sectionSequenceType": "",
+ },
+ "[v1.1]": {
+ "content": "Aici să fie casa Celui veșnic Sfânt,
+Aici s-aducem laudă și-nchinare,
+Acelui care este veșnic viu și Sfânt
+Și merită doar cinste și onoare!",
+ "sectionIdentifier": "[v1.1]",
+ "sectionSequenceType": "v",
+ },
+ "[v1.2]": {
+ "content": "Aici să fie casa unde frații mei
+Cădea-vor în genunchi în fața Ta,
+Cu mâinile întinse către ceruri, ei
+Un legământ cu Tine vor avea!",
+ "sectionIdentifier": "[v1.2]",
+ "sectionSequenceType": "v",
+ },
+ "[v2.1]": {
+ "content": "Aici să fie casa unde ochii Tăi,
+Zi și noapte, zilnic, vor privi,
+Aici să fie casa unde frații mei
+Cu rugăciuni, cu laude, vor veni!",
+ "sectionIdentifier": "[v2.1]",
+ "sectionSequenceType": "v",
+ },
+ "[v2.2]": {
+ "content": "Atunci când va veni aici străinul,
+Din pricina Numelui Tău Sfânt,
+Să fie ascultat, să-i dai alinul,
+Că Tu ești Dumnezeu și Tu ești Sfânt!",
+ "sectionIdentifier": "[v2.2]",
+ "sectionSequenceType": "v",
+ },
+ },
+ "sequence": [
+ "v1.1",
+ "v1.2",
+ "c1.1",
+ "c1.2",
+ "v2.1",
+ "v2.2",
+ "c1.1",
+ "c1.2",
+ ],
+ "tags": "*",
+ "tempo": "*",
+ "title": "My custom title",
+ "version": "ii",
+ "writer": "*",
+}
+`);
expect(print(parsedSong)).toMatchInlineSnapshot(`
"[title]
diff --git a/src/songPrinter.ts b/src/songPrinter.ts
index b0751c609..f8ec00e45 100644
--- a/src/songPrinter.ts
+++ b/src/songPrinter.ts
@@ -15,9 +15,9 @@ import {
COMMA,
DOT,
DOUBLE_LINE_TUPLE,
- EMPTY_SPACE,
- NEW_LINE_TUPLE,
+ NEW_LINE,
NULL,
+ SPACE_CHAR,
} from './constants.js';
import {
assertUniqueness,
@@ -52,7 +52,7 @@ const getContentAndSequenceSplitInSubSections = (
subSectionSequence.push(subSectionIdentifier);
return [getCharWithMarkup(subSectionIdentifier), subSections[index]].join(
- NEW_LINE_TUPLE,
+ NEW_LINE,
);
}),
).join(DOUBLE_LINE_TUPLE);
@@ -81,7 +81,7 @@ const getContentAndSequenceUnSplit = (
const updatedSongSectionContent = [
identifierWitMarkup,
songSectionContent,
- ].join(NEW_LINE_TUPLE);
+ ].join(NEW_LINE);
const updatedSequence = existingSequence.map((sequenceIteratee) => {
if (isEqual(sequenceIteratee, verseSongSectionIdentifierWithoutMarkup)) {
@@ -175,9 +175,7 @@ export const print = ({
// ---
// If no split is required
if (!hasContentThatCouldBeSubSections) {
- return [verseSongSectionIdentifier, songSectionContent].join(
- NEW_LINE_TUPLE,
- );
+ return [verseSongSectionIdentifier, songSectionContent].join(NEW_LINE);
}
// ---
@@ -207,7 +205,7 @@ export const print = ({
) =>
songMetaContent
? [songMetaKey, withMetaMarkup(songMetaContent)].join(
- `${COLON}${EMPTY_SPACE}`,
+ `${COLON}${SPACE_CHAR}`,
)
: NULL;
@@ -229,17 +227,15 @@ export const print = ({
printSongMetaContentIfTruthy(SongMeta.CONTENT_HASH, contentHash),
]
.filter(Boolean)
- .join(`${COMMA}${EMPTY_SPACE}`),
+ .join(`${COMMA}${SPACE_CHAR}`),
);
// ---
// Reassemble the song
const flattenContent = flatten([
- [SongSection.TITLE, [title, metaSection].join(EMPTY_SPACE)].join(
- NEW_LINE_TUPLE,
- ),
- [SongSection.SEQUENCE, newSequence.join(COMMA)].join(NEW_LINE_TUPLE),
+ [SongSection.TITLE, [title, metaSection].join(SPACE_CHAR)].join(NEW_LINE),
+ [SongSection.SEQUENCE, newSequence.join(COMMA)].join(NEW_LINE),
songBodySections,
]).join(DOUBLE_LINE_TUPLE);
- return `${trim(flattenContent)}${NEW_LINE_TUPLE}`;
+ return `${trim(flattenContent)}${NEW_LINE}`;
};
diff --git a/src/songToLeadsheetConverter.spec.ts b/src/songToLeadsheetConverter.spec.ts
new file mode 100644
index 000000000..b04535349
--- /dev/null
+++ b/src/songToLeadsheetConverter.spec.ts
@@ -0,0 +1,228 @@
+import { parse } from './songParser.js';
+import {
+ convertSongToLeadsheet,
+ getNormalizedContent,
+} from './songToLeadsheetConverter.js';
+
+describe('songToLeadsheetConverter', () => {
+ it('should correctly convert to a leadsheet song', () => {
+ const parsedSong = parse(`[title]
+Cântă, suflet al meu, pentru Dumnezeu {alternative: {alternative 1 & alternative 2}, composer: {Matt Redman}, writer: {*}, arranger: {*}, interpreter: {Alin Timofte}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {164159}, id: {abCwAsZpAWGVzGNBWEfyhB}, contentHash: {1befcd}}
+
+[sequence]
+c,v1,c,v2,c,v3,c
+
+[c]
+^{D}Cântă, ^{G}suflet al ^{D}meu,
+^{A}pentru Dumne^{Bm}zeu, ^{G}Cel bine^{D}cuvân^{A4-A}tat!
+Al Lui ^{G}Nume e ^{Bm}sfânt, ^{G}cân^{A}ta-a^{Bm}cum,
+Cum ^{G}nu ai ^{A}mai cân^{Dsus-D}tat.
+
+[v1]
+E o ^{G}nouă ^{D}zi, soare^{A}le ră^{Bm}sare,
+^{G}E timp să ^{D}cânt spre ^{A}slava ^{Bm}Ta.
+Orice-^{G}ar ve^{D}ni, orice-n ^{A}față mi-ar a^{Bm}pare
+^{G}Eu vreau să ^{D}cânt și seara ^{A6}la^{A}u^{D}de.
+
+[v2]
+Încet Tu ești, Doamne, la mânie,
+În dragoste ești bogat și ești bun.
+Găsesc că am zece mii motive
+Ca să Te laud și tuturor să spun:
+
+[v3]
+Iar când sfârșitul îmi va fi aproape,
+Puterile când îmi vor slăbi,
+Al meu suflet va cânta continuu
+Ori zece mii de ani și-n veșnicii.
+`);
+
+ expect(parsedSong).toMatchInlineSnapshot(`
+{
+ "alternative": "alternative 1 & alternative 2",
+ "arranger": "*",
+ "band": "*",
+ "composer": "Matt Redman",
+ "contentHash": "1befcd",
+ "genre": "*",
+ "id": "abCwAsZpAWGVzGNBWEfyhB",
+ "interpreter": "Alin Timofte",
+ "key": "*",
+ "rcId": "164159",
+ "sectionOrder": [
+ "[c]",
+ "[v1]",
+ "[v2]",
+ "[v3]",
+ ],
+ "sectionsMap": {
+ "[c]": {
+ "content": "^{D}Cântă, ^{G}suflet al ^{D}meu,
+^{A}pentru Dumne^{Bm}zeu, ^{G}Cel bine^{D}cuvân^{A4-A}tat!
+Al Lui ^{G}Nume e ^{Bm}sfânt, ^{G}cân^{A}ta-a^{Bm}cum,
+Cum ^{G}nu ai ^{A}mai cân^{Dsus-D}tat.",
+ "sectionIdentifier": "[c]",
+ "sectionSequenceType": "c",
+ },
+ "[sequence]": {
+ "content": "c,v1,c,v2,c,v3,c",
+ "sectionIdentifier": "[sequence]",
+ "sectionSequenceType": "s",
+ },
+ "[title]": {
+ "content": "Cântă, suflet al meu, pentru Dumnezeu {alternative: {alternative 1 & alternative 2}, composer: {Matt Redman}, writer: {*}, arranger: {*}, interpreter: {Alin Timofte}, band: {*}, key: {*}, tempo: {*}, tags: {*}, version: {*}, genre: {*}, rcId: {164159}, id: {abCwAsZpAWGVzGNBWEfyhB}, contentHash: {1befcd}}",
+ "sectionIdentifier": "[title]",
+ "sectionSequenceType": "",
+ },
+ "[v1]": {
+ "content": "E o ^{G}nouă ^{D}zi, soare^{A}le ră^{Bm}sare,
+^{G}E timp să ^{D}cânt spre ^{A}slava ^{Bm}Ta.
+Orice-^{G}ar ve^{D}ni, orice-n ^{A}față mi-ar a^{Bm}pare
+^{G}Eu vreau să ^{D}cânt și seara ^{A6}la^{A}u^{D}de.",
+ "sectionIdentifier": "[v1]",
+ "sectionSequenceType": "v",
+ },
+ "[v2]": {
+ "content": "Încet Tu ești, Doamne, la mânie,
+În dragoste ești bogat și ești bun.
+Găsesc că am zece mii motive
+Ca să Te laud și tuturor să spun:",
+ "sectionIdentifier": "[v2]",
+ "sectionSequenceType": "v",
+ },
+ "[v3]": {
+ "content": "Iar când sfârșitul îmi va fi aproape,
+Puterile când îmi vor slăbi,
+Al meu suflet va cânta continuu
+Ori zece mii de ani și-n veșnicii.",
+ "sectionIdentifier": "[v3]",
+ "sectionSequenceType": "v",
+ },
+ },
+ "sequence": [
+ "c",
+ "v1",
+ "c",
+ "v2",
+ "c",
+ "v3",
+ "c",
+ ],
+ "tags": "*",
+ "tempo": "*",
+ "title": "Cântă, suflet al meu, pentru Dumnezeu",
+ "version": "*",
+ "writer": "*",
+}
+`);
+
+ expect(convertSongToLeadsheet(parsedSong)).toMatchInlineSnapshot(`
+"% =====================================================================
+% This file is auto-generated.
+%
+% Copyright (c) 2024 Ioan Lucuț (ioan.lucut88@gmail.com)
+%
+% Do not edit this file directly. Any changes made will be overwritten
+% the next time the file is generated.
+% =====================================================================
+
+% This is the only preamble definition required
+\\documentclass{leadsheet}
+\\begin{document}
+
+ % https://tex.stackexchange.com/questions/9852/what-is-the-difference-between-page-break-and-new-page
+ % Every song should start in a new page.
+ \\newpage
+
+ \\begin{song}{
+ title={Cântă, suflet al meu, pentru Dumnezeu},
+ subtitle={c,v1,c,v2,c,v3,c},
+ composer={Matt Redman},
+ interpret={Alin Timofte}
+ }
+
+ \\begin{chorus}[template = framed]
+ ^{D}Cântă, ^{G}suflet al ^{D}meu, \\\\
+ ^{A}pentru Dumne^{Bm}zeu, ^{G}Cel bine^{D}cuvân^{A4-A}tat! \\\\
+ Al Lui ^{G}Nume e ^{Bm}sfânt, ^*{G}cân ^*{A}ta-a ^{Bm}cum, \\\\
+ Cum ^{G}nu ai ^{A}mai cân^{Dsus-D}tat.
+ \\end{chorus}
+
+ \\begin{verse}
+ E o ^{G}nouă ^{D}zi, soare^{A}le ră^{Bm}sare, \\\\
+ ^{G}E timp să ^{D}cânt spre ^{A}slava ^{Bm}Ta. \\\\
+ Orice-^{G}ar ve^{D}ni, orice-n ^{A}față mi-ar a^{Bm}pare \\\\
+ ^{G}Eu vreau să ^{D}cânt și seara ^*{A6}la ^*{A}u ^{D}de.
+ \\end{verse}
+
+ \\begin{verse}
+ Încet Tu ești, Doamne, la mânie, \\\\
+ În dragoste ești bogat și ești bun. \\\\
+ Găsesc că am zece mii motive \\\\
+ Ca să Te laud și tuturor să spun:
+ \\end{verse}
+
+ \\begin{verse}
+ Iar când sfârșitul îmi va fi aproape, \\\\
+ Puterile când îmi vor slăbi, \\\\
+ Al meu suflet va cânta continuu \\\\
+ Ori zece mii de ani și-n veșnicii.
+ \\end{verse}
+
+ \\end{song}
+\\end{document}"
+`);
+ });
+
+ describe('getNormalizedContent', () => {
+ it('should ignore single words that do not have more than one chord section within', () => {
+ expect(getNormalizedContent('^{G4}this')).toEqual('^{G4}this');
+ });
+
+ it('should ignore multiple words that do not have more than one chord section within', () => {
+ expect(getNormalizedContent(`^{G4}this ^{G}that`)).toEqual(
+ '^{G4}this ^{G}that',
+ );
+ });
+
+ it('should normalise word that has more than one chord', () => {
+ expect(getNormalizedContent('^{G4}th^{G}is')).toEqual('^*{G4}th ^{G}is');
+ });
+
+ it('should normalise word with more than three chord notations correctly', () => {
+ expect(getNormalizedContent('^{G}Te-o^{D}no^{A}rez')).toEqual(
+ '^*{G}Te-o ^*{D}no ^{A}rez',
+ );
+ });
+
+ it('should normalise words that have more than one chord', () => {
+ expect(getNormalizedContent('^{G4}th^{G}is ^{G4}th^{G}is')).toEqual(
+ '^*{G4}th ^{G}is ^*{G4}th ^{G}is',
+ );
+ });
+
+ it.skip('should normalise words that have more than one chord', () => {
+ expect(getNormalizedContent('^{A}A^{D-G}min!')).toEqual(
+ '^*{A} A^{D-G}min!',
+ );
+ });
+
+ it('should normalise words with notations having bass (from / to -)', () => {
+ expect(getNormalizedContent('^{Ab/C}th')).toEqual('^{Ab-C}th');
+ expect(getNormalizedContent('^{D/F#}lumi^{G}nat')).toEqual(
+ '^{D-F#}lumi^{G}nat',
+ );
+ expect(getNormalizedContent('/: th :/')).toEqual('/: th :/');
+ });
+
+ it('should normalise words with wrong chord notations (missing ^ before {)', () => {
+ expect(getNormalizedContent('{G4}th{G}is {G4}th{G}is')).toEqual(
+ '^*{G4}th ^{G}is ^*{G4}th ^{G}is',
+ );
+ });
+
+ it('should normalise words with wrong chord notations (having space in {A C})', () => {
+ expect(() => getNormalizedContent('^{A C}th')).toThrow();
+ });
+ });
+});
diff --git a/src/songToLeadsheetConverter.ts b/src/songToLeadsheetConverter.ts
new file mode 100644
index 000000000..a61a98592
--- /dev/null
+++ b/src/songToLeadsheetConverter.ts
@@ -0,0 +1,243 @@
+import chalk from 'chalk';
+import { isEmpty, isEqual, trim } from 'lodash-es';
+import {
+ COMMA,
+ DOUBLE_LINE_TUPLE,
+ EMPTY_STRING,
+ NEW_LINE,
+ SPACE_CHAR,
+ UNSET_META,
+} from './constants.js';
+import { isTestEnv, padForTex } from './core.js';
+import { SequenceChar, SongAST } from './types.js';
+
+const LEADSHEET_ENV_MAP = {
+ [SequenceChar.VERSE]: 'verse',
+ [SequenceChar.PRECHORUS]: 'prechorus',
+ [SequenceChar.CHORUS]: 'chorus',
+ [SequenceChar.BRIDGE]: 'bridge',
+ [SequenceChar.ENDING]: 'outro',
+ [SequenceChar.RECITAL]: 'solo',
+};
+const LEADSHEET_ENV_OPTS_MAP = {
+ [SequenceChar.VERSE]: '',
+ [SequenceChar.PRECHORUS]: '[template = framed]',
+ [SequenceChar.CHORUS]: '[template = framed]',
+ [SequenceChar.BRIDGE]: '[template = framed]',
+ [SequenceChar.ENDING]: '[template = framed]',
+ [SequenceChar.RECITAL]: '[template = framed]',
+};
+
+const getSongContentWithRequiredTrailingEntities = (content: string) =>
+ content.replaceAll(/\n/g, `${SPACE_CHAR}\\\\${NEW_LINE}`);
+
+const getSongContentWithRightPadding = (entireContent: string) =>
+ entireContent.split(/\n/g).map(padForTex(4)).join(NEW_LINE);
+
+const wrapAsStart = (songEnvironment: string, options = '') =>
+ `\\begin{${songEnvironment}}${options ? `${options}` : ''}`;
+
+const wrapAsEnd = (songEnvironment: string) => `\\end{${songEnvironment}}`;
+
+const warnIfIsNotProperlyPrependedAndReplace = (singleWord: string): string => {
+ const maybeRegExpMatchArrays = Array.from(
+ singleWord.matchAll(/(? {
+ const maybeRegExpMatchArrays = Array.from(
+ singleWord.matchAll(/\^\{\s*[^}]*\s+[^}]*\s*}/gim),
+ );
+
+ if (isEmpty(maybeRegExpMatchArrays)) {
+ return singleWord;
+ }
+
+ throw new Error(`The ${chalk.red(singleWord)} is not correct.`);
+};
+
+const rewriteWordWithRightMusicalNotationSyntaxIfNeeded = (
+ singleWord: string,
+): string => {
+ const maybeRegExpMatchArrays = Array.from(
+ singleWord.matchAll(
+ /((\^)({[A-Z]+\d*})([^\\^ ]*))(?=[^ ]*\^{[A-Z]+\d*}\b)(.*)/gim,
+ ),
+ );
+
+ if (isEmpty(maybeRegExpMatchArrays)) {
+ return singleWord;
+ }
+
+ const rewrittenWordWithSpaceBetween = trim(
+ maybeRegExpMatchArrays
+ .map((regExpMatch) => {
+ const chordSyntaxPrefix = regExpMatch[2];
+ const chordInformation = regExpMatch[3];
+ const contentForChord = regExpMatch[4];
+ const maybeTrailingContent = regExpMatch[5];
+
+ return `${chordSyntaxPrefix}*${chordInformation}${contentForChord}${SPACE_CHAR}${maybeTrailingContent}`;
+ })
+ .join(EMPTY_STRING),
+ );
+
+ if (rewrittenWordWithSpaceBetween.includes(SPACE_CHAR)) {
+ return rewrittenWordWithSpaceBetween
+ .split(/ /gi)
+ .map(rewriteWordWithRightMusicalNotationSyntaxIfNeeded)
+ .join(SPACE_CHAR);
+ }
+
+ return rewrittenWordWithSpaceBetween;
+};
+
+const rewriteNotationsWithDashForChordsWithBass = (
+ singleWord: string,
+): string => {
+ const maybeRegExpMatchArrays = Array.from(
+ singleWord.matchAll(/\^\{.*\/.*}/gim),
+ );
+
+ if (isEmpty(maybeRegExpMatchArrays)) {
+ return singleWord;
+ }
+
+ return singleWord.replaceAll(/\//gi, '-');
+};
+
+// const rewriteLeftRightRepeat = (singleWord: string): string => {
+// return singleWord
+// .replaceAll(/\/:/gi, '\\leftrepeat')
+// .replaceAll(/:\//gi, '\\rightrepeat');
+// };
+
+export const getNormalizedContent = (sectionAsContent: string) => {
+ return sectionAsContent
+ .split(/\n/g)
+ .map((verseLineOfARow: string) =>
+ warnIfIsNotProperlyFormatted(verseLineOfARow)
+ .split(/ /gi)
+ .map(warnIfIsNotProperlyPrependedAndReplace)
+ .map(warnIfIsNotProperlyFormatted)
+ .map(rewriteWordWithRightMusicalNotationSyntaxIfNeeded)
+ .map(rewriteNotationsWithDashForChordsWithBass)
+ // .map(rewriteLeftRightRepeat)
+ .join(SPACE_CHAR),
+ )
+ .join(NEW_LINE);
+};
+
+const escapeRequiredChars = (songMetaContent: string) =>
+ songMetaContent.replaceAll(/&/g, '\\&');
+
+export const convertSongToLeadsheet = ({
+ sectionOrder,
+ sectionsMap,
+ sequence,
+ alternative,
+ arranger,
+ band,
+ composer,
+ contentHash,
+ genre,
+ id,
+ interpreter,
+ key,
+ rcId,
+ tags,
+ tempo,
+ title,
+ version,
+ writer,
+}: SongAST) => {
+ const maybeGetSongMetaContent = (key: string, songMetaContent?: string) => {
+ const shouldRenderContent =
+ songMetaContent && !isEqual(songMetaContent, UNSET_META);
+
+ if (!shouldRenderContent) {
+ return;
+ }
+
+ return `${key}={${escapeRequiredChars(songMetaContent)}}`;
+ };
+
+ const sectionMapper = (verseSongSectionIdentifier: string) => {
+ const { content, sectionSequenceType } =
+ sectionsMap[verseSongSectionIdentifier];
+
+ const songEnvironment = LEADSHEET_ENV_MAP[sectionSequenceType];
+
+ return [
+ padForTex(2)(
+ wrapAsStart(
+ songEnvironment,
+ LEADSHEET_ENV_OPTS_MAP[sectionSequenceType],
+ ),
+ ),
+ getSongContentWithRightPadding(
+ getSongContentWithRequiredTrailingEntities(
+ getNormalizedContent(content),
+ ),
+ ),
+ padForTex(2)(wrapAsEnd(songEnvironment)),
+ ].join(NEW_LINE);
+ };
+
+ const songSectionsAsEnvironments = sectionOrder
+ .map(sectionMapper)
+ .join(DOUBLE_LINE_TUPLE);
+
+ const metaData = [
+ `title={${escapeRequiredChars(title)}}`,
+ `subtitle={${escapeRequiredChars(sequence.join(COMMA))}}`,
+ maybeGetSongMetaContent('composer', composer),
+ maybeGetSongMetaContent('arr', arranger),
+ maybeGetSongMetaContent('band', band),
+ maybeGetSongMetaContent('tags', tags),
+ maybeGetSongMetaContent('genre', genre),
+ maybeGetSongMetaContent('tempo', tempo),
+ maybeGetSongMetaContent('interpret', interpreter),
+ maybeGetSongMetaContent('lyrics', writer),
+ maybeGetSongMetaContent('key', key),
+ ]
+ .filter(Boolean)
+ .map(padForTex(5))
+ .join(`${COMMA}${NEW_LINE}`);
+
+ return `% =====================================================================
+% This file is auto-generated.
+%
+% Copyright (c) 2024 Ioan Lucuț (ioan.lucut88@gmail.com)
+%
+% Do not edit this file directly. Any changes made will be overwritten
+% the next time the file is generated.
+% =====================================================================
+
+% This is the only preamble definition required
+\\documentclass{leadsheet}
+\\begin{document}
+
+ % https://tex.stackexchange.com/questions/9852/what-is-the-difference-between-page-break-and-new-page
+ % Every song should start in a new page.
+ \\newpage
+
+ \\begin{song}{
+${metaData}
+ }
+
+${songSectionsAsEnvironments}
+
+ \\end{song}
+\\end{document}`;
+};
diff --git a/src/types.ts b/src/types.ts
index 5ea46122e..4dcb610f1 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -146,6 +146,9 @@ export type Section = {
// E.g. strophe/chorus content
content: string;
+
+ // E.g. v, p, c, b, e, s
+ sectionSequenceType: SequenceChar;
};
/**
diff --git a/temp-runners/rc_authors_to_process.txt b/temp-runners/rc_authors_to_process.txt
deleted file mode 100644
index e1a23f76d..000000000
--- a/temp-runners/rc_authors_to_process.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-10:BBSO:Bbso
-11:Eldad:Eldad
-11:Florin Mesaroș:Florin_mesaros
-11:Messis:Messis
-12:Grup Eldad:Grup_eldad
-14:Emma Repede:Emma_repede
-18:Ekklesia:Ekklesia
-18:Grupul Eldad:Grupul_eldad
-2:Bbso Baia Mare:Bbso_baia_mare
-3:Adi Lup:Adi_lup
-3:Ahava:Ahava
-3:Alin, Emima Timofte:Alin_emima_timofte
-3:Kari Jobe:Kari_jobe
-4:Elim Harmony Band:Elim_harmony_band
-4:Harvest Arad:Harvest_arad
-4:Iovan Miclea:Iovan_miclea
-5:Adi Kovaci:Adi_kovaci
-5:Agape:Agape
-5:Eliza Pirosca:Eliza_pirosca
-5:Marius Pop, Naomi Borota:Marius_pop_naomi_borota
-5:Marius Pop:Marius_pop
-5:Samuel Bratu:Samuel_bratu
-6:Ekklesia Arad:Ekklesia_arad
-6:Shalom:Shalom
-7:Laud:Laud
diff --git a/temp-runners/rc_ids_to_process.txt b/temp-runners/rc_ids_to_process.txt
deleted file mode 100644
index 303ad4c20..000000000
--- a/temp-runners/rc_ids_to_process.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-137838:Any
-137840:Any
-149044:Any
-189709:Any
-193757:Any
-195799:Any
-203635:Any
-210581:Any
-212152:Any
-3820:Any
-4207:Any
-4211:Any
-57626:Any
-58039:Any
-60417:Any
-6285:Any
-6303:Any
-6571:Any
-6692:Any
-7120:Any
-7281:Any
-195608:Any