fix(core): update
This commit is contained in:
		
							
								
								
									
										66
									
								
								.gitea/workflows/default_nottags.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								.gitea/workflows/default_nottags.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | |||||||
|  | name: Default (not tags) | ||||||
|  |  | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     tags-ignore: | ||||||
|  |       - '**' | ||||||
|  |  | ||||||
|  | env: | ||||||
|  |   IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci | ||||||
|  |   NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git | ||||||
|  |   NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}} | ||||||
|  |   NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}} | ||||||
|  |   NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}} | ||||||
|  |   NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}} | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   security: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     continue-on-error: true | ||||||
|  |     container: | ||||||
|  |       image: ${{ env.IMAGE }} | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v3 | ||||||
|  |  | ||||||
|  |       - name: Install pnpm and npmci | ||||||
|  |         run: | | ||||||
|  |           pnpm install -g pnpm | ||||||
|  |           pnpm install -g @shipzone/npmci | ||||||
|  |  | ||||||
|  |       - name: Run npm prepare | ||||||
|  |         run: npmci npm prepare | ||||||
|  |  | ||||||
|  |       - name: Audit production dependencies | ||||||
|  |         run: | | ||||||
|  |           npmci command npm config set registry https://registry.npmjs.org | ||||||
|  |           npmci command pnpm audit --audit-level=high --prod | ||||||
|  |         continue-on-error: true | ||||||
|  |  | ||||||
|  |       - name: Audit development dependencies | ||||||
|  |         run: | | ||||||
|  |           npmci command npm config set registry https://registry.npmjs.org | ||||||
|  |           npmci command pnpm audit --audit-level=high --dev | ||||||
|  |         continue-on-error: true | ||||||
|  |  | ||||||
|  |   test: | ||||||
|  |     if: ${{ always() }} | ||||||
|  |     needs: security | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     container: | ||||||
|  |       image: ${{ env.IMAGE }} | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v3 | ||||||
|  |  | ||||||
|  |       - name: Test stable | ||||||
|  |         run: | | ||||||
|  |           npmci node install stable | ||||||
|  |           npmci npm install | ||||||
|  |           npmci npm test | ||||||
|  |  | ||||||
|  |       - name: Test build | ||||||
|  |         run: | | ||||||
|  |           npmci node install stable | ||||||
|  |           npmci npm install | ||||||
|  |           npmci npm build | ||||||
							
								
								
									
										124
									
								
								.gitea/workflows/default_tags.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								.gitea/workflows/default_tags.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | |||||||
