From de48b7f0fc5dffd7d2330b05d29c898983f3b74f Mon Sep 17 00:00:00 2001 From: Ioan Lucut Date: Mon, 23 Dec 2024 10:31:19 +0200 Subject: [PATCH] feat: Add a non-chords first songbook leadsheet --- .editorconfig | 3 + .github/workflows/ci.yml | 27 +- .github/workflows/deploy_to_gdrive.yml | 2 +- .github/workflows/latex_conduct_release.yml | 4 +- .github/workflows/latex_songbook_release.yml | 62 + .gitignore | 14 +- .idea/bes-lyrics.iml | 4 +- .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/git_toolbox_blame.xml | 6 + .idea/git_toolbox_prj.xml | 15 + ...adsheet_Songs_Once__Latexmk___xelatex_.xml | 24 + ...ce___Stop_On_Error__Latexmk___xelatex_.xml | 24 + .../Run___Temp__add_songs_from_rc_by_ids.xml | 2 +- .idea/watcherTasks.xml | 24 +- .idea/webResources.xml | 3 + ...Temp] add songs from rc by authors.run.xml | 4 +- ...herry pick songs we have in church.run.xml | 4 +- LaTeX/conduct/BES_Conduct_Afisaj.pdf | Bin 0 -> 81565 bytes LaTeX/songbook/bes-songbook-config.tex | 128 ++ LaTeX/songbook/bes-songbook.template.txt | 145 +++ LaTeX/songbook/convertToSongbookTex.ts | 118 ++ bin/lyricsIdUniquenessValidator.ts | 4 +- bin/lyricsRomanianDictionaryAnalyzer.ts | 3 +- .../Agape/Agape - Aici te astept azi.txt | 19 - .../Agape/Agape - Si pe mine si pe tine.txt | 18 - .../Agape/Agape - Stam uniti in adorare.txt | 27 - ...legem harul tau (doar prin crucea ta ).txt | 35 - ... Harmony Band - Isus m-ai binecuvantat.txt | 60 - .../Elim Harmony Band - Promisiuni.txt | 43 - .../Elim Harmony Band - Psalmul.txt | 34 - .../Eliza Pirosca/Eliza Pirosca - Aleluia.txt | 33 - .../Eliza Pirosca - Atat de mic.txt | 28 - .../Eliza Pirosca - Cred in tine.txt | 62 - .../Eliza Pirosca - Gara vietii.txt | 44 - .../Eliza Pirosca - Orice lacrima.txt | 31 - .../Eldad - A frant temeliile mortii.txt | 35 - candidates/Grup Eldad/Eldad - Al cui esti.txt | 30 - .../Eldad - Ce este viata fara El.txt | 23 - .../Grup Eldad/Eldad - Curgi ca un rau.txt | 25 - candidates/Grup Eldad/Eldad - Doamne bun.txt | 31 - .../Grup Eldad/Eldad - El este Mielul.txt | 29 - candidates/Grup Eldad/Eldad - Mielule.txt | 33 - .../Eldad - Se duce timpul de chemare.txt | 29 - .../Grup Eldad/Eldad - Vino vino Doamne.txt | 42 - .../Grupul Eldad - Aleg sa cred.txt | 35 - .../Grupul Eldad - Astazi Duhul Domnului.txt | 37 - .../Grupul Eldad - Cand domnul porunceste.txt | 32 - ... - Cine e oare cel mai sfant sub soare.txt | 42 - .../Grupul Eldad - Din dragoste.txt | 40 - .../Grupul Eldad - E noapte-n Betleem.txt | 45 - .../Grupul Eldad - Esti minunat.txt | 34 - .../Grupul Eldad - Fara dumnezeu.txt | 28 - .../Grupul Eldad - Fiindca atat de mult.txt | 29 - .../Grupul Eldad - Framantat de pacat.txt | 27 - .../Grup Eldad/Grupul Eldad - Glorie.txt | 29 - .../Grupul Eldad - Imparte-ti painea.txt | 31 - .../Grupul Eldad - Invesmantat in glorie.txt | 31 - .../Grup Eldad/Grupul Eldad - Israele.txt | 24 - .../Grup Eldad/Grupul Eldad - Luptam.txt | 44 - ... Eldad - M-ating de tine dar nu oricum.txt | 33 - .../Grupul Eldad - Ma uit in jur.txt | 41 - .../Grup Eldad/Grupul Eldad - Pacea lui.txt | 28 - .../Grupul Eldad - Sa fiu neprihanit.txt | 29 - .../Grupul Eldad - Se clatina lumea.txt | 25 - ...dad - Te asteptam sa vii din nou isuse.txt | 35 - .../Grupul Eldad - Tie iti cantam.txt | 29 - .../Grup Eldad/Grupul Eldad - Vas de lut.txt | 35 - .../Grupul Eldad - Vin inaintea Ta.txt | 57 - .../Iovan Miclea - Hai veniti la betleem.txt | 40 - .../Iovan Miclea - Slava ta o cant isuse.txt | 35 - ...n Miclea - Un nume mai presus de toate.txt | 29 - .../Iovan Miclea - Viata tinereasca.txt | 29 - ...be - In veci El e glorificat - forever.txt | 37 - .../Marius Pop - Da-i inima ta lui isus.txt | 32 - .../Marius Pop/Marius Pop - Dragostea lui.txt | 33 - .../Marius Pop - In fata regelui.txt | 31 - .../Marius Pop/Marius Pop - Psalmul.txt | 22 - .../Messis/Messis - Cantec din iubire.txt | 31 - .../Messis/Messis - Iata s-a nascut.txt | 51 - .../Messis - In prezenta ta sunt frant.txt | 24 - .../Messis/Messis - Inconjurat de slava.txt | 28 - candidates/Messis/Messis - Nu pot uita.txt | 25 - .../Messis - Spui ca tu cauti viata.txt | 29 - .../Messis/Messis - Voi chema numele tau.txt | 33 - .../Samuel Bratu - Crezand in el vom trai.txt | 35 - .../Samuel Bratu - Doar un nume sfant.txt | 27 - ...l Bratu - Dumnezeu s-a apropiat de noi.txt | 23 - .../Samuel Bratu - In palma ta.txt | 29 - .../Samuel Bratu - Pruncul imparat.txt | 30 - ...l ce sta sub ocrotirea celui preainalt.txt | 30 - .../Ovidiu Liteanu - Hai in rai.txt | 33 - ...iu Chibici - Calatori spre tara sfanta.txt | 29 - .../Puiu Chibici - De ce stai mut.txt | 32 - .../Puiu Chibici - Intr-un sat ne-nsemnat.txt | 31 - ... Ma iubesti tu mai mult decat ceilalti.txt | 47 - .../importSongsFromRcByAuthors.ts | 0 .../importSongsFromRcByIds.ts | 0 .../manual_picks.txt | 0 .../manual_picks_rest.txt | 0 .../moveExistingWorshipSongsToDir.ts | 0 .../rc_authors_to_process.txt | 0 .../rc_ids_to_ignore.txt | 0 .../rc_ids_to_process.txt | 0 jest.config.ts | 8 +- package-lock.json | 1131 +++++++++-------- package.json | 49 +- src/constants.ts | 7 +- src/core.ts | 15 +- src/index.ts | 1 + src/songParser.spec.ts | 145 +++ src/songParser.ts | 52 +- src/songPrinter.spec.ts | 184 +-- src/songPrinter.ts | 24 +- src/songToLeadsheetConverter.spec.ts | 228 ++++ src/songToLeadsheetConverter.ts | 243 ++++ src/types.ts | 3 + temp-runners/rc_authors_to_process.txt | 25 - temp-runners/rc_ids_to_process.txt | 22 - 118 files changed, 2009 insertions(+), 3139 deletions(-) create mode 100644 .github/workflows/latex_songbook_release.yml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/git_toolbox_blame.xml create mode 100644 .idea/git_toolbox_prj.xml create mode 100644 .idea/runConfigurations/Compile_Leadsheet_Songs_Once__Latexmk___xelatex_.xml create mode 100644 .idea/runConfigurations/Compile_Leadsheet_Songs_Once___Stop_On_Error__Latexmk___xelatex_.xml create mode 100644 LaTeX/conduct/BES_Conduct_Afisaj.pdf create mode 100644 LaTeX/songbook/bes-songbook-config.tex create mode 100644 LaTeX/songbook/bes-songbook.template.txt create mode 100644 LaTeX/songbook/convertToSongbookTex.ts delete mode 100644 candidates/Agape/Agape - Aici te astept azi.txt delete mode 100644 candidates/Agape/Agape - Si pe mine si pe tine.txt delete mode 100644 candidates/Agape/Agape - Stam uniti in adorare.txt delete mode 100644 candidates/BBSO/BBSO - Inainte sa-ntelegem harul tau (doar prin crucea ta ).txt delete mode 100644 candidates/Elim Harmony Band/Elim Harmony Band - Isus m-ai binecuvantat.txt delete mode 100644 candidates/Elim Harmony Band/Elim Harmony Band - Promisiuni.txt delete mode 100644 candidates/Elim Harmony Band/Elim Harmony Band - Psalmul.txt delete mode 100644 candidates/Eliza Pirosca/Eliza Pirosca - Aleluia.txt delete mode 100644 candidates/Eliza Pirosca/Eliza Pirosca - Atat de mic.txt delete mode 100644 candidates/Eliza Pirosca/Eliza Pirosca - Cred in tine.txt delete mode 100644 candidates/Eliza Pirosca/Eliza Pirosca - Gara vietii.txt delete mode 100644 candidates/Eliza Pirosca/Eliza Pirosca - Orice lacrima.txt delete mode 100644 candidates/Grup Eldad/Eldad - A frant temeliile mortii.txt delete mode 100644 candidates/Grup Eldad/Eldad - Al cui esti.txt delete mode 100644 candidates/Grup Eldad/Eldad - Ce este viata fara El.txt delete mode 100644 candidates/Grup Eldad/Eldad - Curgi ca un rau.txt delete mode 100644 candidates/Grup Eldad/Eldad - Doamne bun.txt delete mode 100644 candidates/Grup Eldad/Eldad - El este Mielul.txt delete mode 100644 candidates/Grup Eldad/Eldad - Mielule.txt delete mode 100644 candidates/Grup Eldad/Eldad - Se duce timpul de chemare.txt delete mode 100644 candidates/Grup Eldad/Eldad - Vino vino Doamne.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Aleg sa cred.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Astazi Duhul Domnului.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Cand domnul porunceste.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Cine e oare cel mai sfant sub soare.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Din dragoste.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - E noapte-n Betleem.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Esti minunat.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Fara dumnezeu.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Fiindca atat de mult.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Framantat de pacat.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Glorie.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Imparte-ti painea.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Invesmantat in glorie.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Israele.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Luptam.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - M-ating de tine dar nu oricum.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Ma uit in jur.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Pacea lui.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Sa fiu neprihanit.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Se clatina lumea.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Te asteptam sa vii din nou isuse.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Tie iti cantam.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Vas de lut.txt delete mode 100644 candidates/Grup Eldad/Grupul Eldad - Vin inaintea Ta.txt delete mode 100644 candidates/Iovan Miclea/Iovan Miclea - Hai veniti la betleem.txt delete mode 100644 candidates/Iovan Miclea/Iovan Miclea - Slava ta o cant isuse.txt delete mode 100644 candidates/Iovan Miclea/Iovan Miclea - Un nume mai presus de toate.txt delete mode 100644 candidates/Iovan Miclea/Iovan Miclea - Viata tinereasca.txt delete mode 100644 candidates/Kari Jobe/Kari Jobe - In veci El e glorificat - forever.txt delete mode 100644 candidates/Marius Pop/Marius Pop - Da-i inima ta lui isus.txt delete mode 100644 candidates/Marius Pop/Marius Pop - Dragostea lui.txt delete mode 100644 candidates/Marius Pop/Marius Pop - In fata regelui.txt delete mode 100644 candidates/Marius Pop/Marius Pop - Psalmul.txt delete mode 100644 candidates/Messis/Messis - Cantec din iubire.txt delete mode 100644 candidates/Messis/Messis - Iata s-a nascut.txt delete mode 100644 candidates/Messis/Messis - In prezenta ta sunt frant.txt delete mode 100644 candidates/Messis/Messis - Inconjurat de slava.txt delete mode 100644 candidates/Messis/Messis - Nu pot uita.txt delete mode 100644 candidates/Messis/Messis - Spui ca tu cauti viata.txt delete mode 100644 candidates/Messis/Messis - Voi chema numele tau.txt delete mode 100644 candidates/Samuel Bratu/Samuel Bratu - Crezand in el vom trai.txt delete mode 100644 candidates/Samuel Bratu/Samuel Bratu - Doar un nume sfant.txt delete mode 100644 candidates/Samuel Bratu/Samuel Bratu - Dumnezeu s-a apropiat de noi.txt delete mode 100644 candidates/Samuel Bratu/Samuel Bratu - In palma ta.txt delete mode 100644 candidates/Samuel Bratu/Samuel Bratu - Pruncul imparat.txt delete mode 100644 candidates/resurse_crestine_raw/Otniel Stirb - Cel ce sta sub ocrotirea celui preainalt.txt delete mode 100644 candidates/resurse_crestine_raw/Ovidiu Liteanu - Hai in rai.txt delete mode 100644 candidates/resurse_crestine_raw/Puiu Chibici - Calatori spre tara sfanta.txt delete mode 100644 candidates/resurse_crestine_raw/Puiu Chibici - De ce stai mut.txt delete mode 100644 candidates/resurse_crestine_raw/Puiu Chibici - Intr-un sat ne-nsemnat.txt delete mode 100644 candidates/resurse_crestine_raw/Traian Dorz - Ma iubesti tu mai mult decat ceilalti.txt rename {temp-runners => import-songs-temp-runners}/importSongsFromRcByAuthors.ts (100%) rename {temp-runners => import-songs-temp-runners}/importSongsFromRcByIds.ts (100%) rename {temp-runners => import-songs-temp-runners}/manual_picks.txt (100%) rename {temp-runners => import-songs-temp-runners}/manual_picks_rest.txt (100%) rename {temp-runners => import-songs-temp-runners}/moveExistingWorshipSongsToDir.ts (100%) create mode 100644 import-songs-temp-runners/rc_authors_to_process.txt rename {temp-runners => import-songs-temp-runners}/rc_ids_to_ignore.txt (100%) create mode 100644 import-songs-temp-runners/rc_ids_to_process.txt create mode 100644 src/songToLeadsheetConverter.spec.ts create mode 100644 src/songToLeadsheetConverter.ts delete mode 100644 temp-runners/rc_authors_to_process.txt delete mode 100644 temp-runners/rc_ids_to_process.txt 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..9633a33ab --- /dev/null +++ b/.github/workflows/latex_songbook_release.yml @@ -0,0 +1,62 @@ +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: Verify Font Installation + run: | + fc-list | grep -i "georgia" + + - 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.%m.%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: true + 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 @@ - + - + + + + \ 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 0000000000000000000000000000000000000000..c081785c426eea17682c3fc5402a4edb509569a2 GIT binary patch literal 81565 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 WAVLd~c2Em$N!`%J#!*V6cY5Lfdv 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 WM^}JfgJfr*XJ>{aArX-ih5R1@Dy_u; literal 0 HcmV?d00001 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