|  | name: Default (tags) | ||||||
|  |  | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     tags: | ||||||
|  |       - '*' | ||||||
|  |  | ||||||
|  | env: | ||||||
|  |   IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci | ||||||
|  |   NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git | ||||||
|  |   NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}} | ||||||
|  |   NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}} | ||||||
|  |   NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}} | ||||||
|  |   NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}} | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   security: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     continue-on-error: true | ||||||
|  |     container: | ||||||
|  |       image: ${{ env.IMAGE }} | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v3 | ||||||
|  |  | ||||||
|  |       - name: Prepare | ||||||
|  |         run: | | ||||||
|  |           pnpm install -g pnpm | ||||||
|  |           pnpm install -g @shipzone/npmci | ||||||
|  |           npmci npm prepare | ||||||
|  |  | ||||||
|  |       - name: Audit production dependencies | ||||||
|  |         run: | | ||||||
|  |           npmci command npm config set registry https://registry.npmjs.org | ||||||
|  |           npmci command pnpm audit --audit-level=high --prod | ||||||
|  |         continue-on-error: true | ||||||
|  |  | ||||||
|  |       - name: Audit development dependencies | ||||||
|  |         run: | | ||||||
|  |           npmci command npm config set registry https://registry.npmjs.org | ||||||
|  |           npmci command pnpm audit --audit-level=high --dev | ||||||
|  |         continue-on-error: true | ||||||
|  |  | ||||||
|  |   test: | ||||||
|  |     if: ${{ always() }} | ||||||
|  |     needs: security | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     container: | ||||||
|  |       image: ${{ env.IMAGE }} | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v3 | ||||||
|  |  | ||||||
|  |       - name: Prepare | ||||||
|  |         run: | | ||||||
|  |           pnpm install -g pnpm | ||||||
|  |           pnpm install -g @shipzone/npmci | ||||||
|  |           npmci npm prepare | ||||||
|  |  | ||||||
|  |       - name: Test stable | ||||||
|  |         run: | | ||||||
|  |           npmci node install stable | ||||||
|  |           npmci npm install | ||||||
|  |           npmci npm test | ||||||
|  |  | ||||||
|  |       - name: Test build | ||||||
|  |         run: | | ||||||
|  |           npmci node install stable | ||||||
|  |           npmci npm install | ||||||
|  |           npmci npm build | ||||||
|  |  | ||||||
|  |   release: | ||||||
|  |     needs: test | ||||||
|  |     if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     container: | ||||||
|  |       image: ${{ env.IMAGE }} | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v3 | ||||||
|  |  | ||||||
|  |       - name: Prepare | ||||||
|  |         run: | | ||||||
|  |           pnpm install -g pnpm | ||||||
|  |           pnpm install -g @shipzone/npmci | ||||||
|  |           npmci npm prepare | ||||||
|  |  | ||||||
|  |       - name: Release | ||||||
|  |         run: | | ||||||
|  |           npmci node install stable | ||||||
|  |           npmci npm publish | ||||||
|  |  | ||||||
|  |   metadata: | ||||||
|  |     needs: test | ||||||
|  |     if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     container: | ||||||
|  |       image: ${{ env.IMAGE }} | ||||||
|  |     continue-on-error: true | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v3 | ||||||
|  |  | ||||||
|  |       - name: Prepare | ||||||
|  |         run: | | ||||||
|  |           pnpm install -g pnpm | ||||||
|  |           pnpm install -g @shipzone/npmci | ||||||
|  |           npmci npm prepare | ||||||
|  |  | ||||||
|  |       - name: Code quality | ||||||
|  |         run: | | ||||||
|  |           npmci command npm install -g typescript | ||||||
|  |           npmci npm install | ||||||
|  |  | ||||||
|  |       - name: Trigger | ||||||
|  |         run: npmci trigger | ||||||
|  |  | ||||||
|  |       - name: Build docs and upload artifacts | ||||||
|  |         run: | | ||||||
|  |           npmci node install stable | ||||||
|  |           npmci npm install | ||||||
|  |           pnpm install -g @gitzone/tsdoc | ||||||
|  |           npmci command tsdoc | ||||||
|  |         continue-on-error: true | ||||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -15,8 +15,6 @@ node_modules/ | |||||||
|  |  | ||||||
| # builds | # builds | ||||||
| dist/ | dist/ | ||||||
| dist_web/ | dist_*/ | ||||||
| dist_serve/ |  | ||||||
| dist_ts_web/ |  | ||||||
|  |  | ||||||
| # custom | # custom | ||||||
							
								
								
									
										11
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | { | ||||||
|  |   "version": "0.2.0", | ||||||
|  |   "configurations": [ | ||||||
|  |     { | ||||||
|  |       "command": "npm test", | ||||||
|  |       "name": "Run npm test", | ||||||
|  |       "request": "launch", | ||||||
|  |       "type": "node-terminal" | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | { | ||||||
|  |   "json.schemas": [ | ||||||
|  |     { | ||||||
|  |       "fileMatch": ["/npmextra.json"], | ||||||
|  |       "schema": { | ||||||
|  |         "type": "object", | ||||||
|  |         "properties": { | ||||||
|  |           "npmci": { | ||||||
|  |             "type": "object", | ||||||
|  |             "description": "settings for npmci" | ||||||
|  |           }, | ||||||
|  |           "gitzone": { | ||||||
|  |             "type": "object", | ||||||
|  |             "description": "settings for gitzone", | ||||||
|  |             "properties": { | ||||||
|  |               "projectType": { | ||||||
|  |                 "type": "string", | ||||||
|  |                 "enum": ["website", "element", "service", "npm", "wcc"] | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,40 +0,0 @@ | |||||||
| # @pushrocks/smartnginx |  | ||||||
| control nginx from node, TypeScript ready |  | ||||||
|  |  | ||||||
| ## Availabililty and Links |  | ||||||
| * [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartnginx) |  | ||||||
| * [gitlab.com (source)](https://gitlab.com/pushrocks/smartnginx) |  | ||||||
| * [github.com (source mirror)](https://github.com/pushrocks/smartnginx) |  | ||||||
| * [docs (typedoc)](https://pushrocks.gitlab.io/smartnginx/) |  | ||||||
|  |  | ||||||
| ## Status for master |  | ||||||
| [](https://gitlab.com/pushrocks/smartnginx/commits/master) |  | ||||||
| [](https://gitlab.com/pushrocks/smartnginx/commits/master) |  | ||||||
| [](https://www.npmjs.com/package/@pushrocks/smartnginx) |  | ||||||
| [](https://snyk.io/test/npm/@pushrocks/smartnginx) |  | ||||||
| [](https://nodejs.org/dist/latest-v10.x/docs/api/) |  | ||||||
| [](https://nodejs.org/dist/latest-v10.x/docs/api/) |  | ||||||
| [](https://prettier.io/) |  | ||||||
|  |  | ||||||
| ## Usage |  | ||||||
|  |  | ||||||
| We recommend the use of TypeScript! :) |  | ||||||
|  |  | ||||||
| ```typescript |  | ||||||
| import * as smartnginx from 'smartnginx'; |  | ||||||
| const smartnginxInstance = new smartnginx.SmartNginx(); |  | ||||||
| myNginxHost = new smartnginx.NginxHost({ |  | ||||||
|   hostName: 'some.example.com', |  | ||||||
|   type: 'reverseProxy', |  | ||||||
|   destination: '192.192.192.192' // some destination IP |  | ||||||
| }); |  | ||||||
| myNginxConfig.addZone(myNginxZone); // adds the zone to the config |  | ||||||
| myNginxConfig.deploy(); // deploys the referenced NginxConfig and gracefully reloads it |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| For further information read the linked docs at the top of this readme. |  | ||||||
|  |  | ||||||
| > MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh) |  | ||||||
| | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy) |  | ||||||
|  |  | ||||||
| [](https://maintainedby.lossless.com) |  | ||||||
| @@ -1,15 +1,15 @@ | |||||||
| -----BEGIN RSA PRIVATE KEY----- | -----BEGIN RSA PRIVATE KEY----- | ||||||
| MIICXAIBAAKBgQCMGIi2uxtbfbDIiyL6SWwZb1RdSpjGFHwzlR+mipbwgW1JsYld | MIICXQIBAAKBgQD5b6wtr4xHY5gxH0SR+V9XIQPH6DGe2PXlKWN02dgvg7Ej/4uA | ||||||
| Fs463PvxsMFgyQ6Nzndj3IE1mpYQgWYSS69mV8B3XxusrxnOGeO00IdA+qPGakzq | 7MmOnem2SUpWE2GwuKCAUCeZkj+riEmky0EWFexaM3BmcvWLSHZ6MAYg5FxTsUG8 | ||||||
| Sm+/2ualnz6nDeVWTvQuM15Ki6WQsbvmcIKngs+5tsmYfTiAnpFUv3t6zQIDAQAB | IXxNYUdTPpUBxaCX/yp/dvpiDqSMH67y9LwI85oWHx/zk1jMixaZXvOCXwIDAQAB | ||||||
| AoGAdb6VAMdnKdEMyLAv+J3G7eWkyTfOCQTkklHuJQHr9D1DRiGhqoxlThG26p49 | AoGBALFXn1/f9uluuu753yO12/4zf9+qi1T3xmQGuCqFE7o8dD422vVv5KHcTiUH | ||||||
| GQRCaCq0K0kDi7LeFwc6a3wS8LjRZ9DI+mkyA0KRM0bXEkQnBM7ZGqc32476mMp+ | GK34G7Wsnph75JvAKjqHrGxZAk0NN59VK4Sl141S7qzXgjQf5Ks7r5y8v8AQgvEM | ||||||
| 4GI29Xl8U1pbjI0uYsyVoVeq7r3DTvHBD22FfvbPELIVzGECQQDM9WH55J70BjhH | zOwutOqlGNHJZ1NlCDJuMNxUe/vyRXRl1WDCeJF6pt8huZgRAkEA/Ppqz8NyU+B7 | ||||||
| 7h8vYD4agrVGk6AnWJaTyH4uqr3/o8tzyWMbSEDqsCo8dDufsUkrntg4DscSLVEl | kaz3e39uCELsyaDl3Xf82JMmJASBlndso3l3H2ihihAMYHaH21IxKQnfaiKMyfK4 | ||||||
| MZQq+8G1AkEArvv+N2Yjef9Xplo5/Zfx+bVzGrnrWuI9KVNHQeqZj50nmQbTVf+h | tvONLB/eZwJBAPxqbKEzLqYM7ds8QG2fty7heIcwtcKjTMThl99/OinNsJdd0DUE | ||||||
| qAJrJKUecJcvy5elwzMdFtw5CtU+aUXjuQJAKsHmNqOjJXVGuHrMtq11R0KNXrPd | GPBVaDlvqijEk5R4oQ5CkzrQDe6mVkt90UkCQEogChoUl7RSC4MU3nM2VIRhL8ao | ||||||
| bVfl0d65tDKagIJDJ1yT+FUSdeNabFIzPhVWFmuE3+z1Sq15iDDXoD/1IQJBAJmW | uZHaLaE8BKn7FAmFtrRzy97NJsAwkZ/WO1qdS8BNn0QXGY+26j7ZQF1UfTMCQG8W | ||||||
| Pwz7Dnp/P7yYhzvqCQ6nT++ObmCoIQzLtsjJlJ10UBRF5GsgZBCmhsp0T6J9YQsv | u4Zaiz5DVG93XfehIjK8wpnlAymNSx0fGAMh8EwznXOQszCSBBPJ0tvsXBwjH7xp | ||||||
| AOSzUX4GL98tSol2OakCQDpb11GrMuDVfYW+ltJs/WFOIE/Qexy+pKU6uWQnGjGP | NqCbBkcNCASvKi2BSxkCQQDphVUlroFh6n4KEfrVQkzHoGU2pWfwTekCwneJ1w8r | ||||||
| 3OQVJ68vPebrMqQ6Lp3/r5hbN/UgLMufrUuevtHb7DA= | omwcagWn7E0a2DDj7tONmY7NU3kwRU2fLIzdG4Y9rewO | ||||||
| -----END RSA PRIVATE KEY----- | -----END RSA PRIVATE KEY----- | ||||||
|   | |||||||
| @@ -1,13 +1,13 @@ | |||||||
| -----BEGIN CERTIFICATE----- | -----BEGIN CERTIFICATE----- | ||||||
| MIIB/zCCAWigAwIBAgIJeD6pc7FCt9rnMA0GCSqGSIb3DQEBBQUAMB4xHDAaBgNV | MIIB/zCCAWigAwIBAgIJH3Pl1mivagGCMA0GCSqGSIb3DQEBBQUAMB4xHDAaBgNV | ||||||
| BAMTE3NlbGZzaWduZWQuZ2l0LnpvbmUwHhcNMTkwODIwMjAzMDI1WhcNMjAwODE5 | BAMTE3NlbGZzaWduZWQuZ2l0LnpvbmUwHhcNMjMwNzI2MTQwNTIwWhcNMjQwNzI1 | ||||||
| MjAzMDI1WjAeMRwwGgYDVQQDExNzZWxmc2lnbmVkLmdpdC56b25lMIGfMA0GCSqG | MTQwNTIwWjAeMRwwGgYDVQQDExNzZWxmc2lnbmVkLmdpdC56b25lMIGfMA0GCSqG | ||||||
| SIb3DQEBAQUAA4GNADCBiQKBgQCMGIi2uxtbfbDIiyL6SWwZb1RdSpjGFHwzlR+m | SIb3DQEBAQUAA4GNADCBiQKBgQD5b6wtr4xHY5gxH0SR+V9XIQPH6DGe2PXlKWN0 | ||||||
| ipbwgW1JsYldFs463PvxsMFgyQ6Nzndj3IE1mpYQgWYSS69mV8B3XxusrxnOGeO0 | 2dgvg7Ej/4uA7MmOnem2SUpWE2GwuKCAUCeZkj+riEmky0EWFexaM3BmcvWLSHZ6 | ||||||
| 0IdA+qPGakzqSm+/2ualnz6nDeVWTvQuM15Ki6WQsbvmcIKngs+5tsmYfTiAnpFU | MAYg5FxTsUG8IXxNYUdTPpUBxaCX/yp/dvpiDqSMH67y9LwI85oWHx/zk1jMixaZ | ||||||
| v3t6zQIDAQABo0UwQzAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIC9DAmBgNVHREE | XvOCXwIDAQABo0UwQzAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIC9DAmBgNVHREE | ||||||
| HzAdhhtodHRwOi8vZXhhbXBsZS5vcmcvd2ViaWQjbWUwDQYJKoZIhvcNAQEFBQAD | HzAdhhtodHRwOi8vZXhhbXBsZS5vcmcvd2ViaWQjbWUwDQYJKoZIhvcNAQEFBQAD | ||||||
| gYEARLQhxnvrKNGs758MzDTbf3lBuMd5jf42YFcUdEPI6jg9knKwqcgd5eNkZtNM | gYEAQ0pJ279EDgvsY+YjslMdUaJbZcF9rFgUE3t8vDDZH99kth8gqNddahcLqEV2 | ||||||
| DFPOFJf3HIJOLeOhXZ4bzQpcxVkkDAMUloKmQNypZlRWzkZt0jLgG0/ofKvvqX7c | 8hyx7qcnplpKNVx8DYvDWoTGRdXBhCP/TBBW3jdsqaBHJey+yfAISBk4pbOow260 | ||||||
| DpzwgTIoJwWlpbug788LEm3HcTVPu0LxQ1lOpgt0PWPnasc= | tNQngsMDf+PZQMLm2bT1Pxk2KXd0rFMkVWprcRs2qx3Yz0Q= | ||||||
| -----END CERTIFICATE----- | -----END CERTIFICATE----- | ||||||
|   | |||||||
| @@ -15,8 +15,8 @@ server { | |||||||
| server { | server { | ||||||
| 	listen *:443 ssl; | 	listen *:443 ssl; | ||||||
| 	server_name test100.bleu.de; | 	server_name test100.bleu.de; | ||||||
| 	ssl_certificate /Users/philkunz/gitlab/pushrocks_meta/smartnginx/nginxconfig/hosts/test100.bleu.de.public.pem; | 	ssl_certificate /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/test100.bleu.de.public.pem; | ||||||
| 	ssl_certificate_key /Users/philkunz/gitlab/pushrocks_meta/smartnginx/nginxconfig/hosts/test100.bleu.de.private.pem; | 	ssl_certificate_key /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/test100.bleu.de.private.pem; | ||||||
| 	location / { | 	location / { | ||||||
| 		proxy_http_version      1.1; | 		proxy_http_version      1.1; | ||||||
| 		proxy_buffering         off; | 		proxy_buffering         off; | ||||||
|   | |||||||
| @@ -15,8 +15,8 @@ server { | |||||||
| server { | server { | ||||||
| 	listen *:443 ssl; | 	listen *:443 ssl; | ||||||
| 	server_name test102.bleu.de; | 	server_name test102.bleu.de; | ||||||
| 	ssl_certificate /Users/philkunz/gitlab/pushrocks_meta/smartnginx/nginxconfig/hosts/test102.bleu.de.public.pem; | 	ssl_certificate /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/test102.bleu.de.public.pem; | ||||||
| 	ssl_certificate_key /Users/philkunz/gitlab/pushrocks_meta/smartnginx/nginxconfig/hosts/test102.bleu.de.private.pem; | 	ssl_certificate_key /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/test102.bleu.de.private.pem; | ||||||
| 	location / { | 	location / { | ||||||
| 		proxy_http_version      1.1; | 		proxy_http_version      1.1; | ||||||
| 		proxy_buffering         off; | 		proxy_buffering         off; | ||||||
|   | |||||||
| @@ -68,12 +68,12 @@ http { | |||||||
| 	server { | 	server { | ||||||
| 		listen *:443 ssl default_server; | 		listen *:443 ssl default_server; | ||||||
| 		server_name selfsigned.git.zone; | 		server_name selfsigned.git.zone; | ||||||
| 		ssl_certificate /Users/philkunz/gitlab/pushrocks_meta/smartnginx/nginxconfig/hosts/default.public.pem; | 		ssl_certificate /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/default.public.pem; | ||||||
| 		ssl_certificate_key /Users/philkunz/gitlab/pushrocks_meta/smartnginx/nginxconfig/hosts/default.private.pem; | 		ssl_certificate_key /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/default.private.pem; | ||||||
| 		rewrite        ^ https://git.zone redirect; | 		rewrite        ^ https://git.zone redirect; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	include /Users/philkunz/gitlab/pushrocks_meta/smartnginx/nginxconfig/hosts/*.conf; | 	include /mnt/HC_Volume_11396573/lossless/push.rocks/smartnginx/nginxconfig/hosts/*.conf; | ||||||
| 	include /etc/nginx/sites-enabled/*; | 	include /etc/nginx/sites-enabled/*; | ||||||
| } | } | ||||||
| daemon off; | daemon off; | ||||||
|   | |||||||
| @@ -4,11 +4,12 @@ | |||||||
|   }, |   }, | ||||||
|   "npmdocker": {}, |   "npmdocker": {}, | ||||||
|   "gitzone": { |   "gitzone": { | ||||||
|  |     "projectType": "npm", | ||||||
|     "module": { |     "module": { | ||||||
|       "githost": "gitlab.com", |       "githost": "gitlab.com", | ||||||
|       "gitscope": "push.rocks", |       "gitscope": "push.rocks", | ||||||
|       "gitrepo": "smartnginx", |       "gitrepo": "smartnginx", | ||||||
|       "shortDescription": "control nginx from node, TypeScript ready", |       "description": "control nginx from node, TypeScript ready", | ||||||
|       "npmPackagename": "@push.rocks/smartnginx", |       "npmPackagename": "@push.rocks/smartnginx", | ||||||
|       "license": "MIT" |       "license": "MIT" | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										1819
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1819
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										52
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								package.json
									
									
									
									
									
								
							| @@ -3,12 +3,12 @@ | |||||||
|   "version": "2.0.51", |   "version": "2.0.51", | ||||||
|   "private": false, |   "private": false, | ||||||
|   "description": "control nginx from node, TypeScript ready", |   "description": "control nginx from node, TypeScript ready", | ||||||
|   "main": "dist/index.js", |   "main": "dist_ts/index.js", | ||||||
|   "typings": "dist/index.d.ts", |   "typings": "dist_ts/index.d.ts", | ||||||
|   "scripts": { |   "scripts": { | ||||||
|     "test": "tstest test/", |     "test": "tstest test/", | ||||||
|     "cleanTest": "(rm -r nginxconfig) && npm run test", |     "cleanTest": "(rm -r nginxconfig) && npm run test", | ||||||
|     "build": "(tsbuild)" |     "build": "(tsbuild --allowimplicitany)" | ||||||
|   }, |   }, | ||||||
|   "repository": { |   "repository": { | ||||||
|     "type": "git", |     "type": "git", | ||||||
| @@ -24,33 +24,37 @@ | |||||||
|   }, |   }, | ||||||
|   "homepage": "https://gitlab.com/pushrocks/smartnginx#README", |   "homepage": "https://gitlab.com/pushrocks/smartnginx#README", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@pushrocks/lik": "^3.0.10", |     "@push.rocks/lik": "^6.0.2", | ||||||
|     "@pushrocks/smartfile": "^7.0.4", |     "@push.rocks/smartfile": "^10.0.26", | ||||||
|     "@pushrocks/smartlog": "^2.0.19", |     "@push.rocks/smartlog": "^3.0.2", | ||||||
|     "@pushrocks/smartpromise": "^3.0.2", |     "@push.rocks/smartpath": "^5.0.11", | ||||||
|     "@pushrocks/smartshell": "^2.0.23", |     "@push.rocks/smartpromise": "^4.0.2", | ||||||
|     "@pushrocks/smartstring": "^3.0.10", |     "@push.rocks/smartshell": "^3.0.3", | ||||||
|     "@pushrocks/smartunique": "^3.0.1", |     "@push.rocks/smartstring": "^4.0.7", | ||||||
|     "selfsigned": "^1.10.4" |     "@push.rocks/smartunique": "^3.0.3", | ||||||
|  |     "selfsigned": "^2.1.1" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@gitzone/tsbuild": "^2.1.11", |     "@gitzone/tsbuild": "^2.1.66", | ||||||
|     "@gitzone/tsrun": "^1.2.8", |     "@gitzone/tsrun": "^1.2.44", | ||||||
|     "@gitzone/tstest": "^1.0.24", |     "@gitzone/tstest": "^1.0.77", | ||||||
|     "@pushrocks/qenv": "^4.0.2", |     "@push.rocks/qenv": "^5.0.2", | ||||||
|     "@pushrocks/tapbundle": "^3.0.11", |     "@push.rocks/tapbundle": "^5.0.8" | ||||||
|     "tslint": "^5.19.0", |  | ||||||
|     "tslint-config-prettier": "^1.18.0" |  | ||||||
|   }, |   }, | ||||||
|   "files": [ |   "files": [ | ||||||
|     "ts/*", |     "ts/**/*", | ||||||
|     "ts_web/*", |     "ts_web/**/*", | ||||||
|     "dist/*", |     "dist/**/*", | ||||||
|     "dist_web/*", |     "dist_*/**/*", | ||||||
|     "dist_ts_web/*", |     "dist_ts/**/*", | ||||||
|     "assets/*", |     "dist_ts_web/**/*", | ||||||
|  |     "assets/**/*", | ||||||
|     "cli.js", |     "cli.js", | ||||||
|     "npmextra.json", |     "npmextra.json", | ||||||
|     "readme.md" |     "readme.md" | ||||||
|  |   ], | ||||||
|  |   "type": "module", | ||||||
|  |   "browserslist": [ | ||||||
|  |     "last 1 chrome versions" | ||||||
|   ] |   ] | ||||||
| } | } | ||||||
							
								
								
									
										4819
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										4819
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										14
									
								
								test/test.ts
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								test/test.ts
									
									
									
									
									
								
							| @@ -1,10 +1,10 @@ | |||||||
| import { tap, expect } from '@pushrocks/tapbundle'; | import { tap, expect } from '@push.rocks/tapbundle'; | ||||||
| import path = require('path'); | import path = require('path'); | ||||||
|  |  | ||||||
| import { Qenv } from '@pushrocks/qenv'; | import { Qenv } from '@push.rocks/qenv'; | ||||||
| const testQenv = new Qenv('./', './.nogit/'); | const testQenv = new Qenv('./', './.nogit/'); | ||||||
|  |  | ||||||
| import * as smartnginx from '../ts/index'; | import * as smartnginx from '../ts/index.js'; | ||||||
|  |  | ||||||
| let testSmartNginx: smartnginx.SmartNginx; | let testSmartNginx: smartnginx.SmartNginx; | ||||||
| let testNginxZone01: smartnginx.NginxHost; | let testNginxZone01: smartnginx.NginxHost; | ||||||
| @@ -12,7 +12,7 @@ let testNginxZone02: smartnginx.NginxHost; | |||||||
|  |  | ||||||
| tap.test('should create a valid instance of SmartNginx', async () => { | tap.test('should create a valid instance of SmartNginx', async () => { | ||||||
|   testSmartNginx = new smartnginx.SmartNginx({ defaultProxyUrl: 'https://git.zone' }); |   testSmartNginx = new smartnginx.SmartNginx({ defaultProxyUrl: 'https://git.zone' }); | ||||||
|   expect(testSmartNginx).to.be.instanceof(smartnginx.SmartNginx); |   expect(testSmartNginx).toBeInstanceOf(smartnginx.SmartNginx); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test(`should produce an instance of NginxConfig`, async () => { | tap.test(`should produce an instance of NginxConfig`, async () => { | ||||||
| @@ -21,16 +21,16 @@ tap.test(`should produce an instance of NginxConfig`, async () => { | |||||||
|     destination: '192.192.192.191', |     destination: '192.192.192.191', | ||||||
|     destinationPort: 3000, |     destinationPort: 3000, | ||||||
|     privateKey: 'some private', |     privateKey: 'some private', | ||||||
|     publicKey: 'some public' |     publicKey: 'some public', | ||||||
|   }); |   }); | ||||||
|   testNginxZone02 = new smartnginx.NginxHost(testSmartNginx, { |   testNginxZone02 = new smartnginx.NginxHost(testSmartNginx, { | ||||||
|     hostName: 'test102.bleu.de', |     hostName: 'test102.bleu.de', | ||||||
|     destination: '192.192.192.192', |     destination: '192.192.192.192', | ||||||
|     destinationPort: 3050, |     destinationPort: 3050, | ||||||
|     privateKey: 'some private', |     privateKey: 'some private', | ||||||
|     publicKey: 'some public' |     publicKey: 'some public', | ||||||
|   }); |   }); | ||||||
|   expect(testNginxZone01).to.be.instanceof(smartnginx.NginxHost); |   expect(testNginxZone01).toBeInstanceOf(smartnginx.NginxHost); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test('.addHostCandidate() should add a zone to NginxConfig Object', async () => { | tap.test('.addHostCandidate() should add a zone to NginxConfig Object', async () => { | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								ts/00_commitinfo_data.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								ts/00_commitinfo_data.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | /** | ||||||
|  |  * autocreated commitinfo by @pushrocks/commitinfo | ||||||
|  |  */ | ||||||
|  | export const commitinfo = { | ||||||
|  |   name: '@push.rocks/smartnginx', | ||||||
|  |   version: '2.0.52', | ||||||
|  |   description: 'control nginx from node, TypeScript ready' | ||||||
|  | } | ||||||
| @@ -1,6 +1,4 @@ | |||||||
| import * as plugins from './smartnginx.plugins'; |  | ||||||
|  |  | ||||||
| // classes | // classes | ||||||
| export * from './smartnginx.classes.smartnginx'; | export * from './smartnginx.classes.smartnginx.js'; | ||||||
| export * from './smartnginx.classes.nginxprocess'; | export * from './smartnginx.classes.nginxprocess.js'; | ||||||
| export * from './smartnginx.classes.nginxhost'; | export * from './smartnginx.classes.nginxhost.js'; | ||||||
|   | |||||||
| @@ -1,13 +1,13 @@ | |||||||
| import * as plugins from './smartnginx.plugins'; | import * as plugins from './smartnginx.plugins.js'; | ||||||
| import * as paths from './smartnginx.paths'; | import * as paths from './smartnginx.paths.js'; | ||||||
| import * as snippets from './smartnginx.snippets'; | import * as snippets from './smartnginx.snippets.js'; | ||||||
|  |  | ||||||
| import { SmartNginx } from './smartnginx.classes.smartnginx'; | import { SmartNginx } from './smartnginx.classes.smartnginx.js'; | ||||||
|  |  | ||||||
| import { IHostConfig } from './interfaces/hostconfig'; | import { type IHostConfig } from './interfaces/hostconfig.js'; | ||||||
|  |  | ||||||
| export enum hostTypes { | export enum hostTypes { | ||||||
|   reverseProxy |   reverseProxy, | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|   | |||||||
| @@ -1,9 +1,7 @@ | |||||||
| import * as plugins from './smartnginx.plugins'; | import * as plugins from './smartnginx.plugins.js'; | ||||||
| import * as paths from './smartnginx.paths'; | import * as paths from './smartnginx.paths.js'; | ||||||
| import { SmartNginx } from './smartnginx.classes.smartnginx'; | import { SmartNginx } from './smartnginx.classes.smartnginx.js'; | ||||||
| import { NginxHost } from './smartnginx.classes.nginxhost'; | import { NginxHost } from './smartnginx.classes.nginxhost.js'; | ||||||
|  |  | ||||||
| import { Smartshell } from '@pushrocks/smartshell'; |  | ||||||
|  |  | ||||||
| import { ChildProcess } from 'child_process'; | import { ChildProcess } from 'child_process'; | ||||||
|  |  | ||||||
| @@ -14,8 +12,8 @@ export class NginxProcess { | |||||||
|   public started: boolean = false; |   public started: boolean = false; | ||||||
|   public smartNginxRef: SmartNginx; |   public smartNginxRef: SmartNginx; | ||||||
|   private nginxChildProcess: ChildProcess; |   private nginxChildProcess: ChildProcess; | ||||||
|   private smartshellInstance = new Smartshell({ |   private smartshellInstance = new plugins.smartshell.Smartshell({ | ||||||
|     executor: 'bash' |     executor: 'bash', | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   constructor(nginxRefArg: SmartNginx) { |   constructor(nginxRefArg: SmartNginx) { | ||||||
| @@ -27,12 +25,12 @@ export class NginxProcess { | |||||||
|    */ |    */ | ||||||
|   public async start() { |   public async start() { | ||||||
|     if (!this.nginxChildProcess) { |     if (!this.nginxChildProcess) { | ||||||
|       this.nginxChildProcess = (await this.smartshellInstance.execStreaming( |       this.nginxChildProcess = ( | ||||||
|         `nginx -c ${paths.nginxConfFile}` |         await this.smartshellInstance.execStreaming(`nginx -c ${paths.nginxConfFile}`) | ||||||
|       )).childProcess; |       ).childProcess; | ||||||
|     } |     } | ||||||
|     this.started = true; |     this.started = true; | ||||||
|     plugins.smartlog.defaultLogger.log('info', 'started Nginx!'); |     console.log('info', 'started Nginx!'); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|   | |||||||
| @@ -1,9 +1,9 @@ | |||||||
| import * as plugins from './smartnginx.plugins'; | import * as plugins from './smartnginx.plugins.js'; | ||||||
| import * as paths from './smartnginx.paths'; | import * as paths from './smartnginx.paths.js'; | ||||||
| import * as snippets from './smartnginx.snippets'; | import * as snippets from './smartnginx.snippets.js'; | ||||||
| import { NginxHost } from './smartnginx.classes.nginxhost'; | import { NginxHost } from './smartnginx.classes.nginxhost.js'; | ||||||
| import { NginxProcess } from './smartnginx.classes.nginxprocess'; | import { NginxProcess } from './smartnginx.classes.nginxprocess.js'; | ||||||
| import { IHostConfig } from './interfaces/hostconfig'; | import { type IHostConfig } from './interfaces/hostconfig.js'; | ||||||
|  |  | ||||||
| export interface ISmartNginxContructorOptions { | export interface ISmartNginxContructorOptions { | ||||||
|   logger?: plugins.smartlog.Smartlog; |   logger?: plugins.smartlog.Smartlog; | ||||||
| @@ -18,15 +18,17 @@ export class SmartNginx { | |||||||
|   public logger: plugins.smartlog.Smartlog; |   public logger: plugins.smartlog.Smartlog; | ||||||
|  |  | ||||||
|   // the objectmaps |   // the objectmaps | ||||||
|   private deployedHosts = new plugins.lik.Objectmap<NginxHost>(); |   private deployedHosts = new plugins.lik.ObjectMap<NginxHost>(); | ||||||
|   private hostCandidates = new plugins.lik.Objectmap<NginxHost>(); |   private hostCandidates = new plugins.lik.ObjectMap<NginxHost>(); | ||||||
|  |  | ||||||
|   public nginxProcess: NginxProcess = new NginxProcess(this); |   public nginxProcess: NginxProcess = new NginxProcess(this); | ||||||
|   constructor(optionsArg: ISmartNginxContructorOptions) { |   constructor(optionsArg: ISmartNginxContructorOptions) { | ||||||
|     this.options = optionsArg; |     this.options = optionsArg; | ||||||
|     this.options.logger |     this.options.logger | ||||||
|       ? (this.logger = this.options.logger) |       ? (this.logger = this.options.logger) | ||||||
|       : (this.logger = plugins.smartlog.defaultLogger); |       : (this.logger = new plugins.smartlog.Smartlog({ | ||||||
|  |         logContext: null | ||||||
|  |       })); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // =================== |   // =================== | ||||||
| @@ -48,7 +50,7 @@ export class SmartNginx { | |||||||
|    * @param hostNameArg |    * @param hostNameArg | ||||||
|    */ |    */ | ||||||
|   public getDeployedNginxHostByHostName(hostNameArg: string): NginxHost { |   public getDeployedNginxHostByHostName(hostNameArg: string): NginxHost { | ||||||
|     return this.deployedHosts.find(nginxHost => { |     return this.deployedHosts.findSync((nginxHost) => { | ||||||
|       return nginxHost.hostName === hostNameArg; |       return nginxHost.hostName === hostNameArg; | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| @@ -65,7 +67,7 @@ export class SmartNginx { | |||||||
|    */ |    */ | ||||||
|   public async removeDeployedHost(nginxHostArg: NginxHost) { |   public async removeDeployedHost(nginxHostArg: NginxHost) { | ||||||
|     if (this.hostCandidates.isEmpty()) { |     if (this.hostCandidates.isEmpty()) { | ||||||
|       this.deployedHosts.forEach(hostArg => { |       this.deployedHosts.forEach((hostArg) => { | ||||||
|         this.hostCandidates.add(hostArg); |         this.hostCandidates.add(hostArg); | ||||||
|       }); |       }); | ||||||
|     } |     } | ||||||
| @@ -80,9 +82,9 @@ export class SmartNginx { | |||||||
|   private async areHostsDiverged(): Promise<boolean> { |   private async areHostsDiverged(): Promise<boolean> { | ||||||
|     let hostCounter = 0; |     let hostCounter = 0; | ||||||
|     let unfoundHosts = 0; |     let unfoundHosts = 0; | ||||||
|     await this.hostCandidates.forEach(async hostCandidateArg => { |     await this.hostCandidates.forEach(async (hostCandidateArg) => { | ||||||
|       let foundHost = false; |       let foundHost = false; | ||||||
|       await this.deployedHosts.forEach(async deployedHostArg => { |       await this.deployedHosts.forEach(async (deployedHostArg) => { | ||||||
|         if ( |         if ( | ||||||
|           hostCandidateArg.hostName === deployedHostArg.hostName && |           hostCandidateArg.hostName === deployedHostArg.hostName && | ||||||
|           hostCandidateArg.destination === deployedHostArg.destination && |           hostCandidateArg.destination === deployedHostArg.destination && | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| import * as plugins from './smartnginx.plugins'; | import * as plugins from './smartnginx.plugins.js'; | ||||||
|  |  | ||||||
| // directories | // directories | ||||||
| export const packageBase = plugins.path.join(__dirname, '../'); | export const packageBase = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../'); | ||||||
| export const nginxConfigDirPath = plugins.path.join(packageBase, 'nginxconfig'); | export const nginxConfigDirPath = plugins.path.join(packageBase, 'nginxconfig'); | ||||||
| export const nginxHostDirPath = plugins.path.join(nginxConfigDirPath, 'hosts'); | export const nginxHostDirPath = plugins.path.join(nginxConfigDirPath, 'hosts'); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,17 +4,18 @@ import * as path from 'path'; | |||||||
| export { path }; | export { path }; | ||||||
|  |  | ||||||
| // @pushrocks scope | // @pushrocks scope | ||||||
| import * as lik from '@pushrocks/lik'; |   import * as lik from '@push.rocks/lik'; | ||||||
| import * as smartlog from '@pushrocks/smartlog'; |   import * as smartfile from '@push.rocks/smartfile'; | ||||||
| import * as smartpromise from '@pushrocks/smartpromise'; |   import * as smartlog from '@push.rocks/smartlog'; | ||||||
| import * as smartshell from '@pushrocks/smartshell'; |   import * as smartpath from '@push.rocks/smartpath'; | ||||||
| import * as smartfile from '@pushrocks/smartfile'; |   import * as smartpromise from '@push.rocks/smartpromise'; | ||||||
| import * as smartstring from '@pushrocks/smartstring'; |   import * as smartshell from '@push.rocks/smartshell'; | ||||||
| import * as smartunique from '@pushrocks/smartunique'; |   import * as smartstring from '@push.rocks/smartstring'; | ||||||
|  |   import * as smartunique from '@push.rocks/smartunique'; | ||||||
|  |  | ||||||
| export { lik, smartlog, smartpromise, smartshell, smartfile, smartstring, smartunique }; | export { lik, smartfile, smartlog, smartpath, smartpromise, smartshell, smartstring, smartunique }; | ||||||
|  |  | ||||||
| // thirdparty scope | // thirdparty scope | ||||||
| import * as selfsigned from 'selfsigned'; |   import * as selfsigned from 'selfsigned'; | ||||||
|  |  | ||||||
| export { selfsigned }; | export { selfsigned }; | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| import * as plugins from './smartnginx.plugins'; | import * as plugins from './smartnginx.plugins.js'; | ||||||
| import * as paths from './smartnginx.paths'; | import * as paths from './smartnginx.paths.js'; | ||||||
| export let getBaseConfigString = (defaultProxy: string) => { | export let getBaseConfigString = (defaultProxy: string) => { | ||||||
|   const baseConfig = plugins.smartstring.indent.normalize(` |   const baseConfig = plugins.smartstring.indent.normalize(` | ||||||
| 		user www-data; | 		user www-data; | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | { | ||||||
|  |   "compilerOptions": { | ||||||
|  |     "experimentalDecorators": true, | ||||||
|  |     "useDefineForClassFields": false, | ||||||
|  |     "target": "ES2022", | ||||||
|  |     "module": "ES2022", | ||||||
|  |     "moduleResolution": "nodenext", | ||||||
|  |     "esModuleInterop": true, | ||||||
|  |     "verbatimModuleSyntax": true, | ||||||
|  |   } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user