Showing preview only (3,466K chars total). Download the full file or copy to clipboard to get everything.
Repository: goldbergyoni/nodebestpractices
Branch: master
Commit: c0b71ccf3a13
Files: 669
Total size: 3.2 MB
Directory structure:
gitextract_l1sblc9v/
├── .all-contributorsrc
├── .github/
│ ├── stale.yml
│ └── workflows/
│ ├── automerge-prs.yml
│ ├── lint-and-generate-html-from-markdown.yml
│ ├── update-date-in-last-update-badge.yml
│ └── update-last-update-badge.sh
├── .gitignore
├── .operations/
│ ├── .markdownlint.json
│ ├── CONTRIBUTING.md
│ ├── common-answers.md
│ ├── operations-manual.md
│ ├── writing-guidelines.basque.md
│ ├── writing-guidelines.chinese.md
│ ├── writing-guidelines.french.md
│ ├── writing-guidelines.indonesia.md
│ ├── writing-guidelines.japanese.md
│ ├── writing-guidelines.md
│ ├── writing-guidelines.polish.md
│ └── writing-guidelines.russian.md
├── LICENSE
├── README.basque.md
├── README.brazilian-portuguese.md
├── README.chinese.md
├── README.french.md
├── README.hebrew.md
├── README.indonesian.md
├── README.japanese.md
├── README.korean.md
├── README.md
├── README.polish.md
├── README.russian.md
├── assets/
│ └── images/
│ ├── members/
│ │ └── create-member-icon.md
│ └── placeholdet.txt
├── package.json
└── sections/
├── codestylepractices/
│ ├── eslint_prettier.basque.md
│ ├── eslint_prettier.brazilian-portuguese.md
│ ├── eslint_prettier.chinese.md
│ ├── eslint_prettier.french.md
│ ├── eslint_prettier.japanese.md
│ ├── eslint_prettier.korean.md
│ ├── eslint_prettier.md
│ ├── eslint_prettier.polish.md
│ └── eslint_prettier.russian.md
├── docker/
│ ├── avoid-build-time-secrets.basque.md
│ ├── avoid-build-time-secrets.chinese.md
│ ├── avoid-build-time-secrets.french.md
│ ├── avoid-build-time-secrets.japanese.md
│ ├── avoid-build-time-secrets.md
│ ├── bootstrap-using-node.basque.md
│ ├── bootstrap-using-node.chinese.md
│ ├── bootstrap-using-node.french.md
│ ├── bootstrap-using-node.japanese.md
│ ├── bootstrap-using-node.md
│ ├── clean-cache.basque.md
│ ├── clean-cache.chinese.md
│ ├── clean-cache.french.md
│ ├── clean-cache.japanese.md
│ ├── clean-cache.md
│ ├── docker-ignore.basque.md
│ ├── docker-ignore.chinese.md
│ ├── docker-ignore.french.md
│ ├── docker-ignore.japanese.md
│ ├── docker-ignore.md
│ ├── generic-tips.basque.md
│ ├── generic-tips.chinese.md
│ ├── generic-tips.french.md
│ ├── generic-tips.japanese.md
│ ├── generic-tips.md
│ ├── graceful-shutdown.basque.md
│ ├── graceful-shutdown.french.md
│ ├── graceful-shutdown.japanese.md
│ ├── graceful-shutdown.md
│ ├── image-tags.basque.md
│ ├── image-tags.french.md
│ ├── image-tags.japanese.md
│ ├── image-tags.md
│ ├── install-for-production.basque.md
│ ├── install-for-production.french.md
│ ├── install-for-production.japanese.md
│ ├── install-for-production.md
│ ├── lint-dockerfile.basque.md
│ ├── lint-dockerfile.french.md
│ ├── lint-dockerfile.japanese.md
│ ├── lint-dockerfile.md
│ ├── memory-limit.basque.md
│ ├── memory-limit.french.md
│ ├── memory-limit.japanese.md
│ ├── memory-limit.md
│ ├── multi_stage_builds.basque.md
│ ├── multi_stage_builds.french.md
│ ├── multi_stage_builds.japanese.md
│ ├── multi_stage_builds.md
│ ├── restart-and-replicate-processes.basque.md
│ ├── restart-and-replicate-processes.french.md
│ ├── restart-and-replicate-processes.japanese.md
│ ├── restart-and-replicate-processes.md
│ ├── scan-images.basque.md
│ ├── scan-images.french.md
│ ├── scan-images.japanese.md
│ ├── scan-images.md
│ ├── smaller_base_images.basque.md
│ ├── smaller_base_images.french.md
│ ├── smaller_base_images.japanese.md
│ ├── smaller_base_images.md
│ ├── use-cache-for-shorter-build-time.basque.md
│ ├── use-cache-for-shorter-build-time.french.md
│ ├── use-cache-for-shorter-build-time.japanese.md
│ └── use-cache-for-shorter-build-time.md
├── drafts/
│ ├── readme-general-toc-1.md
│ ├── readme-general-toc-2.md
│ ├── readme-general-toc-3.md
│ └── readme-general-toc-4.md
├── errorhandling/
│ ├── apmproducts.basque.md
│ ├── apmproducts.brazilian-portuguese.md
│ ├── apmproducts.chinese.md
│ ├── apmproducts.french.md
│ ├── apmproducts.japanese.md
│ ├── apmproducts.korean.md
│ ├── apmproducts.md
│ ├── apmproducts.polish.md
│ ├── apmproducts.russian.md
│ ├── asyncerrorhandling.basque.md
│ ├── asyncerrorhandling.brazilian-portuguese.md
│ ├── asyncerrorhandling.chinese.md
│ ├── asyncerrorhandling.french.md
│ ├── asyncerrorhandling.japanese.md
│ ├── asyncerrorhandling.korean.md
│ ├── asyncerrorhandling.md
│ ├── asyncerrorhandling.polish.md
│ ├── asyncerrorhandling.russian.md
│ ├── catchunhandledpromiserejection.basque.md
│ ├── catchunhandledpromiserejection.brazilian-portuguese.md
│ ├── catchunhandledpromiserejection.chinese.md
│ ├── catchunhandledpromiserejection.french.md
│ ├── catchunhandledpromiserejection.japanese.md
│ ├── catchunhandledpromiserejection.korean.md
│ ├── catchunhandledpromiserejection.md
│ ├── catchunhandledpromiserejection.polish.md
│ ├── catchunhandledpromiserejection.russian.md
│ ├── centralizedhandling.basque.md
│ ├── centralizedhandling.brazilian-portuguese.md
│ ├── centralizedhandling.chinese.md
│ ├── centralizedhandling.french.md
│ ├── centralizedhandling.japanese.md
│ ├── centralizedhandling.korean.md
│ ├── centralizedhandling.md
│ ├── centralizedhandling.polish.md
│ ├── centralizedhandling.russian.md
│ ├── documentingusingswagger.basque.md
│ ├── documentingusingswagger.brazilian-portuguese.md
│ ├── documentingusingswagger.chinese.md
│ ├── documentingusingswagger.french.md
│ ├── documentingusingswagger.japanese.md
│ ├── documentingusingswagger.korean.md
│ ├── documentingusingswagger.md
│ ├── documentingusingswagger.polish.md
│ ├── documentingusingswagger.russian.md
│ ├── failfast.basque.md
│ ├── failfast.brazilian-portuguese.md
│ ├── failfast.chinese.md
│ ├── failfast.french.md
│ ├── failfast.japanese.md
│ ├── failfast.korean.md
│ ├── failfast.md
│ ├── failfast.polish.md
│ ├── failfast.russian.md
│ ├── monitoring.chinese.md
│ ├── monitoring.french.md
│ ├── monitoring.japanese.md
│ ├── monitoring.md
│ ├── monitoring.russian.md
│ ├── operationalvsprogrammererror.basque.md
│ ├── operationalvsprogrammererror.brazilian-portuguese.md
│ ├── operationalvsprogrammererror.chinese.md
│ ├── operationalvsprogrammererror.french.md
│ ├── operationalvsprogrammererror.japanese.md
│ ├── operationalvsprogrammererror.korean.md
│ ├── operationalvsprogrammererror.md
│ ├── operationalvsprogrammererror.polish.md
│ ├── operationalvsprogrammererror.russian.md
│ ├── returningpromises.basque.md
│ ├── returningpromises.french.md
│ ├── returningpromises.md
│ ├── returningpromises.russian.md
│ ├── shuttingtheprocess.basque.md
│ ├── shuttingtheprocess.brazilian-portuguese.md
│ ├── shuttingtheprocess.chinese.md
│ ├── shuttingtheprocess.french.md
│ ├── shuttingtheprocess.japanese.md
│ ├── shuttingtheprocess.korean.md
│ ├── shuttingtheprocess.md
│ ├── shuttingtheprocess.polish.md
│ ├── shuttingtheprocess.russian.md
│ ├── testingerrorflows.basque.md
│ ├── testingerrorflows.brazilian-portuguese.md
│ ├── testingerrorflows.chinese.md
│ ├── testingerrorflows.french.md
│ ├── testingerrorflows.japanese.md
│ ├── testingerrorflows.korean.md
│ ├── testingerrorflows.md
│ ├── testingerrorflows.polish.md
│ ├── testingerrorflows.russian.md
│ ├── usematurelogger.basque.md
│ ├── usematurelogger.brazilian-portuguese.md
│ ├── usematurelogger.chinese.md
│ ├── usematurelogger.french.md
│ ├── usematurelogger.japanese.md
│ ├── usematurelogger.korean.md
│ ├── usematurelogger.md
│ ├── usematurelogger.polish.md
│ ├── usematurelogger.russian.md
│ ├── useonlythebuiltinerror.basque.md
│ ├── useonlythebuiltinerror.brazilian-portuguese.md
│ ├── useonlythebuiltinerror.chinese.md
│ ├── useonlythebuiltinerror.french.md
│ ├── useonlythebuiltinerror.japanese.md
│ ├── useonlythebuiltinerror.korean.md
│ ├── useonlythebuiltinerror.md
│ ├── useonlythebuiltinerror.polish.md
│ └── useonlythebuiltinerror.russian.md
├── examples/
│ └── dockerfile/
│ ├── .dockerignore
│ ├── .npmrc
│ ├── Dockerfile
│ ├── package.json
│ └── src/
│ └── app.ts
├── performance/
│ ├── block-loop.basque.md
│ ├── block-loop.french.md
│ ├── block-loop.japanese.md
│ ├── block-loop.md
│ ├── block-loop.polish.md
│ ├── block-loop.russian.md
│ ├── nativeoverutil.basque.md
│ ├── nativeoverutil.brazilian-portuguese.md
│ ├── nativeoverutil.french.md
│ ├── nativeoverutil.japanese.md
│ ├── nativeoverutil.md
│ ├── nativeoverutil.polish.md
│ └── nativeoverutil.russian.md
├── production/
│ ├── LTSrelease.basque.md
│ ├── LTSrelease.brazilian-portuguese.md
│ ├── LTSrelease.chinese.md
│ ├── LTSrelease.french.md
│ ├── LTSrelease.japanese.md
│ ├── LTSrelease.korean.md
│ ├── LTSrelease.md
│ ├── LTSrelease.polish.md
│ ├── LTSrelease.russian.md
│ ├── apmproducts.basque.md
│ ├── apmproducts.brazilian-portuguese.md
│ ├── apmproducts.chinese.md
│ ├── apmproducts.french.md
│ ├── apmproducts.japanese.md
│ ├── apmproducts.korean.md
│ ├── apmproducts.md
│ ├── apmproducts.polish.md
│ ├── apmproducts.russian.md
│ ├── assigntransactionid.basque.md
│ ├── assigntransactionid.brazilian-portuguese.md
│ ├── assigntransactionid.chinese.md
│ ├── assigntransactionid.french.md
│ ├── assigntransactionid.japanese.md
│ ├── assigntransactionid.korean.md
│ ├── assigntransactionid.md
│ ├── assigntransactionid.polish.md
│ ├── assigntransactionid.russian.md
│ ├── bestateless.basque.md
│ ├── bestateless.brazilian-portuguese.md
│ ├── bestateless.chinese.md
│ ├── bestateless.french.md
│ ├── bestateless.japanese.md
│ ├── bestateless.korean.md
│ ├── bestateless.md
│ ├── bestateless.polish.md
│ ├── bestateless.russian.md
│ ├── createmaintenanceendpoint.basque.md
│ ├── createmaintenanceendpoint.brazilian-portuguese.md
│ ├── createmaintenanceendpoint.chinese.md
│ ├── createmaintenanceendpoint.french.md
│ ├── createmaintenanceendpoint.japanese.md
│ ├── createmaintenanceendpoint.korean.md
│ ├── createmaintenanceendpoint.md
│ ├── createmaintenanceendpoint.polish.md
│ ├── createmaintenanceendpoint.russian.md
│ ├── delegatetoproxy.basque.md
│ ├── delegatetoproxy.brazilian-portuguese.md
│ ├── delegatetoproxy.chinese.md
│ ├── delegatetoproxy.french.md
│ ├── delegatetoproxy.japanese.md
│ ├── delegatetoproxy.korean.md
│ ├── delegatetoproxy.md
│ ├── delegatetoproxy.polish.md
│ ├── delegatetoproxy.russian.md
│ ├── detectvulnerabilities.basque.md
│ ├── detectvulnerabilities.brazilian-portuguese.md
│ ├── detectvulnerabilities.chinese.md
│ ├── detectvulnerabilities.french.md
│ ├── detectvulnerabilities.japanese.md
│ ├── detectvulnerabilities.korean.md
│ ├── detectvulnerabilities.md
│ ├── detectvulnerabilities.polish.md
│ ├── detectvulnerabilities.russian.md
│ ├── frontendout.basque.md
│ ├── frontendout.brazilian-portuguese.md
│ ├── frontendout.chinese.md
│ ├── frontendout.french.md
│ ├── frontendout.japanese.md
│ ├── frontendout.korean.md
│ ├── frontendout.md
│ ├── frontendout.polish.md
│ ├── frontendout.russian.md
│ ├── guardprocess.basque.md
│ ├── guardprocess.brazilian-portuguese.md
│ ├── guardprocess.chinese.md
│ ├── guardprocess.french.md
│ ├── guardprocess.japanese.md
│ ├── guardprocess.korean.md
│ ├── guardprocess.md
│ ├── guardprocess.polish.md
│ ├── guardprocess.russian.md
│ ├── installpackageswithnpmci.basque.md
│ ├── installpackageswithnpmci.french.md
│ ├── installpackageswithnpmci.japanese.md
│ ├── installpackageswithnpmci.md
│ ├── lockdependencies.basque.md
│ ├── lockdependencies.brazilian-portuguese.md
│ ├── lockdependencies.chinese.md
│ ├── lockdependencies.french.md
│ ├── lockdependencies.japanese.md
│ ├── lockdependencies.korean.md
│ ├── lockdependencies.md
│ ├── lockdependencies.polish.md
│ ├── lockdependencies.russian.md
│ ├── logrouting.basque.md
│ ├── logrouting.brazilian-portuguese.md
│ ├── logrouting.french.md
│ ├── logrouting.japanese.md
│ ├── logrouting.md
│ ├── logrouting.polish.md
│ ├── logrouting.russian.md
│ ├── measurememory.basque.md
│ ├── measurememory.brazilian-portuguese.md
│ ├── measurememory.chinese.md
│ ├── measurememory.french.md
│ ├── measurememory.japanese.md
│ ├── measurememory.korean.md
│ ├── measurememory.md
│ ├── measurememory.polish.md
│ ├── measurememory.russian.md
│ ├── monitoring.basque.md
│ ├── monitoring.brazilian-portuguese.md
│ ├── monitoring.chinese.md
│ ├── monitoring.french.md
│ ├── monitoring.japanese.md
│ ├── monitoring.korean.md
│ ├── monitoring.md
│ ├── monitoring.polish.md
│ ├── monitoring.russian.md
│ ├── productioncode.basque.md
│ ├── productioncode.brazilian-portuguese.md
│ ├── productioncode.chinese.md
│ ├── productioncode.french.md
│ ├── productioncode.japanese.md
│ ├── productioncode.korean.md
│ ├── productioncode.md
│ ├── productioncode.polish.md
│ ├── productioncode.russian.md
│ ├── setnodeenv.basque.md
│ ├── setnodeenv.brazilian-portuguese.md
│ ├── setnodeenv.chinese.md
│ ├── setnodeenv.french.md
│ ├── setnodeenv.japanese.md
│ ├── setnodeenv.korean.md
│ ├── setnodeenv.md
│ ├── setnodeenv.polish.md
│ ├── setnodeenv.russian.md
│ ├── smartlogging.basque.md
│ ├── smartlogging.brazilian-portuguese.md
│ ├── smartlogging.chinese.md
│ ├── smartlogging.french.md
│ ├── smartlogging.japanese.md
│ ├── smartlogging.korean.md
│ ├── smartlogging.md
│ ├── smartlogging.polish.md
│ ├── smartlogging.russian.md
│ ├── utilizecpu.basque.md
│ ├── utilizecpu.brazilian-portuguese.md
│ ├── utilizecpu.chinese.md
│ ├── utilizecpu.french.md
│ ├── utilizecpu.japanese.md
│ ├── utilizecpu.korean.md
│ ├── utilizecpu.md
│ ├── utilizecpu.polish.md
│ └── utilizecpu.russian.md
├── projectstructre/
│ ├── breakintcomponents.basque.md
│ ├── breakintcomponents.brazilian-portuguese.md
│ ├── breakintcomponents.chinese.md
│ ├── breakintcomponents.french.md
│ ├── breakintcomponents.japanese.md
│ ├── breakintcomponents.korean.md
│ ├── breakintcomponents.md
│ ├── breakintcomponents.polish.md
│ ├── breakintcomponents.russian.md
│ ├── choose-framework.md
│ ├── configguide.basque.md
│ ├── configguide.brazilian-portuguese.md
│ ├── configguide.chinese.md
│ ├── configguide.french.md
│ ├── configguide.japanese.md
│ ├── configguide.korean.md
│ ├── configguide.md
│ ├── configguide.polish.md
│ ├── configguide.russian.md
│ ├── createlayers.basque.md
│ ├── createlayers.brazilian-portuguese.md
│ ├── createlayers.chinese.md
│ ├── createlayers.french.md
│ ├── createlayers.japanese.md
│ ├── createlayers.korean.md
│ ├── createlayers.md
│ ├── createlayers.polish.md
│ ├── createlayers.russian.md
│ ├── separateexpress.basque.md
│ ├── separateexpress.brazilian-portuguese.md
│ ├── separateexpress.chinese.md
│ ├── separateexpress.french.md
│ ├── separateexpress.japanese.md
│ ├── separateexpress.korean.md
│ ├── separateexpress.polish.md
│ ├── separateexpress.russian.md
│ ├── thincomponents.chinese.md
│ ├── thincomponents.french.md
│ ├── thincomponents.japanese.md
│ ├── thincomponents.md
│ ├── thincomponents.russian.md
│ ├── typescript-considerations.md
│ ├── wraputilities.basque.md
│ ├── wraputilities.brazilian-portuguese.md
│ ├── wraputilities.chinese.md
│ ├── wraputilities.french.md
│ ├── wraputilities.japanese.md
│ ├── wraputilities.korean.md
│ ├── wraputilities.md
│ ├── wraputilities.polish.md
│ └── wraputilities.russian.md
├── security/
│ ├── avoid_publishing_secrets.basque.md
│ ├── avoid_publishing_secrets.brazilian-portuguese.md
│ ├── avoid_publishing_secrets.french.md
│ ├── avoid_publishing_secrets.japanese.md
│ ├── avoid_publishing_secrets.md
│ ├── avoid_publishing_secrets.polish.md
│ ├── avoid_publishing_secrets.russian.md
│ ├── avoideval.basque.md
│ ├── avoideval.brazilian-portuguese.md
│ ├── avoideval.chinese.md
│ ├── avoideval.french.md
│ ├── avoideval.japanese.md
│ ├── avoideval.md
│ ├── avoideval.polish.md
│ ├── avoideval.russian.md
│ ├── bcryptpasswords.brazilian-portuguese.md
│ ├── bcryptpasswords.chinese.md
│ ├── bcryptpasswords.japanese.md
│ ├── bcryptpasswords.polish.md
│ ├── bcryptpasswords.russian.md
│ ├── childprocesses.basque.md
│ ├── childprocesses.brazilian-portuguese.md
│ ├── childprocesses.chinese.md
│ ├── childprocesses.french.md
│ ├── childprocesses.japanese.md
│ ├── childprocesses.md
│ ├── childprocesses.polish.md
│ ├── childprocesses.russian.md
│ ├── commonsecuritybestpractices.basque.md
│ ├── commonsecuritybestpractices.brazilian-portuguese.md
│ ├── commonsecuritybestpractices.french.md
│ ├── commonsecuritybestpractices.japanese.md
│ ├── commonsecuritybestpractices.md
│ ├── commonsecuritybestpractices.polish.md
│ ├── commonsecuritybestpractices.russian.md
│ ├── dependencysecurity.basque.md
│ ├── dependencysecurity.brazilian-portuguese.md
│ ├── dependencysecurity.french.md
│ ├── dependencysecurity.japanese.md
│ ├── dependencysecurity.md
│ ├── dependencysecurity.polish.md
│ ├── dependencysecurity.russian.md
│ ├── escape-output.basque.md
│ ├── escape-output.brazilian-portuguese.md
│ ├── escape-output.french.md
│ ├── escape-output.japanese.md
│ ├── escape-output.md
│ ├── escape-output.polish.md
│ ├── escape-output.russian.md
│ ├── expirejwt.basque.md
│ ├── expirejwt.brazilian-portuguese.md
│ ├── expirejwt.chinese.md
│ ├── expirejwt.french.md
│ ├── expirejwt.japanese.md
│ ├── expirejwt.md
│ ├── expirejwt.polish.md
│ ├── expirejwt.russian.md
│ ├── hideerrors.basque.md
│ ├── hideerrors.brazilian-portuguese.md
│ ├── hideerrors.chinese.md
│ ├── hideerrors.french.md
│ ├── hideerrors.japanese.md
│ ├── hideerrors.md
│ ├── hideerrors.polish.md
│ ├── hideerrors.russian.md
│ ├── limitrequests.basque.md
│ ├── limitrequests.brazilian-portuguese.md
│ ├── limitrequests.chinese.md
│ ├── limitrequests.french.md
│ ├── limitrequests.japanese.md
│ ├── limitrequests.md
│ ├── limitrequests.polish.md
│ ├── limitrequests.russian.md
│ ├── lintrules.basque.md
│ ├── lintrules.brazilian-portuguese.md
│ ├── lintrules.french.md
│ ├── lintrules.japanese.md
│ ├── lintrules.md
│ ├── lintrules.polish.md
│ ├── lintrules.russian.md
│ ├── login-rate-limit.basque.md
│ ├── login-rate-limit.brazilian-portuguese.md
│ ├── login-rate-limit.french.md
│ ├── login-rate-limit.japanese.md
│ ├── login-rate-limit.md
│ ├── login-rate-limit.polish.md
│ ├── login-rate-limit.russian.md
│ ├── non-root-user.basque.md
│ ├── non-root-user.brazilian-portuguese.md
│ ├── non-root-user.french.md
│ ├── non-root-user.japanese.md
│ ├── non-root-user.md
│ ├── non-root-user.polish.md
│ ├── non-root-user.russian.md
│ ├── ormodmusage.basque.md
│ ├── ormodmusage.brazilian-portuguese.md
│ ├── ormodmusage.french.md
│ ├── ormodmusage.japanese.md
│ ├── ormodmusage.md
│ ├── ormodmusage.polish.md
│ ├── ormodmusage.russian.md
│ ├── regex.basque.md
│ ├── regex.brazilian-portuguese.md
│ ├── regex.french.md
│ ├── regex.japanese.md
│ ├── regex.md
│ ├── regex.polish.md
│ ├── regex.russian.md
│ ├── requestpayloadsizelimit.basque.md
│ ├── requestpayloadsizelimit.brazilian-portuguese.md
│ ├── requestpayloadsizelimit.french.md
│ ├── requestpayloadsizelimit.japanese.md
│ ├── requestpayloadsizelimit.md
│ ├── requestpayloadsizelimit.polish.md
│ ├── requestpayloadsizelimit.russian.md
│ ├── safemoduleloading.basque.md
│ ├── safemoduleloading.brazilian-portuguese.md
│ ├── safemoduleloading.chinese.md
│ ├── safemoduleloading.french.md
│ ├── safemoduleloading.japanese.md
│ ├── safemoduleloading.md
│ ├── safemoduleloading.polish.md
│ ├── safemoduleloading.russian.md
│ ├── saferedirects.basque.md
│ ├── saferedirects.brazilian-portuguese.md
│ ├── saferedirects.chinese.md
│ ├── saferedirects.french.md
│ ├── saferedirects.japanese.md
│ ├── saferedirects.md
│ ├── saferedirects.polish.md
│ ├── saferedirects.russian.md
│ ├── sandbox.basque.md
│ ├── sandbox.brazilian-portuguese.md
│ ├── sandbox.chinese.md
│ ├── sandbox.french.md
│ ├── sandbox.japanese.md
│ ├── sandbox.md
│ ├── sandbox.polish.md
│ ├── sandbox.russian.md
│ ├── secretmanagement.basque.md
│ ├── secretmanagement.brazilian-portuguese.md
│ ├── secretmanagement.french.md
│ ├── secretmanagement.japanese.md
│ ├── secretmanagement.md
│ ├── secretmanagement.polish.md
│ ├── secretmanagement.russian.md
│ ├── secureheaders.basque.md
│ ├── secureheaders.brazilian-portuguese.md
│ ├── secureheaders.french.md
│ ├── secureheaders.japanese.md
│ ├── secureheaders.md
│ ├── secureheaders.polish.md
│ ├── secureheaders.russian.md
│ ├── secureserver.basque.md
│ ├── secureserver.brazilian-portuguese.md
│ ├── secureserver.chinese.md
│ ├── secureserver.french.md
│ ├── secureserver.japanese.md
│ ├── secureserver.md
│ ├── secureserver.russian.md
│ ├── sessions.basque.md
│ ├── sessions.brazilian-portuguese.md
│ ├── sessions.french.md
│ ├── sessions.japanese.md
│ ├── sessions.md
│ ├── sessions.polish.md
│ ├── sessions.russian.md
│ ├── userpasswords.basque.md
│ ├── userpasswords.french.md
│ ├── userpasswords.md
│ ├── validation.basque.md
│ ├── validation.brazilian-portuguese.md
│ ├── validation.french.md
│ ├── validation.japanese.md
│ ├── validation.md
│ ├── validation.polish.md
│ └── validation.russian.md
├── template.basque.md
├── template.md
└── testingandquality/
├── 3-parts-in-name.basque.md
├── 3-parts-in-name.brazilian-portuguese.md
├── 3-parts-in-name.french.md
├── 3-parts-in-name.japanese.md
├── 3-parts-in-name.md
├── 3-parts-in-name.polish.md
├── 3-parts-in-name.russian.md
├── aaa.basque.md
├── aaa.french.md
├── aaa.japanese.md
├── aaa.md
├── aaa.polish.md
├── aaa.russian.md
├── avoid-global-test-fixture.basque.md
├── avoid-global-test-fixture.brazilian-portuguese.md
├── avoid-global-test-fixture.french.md
├── avoid-global-test-fixture.japanese.md
├── avoid-global-test-fixture.md
├── avoid-global-test-fixture.polish.md
├── avoid-global-test-fixture.russian.md
├── bumpversion.japanese.md
├── bumpversion.md
├── citools.basque.md
├── citools.brazilian-portuguese.md
├── citools.chinese.md
├── citools.french.md
├── citools.japanese.md
├── citools.korean.md
├── citools.polish.md
├── citools.russian.md
├── mock-external-services.md
├── randomize-port.md
├── refactoring.basque.md
├── refactoring.brazilian-portuguese.md
├── refactoring.french.md
├── refactoring.japanese.md
├── refactoring.korean.md
├── refactoring.md
├── refactoring.polish.md
├── refactoring.russian.md
├── test-five-outcomes.md
├── test-middlewares.basque.md
├── test-middlewares.french.md
├── test-middlewares.japanese.md
├── test-middlewares.korean.md
└── test-middlewares.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .all-contributorsrc
================================================
{
"files": [
"README.basque.md",
"README.brazilian-portuguese.md",
"README.chinese.md",
"README.french.md",
"README.indonesian.md",
"README.japanese.md",
"README.korean.md",
"README.md",
"README.polish.md",
"README.russian.md"
],
"imageSize": 100,
"contributorsPerLine": 7,
"contributorTemplate": "<a href=\"<%= contributor.profile %>\"><img src=\"<%= contributor.avatar_url %>\" width=\"<%= options.imageSize %>px;\" alt=\"<%= contributor.name %>\"style=\"max-width:<%= options.imageSize %>px;min-width:<%= options.imageSize %>px;\" /><br /><sub style=\"white-space: nowrap;overflow: hidden;text-overflow: ellipsis;\"><b><%= contributor.name %></b></sub></a><br /><%= contributions %>",
"badgeTemplate": "[](#contributors)",
"contributors": [
{
"login": "kevinrambaud",
"name": "Kevin Rambaud",
"avatar_url": "https://avatars1.githubusercontent.com/u/7501477?v=4",
"profile": "https://github.com/kevinrambaud",
"contributions": [
"content"
]
},
{
"login": "mfine15",
"name": "Michael Fine",
"avatar_url": "https://avatars1.githubusercontent.com/u/1286554?v=4",
"profile": "https://github.com/mfine15",
"contributions": [
"content"
]
},
{
"login": "squgeim",
"name": "Shreya Dahal",
"avatar_url": "https://avatars0.githubusercontent.com/u/4996818?v=4",
"profile": "http://squgeim.github.io",
"contributions": [
"content"
]
},
{
"login": "matheusrocha89",
"name": "Matheus Cruz Rocha",
"avatar_url": "https://avatars1.githubusercontent.com/u/3718366?v=4",
"profile": "http://matheusrocha89.com",
"contributions": [
"content"
]
},
{
"login": "BitYog",
"name": "Yog Mehta",
"avatar_url": "https://avatars2.githubusercontent.com/u/28219178?v=4",
"profile": "https://bityog.github.io/Portfolio/",
"contributions": [
"content"
]
},
{
"login": "kudapara",
"name": "Kudakwashe Paradzayi",
"avatar_url": "https://avatars3.githubusercontent.com/u/13519184?v=4",
"profile": "http://kudapara.co.zw",
"contributions": [
"content"
]
},
{
"login": "t1st3",
"name": "t1st3",
"avatar_url": "https://avatars1.githubusercontent.com/u/1469638?v=4",
"profile": "https://www.t1st3.com/",
"contributions": [
"content"
]
},
{
"login": "mulijordan1976",
"name": "mulijordan1976",
"avatar_url": "https://avatars0.githubusercontent.com/u/33382022?v=4",
"profile": "https://github.com/mulijordan1976",
"contributions": [
"content"
]
},
{
"login": "matchai",
"name": "Matan Kushner",
"avatar_url": "https://avatars0.githubusercontent.com/u/4658208?v=4",
"profile": "https://twitter.com/matchai",
"contributions": [
"content"
]
},
{
"login": "fabiothiroki",
"name": "Fabio Hiroki",
"avatar_url": "https://avatars2.githubusercontent.com/u/670057?v=4",
"profile": "https://fabiothiroki.github.io",
"contributions": [
"content"
]
},
{
"login": "jsumners",
"name": "James Sumners",
"avatar_url": "https://avatars1.githubusercontent.com/u/321201?v=4",
"profile": "http://james.sumners.info/",
"contributions": [
"content"
]
},
{
"login": "dan-gamble",
"name": "Dan Gamble",
"avatar_url": "https://avatars2.githubusercontent.com/u/7152041?v=4",
"profile": "https://twitter.com/_DanGamble",
"contributions": [
"content"
]
},
{
"login": "trainorpj",
"name": "PJ Trainor",
"avatar_url": "https://avatars3.githubusercontent.com/u/13276704?v=4",
"profile": "https://github.com/trainorpj",
"contributions": [
"content"
]
},
{
"login": "reod",
"name": "Remek Ambroziak",
"avatar_url": "https://avatars0.githubusercontent.com/u/3164299?v=4",
"profile": "https://github.com/reod",
"contributions": [
"content"
]
},
{
"login": "yonjah",
"name": "Yoni Jah",
"avatar_url": "https://avatars0.githubusercontent.com/u/1829789?v=4",
"profile": "https://ca.non.co.il",
"contributions": [
"content"
]
},
{
"login": "hazolsky",
"name": "Misha Khokhlov",
"avatar_url": "https://avatars1.githubusercontent.com/u/1270790?v=4",
"profile": "https://github.com/hazolsky",
"contributions": [
"content"
]
},
{
"login": "EvgenyOrekhov",
"name": "Evgeny Orekhov",
"avatar_url": "https://avatars3.githubusercontent.com/u/8045060?v=4",
"profile": "https://plus.google.com/+ЕвгенийОрехов/",
"contributions": [
"content"
]
},
{
"login": "gediminasml",
"name": "-",
"avatar_url": "https://avatars3.githubusercontent.com/u/19854105?v=4",
"profile": "https://github.com/gediminasml",
"contributions": [
"content"
]
},
{
"login": "hisaac",
"name": "Isaac Halvorson",
"avatar_url": "https://avatars3.githubusercontent.com/u/923876?v=4",
"profile": "http://hisaac.net",
"contributions": [
"content"
]
},
{
"login": "vkaracic",
"name": "Vedran Karačić",
"avatar_url": "https://avatars3.githubusercontent.com/u/2808092?v=4",
"profile": "http://www.vedrankaracic.com",
"contributions": [
"content"
]
},
{
"login": "lallenlowe",
"name": "lallenlowe",
"avatar_url": "https://avatars3.githubusercontent.com/u/10761165?v=4",
"profile": "https://github.com/lallenlowe",
"contributions": [
"content"
]
},
{
"login": "nwwells",
"name": "Nathan Wells",
"avatar_url": "https://avatars2.githubusercontent.com/u/1039473?v=4",
"profile": "https://github.com/nwwells",
"contributions": [
"content"
]
},
{
"login": "paulovitin",
"name": "Paulo Reis",
"avatar_url": "https://avatars0.githubusercontent.com/u/125503?v=4",
"profile": "https://github.com/paulovitin",
"contributions": [
"content"
]
},
{
"login": "syzer",
"name": "syzer",
"avatar_url": "https://avatars2.githubusercontent.com/u/1989646?v=4",
"profile": "https://snap.simpego.ch",
"contributions": [
"content"
]
},
{
"login": "davesnx",
"name": "David Sancho",
"avatar_url": "https://avatars0.githubusercontent.com/u/3763599?v=4",
"profile": "http://sancho.dev",
"contributions": [
"content"
]
},
{
"login": "pupix",
"name": "Robert Manolea",
"avatar_url": "https://avatars0.githubusercontent.com/u/4929965?v=4",
"profile": "https://apiforge.it",
"contributions": [
"content"
]
},
{
"login": "spaxe",
"name": "Xavier Ho",
"avatar_url": "https://avatars2.githubusercontent.com/u/708395?v=4",
"profile": "https://jumptoglide.com",
"contributions": [
"content"
]
},
{
"login": "ocularrhythm",
"name": "Aaron",
"avatar_url": "https://avatars0.githubusercontent.com/u/2738518?v=4",
"profile": "http://www.ocular-rhythm.io",
"contributions": [
"content"
]
},
{
"login": "septa97",
"name": "Jan Charles Maghirang Adona",
"avatar_url": "https://avatars2.githubusercontent.com/u/13742634?v=4",
"profile": "https://septa97.me",
"contributions": [
"content"
]
},
{
"login": "AllenFang",
"name": "Allen",
"avatar_url": "https://avatars2.githubusercontent.com/u/5351390?v=4",
"profile": "https://www.cakeresume.com/allenfang",
"contributions": [
"content"
]
},
{
"login": "leonardovillela",
"name": "Leonardo Villela",
"avatar_url": "https://avatars3.githubusercontent.com/u/8650543?v=4",
"profile": "https://github.com/leonardovillela",
"contributions": [
"content"
]
},
{
"login": "MichalZalecki",
"name": "Michał Załęcki",
"avatar_url": "https://avatars1.githubusercontent.com/u/3136577?v=4",
"profile": "https://michalzalecki.com",
"contributions": [
"content"
]
},
{
"login": "chrisnicola",
"name": "Chris Nicola",
"avatar_url": "https://avatars1.githubusercontent.com/u/156449?v=4",
"profile": "http://www.wealthbar.com",
"contributions": [
"content"
]
},
{
"login": "aecorredor",
"name": "Alejandro Corredor",
"avatar_url": "https://avatars3.githubusercontent.com/u/9114987?v=4",
"profile": "https://twitter.com/aecorredor",
"contributions": [
"content"
]
},
{
"login": "cwar",
"name": "cwar",
"avatar_url": "https://avatars3.githubusercontent.com/u/272843?v=4",
"profile": "https://github.com/cwar",
"contributions": [
"content"
]
},
{
"login": "keyfoxth",
"name": "Yuwei",
"avatar_url": "https://avatars3.githubusercontent.com/u/10647132?v=4",
"profile": "https://github.com/keyfoxth",
"contributions": [
"content"
]
},
{
"login": "utkarshbhatt12",
"name": "Utkarsh Bhatt",
"avatar_url": "https://avatars3.githubusercontent.com/u/10895594?v=4",
"profile": "https://bigcodenerd.org",
"contributions": [
"content"
]
},
{
"login": "duartemendes",
"name": "Duarte Mendes",
"avatar_url": "https://avatars2.githubusercontent.com/u/12852058?v=4",
"profile": "https://github.com/duartemendes",
"contributions": [
"content"
]
},
{
"login": "serv",
"name": "Jason Kim",
"avatar_url": "https://avatars2.githubusercontent.com/u/103456?v=4",
"profile": "http://jasonkim.ca",
"contributions": [
"content"
]
},
{
"login": "Max101",
"name": "Mitja O.",
"avatar_url": "https://avatars2.githubusercontent.com/u/2124249?v=4",
"profile": "https://github.com/Max101",
"contributions": [
"content"
]
},
{
"login": "SandroMiguel",
"name": "Sandro Miguel Marques",
"avatar_url": "https://avatars0.githubusercontent.com/u/6423157?v=4",
"profile": "http://sandromiguel.com",
"contributions": [
"content"
]
},
{
"login": "GabeKuslansky",
"name": "Gabe",
"avatar_url": "https://avatars3.githubusercontent.com/u/9855482?v=4",
"profile": "https://github.com/GabeKuslansky",
"contributions": [
"content"
]
},
{
"login": "ripper234",
"name": "Ron Gross",
"avatar_url": "https://avatars1.githubusercontent.com/u/172282?v=4",
"profile": "http://ripper234.com/",
"contributions": [
"content"
]
},
{
"login": "vkarpov15",
"name": "Valeri Karpov",
"avatar_url": "https://avatars2.githubusercontent.com/u/1620265?v=4",
"profile": "http://www.thecodebarbarian.com",
"contributions": [
"content"
]
},
{
"login": "imsergiobernal",
"name": "Sergio Bernal",
"avatar_url": "https://avatars3.githubusercontent.com/u/20087388?v=4",
"profile": "https://sergiobernal.com",
"contributions": [
"content"
]
},
{
"login": "ntelkedzhiev",
"name": "Nikola Telkedzhiev",
"avatar_url": "https://avatars2.githubusercontent.com/u/7332371?v=4",
"profile": "https://github.com/ntelkedzhiev",
"contributions": [
"content"
]
},
{
"login": "vitordagamagodoy",
"name": "Vitor Godoy",
"avatar_url": "https://avatars0.githubusercontent.com/u/26370059?v=4",
"profile": "https://github.com/vitordagamagodoy",
"contributions": [
"content"
]
},
{
"login": "manishsaraan",
"name": "Manish Saraan",
"avatar_url": "https://avatars2.githubusercontent.com/u/19797340?v=4",
"profile": "https://www.manishsaraan.com/",
"contributions": [
"content"
]
},
{
"login": "uronly14me",
"name": "Sangbeom Han",
"avatar_url": "https://avatars2.githubusercontent.com/u/5186814?v=4",
"profile": "https://github.com/uronly14me",
"contributions": [
"content"
]
},
{
"login": "blackmatch",
"name": "blackmatch",
"avatar_url": "https://avatars3.githubusercontent.com/u/12443954?v=4",
"profile": "https://blackmatch.github.io",
"contributions": [
"content"
]
},
{
"login": "ISNIT0",
"name": "Joe Reeve",
"avatar_url": "https://avatars3.githubusercontent.com/u/5173131?v=4",
"profile": "https://simmsreeve.com",
"contributions": [
"content"
]
},
{
"login": "BusbyActual",
"name": "Ryan Busby",
"avatar_url": "https://avatars2.githubusercontent.com/u/14985016?v=4",
"profile": "https://github.com/BusbyActual",
"contributions": [
"content"
]
},
{
"login": "ImanMh",
"name": "Iman Mohamadi",
"avatar_url": "https://avatars3.githubusercontent.com/u/4482199?v=4",
"profile": "http://jsdecorator.com",
"contributions": [
"content"
]
},
{
"login": "HeeL",
"name": "Sergii Paryzhskyi",
"avatar_url": "https://avatars1.githubusercontent.com/u/287769?v=4",
"profile": "https://github.com/HeeL",
"contributions": [
"content"
]
},
{
"login": "kapilepatel",
"name": "Kapil Patel",
"avatar_url": "https://avatars3.githubusercontent.com/u/25738473?v=4",
"profile": "https://github.com/kapilepatel",
"contributions": [
"content"
]
},
{
"login": "justjavac",
"name": "迷渡",
"avatar_url": "https://avatars1.githubusercontent.com/u/359395?v=4",
"profile": "https://twitter.com/justjavac",
"contributions": [
"content"
]
},
{
"login": "hozefaj",
"name": "Hozefa",
"avatar_url": "https://avatars1.githubusercontent.com/u/2084833?v=4",
"profile": "https://github.com/hozefaj",
"contributions": [
"content"
]
},
{
"login": "el-ethan",
"name": "Ethan",
"avatar_url": "https://avatars3.githubusercontent.com/u/10249884?v=4",
"profile": "https://github.com/el-ethan",
"contributions": [
"content"
]
},
{
"login": "milkdeliver",
"name": "Sam",
"avatar_url": "https://avatars2.githubusercontent.com/u/3108407?v=4",
"profile": "https://github.com/milkdeliver",
"contributions": [
"content"
]
},
{
"login": "ArlindXh",
"name": "Arlind",
"avatar_url": "https://avatars0.githubusercontent.com/u/19508764?v=4",
"profile": "https://github.com/ArlindXh",
"contributions": [
"content"
]
},
{
"login": "ttous",
"name": "Teddy Toussaint",
"avatar_url": "https://avatars0.githubusercontent.com/u/19815440?v=4",
"profile": "https://github.com/ttous",
"contributions": [
"content"
]
},
{
"login": "LewisArdern",
"name": "Lewis",
"avatar_url": "https://avatars2.githubusercontent.com/u/2419690?v=4",
"profile": "http://ardern.io",
"contributions": [
"content"
]
},
{
"login": "GabrielLidenor",
"name": "Gabriel Lidenor ",
"avatar_url": "https://avatars2.githubusercontent.com/u/765963?v=4",
"profile": "https://gabriellidenor.com/",
"contributions": [
"content"
]
},
{
"login": "animir",
"name": "Roman",
"avatar_url": "https://avatars3.githubusercontent.com/u/4623196?v=4",
"profile": "https://github.com/animir",
"contributions": [
"content"
]
},
{
"login": "Francozeira",
"name": "Francozeira",
"avatar_url": "https://avatars1.githubusercontent.com/u/47419763?v=4",
"profile": "https://github.com/Francozeira",
"contributions": [
"content"
]
},
{
"login": "Invvard",
"name": "Invvard",
"avatar_url": "https://avatars0.githubusercontent.com/u/7305493?v=4",
"profile": "https://twitter.com/invvard",
"contributions": [
"content"
]
},
{
"login": "romulogarofalo",
"name": "Rômulo Garofalo",
"avatar_url": "https://avatars1.githubusercontent.com/u/18492592?v=4",
"profile": "https://romulogarofalo.github.io/",
"contributions": [
"content"
]
},
{
"login": "thoqbk",
"name": "Tho Q Luong",
"avatar_url": "https://avatars0.githubusercontent.com/u/1491103?v=4",
"profile": "http://thoqbk.github.io/",
"contributions": [
"content"
]
},
{
"login": "Qeneke",
"name": "Burak Shen",
"avatar_url": "https://avatars2.githubusercontent.com/u/20271568?v=4",
"profile": "https://github.com/Qeneke",
"contributions": [
"content"
]
},
{
"login": "MartinMuzatko",
"name": "Martin Muzatko",
"avatar_url": "https://avatars0.githubusercontent.com/u/2950505?v=4",
"profile": "http://www.happy-css.com",
"contributions": [
"content"
]
},
{
"login": "autoboxer",
"name": "Jared Collier",
"avatar_url": "https://avatars3.githubusercontent.com/u/2757601?v=4",
"profile": "https://github.com/autoboxer",
"contributions": [
"content"
]
},
{
"login": "bikingbadger",
"name": "Hilton Meyer",
"avatar_url": "https://avatars3.githubusercontent.com/u/4545860?v=4",
"profile": "http://hiltonmeyer.com",
"contributions": [
"content"
]
},
{
"login": "ChangJoo-Park",
"name": "ChangJoo Park(박창주)",
"avatar_url": "https://avatars0.githubusercontent.com/u/1451365?v=4",
"profile": "http://kr.vuejs.org",
"contributions": [
"content"
]
},
{
"login": "MasahiroSakaguchi",
"name": "Masahiro Sakaguchi",
"avatar_url": "https://avatars0.githubusercontent.com/u/16427431?v=4",
"profile": "https://github.com/MasahiroSakaguchi",
"contributions": [
"content"
]
},
{
"login": "TheHollidayInn",
"name": "Keith Holliday",
"avatar_url": "https://avatars1.githubusercontent.com/u/1253400?v=4",
"profile": "https://github.com/TheHollidayInn",
"contributions": [
"content"
]
},
{
"login": "coreyc",
"name": "coreyc",
"avatar_url": "https://avatars3.githubusercontent.com/u/1485356?v=4",
"profile": "https://www.coreycleary.me",
"contributions": [
"content"
]
},
{
"login": "Berkmann18",
"name": "Maximilian Berkmann",
"avatar_url": "https://avatars0.githubusercontent.com/u/8260834?v=4",
"profile": "http://maxcubing.wordpress.com",
"contributions": [
"content"
]
},
{
"login": "DouglasMV",
"name": "Douglas Mariano Valero",
"avatar_url": "https://avatars3.githubusercontent.com/u/32845487?v=4",
"profile": "https://github.com/DouglasMV",
"contributions": [
"content"
]
},
{
"login": "marcelosdm",
"name": "Marcelo Melo",
"avatar_url": "https://avatars0.githubusercontent.com/u/18266600?v=4",
"profile": "https://github.com/marcelosdm",
"contributions": [
"content"
]
},
{
"login": "mperk",
"name": "Mehmet Perk",
"avatar_url": "https://avatars0.githubusercontent.com/u/3465794?v=4",
"profile": "https://twitter.com/mperk_",
"contributions": [
"content"
]
},
{
"login": "ryanouyang",
"name": "ryan ouyang",
"avatar_url": "https://avatars2.githubusercontent.com/u/360426?v=4",
"profile": "https://github.com/ryanouyang",
"contributions": [
"content"
]
},
{
"login": "shabeer-mdy",
"name": "Shabeer",
"avatar_url": "https://avatars0.githubusercontent.com/u/26842535?v=4",
"profile": "https://github.com/shabeer-mdy",
"contributions": [
"content"
]
},
{
"login": "halfzebra",
"name": "Eduard Kyvenko",
"avatar_url": "https://avatars1.githubusercontent.com/u/3983879?v=4",
"profile": "https://github.com/halfzebra",
"contributions": [
"content"
]
},
{
"login": "deyvisonrocha",
"name": "Deyvison Rocha",
"avatar_url": "https://avatars2.githubusercontent.com/u/686067?v=4",
"profile": "http://deyvisonrocha.com",
"contributions": [
"content"
]
},
{
"login": "georgem3",
"name": "George Mamer",
"avatar_url": "https://avatars1.githubusercontent.com/u/20108934?v=4",
"profile": "http://twitter.com/georgemamer",
"contributions": [
"content"
]
},
{
"login": "leimonio",
"name": "Konstantinos Leimonis",
"avatar_url": "https://avatars0.githubusercontent.com/u/1969742?v=4",
"profile": "https://github.com/leimonio",
"contributions": [
"content"
]
},
{
"login": "Zybax",
"name": "Oliver Lluberes",
"avatar_url": "https://avatars3.githubusercontent.com/u/22094453?v=4",
"profile": "https://github.com/Zybax",
"contributions": [
"translation"
]
},
{
"login": "tiendq",
"name": "Tien Do",
"avatar_url": "https://avatars2.githubusercontent.com/u/815910?v=4",
"profile": "https://stackoverflow.com/story/tiendq",
"contributions": [
"content"
]
},
{
"login": "singh1114",
"name": "Ranvir Singh",
"avatar_url": "https://avatars0.githubusercontent.com/u/11356398?v=4",
"profile": "http://singh1114.github.io/",
"contributions": [
"content"
]
},
{
"login": "collierrgbsitisfise",
"name": "Vadim Nicolaev",
"avatar_url": "https://avatars3.githubusercontent.com/u/13496126?v=4",
"profile": "https://github.com/collierrgbsitisfise",
"contributions": [
"content",
"translation"
]
},
{
"login": "germangamboa95",
"name": "German Gamboa Gonzalez",
"avatar_url": "https://avatars3.githubusercontent.com/u/28633849?v=4",
"profile": "https://github.com/germangamboa95",
"contributions": [
"content"
]
},
{
"login": "AbdelrahmanHafez",
"name": "Hafez",
"avatar_url": "https://avatars3.githubusercontent.com/u/19984935?v=4",
"profile": "https://github.com/AbdelrahmanHafez",
"contributions": [
"content"
]
},
{
"login": "chandiran-dmc",
"name": "Chandiran",
"avatar_url": "https://avatars3.githubusercontent.com/u/42678579?v=4",
"profile": "http://linkedin.com/in/chandiran-dmc",
"contributions": [
"content"
]
},
{
"login": "VinayaSathyanarayana",
"name": "VinayaSathyanarayana",
"avatar_url": "https://avatars2.githubusercontent.com/u/16976677?v=4",
"profile": "https://github.com/VinayaSathyanarayana",
"contributions": [
"content"
]
},
{
"login": "kiwikern",
"name": "Kim Kern",
"avatar_url": "https://avatars1.githubusercontent.com/u/2671139?v=4",
"profile": "https://www.kimkern.de",
"contributions": [
"content"
]
},
{
"login": "kennethfreitas",
"name": "Kenneth Freitas",
"avatar_url": "https://avatars2.githubusercontent.com/u/55669043?v=4",
"profile": "https://kennethfreitas.github.io/",
"contributions": [
"content"
]
},
{
"login": "songe",
"name": "songe",
"avatar_url": "https://avatars2.githubusercontent.com/u/1531561?v=4",
"profile": "https://github.com/songe",
"contributions": [
"content"
]
},
{
"login": "Ksedline",
"name": "Kirill Shekhovtsov",
"avatar_url": "https://avatars1.githubusercontent.com/u/30693707?v=4",
"profile": "http://ksed.dev",
"contributions": [
"content"
]
},
{
"login": "SerzN1",
"name": "Serge",
"avatar_url": "https://avatars0.githubusercontent.com/u/2534649?v=4",
"profile": "https://github.com/SerzN1",
"contributions": [
"content"
]
},
{
"login": "keyrwinz",
"name": "keyrwinz",
"avatar_url": "https://avatars3.githubusercontent.com/u/21241761?v=4",
"profile": "https://github.com/keyrwinz",
"contributions": [
"content"
]
},
{
"login": "nDmitry",
"name": "Dmitry Nikitenko",
"avatar_url": "https://avatars0.githubusercontent.com/u/2134568?v=4",
"profile": "https://github.com/nDmitry",
"contributions": [
"content"
]
},
{
"login": "bushuai",
"name": "bushuai",
"avatar_url": "https://avatars0.githubusercontent.com/u/1875256?v=4",
"profile": "https://bushuai.cc",
"contributions": [
"review",
"content"
]
},
{
"login": "benjamingr",
"name": "Benjamin Gruenbaum",
"avatar_url": "https://avatars2.githubusercontent.com/u/1315533?v=4",
"profile": "https://stackoverflow.com/users/1348195/benjamin-gruenbaum",
"contributions": [
"content"
]
},
{
"login": "byeze",
"name": "Ezequiel",
"avatar_url": "https://avatars1.githubusercontent.com/u/7424138?v=4",
"profile": "https://github.com/byeze",
"contributions": [
"translation"
]
},
{
"login": "juaoose",
"name": "Juan José Rodríguez",
"avatar_url": "https://avatars3.githubusercontent.com/u/994594?v=4",
"profile": "https://github.com/juaoose",
"contributions": [
"translation"
]
},
{
"login": "OrBin",
"name": "Or Bin",
"avatar_url": "https://avatars1.githubusercontent.com/u/6897234?v=4",
"profile": "https://github.com/OrBin",
"contributions": [
"content"
]
},
{
"login": "andreoav",
"name": "Andreo Vieira",
"avatar_url": "https://avatars2.githubusercontent.com/u/508827?v=4",
"profile": "https://twitter.com/andreoav07",
"contributions": [
"content"
]
},
{
"login": "mikicho",
"name": "Michael Solomon",
"avatar_url": "https://avatars1.githubusercontent.com/u/11459632?v=4",
"profile": "https://github.com/mikicho",
"contributions": [
"content"
]
},
{
"login": "jimmycallin",
"name": "Jimmy Callin",
"avatar_url": "https://avatars0.githubusercontent.com/u/2225828?v=4",
"profile": "https://github.com/jimmycallin",
"contributions": [
"content"
]
},
{
"login": "w01fS",
"name": "Siddharth",
"avatar_url": "https://avatars2.githubusercontent.com/u/26025955?v=4",
"profile": "https://www.linkedin.com/in/siddharthofficial/",
"contributions": [
"content"
]
},
{
"login": "ryan3E0",
"name": "Ryan Smith",
"avatar_url": "https://avatars0.githubusercontent.com/u/1578766?v=4",
"profile": "https://ryansmith.tech/",
"contributions": [
"content"
]
},
{
"login": "bttger",
"name": "Tom Boettger",
"avatar_url": "https://avatars2.githubusercontent.com/u/49961674?v=4",
"profile": "https://de.linkedin.com/in/tom-boettger",
"contributions": [
"content"
]
},
{
"login": "jormaechea",
"name": "Joaquín Ormaechea",
"avatar_url": "https://avatars3.githubusercontent.com/u/5612500?v=4",
"profile": "https://github.com/jormaechea",
"contributions": [
"translation"
]
},
{
"login": "dfrzuz",
"name": "dfrzuz",
"avatar_url": "https://avatars3.githubusercontent.com/u/71859096?v=4",
"profile": "https://github.com/dfrzuz",
"contributions": [
"translation"
]
},
{
"login": "victor-homyakov",
"name": "Victor Homyakov",
"avatar_url": "https://avatars1.githubusercontent.com/u/121449?v=4",
"profile": "https://github.com/victor-homyakov",
"contributions": [
"content"
]
},
{
"login": "josh-hemphill",
"name": "Josh",
"avatar_url": "https://avatars3.githubusercontent.com/u/46608115?v=4",
"profile": "http://joshuahemphill.com",
"contributions": [
"content",
"security"
]
},
{
"login": "alec-francis",
"name": "Alec Francis",
"avatar_url": "https://avatars2.githubusercontent.com/u/32949882?v=4",
"profile": "https://github.com/alec-francis",
"contributions": [
"content"
]
},
{
"login": "arjun6610",
"name": "arjun6610",
"avatar_url": "https://avatars1.githubusercontent.com/u/61268891?v=4",
"profile": "https://github.com/arjun6610",
"contributions": [
"content"
]
},
{
"login": "jan-osch",
"name": "Jan Osch",
"avatar_url": "https://avatars2.githubusercontent.com/u/11651780?v=4",
"profile": "https://github.com/jan-osch",
"contributions": [
"content"
]
},
{
"login": "thiagotrs",
"name": "Thiago Rotondo Sampaio",
"avatar_url": "https://avatars2.githubusercontent.com/u/32005779?v=4",
"profile": "https://github.com/thiagotrs",
"contributions": [
"translation"
]
},
{
"login": "Alexsey",
"name": "Alexsey",
"avatar_url": "https://avatars0.githubusercontent.com/u/6392013?v=4",
"profile": "https://github.com/Alexsey",
"contributions": [
"content"
]
},
{
"login": "13luismb",
"name": "Luis A. Acurero",
"avatar_url": "https://avatars1.githubusercontent.com/u/32210483?v=4",
"profile": "https://github.com/13luismb",
"contributions": [
"translation"
]
},
{
"login": "lromano97",
"name": "Lucas Romano",
"avatar_url": "https://avatars1.githubusercontent.com/u/22394847?v=4",
"profile": "https://lromano97.github.io/",
"contributions": [
"translation"
]
},
{
"login": "denisecase",
"name": "Denise Case",
"avatar_url": "https://avatars0.githubusercontent.com/u/13016516?v=4",
"profile": "https://github.com/denisecase",
"contributions": [
"content"
]
},
{
"login": "elektronik2k5",
"name": "Nick Ribal",
"avatar_url": "https://avatars3.githubusercontent.com/u/1078554?v=4",
"profile": "http://stackoverflow.com/story/elektronik",
"contributions": [
"content",
"review"
]
},
{
"login": "0xflotus",
"name": "0xflotus",
"avatar_url": "https://avatars3.githubusercontent.com/u/26602940?v=4",
"profile": "https://github.com/0xflotus",
"contributions": [
"content"
]
},
{
"login": "dijonkitchen",
"name": "Jonathan Chen",
"avatar_url": "https://avatars3.githubusercontent.com/u/11434205?v=4",
"profile": "https://www.dijonkitchen.org/",
"contributions": [
"content"
]
},
{
"login": "dilansri",
"name": "Dilan Srilal",
"avatar_url": "https://avatars2.githubusercontent.com/u/5089728?v=4",
"profile": "https://github.com/dilansri",
"contributions": [
"content"
]
},
{
"login": "vladthelittleone",
"name": "vladthelittleone",
"avatar_url": "https://avatars3.githubusercontent.com/u/4215285?v=4",
"profile": "https://vectree.ru",
"contributions": [
"translation"
]
},
{
"login": "nosvalds",
"name": "Nik Osvalds",
"avatar_url": "https://avatars0.githubusercontent.com/u/60047271?v=4",
"profile": "https://www.nikolaso.com",
"contributions": [
"content"
]
},
{
"login": "kdaniel21",
"name": "Daniel Kiss",
"avatar_url": "https://avatars0.githubusercontent.com/u/39854385?v=4",
"profile": "https://github.com/kdaniel21",
"contributions": [
"doc"
]
},
{
"login": "forresst",
"name": "Forresst",
"avatar_url": "https://avatars2.githubusercontent.com/u/163352?v=4",
"profile": "https://twitter.com/forresst17",
"contributions": [
"content"
]
},
{
"login": "svenheden",
"name": "Jonathan Svenheden",
"avatar_url": "https://avatars1.githubusercontent.com/u/76098?v=4",
"profile": "https://github.com/svenheden",
"contributions": [
"content"
]
},
{
"login": "AustrisC",
"name": "AustrisC",
"avatar_url": "https://avatars2.githubusercontent.com/u/12381652?v=4",
"profile": "https://github.com/AustrisC",
"contributions": [
"content"
]
},
{
"login": "cisco0808",
"name": "kyeongtae kim",
"avatar_url": "https://avatars0.githubusercontent.com/u/60251188?v=4",
"profile": "https://github.com/cisco0808",
"contributions": [
"translation"
]
},
{
"login": "6gx7iycn53ioq2e8apk1j1ypwov4giui",
"name": "007",
"avatar_url": "https://avatars.githubusercontent.com/u/65741741?v=4",
"profile": "https://keybase.io/651z9pz968v2accj",
"contributions": [
"content"
]
},
{
"login": "anediaz",
"name": "Ane Diaz de Tuesta",
"avatar_url": "https://avatars.githubusercontent.com/u/17216937?v=4",
"profile": "http://www.anediaz.com",
"contributions": [
"translation",
"content"
]
},
{
"login": "YukiOta",
"name": "YukiOta",
"avatar_url": "https://avatars.githubusercontent.com/u/23182489?v=4",
"profile": "http://yukioh.net",
"contributions": [
"translation"
]
},
{
"login": "Fdawgs",
"name": "Frazer Smith",
"avatar_url": "https://avatars.githubusercontent.com/u/43814140?v=4",
"profile": "https://www.yeovilhospital.co.uk/",
"contributions": [
"content"
]
},
{
"login": "rluvaton",
"name": "Raz Luvaton",
"avatar_url": "https://avatars.githubusercontent.com/u/16746759?v=4",
"profile": "https://github.com/rluvaton",
"contributions": [
"content"
]
},
{
"login": "YA21",
"name": "Yuta Azumi",
"avatar_url": "https://avatars.githubusercontent.com/u/37298463?v=4",
"profile": "https://github.com/YA21",
"contributions": [
"content"
]
},
{
"login": "andrewjbarbour",
"name": "andrewjbarbour",
"avatar_url": "https://avatars.githubusercontent.com/u/77080074?v=4",
"profile": "https://github.com/andrewjbarbour",
"contributions": [
"content"
]
},
{
"login": "MasujimaRyohei",
"name": "mr",
"avatar_url": "https://avatars.githubusercontent.com/u/17163541?v=4",
"profile": "https://MasujimaRyohei.jp",
"contributions": [
"content"
]
},
{
"login": "kubanac95",
"name": "Aleksandar",
"avatar_url": "https://avatars.githubusercontent.com/u/16191931?v=4",
"profile": "https://github.com/kubanac95",
"contributions": [
"content"
]
},
{
"login": "SuspiciousLookingOwl",
"name": "Owl",
"avatar_url": "https://avatars.githubusercontent.com/u/32597776?v=4",
"profile": "http://vincentjonathan.com",
"contributions": [
"content"
]
},
{
"login": "yedidyas",
"name": "Yedidya Schwartz",
"avatar_url": "https://avatars.githubusercontent.com/u/36074789?v=4",
"profile": "https://github.com/yedidyas",
"contributions": [
"content",
"example"
]
},
{
"login": "ariel-diaz",
"name": "ari",
"avatar_url": "https://avatars.githubusercontent.com/u/20423540?v=4",
"profile": "https://github.com/ariel-diaz",
"contributions": [
"content"
]
},
{
"login": "Vispercept",
"name": "Thomas König",
"avatar_url": "https://avatars.githubusercontent.com/u/7080389?v=4",
"profile": "http://www.koenigthomas.de/",
"contributions": [
"content"
]
},
{
"login": "coocos",
"name": "Kalle Lämsä",
"avatar_url": "https://avatars.githubusercontent.com/u/1397804?v=4",
"profile": "https://github.com/coocos",
"contributions": [
"content"
]
},
{
"login": "ZhyMC",
"name": "Wyatt",
"avatar_url": "https://avatars.githubusercontent.com/u/10328430?v=4",
"profile": "http://math.cat",
"contributions": [
"content"
]
},
{
"login": "tkhadir",
"name": "KHADIR Tayeb",
"avatar_url": "https://avatars.githubusercontent.com/u/45130488?v=4",
"profile": "http://libkhadir.fr",
"contributions": [
"content"
]
},
{
"login": "shankarregmi",
"name": "Shankar Regmi",
"avatar_url": "https://avatars.githubusercontent.com/u/7703345?v=4",
"profile": "https://github.com/shankarregmi",
"contributions": [
"content"
]
},
{
"login": "codebyshubham",
"name": "Shubham",
"avatar_url": "https://avatars.githubusercontent.com/u/10389723?v=4",
"profile": "https://github.com/codebyshubham",
"contributions": [
"content"
]
},
{
"login": "lucalves",
"name": "Lucas Alves",
"avatar_url": "https://avatars.githubusercontent.com/u/17712401?v=4",
"profile": "http://lucalves.me/",
"contributions": [
"content"
]
},
{
"login": "benjaminudoh10",
"name": "Benjamin",
"avatar_url": "https://avatars.githubusercontent.com/u/9018331?v=4",
"profile": "https://github.com/benjaminudoh10",
"contributions": [
"content"
]
},
{
"login": "yjoer",
"name": "Yeoh Joer",
"avatar_url": "https://avatars.githubusercontent.com/u/47742486?v=4",
"profile": "https://www.yjoer.com",
"contributions": [
"content"
]
},
{
"login": "Miigon",
"name": "Miigon",
"avatar_url": "https://avatars.githubusercontent.com/u/16161991?v=4",
"profile": "https://blog.miigon.net",
"contributions": [
"content"
]
},
{
"login": "Egregor2011",
"name": "Rostislav Bogorad",
"avatar_url": "https://avatars.githubusercontent.com/u/3630318?v=4",
"profile": "http://brainstorage.me/Egregor2011",
"contributions": [
"content"
]
},
{
"login": "Flouse",
"name": "Flouse",
"avatar_url": "https://avatars.githubusercontent.com/u/1297478?v=4",
"profile": "https://github.com/Flouse",
"contributions": [
"content"
]
},
{
"login": "taranttini",
"name": "Tarantini Pereira",
"avatar_url": "https://avatars.githubusercontent.com/u/6922125?v=4",
"profile": "http://taranttini.com",
"contributions": [
"content"
]
},
{
"login": "kzmat",
"name": "Kazuki Matsuo",
"avatar_url": "https://avatars.githubusercontent.com/u/34614358?v=4",
"profile": "https://github.com/kzmat",
"contributions": [
"content"
]
},
{
"login": "burkybang",
"name": "Adam Smith",
"avatar_url": "https://avatars.githubusercontent.com/u/927886?v=4",
"profile": "https://github.com/burkybang",
"contributions": [
"content"
]
},
{
"login": "k906506",
"name": "Dohyeon Ko",
"avatar_url": "https://avatars.githubusercontent.com/u/33795856?v=4",
"profile": "https://codekodo.tistory.com",
"contributions": [
"content"
]
},
{
"login": "vlad99902",
"name": "Vladislav Legkov",
"avatar_url": "https://avatars.githubusercontent.com/u/67615003?v=4",
"profile": "https://github.com/vlad99902",
"contributions": [
"content"
]
},
{
"login": "kerolloz",
"name": "Kerollos Magdy",
"avatar_url": "https://avatars.githubusercontent.com/u/36763164?v=4",
"profile": "http://kerolloz.github.io",
"contributions": [
"content"
]
},
{
"login": "erezLieberman",
"name": "Erez Lieberman",
"avatar_url": "https://avatars.githubusercontent.com/u/3277260?v=4",
"profile": "https://www.linkedin.com/in/erez-lieberman-b90b7219/",
"contributions": [
"content"
]
},
{
"login": "breno404",
"name": "Breno Macedo",
"avatar_url": "https://avatars.githubusercontent.com/u/48841329?v=4",
"profile": "https://www.linkedin.com/in/breno-macedo-ernani-de-s%C3%A1-110223158/",
"contributions": [
"content"
]
},
{
"login": "JFernando122",
"name": "Fernando Flores",
"avatar_url": "https://avatars.githubusercontent.com/u/40414805?v=4",
"profile": "https://github.com/JFernando122",
"contributions": [
"translation"
]
},
{
"login": "rafaelconcept",
"name": "Rafael Brito",
"avatar_url": "https://avatars.githubusercontent.com/u/43880669?v=4",
"profile": "https://www.linkedin.com/in/rafaelconcept/",
"contributions": [
"translation"
]
},
{
"login": "emiperalta",
"name": "Emiliano Peralta",
"avatar_url": "https://avatars.githubusercontent.com/u/63617637?v=4",
"profile": "https://emiliano-peralta-portfolio.vercel.app/",
"contributions": [
"translation"
]
},
{
"login": "lannex",
"name": "Shin, SJ",
"avatar_url": "https://avatars.githubusercontent.com/u/7369541?v=4",
"profile": "https://lannex.github.io",
"contributions": [
"content"
]
},
{
"login": "e-e-e",
"name": "Benjamin Forster",
"avatar_url": "https://avatars.githubusercontent.com/u/12589522?v=4",
"profile": "http://www.benjaminforster.com",
"contributions": [
"content"
]
},
{
"login": "DanieleFedeli",
"name": "Daniele Fedeli",
"avatar_url": "https://avatars.githubusercontent.com/u/37077048?v=4",
"profile": "https://github.com/DanieleFedeli",
"contributions": [
"content"
]
},
{
"login": "djob195",
"name": "djob195",
"avatar_url": "https://avatars.githubusercontent.com/u/17146669?v=4",
"profile": "https://github.com/djob195",
"contributions": [
"content"
]
},
{
"login": "antspk",
"name": "antspk",
"avatar_url": "https://avatars.githubusercontent.com/u/78955792?v=4",
"profile": "https://github.com/antspk",
"contributions": [
"content"
]
},
{
"login": "jjy821",
"name": "정진영",
"avatar_url": "https://avatars.githubusercontent.com/u/88075341?v=4",
"profile": "https://jjy0821.tistory.com/",
"contributions": [
"content"
]
},
{
"login": "kkk-cashwalk",
"name": "kkk-cashwalk",
"avatar_url": "https://avatars.githubusercontent.com/u/91455122?v=4",
"profile": "https://github.com/kkk-cashwalk",
"contributions": [
"content"
]
},
{
"login": "apainintheneck",
"name": "apainintheneck",
"avatar_url": "https://avatars.githubusercontent.com/u/42982186?v=4",
"profile": "https://github.com/apainintheneck",
"contributions": [
"content"
]
},
{
"login": "koyanyaroo",
"name": "Fajar Budhi Iswanda",
"avatar_url": "https://avatars.githubusercontent.com/u/9715368?v=4",
"profile": "https://github.com/koyanyaroo",
"contributions": [
"content"
]
},
{
"login": "jutiger",
"name": "이주호",
"avatar_url": "https://avatars.githubusercontent.com/u/97490806?v=4",
"profile": "https://github.com/jutiger",
"contributions": [
"content"
]
},
{
"login": "MisterSingh",
"name": "Singh",
"avatar_url": "https://avatars.githubusercontent.com/u/44462019?v=4",
"profile": "https://github.com/MisterSingh",
"contributions": [
"content"
]
},
{
"login": "Alex-Dumitru",
"name": "Alex Dumitru",
"avatar_url": "https://avatars.githubusercontent.com/u/43738450?v=4",
"profile": "https://github.com/Alex-Dumitru",
"contributions": [
"content"
]
},
{
"login": "lykhatskyi",
"name": "Anton Lykhatskyi",
"avatar_url": "https://avatars.githubusercontent.com/u/18104686?v=4",
"profile": "https://github.com/lykhatskyi",
"contributions": [
"content"
]
},
{
"login": "EverythingAvailable",
"name": "sangwonlee",
"avatar_url": "https://avatars.githubusercontent.com/u/81002379?v=4",
"profile": "https://github.com/EverythingAvailable",
"contributions": [
"content"
]
},
{
"login": "euberdeveloper",
"name": "Eugenio Berretta",
"avatar_url": "https://avatars.githubusercontent.com/u/33126163?v=4",
"profile": "https://github.com/euberdeveloper",
"contributions": [
"content"
]
},
{
"login": "soranakk",
"name": "soranakk",
"avatar_url": "https://avatars.githubusercontent.com/u/3930307?v=4",
"profile": "https://github.com/soranakk",
"contributions": [
"content"
]
},
{
"login": "backend-joonyoung",
"name": "고준영",
"avatar_url": "https://avatars.githubusercontent.com/u/94430145?v=4",
"profile": "https://github.com/backend-joonyoung",
"contributions": [
"content",
"code"
]
},
{
"login": "GuilhermePortella",
"name": "Guilherme Portella ",
"avatar_url": "https://avatars.githubusercontent.com/u/59876059?v=4",
"profile": "https://github.com/GuilhermePortella",
"contributions": [
"content"
]
},
{
"login": "Esser50K",
"name": "André Esser",
"avatar_url": "https://avatars.githubusercontent.com/u/18497570?v=4",
"profile": "https://www.youtube.com/channel/UCBxzOQd2v9wWfiMDrf_RQ7A",
"contributions": [
"content"
]
},
{
"login": "ShiChenCong",
"name": "Scc",
"avatar_url": "https://avatars.githubusercontent.com/u/22486446?v=4",
"profile": "https://github.com/ShiChenCong",
"contributions": [
"translation"
]
},
{
"login": "mauroaccornero",
"name": "Mauro Accornero",
"avatar_url": "https://avatars.githubusercontent.com/u/1875822?v=4",
"profile": "https://www.mauroaccornero.it",
"contributions": [
"content"
]
},
{
"login": "no-yan",
"name": "no-yan",
"avatar_url": "https://avatars.githubusercontent.com/u/63000297?v=4",
"profile": "https://github.com/no-yan",
"contributions": [
"content"
]
}
],
"projectName": "nodebestpractices",
"projectOwner": "goldbergyoni",
"repoType": "github",
"repoHost": "https://github.com",
"skipCi": true,
"commitConvention": "angular"
}
================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 90
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 10
# Issues with these labels will never be considered stale
exemptLabels:
- security
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
Hello there! 👋
This issue has gone silent. Eerily silent. ⏳
We currently close issues after 100 days of inactivity. It has been 90 days
since the last update here.
If needed, you can keep it open by replying here.
Thanks for being a part of the Node.js Best Practices community! 💚
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
================================================
FILE: .github/workflows/automerge-prs.yml
================================================
name: automerge
on:
pull_request:
types:
- labeled
- unlabeled
- synchronize
- opened
- edited
- ready_for_review
- reopened
- unlocked
pull_request_review:
types:
- submitted
check_suite:
types:
- completed
status: {}
jobs:
automerge:
runs-on: ubuntu-20.04
steps:
- name: automerge
uses: "pascalgn/automerge-action@v0.15.5"
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
MERGE_LABELS: "auto-merge,!work in progress"
MERGE_REMOVE_LABELS: "auto-merge"
MERGE_FORKS: "false"
MERGE_RETRIES: "6"
MERGE_RETRY_SLEEP: "10000"
MERGE_DELETE_BRANCH: "true"
================================================
FILE: .github/workflows/lint-and-generate-html-from-markdown.yml
================================================
name: Lint & Generate HTML from Markdown
on:
push:
branches:
- master
pull_request:
defaults:
run:
shell: bash
working-directory: .operations
jobs:
lint:
name: Lint
runs-on: ubuntu-20.04
env:
NODE_ENV: test
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node.js environment
uses: actions/setup-node@v3
with:
node-version: "18"
- run: npm install
- run: npm run lint
================================================
FILE: .github/workflows/update-date-in-last-update-badge.yml
================================================
name: Update date in last update badge
on:
push:
branches:
- master
jobs:
run:
name: Update the date in last update badge to today
runs-on: ubuntu-20.04
# Limit this action to only run on the main repo and not on forks
if: github.repository_owner == 'goldbergyoni'
steps:
- name: Checkout repo
uses: actions/checkout@v3
- name: Update last update badge
run: |
# Make file runnable
chmod +x "${GITHUB_WORKSPACE}/.github/workflows/update-last-update-badge.sh"
# Run script
"${GITHUB_WORKSPACE}/.github/workflows/update-last-update-badge.sh" "${GITHUB_WORKSPACE}/README.md"
- name: Commit & Create Pull Request
uses: peter-evans/create-pull-request@v4
with:
commit-message: update the last update badge to today [skip ci]
author: Update Last Update Badge Action <${{ github.actor }}@users.noreply.github.com>
branch: update-last-update-badge
delete-branch: true
title: 'Update last update badge to today [skip ci]'
labels: |
update-last-update-badge
auto-merge
# Force empty body as the action have default body
body: ''
================================================
FILE: .github/workflows/update-last-update-badge.sh
================================================
#!/bin/bash
set -e
INPUT_FILE=$1
url_encode() {
# url_encode <string>
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
}
is_there_last_update_badge() {
local input_file=$1
local updated_badge_regex=$2
if grep -q "$updated_badge_regex" "$input_file"; then return 0
else return 1
fi
}
is_last_update_badge_date_is_today() {
local input_file=$1
local updated_badge=$2
if grep -q "$updated_badge" "$input_file"; then return 0
else return 1
fi
}
# We use already encoded string emoji because I'm on Windows and the calendar emoji failed to render
CALENDAR_EMOJI_ENCODED='%F0%9F%93%85'
# Date format example: March 03, 2021
CURRENT_DATE=`date +"%B %d, %Y"`
# We explicitly matching the img.shields.io/badge because when we change the provider of the badge the input will be changed too
LAST_UPDATE_BADGE_REGEX='<img id="last-update-badge" src="https:\/\/img\.shields\.io\/badge\/[^>]*>'
UPDATED_BADGE_URL="https:\/\/img.shields.io\/badge\/${CALENDAR_EMOJI_ENCODED}$(url_encode " Last update - ${CURRENT_DATE}-green").svg"
UPDATED_LAST_UPDATE_BADGE="<img id=\"last-update-badge\" src=\"$UPDATED_BADGE_URL\" alt=\"Last update: $CURRENT_DATE\" />"
if ! is_there_last_update_badge "$INPUT_FILE" "$LAST_UPDATE_BADGE_REGEX"; then
# Print with red foreground
echo -e "\033[31mError: Can't find Last update badge\033[m"
exit 1
fi
if is_last_update_badge_date_is_today "$INPUT_FILE" "$UPDATED_LAST_UPDATE_BADGE"; then
echo "No need to update the $INPUT_FILE, the last update badge already pointing to today"
exit 0
fi
sed -i "s@$LAST_UPDATE_BADGE_REGEX@$UPDATED_LAST_UPDATE_BADGE@" "$INPUT_FILE"
================================================
FILE: .gitignore
================================================
*.log
.idea
.vscode
.idea/**/*
.vscode/**/*
.nyc_output
mochawesome-report
.DS_Store
npm-debug.log.*
node_modules
node_modules/**/*
.eslintcache
cert
logs/*
desktop.ini
package-lock.json
.history
.env
================================================
FILE: .operations/.markdownlint.json
================================================
{
"default": true,
"MD033": false,
"MD001": false,
"MD013": false,
"MD039": false
}
================================================
FILE: .operations/CONTRIBUTING.md
================================================
# Contribution guidelines
## Lovely & friendly atmosphere
Our code of conduct is 5 words long: we are all friends here
We recognize that being professional and kind are the same thing and strive to maximize our professionalism
## Handling issues and PRs
<br/>
In a nutshell, every issue is an opprtunity to gain new knowledge and attract new contributor. Therefore we aim for vast response and welcoming words 💚
When merging a new PR, add the contributor to our credits list using the all-contributors bot. Just include this text as a PR comment:
`@all-contributors please add @username for content`
The specific PR/issue resolustion depends on its kind:
**A. New best practice or fundamental changes to existing content -** In that case, involve at least 1 other members to solicit enough feedback for this change. Start by greeting the contributor, ensure the formalities are fine, ensure it conforms to our [writing guidelines](./writing-guidelines.md), ensure enough information was provided and then get at least 1 more collaborators and allow at least a week for comments
**B. Plain text change (e.g. Grammar correctness) -** When super-simple wording edits are proposed (i.e. not new content rather language correctness), one can just greet, approve and merge immediately
**C. Translations to a new (not existing) language -** When offered to add new language, greet the person and paste our [translation guidelines](./common-answers.md)
**D. Edits to existing translations -** If the change can be inferred by the reviewer (e.g., a change of a symbol, number or just date update) then feel free to merge alone. If familiarity with the language is needed, tag the original translator and ask for feedback. The translators name can be found in the home page under "Translations"
**D. Dicussions and ideas -** When a technical discussion or just general conversation is brought into a new issue, apply your own judgements whether to tag other collaborators
## Assets to be aware of
- Our content writing guidelines [can be found here](./writing-guidelines.md)
- Common questions and answers to issues/PRs [can be found here](./common-answers.md)
## Precommit
Before pushing, verify your Markdown passes [the linter](https://www.npmjs.com/package/markdownlint-cli) :
```bash
npm run lint
```
For example fix basic errors :
```bash
npm run lint --fix
```
## Contribution model
### Steering committee 🏆
Members of the steering committee work together to provide guidance and future direction to the project. Each committee member has a particular expertise which they share their knowledge on, and work to lead further improvements to the project in that area. The steering committee members are responsible for approving new best practices, and ensuring current best practices remain relevant.
### Collaborators 👍
Collaborators are members who are contributing to the repository on a regular basis, through suggesting new best practices, triaging issues, reviewing pull requests and more. Along with the steering committee, each collaborator leads a project tracked under our Github projects.
The role is in place to help the steering committee ensure that the content provided is of high standard, up-to-date with the industry, and available in many languages. Members who frequently participate in these activities will be invited to become a collaborator, based on the quality of their contributions.
The steering committee periodically reviews the collaborator list to identify inactive collaborators. Inactive collaborators can choose to either continue in or step down from their role, in which case they are acknowledged as a past collaborator. They may later request that the steering committee restore them to active status.
================================================
FILE: .operations/common-answers.md
================================================
**Welcoming new translators**
@name - Welcome aboard, it's great to have you here! 🎆
Having A Slovak translation could be awesome! At the end, we can Tweet about this, put in our news section, include your name at the top of the translated language and also at the main home page contributors list.
Let's go for this? Few basic guideliness:
- Work on your own fork - Fork this repo, create a branch for yourself, translate & collaborate with other translators, then finally when ready create a PR.
- Focus on translation, not content editing - The focus is on translation, should you want to modify the content or the graphics - let's PR first in English and then translate to other languages. Also the format of the text should remain intact (same design).
- Duplicate the readme and the inner pages - The content should be translated over a page duplication. readme.md became readme.{translated-language}.md (e.g. readme.french.md), all other files should be duplicated similarly. So the number of English & translated pages should be the same. You may see examples in currently translated languages.
Collaborate - once you do the basic setup (branch, duplicate pages), we can announce the work on a new language and get others involved and help you in translation (if you wish).
We're here to help - let us know whether we can do anything to support you. We can Tweet about this work, put homepage banner or anything else.
================================================
FILE: .operations/operations-manual.md
================================================
# Operations Manual - Organizing and Maximizing Our Work
Building knowledge and a community by efficiently handling issues
## Handling issues and PRs
<br/>
In a nutshell, every issue and PR should get tagged by one of our core team and routed to the person who specializes in the related topic. This person then, will warmly welcome the contributor and then kick off the discussion (hopefully within 48 hours). The goal of each issue/PR is to learn new thing that might improve our repo and try to include the contributor in our army.
There is no specific person on call who assigns inquiries rather we count on our core team to visit almost everyday and assign issues/PR - this way, the workflow is not depend upon any specific person rather on our entire team.
Any new content should conform to our [writing guidelines](./writing-guidelines.md)
## Monthly maintenance
<br/>
Each month, a maintainer on call will open an issue for a maintenance work checklist and write down all the actions to perform by the end of the month (e.g. assign flower to a contributor). At the end of the month, that maintainer will perform the tasks on the checklist.
---
**Maintainer on call**: @someone
**Updates**
- [x] Update top badges with best practices item count, last update date and Node.js version
- [ ] Ensure all translations are aligned with the English version
- [x] Update 'thank you' stars & flowers
- [x] Notify and thanks the contributors of the month
**Flowers**
- @someone2
- @someone1
**Stars**
- @someone1
**Core Team**
- @someone1
--
| Month | Maintainer on call |
|---------|--------------------|
| 10/2019 | Yoni |
| 12/2019 | Bruno |
| 02/2020 | Kyle |
| 04/2020 | Yoni |
| 06/2020 | Bruno |
| 08/2020 | Kyle |
| 10/2020 | Yoni |
| 12/2020 | Bruno |
<br/>
## Routing by areas of expertise
| Topic | Examples | Assignee |
|--------------------------|-----------------------------------------------------|------------------------------------|
| Code standards and fixes | Code typos, code standards, examples refinements | Bruno |
| Translations | Adding new language, merging language PRs | Monthly rotation October - Yoni |
| General Writing quality | Typos, text clarify | Bruno |
| Javascript runtime | JS runtime, syntax correctness | Sagir |
| Devops | Monitoring, hardening a production site, deployment | Kyle |
| Architetecture | Project structure, microservices | Yoni |
| Testing | CI, linting, testing | Yoni |
| Performance | Efficient code, inspecting processes on fire | Sagir |
| Security | Security packages, secured code | Kyle |
| General inquires | Ideas, requests to contribute, etc | Monthly rotation October - Bruno |
| Error handling | ... | Yoni |
## Routing of languages under translation
| Language | Assignee |
|----------------------|----------|
| Brazilian Portuguese | Bruno |
| Portuguese | Kyke |
| Hebrew | Yoni |
| German | Bruno |
| Italian | Kyle |
| Turkish | Bruno |
| French | Yoni |
| Russian | Yoni |
| Korean | Yoni |
| Spanish | Kevyn |
| Chinese | Yoni |
| Korean | Kyle |
| Egyptian | Yoni |
| Ukrainian | Bruno |
| Polish | Kevyn |
| Thai | Kevyn |
================================================
FILE: .operations/writing-guidelines.basque.md
================================================
# Gure agiriko edukia hobeto idazteko
Nola hobetu gure bisitarien irakurtzeko eta ikasteko esperientzia
## 1. Sinplea ezin hobea da
Gure helburua da irakurketa eta ezagutzaren xurgaketa erraztea: edukia zaintzen dugu. Horrenbestez, saiatzen gara gai konplexu eta nekagarriak zerrenda erraztu bihurtzen, informazio astuna zati txikiagoetan eta zehaztasun gutxiagokoetan eratzen dugu, gai eztabaidagarri eta 'sukoiak' ekiditen ditugu, ideia subjektiboak saihestuz eta orokorrean onartutako jarraibideak erabiliz
## 2. Oinarritu egitate frogatu eta fidagarrietan
Gure irakurleek konfidantza handia izan behar dute irakurtzen duten informazioa fidagarria dela. Hori lortzeko, erreferentziak, datuak eta gaiarekin zerikusirik duten bestelako ebidentziak erabiltzen ditugu. Praktikan, gure baieztapenak frogatzeko, ahalegintzen gara iturburu fidagarrietako aipuak aurkezten eta konparaketak, erlazionatutako diseinu ereduak edo neurketa zientifikoak azaltzen
## 3. EEKS (Elkarrekiko Esklusiboa eta Kolektiboki Sakona)
Edukia ondo editatua eta fidagarria izateaz gain, haren irakurketak gaiaz bere osoan jabetzea bermatu behar du. Ez da azpigai garrantzitsurik baztertu behar
## 4. Formatu koherentea
Edukia txantiloi finkoak erabiliz dago aurkeztua, eta etorkizuneko beste edozein edukik txantiloi bera errespetatu behar du. Eduki berriak gehitu nahi izanez gero, kopiatu buleta formatua iada existitzen den bulet batetik eta moldatu zure beharretara. Informazio gehiago nahi izanez gero begiratu [txantiloi hau](../sections/template.basque.md)
## 5. Node.jsri buruz ari gara
Aholku bakoitzak zuzenean Node.jsrekin erlazionatuta egon behar du, eta ez orokorrean software garapenarekin. Node.jsren eredu/arau generikoak ezartzea aholkatzen dugunean, edukiak Noderen ezarpenean ardaztuta egon behar du. Adibidez, eskaera sarrera guztiak onbideratzea aholkatzen dugunean, segurtasun arrazoiengatik, Node-lingo erabili behar da, ‘erabili middlewarea eskaera sarrera onbideratzeko‘. Gai batek Node.jsren ezarpenik ez badauka (esaterako Python & Jaban bezala), gehitu edukiontzi generiko batean, begiratu 6.5 gaia adibidetzat
## 6. Hornitzaile nagusiak soilik
Batzuetan, npm paketeak, open source tresnak edota produktu komertzialak bezalako zenbait erronka eta arazo abordatzen dituzten hornitzaileen izenak gehitzea erabilgarria da. Gainezka egiten duten zerrenda luzeak edota ospetsuak eta egonkorrak ez diren proiektuak ekiditeko, hurrengo arauak proposatzen ditugu:
- Soilik 3 hornitzaile ezagunenak gomendatu behar dira: hitz gako batentzat bilaketa motore bateko (Google edo Github ospearen arabera ordenatua) lehenengo 3 emaitzetan agertzen den hornitzaile bat aipatu genezake gure gomendioetan
- npm pakete bat bada, batez beste egunean, gutxienez, 750 aldiz deskargatua izan behar da
- Kode irekiko proiektu bat bada, azken 6 hilabeteetan gutxienez behin eguneratua izan behar da
================================================
FILE: .operations/writing-guidelines.chinese.md
================================================
# 我们创作内容的准则
提高访问者的阅读和学习体验
## 1. 越简单越好
我们的使命,是使知识更易于理解与吸收。因此,我们专注于将复杂和无趣的话题转化为一个简化的清单,用简短但细节相对不精确的列表,去避免超负荷的信息量。同时避免涉及”易爆炸“和有争议的话题。摆脱主观观点,赞成普遍接受的实践。
## 2. 基于证据且可靠
我们应使得我们的内容能让读者充分信任其可靠性。为实现这一点,我们加入引用、数据和与主题相关的其他资源。实践上,通过努力包括来自可靠来源的引用话语,展示基准测试结果、相关的设计模式,或采用任何其他的科学手段以证明您的主张。
## 3. MECE(不重不漏)
除了要精心编写和可靠,一个话题应该做到略读它之后能涉及到该话题的全部知识。任何重要的子话题都不能遗漏。
## 4. 一致的格式
内容是使用固定模板显示的。任何新的内容都必须遵守这一模板。如果希望添加新项目符号,请从现有项目符号复制项目符号格式,并将其扩展以满足您的需要。有关其他信息,请查看[模版](../sections/template.md)
## 5. Node.js 相关
每个建议都应直接与 Node.js 相关,而不能仅仅是一般的软件开发。当我们建议在 Node.js 中实现通用的模式/规则时,内容应该集中在 Node 的实现上。例如,当我们建议将所有请求的输入为了安全原因进行处理时,应使用 Node 行话——‘使用中间件来处理请求输入’,如果一个条目在 Node.js 中没有具体特别的实现(e.g. 在 Python 或 Java 中看起来一样)——则将其包含在一个通用的容器条目,例子请查看条目 6.5。
## 6. 仅限主要的厂商
有时, 为解决某些问题和挑战,可以包含一些软件 (如 npm 软件包、开源工具甚至商业产品) 的厂商名。为了避免极长的列表,或推荐信誉不好或不稳定的项目,我们提出了以下规则:
- 只有排名前 3 的厂商应该被推荐 – 对于一个给定的相关关键词,如果某个厂商出现在搜索引擎结果中排名前3(谷歌或 GitHub 通过人气排序),那么它可以包含在我们的推荐里。
- 如果它是一个 npm 包,平均日下载量应至少 750 次。
- 如果它是一个开源项目,在过去的 6 个月里必须至少更新过一次。
================================================
FILE: .operations/writing-guidelines.french.md
================================================
# Notre manifeste de rédaction de contenu
Comment nous améliorons l'expérience de lecture et l'apprentissage pour nos visiteurs.
## 1. La simplicité vaut mieux que la perfection
Faciliter la lecture et l'absorption des connaissances est notre mission, nous en organisons son contenu. En tant que tels, nous nous concentrons sur la transformation des sujets complexes et difficiles en une liste simplifiée, nous traitons les informations trop volumineuses avec du contenu plus courts et moins précis, nous évitons les sujets ‘qui mettent de l'huile sur le feu’ ou controversés et nous évitons les idées subjectives au profit de pratiques généralement acceptées.
## 2. Se baser sur des faits probants et fiables
Nos lecteurs doivent être persuadés que le contenu qu'ils parcourent est fiable. Pour ce faire, nous incluons des données probantes comme des références, des données et d'autres ressources disponibles à ce sujet. Dans la pratique, nous essayons d'inclure des citations provenant de sources fiables, de montrer des benchmarks, des modèles de conception connexes ou toute autre mesure scientifique pour prouver les affirmations.
## 3. MECE (Mutuellement Exclusif Collectivement Exhaustif)
En plus d'être d'une grande fiabilité et d'une grande qualité rédactionnelle, le fait de parcourir le contenu devrait également permettre de couvrir l'ensemble du sujet. Aucun sous-thème important ne doit être laissé de côté.
## 4. Formatage cohérent
Le contenu est présenté à l'aide de modèles prédéfinis. Tout contenu futur doit être conforme au même modèle. Si vous souhaitez ajouter de nouveaux points, copiez le format d'un point existant et complétez-le selon vos besoins. Pour plus d'informations, veuillez consulter [ce modèle](../sections/template.md).
## 5. C'est à propos de Node.js
Chaque conseil doit être directement lié à Node.js et non au développement de logiciels en général. Lorsque nous conseillons d'implémenter un modèle/une règle générique dans Node.js, le contenu doit se concentrer sur l'implémentation dans Node. Par exemple, lorsque nous conseillons de nettoyer toutes les requêtes saisies pour des raisons de sécurité, il convient d'utiliser Node-lingo - ‘Utiliser un middleware pour nettoyer les requêtes saisies’. Si un élément n'a pas d'implémentation spécifique dans Node.js (par exemple, il est identique dans Python & Java) - incluez-le dans un élément de conteneur générique, voir l'article 6.5 par exemple.
## 6. Uniquement les fournisseurs majeurs
Il est parfois utile d'inclure des noms de fournisseurs qui peuvent répondre à certains défis et problèmes comme les paquets npm, les outils open source ou même les produits commerciaux. Afin d'éviter des listes trop longues ou de recommander des projets peu fiables et instables, nous avons élaboré les règles suivantes :
- Seuls les 3 premiers fournisseurs devraient être recommandés - un fournisseur qui apparaît dans les 3 premiers résultats d'un moteur de recherche (Google ou GitHub triés par popularité) pour un mot clé pertinent donné peut être inclus dans notre recommandation.
- S'il s'agit d'un paquet npm, il doit également être téléchargé au moins 750 fois par jour en moyenne.
- S'il s'agit d'un projet open-source, il doit avoir été mis à jour au moins une fois au cours des 6 derniers mois.
================================================
FILE: .operations/writing-guidelines.indonesia.md
================================================
# Manifes penulisan konten kami
Bagaimana kami meningkatkan pengalaman membaca dan belajar bagi pengunjung kami.
## 1. Sederhana lebih baik daripada lebih baik
Memudahkan membaca dan menyerap pengetahuan adalah misi kami, kami mengurasi konten. Karena itu, kami fokus pada mengubah topik yang kompleks dan melelahkan menjadi daftar yang disederhanakan, memperdagangkan informasi yang kelebihan beban dengan detail yang dipersingkat dan kurang akurat, menghindari topik yang 'mudah terbakar' dan kontroversial, serta menghindari ide subjektif yang mendukung praktik yang diterima secara umum.
## 2. Berbasis bukti dan dapat diandalkan
Pembaca kami harus yakin bahwa konten yang mereka baca dapat diandalkan. Kami mencapai ini dengan memasukkan bukti seperti referensi, data, dan sumber daya lain yang tersedia untuk topik ini. Secara praktis, upayakan untuk memasukkan kutipan dari sumber yang dapat dipercaya, menunjukkan tolok ukur, pola desain terkait, atau ukuran ilmiah apa pun untuk membuktikan klaim Anda.
## 3. MECE (Saling Eksklusif dan Secara Kolektif)
Selain konten yang sangat diedit dan dapat diandalkan, membaca sekilas konten juga harus memberikan cakupan topik yang lengkap. Tidak ada sub-topik penting yang harus ditinggalkan.
## 4. Pemformatan yang konsisten
Konten disajikan menggunakan templat tetap. Setiap konten di masa mendatang harus sesuai dengan template yang sama. Jika Anda ingin menambahkan poin baru, salin format poin dari poin yang ada dan kembangkan sesuai kebutuhan Anda. Untuk informasi tambahan, silakan lihat [template ini] (/sections/template.md).
## 5. Ini Tentang Node.js
Setiap saran harus terkait langsung dengan Node.js dan tidak dengan pengembangan perangkat lunak secara umum. Saat kami menyarankan untuk menerapkan pola / aturan umum di Node.js, konten harus fokus pada implementasi Node. Misalnya, ketika kami menyarankan untuk membersihkan semua input permintaan untuk alasan keamanan, Node-lingo harus digunakan - ‘Gunakan middleware untuk membersihkan input permintaan’. Jika sebuah item tidak memiliki implementasi khusus di Node.js (misalnya, item tersebut terlihat sama di Python & Jaba) - sertakan di dalam item container umum, lihat item 6.5 misalnya.
## 6. Hanya vendor terkemuka
Terkadang berguna untuk memasukkan nama vendor yang dapat mengatasi tantangan dan masalah tertentu seperti paket npm, alat open source atau bahkan produk komersial. Untuk menghindari daftar yang sangat panjang atau merekomendasikan proyek yang tidak bereputasi baik dan tidak stabil, kami membuat aturan berikut:
- Hanya 3 vendor teratas yang disarankan - vendor yang muncul di 3 hasil teratas dari mesin pencari (Google atau GitHub diurutkan berdasarkan popularitas) untuk kata kunci relevan tertentu dapat dimasukkan dalam rekomendasi kami.
- Jika ini adalah paket npm, itu juga harus diunduh setidaknya rata-rata 750 kali sehari.
- Jika ini adalah proyek sumber terbuka, itu harus diperbarui setidaknya sekali dalam 6 bulan terakhir.
================================================
FILE: .operations/writing-guidelines.japanese.md
================================================
# Our content writing manifest
How we enhance the reading and learning experience for our visitors.
## 1. Simple is better than better
Making it easy to read and absorb knowledge is our mission, we curate content. As such we focus on transforming complex and exhausting topics into a simplified list, trade overloaded information with shortened and less-accurate details, avoid ‘flammable’ and controversial topics and escape subjective ideas in favor of generally accepted practices.
## 2. Be evidence-based and reliable
Our readers should have great confidence that the content they skim through is reliable. We achieve this by including evidence like references, data and other resources available to this topic. Practically, strive to include quotes from reliable sources, show benchmarks, related design patterns or any scientific measure to prove your claims.
## 3. MECE (Mutually Exclusive and Collectively Exhaustive)
Apart from the content being greatly edited and reliable, skimming through it should also provide full coverage of the topic. No important sub-topic should be left out.
## 4. Consistent formatting
The content is presented using fixed templates. Any future content must conform to the same template. If you wish to add new bullets copy a bullet format from an existing bullet and extend it to your needs. For additional information please view [this template](../sections/template.md).
## 5. It's About Node.js
Each advice should be related directly to Node.js and not to software development in general. When we advise to implement generic pattern/rule in Node.js, the content should focus on the Node implementation. For example, when we advise to sanitize all requests input for security reasons, Node-lingo should be used - ‘Use middleware to sanitize request input’. If an item has no specific implementation in Node.js (e.g. it looks the same in Python & Jaba) - include it within a generic container item, see item 6.5 for example.
## 6. Leading vendors only
Sometimes it's useful to include names of vendors that can address certain challenges and problems like npm packages, open source tools or even commercial products. To avoid overwhelmingly long lists or recommending non-reputable and unstable projects, we came up with the following rules:
- Only the top 3 vendors should be recommended – a vendor that appears in the top 3 results of a search engine (Google or GitHub sorted by popularity) for a given relevant keyword can be included in our recommendation.
- If it’s a npm package it must also be downloaded at least 750 times a day on average.
- If it’s an open-source project, it must have been updated at least once in the last 6 months.
================================================
FILE: .operations/writing-guidelines.md
================================================
# Our content writing manifest
How we enhance the reading and learning experience for our visitors.
## 1. Simple is better than better
Making it easy to read and absorb knowledge is our mission, we curate content. As such we focus on transforming complex and exhausting topics into a simplified list, trade overloaded information with shortened and less-accurate details, avoid ‘flammable’ and controversial topics and escape subjective ideas in favor of generally accepted practices.
## 2. Be evidence-based and reliable
Our readers should have great confidence that the content they skim through is reliable. We achieve this by including evidence like references, data and other resources available to this topic. Practically, strive to include quotes from reliable sources, show benchmarks, related design patterns or any scientific measure to prove your claims.
## 3. MECE (Mutually Exclusive and Collectively Exhaustive)
Apart from the content being greatly edited and reliable, skimming through it should also provide full coverage of the topic. No important sub-topic should be left out.
## 4. Consistent formatting
The content is presented using fixed templates. Any future content must conform to the same template. If you wish to add new bullets copy a bullet format from an existing bullet and extend it to your needs. For additional information please view [this template](../sections/template.md).
## 5. It's About Node.js
Each advice should be related directly to Node.js and not to software development in general. When we advise to implement generic pattern/rule in Node.js, the content should focus on the Node implementation. For example, when we advise to sanitize all requests input for security reasons, Node-lingo should be used - ‘Use middleware to sanitize request input’. If an item has no specific implementation in Node.js (e.g. it looks the same in Python & Java) - include it within a generic container item, see item 6.5 for example.
## 6. Leading vendors only
Sometimes it's useful to include names of vendors that can address certain challenges and problems like npm packages, open source tools or even commercial products. To avoid overwhelmingly long lists or recommending non-reputable and unstable projects, we came up with the following rules:
- Only the top 3 vendors should be recommended – a vendor that appears in the top 3 results of a search engine (Google or GitHub sorted by popularity) for a given relevant keyword can be included in our recommendation.
- If it’s a npm package it must also be downloaded at least 750 times a day on average.
- If it’s an open-source project, it must have been updated at least once in the last 6 months.
================================================
FILE: .operations/writing-guidelines.polish.md
================================================
# Nasz manifest pisania treści
Jak zwiększamy komfort czytania i uczenia się dla naszych gości.
## 1. Proste jest lepsze
Naszą misją jest ułatwianie czytania i przyswajania wiedzy. Dlatego koncentrujemy się na przekształcaniu skomplikowanych i wyczerpujących tematów w uproszczoną listę, handlujemy przeciążonymi informacjami ze skróconymi i mniej dokładnymi szczegółami, unikamy „łatwopalnych” i kontrowersyjnych tematów i unikamy subiektywnych pomysłów na rzecz ogólnie przyjętych praktyk.
## 2. Bądź wiarygodny i niezawodny
Nasi czytelnicy powinni mieć wielką pewność, że przeglądane przez nich treści są wiarygodne. Osiągamy to poprzez włączenie dowodów, takich jak referencje, dane i inne zasoby dostępne na ten temat. Praktycznie staraj się zamieszczać cytaty z wiarygodnych źródeł, wykazywać wzorce, powiązane wzorce projektowe lub wszelkie środki naukowe, aby udowodnić swoje twierdzenia.
## 3. MECE (Mutually Exclusive and Collectively Exhaustive)
Oprócz tego, że treść jest znacznie edytowana i niezawodna, przeglądanie w niej powinno również zapewniać pełne omówienie tematu. Nie można pominąć żadnego ważnego tematu.
## 4. Spójne formatowanie
Treść jest prezentowana przy użyciu stałych szablonów. Wszelkie przyszłe treści muszą być zgodne z tym samym szablonem. Jeśli chcesz dodać nowe punktory, skopiuj format punktora z istniejącego i rozszerz go do swoich potrzeb. Aby uzyskać dodatkowe informacje, zobacz [ten szablon](../sections/template.md).
## 5. To na temat Node.js
Każda rada powinna dotyczyć bezpośrednio Node.js, a nie ogólnie oprogramowania. Kiedy radzimy zaimplementować ogólny wzorzec / regułę w Node.js, treść powinna koncentrować się na implementacji Node. Na przykład, gdy ze względów bezpieczeństwa zalecamy oczyszczenie danych wejściowych, należy użyć Node-lingo - „Użyj oprogramowania pośredniego do oczyszczenia danych wejściowych”. Jeśli element nie ma określonej implementacji w Node.js (np. wygląda tak samo w Python i Jaba) - dołącz go do ogólnego elementu kontenera, patrz na przykład pozycja 6.5.
## 6. Tylko wiodący dostawcy
Czasami przydatne jest podanie nazw dostawców, którzy mogą rozwiązać niektóre wyzwania i problemy, takie jak pakiety npm, narzędzia open source, a nawet produkty komercyjne. Aby uniknąć przytłaczających długich list lub rekomendować projekty nierenomowane i niestabilne, opracowaliśmy następujące zasady:
- Polecamy tylko 3 najlepszych dostawców - dostawcę, który pojawia się w 3 najlepszych wynikach wyszukiwania (Google lub GitHub posortowane według popularności) dla danego odpowiedniego słowa kluczowego, możemy uwzględnić w naszej rekomendacji.
- Jeśli jest to pakiet npm, musi być pobierany średnio co najmniej 750 razy dziennie.
- Jeśli jest to projekt typu open source, musi zostać zaktualizowany przynajmniej raz w ciągu ostatnich 6 miesięcy.
================================================
FILE: .operations/writing-guidelines.russian.md
================================================
# Наш манифест по написанию контента
Как мы улучшаем процесс чтения и обучения для наших посетителей.
## 1. Простое лучше, чем лучшее
Наша миссия - облегчить чтение и усвоение знаний, мы курируем контент. Таким образом, мы концентрируемся на преобразовании сложных и изнурительных тем в упрощенный список, обмениваем перегруженную информацию сокращенными и менее точными деталями, избегаем "легковоспламеняющихся" и противоречивых тем и избегаем субъективных идей в пользу общепринятых практик.
## 2. Быть обоснованным и надежным
Наши читатели должны быть уверены, что контент, который они просматривают, надежен. Мы достигаем этого путем включения таких доказательств, как ссылки, данные и другие ресурсы, доступные по этой теме. Практически, старайтесь включать цитаты из надежных источников, показывать контрольные показатели, связанные шаблоны проектирования или любые научные меры, чтобы доказать свои претензии.
## 3. ВИСИ (взаимоисключающие и совместноисчерпывающие)
Помимо того, что контент хорошо отредактирован и надежен, его просмотр должен также обеспечить полное освещение темы. Ни одна важная подтема не должна быть исключена.
## 4. Согласованное форматирование
Контент представлен с использованием фиксированных шаблонов. Любое будущее содержание должно соответствовать тому же шаблону. Если вы хотите добавить новые маркеры, скопируйте формат маркера из существующего маркера и расширьте его для своих нужд. Для получения дополнительной информации, пожалуйста, просмотрите [этот шаблон](../sections/template.md).
## 5. Это про Node.js
Каждый совет должен быть связан непосредственно с Node.js, а не с разработкой программного обеспечения в целом. Когда мы советуем реализовать общий шаблон/правило в Node.js, содержимое должно быть сосредоточено на реализации Node. Например, когда мы советуем очистить все запросы ввода по соображениям безопасности, следует использовать Node-нотацию - "используйте промежуточное ПО для очистки ввода запроса". Если у элемента нет конкретной реализации в Node.js (например, он выглядит одинаково в Python и Jaba) - включите его в общий элемент контейнера, см., например, пункт 6.5.
## 6. Только ведущие поставщики
Иногда полезно включать имена поставщиков, которые могут решить определенные задачи и проблемы, такие как пакеты npm, инструменты с открытым исходным кодом или даже коммерческие продукты. Чтобы избежать слишком длинных списков или рекомендовать не заслуживающие доверия и нестабильные проекты, мы разработали следующие правила:
- Рекомендуются только топ-3 поставщиков - в нашу рекомендацию может быть включен поставщик, который появляется в топ-3 результатов поисковой системы (Google или GitHub по популярности) для данного релевантного ключевого слова.
- Если это пакет npm, его также должны скачивать в среднем не менее 750 раз в день.
- Если это проект с открытым исходным кодом, он должен быть обновлен хотя бы один раз за последние 6 месяцев.
================================================
FILE: LICENSE
================================================
## creative commons
# Attribution-ShareAlike 4.0 International
Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.
### Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.
* __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors).
* __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees).
## Creative Commons Attribution-ShareAlike 4.0 International Public License
By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
### Section 1 – Definitions.
a. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
b. __Adapter's License__ means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
c. __BY-SA Compatible License__ means a license listed at [creativecommons.org/compatiblelicenses](http://creativecommons.org/compatiblelicenses), approved by Creative Commons as essentially the equivalent of this Public License.
d. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
e. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
f. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
g. __License Elements__ means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike.
h. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
i. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
j. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License.
k. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
l. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
m. __You__ means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
### Section 2 – Scope.
a. ___License grant.___
1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
A. reproduce and Share the Licensed Material, in whole or in part; and
B. produce, reproduce, and Share Adapted Material.
2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
3. __Term.__ The term of this Public License is specified in Section 6(a).
4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
5. __Downstream recipients.__
A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
B. __Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.
C. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
b. ___Other rights.___
1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this Public License.
3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.
### Section 3 – License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the following conditions.
a. ___Attribution.___
1. If You Share the Licensed Material (including in modified form), You must:
A. retain the following if it is supplied by the Licensor with the Licensed Material:
i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of warranties;
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
b. ___ShareAlike.___
In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.
1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License.
2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.
3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.
### Section 4 – Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;
b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
### Section 5 – Disclaimer of Warranties and Limitation of Liability.
a. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__
b. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__
c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
### Section 6 – Term and Termination.
a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
### Section 7 – Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.t stated herein are separate from and independent of the terms and conditions of this Public License.
### Section 8 – Interpretation.
a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
> Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
>
> Creative Commons may be contacted at creativecommons.org
================================================
FILE: README.basque.md
================================================
[✔]: assets/images/checkbox-small-blue.png
# Node.js-ren praktika onak
<h1 align="center">
<img src="assets/images/banner-2.jpg" alt="Node.js-ren praktika onak"/>
</h1>
<br/>
<div align="center">
<img src="https://img.shields.io/badge/⚙%20Item%20count%20-%20102%20Best%20Practices-blue.svg" alt="102 items"/> <img src="https://img.shields.io/badge/%F0%9F%93%85%20Last%20update%20-%20December%2012%202020-green.svg" alt="Azken eguneratzea: 2020ko azaroa"/> <img src="https://img.shields.io/badge/ %E2%9C%94%20Updated%20For%20Version%20-%20Node%2014.0.0-brightgreen.svg" alt="Node 14.0.0rako eguneratua"/>
</div>
<br/>
[](https://twitter.com/nodepractices/) **Hemen ere bagaude!** [**@nodepractices**](https://twitter.com/nodepractices/)
<br/>
Irakurri beste hizkuntza batzuetan: [**EN**](./README.md), [**CN**](./README.chinese.md), [**BR**](./README.brazilian-portuguese.md), [**RU**](./README.russian.md), [**PL**](./README.polish.md),[**JA**](./README.japanese.md) [(**ES**, **FR**, **HE**, **KR** eta **TR** aribidean!)](#itzulpenak)
<br/>
###### Gure [Zuzendaritza Batzordeak ](#zuzendaritza-batzordea) eta [laguntzaileek](#Languntzaileak) eraiki eta mantentzen dute webgune hau
# Azken praktika onak eta albisteak
- ** Euskarazko itzulpena!:** wow gure euskal irakurleek ere gida hau bere ama-hizkuntzan irakur dezakete! [Ane Diaz de Tuesta](https://github.com/anediaz) eta Joxefe Diaz de Tuestaren eskutik
- **🇯🇵 Japonierazko itzulpena:** hemendik aurrera japonieraz erabili daiteke gure gida, [YukiOta](https://github.com/YukiOta) eta [Yuta Azumi](https://github.com/YA21) gure laguntzaile ikaragarriei esker
- **🎊 60.000 izar!**: Gure biltegiak 60.100 garatzaileren aitortza eta konfiantza jaso ditu. Hitzik gabe gaude
<br/><br/>
# Ongi etorri! Hasi aurretik jakin beharreko 3 gauza
**1. Hemen dozenaka artikulu dauzkazu, onenetarikoak Node.jsri buruz egindakoetan:** alegia, bilduma honek Node.jsren praktika onak jasotzen ditu, edukien arabera sailkatuta
**2. Dagoen bildumarik handiena da, eta astetik astera handiagoa da:** une honetan 80tik gora praktika, estilo eskuliburu eta arkitektura aholku dauzkagu bilduta. Gustura asko jasoko genituzke zure ekarpenak bilduma hau eguneratuta edukitzeko, bai kode akatsak konponduz, bai itzulpenak eginez, bai ideia berriak proposatuz egin ditzakezunak: izan zaitez Node.jsren praktika onen liburuko partaide. Ikusi gure [idazketa jarraibideak](./.operations/writing-guidelines.basque.md)
**3. Jarraibide gehienek informazio gehigarria dute.** Jarraibideko puntu bakoitzaren ondoan **🔗Informazio gehiago** esteka aurkituko duzu, jarraibidea osatzen duena kode adibideekin, blogetako aipu hautatuekin eta informazio osagarri gehiagorekin
<br/><br/>
## Edukien aurkibidea
1. [Proiektuaren egitura (5)](#1-proiektuaren-egitura)
2. [Erroreen kudeaketa (12) ](#2-erroreen-kudeaketa)
3. [Kode estiloa (12) ](#3-kode-estiloa)
4. [Probak eta kalitate orokorra (13) ](#4-probak-eta-kalitate-orokorra)
5. [Ekoizpena (19) ](#5-ekoizpena)
6. [Segurtasuna (25)](#6-segurtasuna)
7. [Errendimendua (2) (Aribidean ✍️)](#7-zirriborroa-errendimendua)
8. [Docker, praktika onak (15)](#8-docker-praktika-onak)
<br/><br/>
# `1. Proiektuaren egitura`
## ![✔] 1.1 Antolatu zure proiektua atal eta osagai txikiagotan
**TL;PL:** aplikazio handien oztoporik handiena kode base erraldoi bat mantendu beharra da, ehundaka lotura eta menpekotasun dituena. Horrelako lan monolitikoek programatzaileen lana motelarazten dute, funtzionalitate berriak gehitzen saiatzen dira eta. Hori gerta ez dadin, zatitu zure kodea osagai txikiagotan, bakoitza bere datuekin karpeta banatan, eta bermatu osagai bakoitza laburra eta sinplea izatea. Bisitatu hemen behean dagoen “Informazio gehiago” esteka, proiektu egoki baten egitura zuzenaren adibideak ikusteko
**Bestela:** funtzionalitate berriak programatzean, garatzaileek zailtasun handiak izaten dituzte aldaketa horien eragina atzemateko, eta beldur izaten dira funtzionalitateon menpeko osagaiak hautsiko ote dituzten. Ondorioz, inplementazioak motelagoak eta arriskutsuagoak izaten dira. Oro har, zailagoa izaten da aplikazio baten kodea luzatzea negozio unitateak banatuta ez daudenean
🔗 [**Informazio gehiago: antolatu zure proiektua osagai txikiagotan**](./sections/projectstructre/breakintcomponents.basque.md)
<br/><br/>
## ![✔] 1.2 Antolatu zure aplikazioa geruzatan eta mantendu webaren geruza bere esparruaren barruan
**TL;PL:** osagai bakoitzak «geruzak» izan beharko lituzke: hau da, berariaz weberako egindako objektu bat; beste bat, logikarako; eta beste bat, datuen sarbidearen koderako. Horrek, zati bakoitzaren funtzioak ondo bereizteko aukera eskaintzeaz gainera, sistema errazago simulatu eta testatzea ahalbidetzen du. Modelo hau oso ohikoa bada ere, APIen garatzaileek joera izaten dute geruzak nahasteko, webeko objektu espezifikoa (Express req, res) logika operatiboaren eta datuen geruzetara pasatuz, eta, ondorioz bai aplikazioa bai sarbidea Expressen menpeko bihurtzen dira
**Bestela:** aplikazio batean webeko objektuak beste geruzekin nahastuta badaude, ezingo da bertara sartu testak, CRON atazak eta Express middleware-ak baino erabiliz
🔗 [**Informazio gehiago: antolatu zure aplikazioa geruzatan**](./sections/projectstructre/createlayers.basque.md)
<br/><br/>
## ![✔] 1.3 Kokatu baliabide komunak npm paketetan
**TL;PL:** datu base askok osatzen duten aplikazio handi bat prestatzen dugunean, geruza guztietan lan egiten duten zeharkako tresna bakoitzak –erregistragailuak, zifragailuak eta beste– bere kodearen barruan egon behar du, npm pakete pribatu moduan, tresna horiek hainbat proiektutan partekatu ahal izatea ahalbidetzen duena
**Bestela:** zuk zeuk asmatu beharko duzu zeure inplementazioa eta menpekotasun gurpila
🔗 [**Informazio gehiago: antolatu funtzioen arabera**](./sections/projectstructre/wraputilities.basque.md)
<br/><br/>
## ![✔] 1.4 Banandu Express 'aplikazioa' eta 'zerbitzaria'
**TL;PL:** ekidin [Express](https://expressjs.com/) aplikazioa artxibo handi batean oso-osorik definitzeko ohitura desegokia. Banandu Express aplikazioaren definizioa bi artxibotan gutxienez: batetik, APIaren definizioa (app.js); eta, bestetik, sarearen ezaugarriak (WWW). Are gehiago, egitura egokiagoa izan dadin, jarri APIaren definizioa osagaiekin batera
**Bestela:** probak egiteko, HTTP deien bidez baino ezingo da zure APIra sartu. Sarbide hori motelagoa da eta asko zailtzen du estaldura txostenak egitea. Gainera, ziur aski, ez da bat ere atsegina izango ehundaka lerro dituen kodea mantentzea
🔗 [**Informazio gehiago: banandu Express 'aplikazioa' eta 'zerbitzaria'**](./sections/projectstructre/separateexpress.basque.md)
<br/><br/>
## ![✔] 1.5 Erabili ingurunea errespetatzen duen konfigurazio seguru eta hierarkiko bat
**TL;PL:** akatsik gabeko konfigurazio perfektu batek bermatu behar du (a) giltzak fitxategietatik eta inguruneko aldagaietatik irakurri ahal izatea, (b) sekretuak iturri kodetik kanpo gordeta egotea, eta, (c), bilaketak errazte aldera, konfigurazioa hierarkikoa izatea. Hori dena lortzeko badira paketeak, hala nola, [rc](https://www.npmjs.com/package/rc), [nconf](https://www.npmjs.com/package/nconf), [config](https://www.npmjs.com/package/config) eta [convict](https://www.npmjs.com/package/convict)
**Bestela:** konfiguazioa egitean baldintza horietarikoren bat betetzen ez baduzu, lana moteldu egingo da, bai garapen taldearena, bai devops taldearena
🔗 [**Informazio gehiago: konfigurazio praktika onak**](./sections/projectstructre/configguide.basque.md)
<br/><br/><br/>
<p align="right"><a href="#edukien-aurkibidea">⬆ Itzuli hasierara</a></p>
# `2. Erroreen kudeaketa`
## ![✔] 2.1 Erabili Async-Await edo errore asinkronoak kudeatzeko promesak
**TL;PL:** errore asinkronoak callback erabiliz kudeatzen badituzu, infernurako biderik azkarrena hartuko duzu edo galbiderako piramidean sartuko zara. Zure kodeari opari on bat egin nahi badiozu, erabili agintzen liburutegi ezagun bat edo async-await, try-catch erakoa adibidez kode sintaxis askoz trinkoago eta ohikoago bat eskaintzen duena
**Bestela:** Node.jsren callback teknika (“err, response” prozedura) erabiltzen baduzu, kode ez jasangarriak sortuko dituzu, batera suertatuko baitira kode arrunta duten erroreen kudeaketa, habiaratze sarriegiak eta kodetze eredu ez erosoak
🔗 [**Informazio gehiago: ekidin callback prozedurak**](./sections/errorhandling/asyncerrorhandling.basque.md)
<br/><br/>
## ![✔] 2.2 Erabili soilik “Errorea” objektu kapsulatua
**TL;PL:** maiz, erroreak kate gisa edo modu pertsonalizatuan agertzen dira, erroreak kudeatzeko logika zaildu eta moduluen arteko elkarreragingarritasuna oztopatzen duena. Agintza bat baztertu zein salbuespen bat ezarri edo errore ohar bat argitaratzen duzunean, soilik “Errorea” objektu kapsulatua –edo “Errore txertatua“ objektua zabaltzen duen objektua– erabiliz lortuko duzu bermatzea bateratasuna handitu eta informazioa ez galtzea
**Bestela:** osagairen bati deitzean erroreak zein motatakoak diren jakin gabe, askoz zailagoa da eurak kontrolatzea. Are okerrago, erroreak deskribatzeko modu pertsonalizatuak erabiltzeak errore kritikoen informazioa galtzea ekar dezake, pilaren aztarna, besteak beste
🔗 [**Informazio gehiago: erabili soilik “Errorea” objektu kapsulatua**](./sections/errorhandling/useonlythebuiltinerror.basque.md)
<br/><br/>
## ![✔] 2.3 Bereizi eragiketa erroreak eta programatze erroreak
**TL; PL:** eragiketa erroreek (adibidez, APIak balio gabeko sarrera jasotzea) agerian jartzen dituzten arazoak ezagunak izaten dira, eta, haien eragina guztiz ulertu eta kontuz kudeatzeko modukoak izaten dira. Bestetik, programatze erroreak (adibidez, zehaztu gabeko aldagaia irakurtzen saiatzea) aplikazioa berrabiarazteko agindua ematen duten kode hutsegite ezezagunak izaten dira
**Bestela:** beti berrabiaraz dezakezu aplikazioa errore bat agertzen denean. Baina zergatik utzi 5.000 erabiltzaile offline iragarri daitekeen errore funtzional txiki batengatik? Kontrakoa ere ez da egokia: arazo ezezagun bat gertatzen denean -programatze errore bat, esaterako- aplikazioa martxan mantentzeak ezusteko jokaerak eragin ditzake. Biak bereizteak aukera ematen du kontuz jokatzeko eta ikuspegi orekatu bat aplikatzeko testuinguruan oinarrituz
🔗 [**Informazio gehiago: eragiketa erroreak vs programatze erroreak**](./sections/errorhandling/operationalvsprogrammererror.basque.md)
<br/><br/>
## ![✔] 2.4 Kudeatu erroreak gune bakar batean, Express middleware erabili partez
**TL;PL:** erroreak kudeatzeko logika -hala nola, haien erregistroa eramatea eta administratzaileari mezuak bidaltzea- objektu dedikatu zentralizatu batean kapsulatu behar da, erroreren bat gertatzen denean helmuga guztiek (adibidez, Express middlewarea, cron atazak, atalkako egiaztatzeak) hara deitu dezaten
**Bestela:** erroreak toki bakarrean ez kudeatzeak kodea bikoiztea eragiten du eta, ziur aski, erroreak gaizki kudeatzea ere bai
🔗 [**Informazio gehiago: kudeatu erroreak gune bakar batean**](./sections/errorhandling/centralizedhandling.basque.md)
<br/><br/>
## ![✔] 2.5 Dokumentatu aplikazioaren erroreak Swagger edo GraphQL-ren laguntzarekin
**TL;PL:** jakinaren gainean jarri aplikazioaren deitzaileak erroreak berriro gerta daitezkeela, errore horiek behar bezala konpondu ahal izateko hutsik egin gabe. RESTful aplikazioetan Swagger bezalako dokumentazio esparruak erabiltzen dira. GraphQL erabiltzen baduzu, zeure eskema eta azalpenak erabil ditzakezu
**Bestela:** aplikazio baten bezeroak erabaki dezake aplikazioa itxi eta berrabiaraztea, ulertzen ez duen errore baten abisua jaso duelako soil-soilik. Oharra: zu zeu izan zaitezke zure aplikaziotik deitzen duena (oso ohikoa mikrozerbitzu inguruneetan)
🔗 [**Informazio gehiago: dokumentatu aplikazioaren erroreak Swagger edo GraphQLren laguntzarekin**](./sections/errorhandling/documentingusingswagger.basque.md)
<br/><br/>
## ![✔] 2.6 Irten prozesutik elegantziarekin kanpoko norbait iristen denean hirira
**TL;PL:** errore ezezagun bat gertatzen denean (programazio errore bat, ikusi 2.3 praktika ona), zalantza izaten da era egokian lanean ote dabilen aplikazioa. Kasu horietan, oso ohikoa izaten da prozesuak kudeatzeko tresna bat erabiltzea [Forever](https://www.npmjs.com/package/forever), [PM2](http://pm2.keymetrics.io/) edo antzekoren bat– prozesua berriro hasteko
**Bestela:** ezagutzen ez duzun zerbait gertatzen denean, izan daiteke objekturen batzuk egoera txarrean daudelako (esaterako, globalki erabiltzen den gertaera igorle bat, barneko erroreren batengatik ondo ez dabilena) eta gerta daiteke aurrerantzean abisuek huts egitea edo modu ero samarrean funtzionatzea
🔗 [**Informazio gehiago: gelditu prozesua**](./sections/errorhandling/shuttingtheprocess.basque.md)
<br/><br/>
## ![✔] 2.7 Erabili erregistratze tresna helduak erroreen ikusgaitasuna handitzeko
**TL;PL:** erregistratze tresna helduen sortak erabiltzen badituzu –[Pino](https://github.com/pinojs/pino) edo [Log4js](https://www.npmjs.com/package/log4js), adibidez–, erroreak lehenago atzeman eta ulertuko dituzu. Beraz, utzi alde batera console.log
**Bestela:** console.log-ak arakatu behar badituzu edo testua desordenatua duen artxibo batean erroreak eskuz, kontsulta tresnarik gabe edo erregistratze bisore ganorazkorik gabe bilatu behar badituzu, ordu asko emango dituzu lanean gaueko ordu txikiak arte
🔗 [**Informazio gehiago: erabili erregistratze tresna helduak**](./sections/errorhandling/usematurelogger.basque.md)
<br/><br/>
## ![✔] 2.8 Testeatu erroreen fluxua zure test framework gustukoena erabiliz
**TL;PL:** kalitate profesionaleko kontrol tresna automatizatu bat izan zein programatzaileentzako eskuzko test soil bat izan, bermatu zure kodeak ez duela egoera positiboetan bakarrik lan egiten, baizik eta errore zuzenak ere kudeatu eta birbidaltzen dituela. Mocha eta Chai bezalako unitate test frameworkek erraz egin dezakete lan hori (ikusi “Gist leiho”ko kode adibideak)
**Bestela:** automatikoki zein eskuz probarik egin gabe ezin duzu konfiantzarik izan zure kodeak benetako erroreak atzemango dituen. Errore adierazgarririk gabe ez dago erroreak kudeatzerik
🔗 [**Informazio gehiago: testeatu erroreen fluxua**](./sections/errorhandling/testingerrorflows.basque.md)
<br/><br/>
## ![✔] 2.9 Aurkitu erroreak eta jardunik gabeko uneak APM produktuak erabiliz
**TL;PL:** monitorizazio eta errendimendu produktuek (APM, ingelesezko siglen arabera) modu proaktiboan ebaluatzen dute zure kode basea edo aplikazioa automatikoki aurkitu ahal izan ditzaten erroreak, blokeoak eta atzeman ezin dituzun eraginkortasun txikiko atalak
**Bestela:** denbora asko pasa zenezake zure aplikazioaren errendimendua eta jardunik gabeko uneak neurtzen, eta, hala ere, ez zenuke aurkituko zeintzuk diren zure kodearen zatirik motelenak egoera errealetan eta ez zenuke inoiz jakingo nola eragiten dioten erabiltzailearen lanari
🔗 [**Informazio gehiago: APM produktuen erabilera**](./sections/errorhandling/apmproducts.basque.md)
<br/><br/>
## ![✔] 2.10 Atzeman kudeatu gabeko agintzen arbuioak
**TL;PL:** agintza baten barruan dauden salbuespenak xurgatuak eta baztertuak izango dira programatzaileak modu esplizituan kudeatzen ez baditu, haren kodea `process.uncaughtException`-ari atxikia egonda ere. Ekidin hori `process.unhandledRejection` erabiliz
**Bestela:** zure erroreak xurgatuak izango dira eta ez da haien arrastorik geratuko. Ez duzu zertaz kezkatu
🔗 [**Informazio gehiago: atzeman kudeatu gabeko aginduen arbuioak**](./sections/errorhandling/catchunhandledpromiserejection.basque.md)
<br/><br/>
## ![✔] 2.11 Huts egin azkar, balidatu argudioak liburutegi dedikatu baten laguntzarekin
**TL;PL:** Express erabiltzen duzunean, zure praktika onetako bat izan beharko litzateke aplikazioaren sarbidea kontrolatzea, ustegabeko erroreak ekiditeko, aurrerago erroreak atzematea askoz zailagoa izaten da eta. Balidazio kodea gogaikarria izan ohi da, [ajv](https://www.npmjs.com/package/ajv) eta [Joi](https://www.npmjs.com/package/joi) bezalako laguntza liburutegi moderno bat erabili ezean
**Bestela:** pentsatu zure funtzioa agintza numeriko baten zain dagoela, adibidez «deskontua», eskatzaileak bidaltzea ahaztu duena; geroago, haren kodeak baieztatzen du « deskontua! = 0 (baimendutako deskontua zero baino handiagoa da)», eta horrek ahalmena ematen dio erabiltzaileari deskontua izateko. Ene, nolako errore arriskutsua! Konturatzen zara?
🔗 [**Informazio gehiago: huts eragin azkar**](./sections/errorhandling/failfast.basque.md)
<br/><br/><br/>
## ![✔] 2.12 Agintzen zain egon beti itzuli aurretik, pilak arrastorik uztea saihesteko
**TL; PL:** beti egin `return await` promesa bat itzultzean, pila osoaren jarraipena egin ahal izateko. Funtzio batek promesa bat itzultzen badu, funtzio hori `async`, hau da, asinkronotzat jo behar da, eta esplizituki `await`, itxaron agintza, itzuli aurretik
**Bestela:** itxaron gabe agintza itzultzen duen funtzioa ez da pilaren arrastoan agertuko. Galdutako fotograma horiek akatsa eragingo duen fluxua ulertzea zailduko lukete, batez ere portaera anormalaren zergatia falta den funtzioaren barruan baldin badago
🔗 [**Informazio gehiago: agintzak itzultzea**](./sections/errorhandling/returningpromises.basque.md)
<br/><br/><br/>
<p align="right"><a href="#edukien-aurkibidea">⬆ Itzuli hasierara</a></p>
# `3. Kode estiloa`
## ![✔] 3.1 Erabili ESLint
**TL;PL:** [ESLint](https://eslint.org) da gerta daitezkeen kode erroreak egiaztatzeko eta kodearen estiloa zuzentzeko estandarra. Ez da soilik erabiltzen tarteen arazoak identifikatzeko, baizik eta kodearen antipatroi kritikoak atzemateko ere, hala nola garatzaileen errore ez-sailkatuak. ESLint kode estiloak automatikoki zuzentzeko gai bada ere, badira beste tresna batzuk eraginkorragoak direnak zuzenketak egiten –esaterako, [prettier](https://www.npmjs.com/package/prettier) eta [beautify](https://www.npmjs.com/package/js-beautify)– eta, gainera, ESLintekin batera egiten dute lan
**Bestela:** garatzaileek arreta jarriko dute hain gogaikarriak diren arazo batzuk konpontzen –kodearen tarteak eta lerroaren luzera–, eta denbora gehiegi gal dezakete proiektuaren kode estiloa aztertzen
🔗 [**Informazio gehiago: erabili ESLint eta Prettier**](./sections/codestylepractices/eslint_prettier.basque.md)
<br/><br/>
## ![✔] 3.2 Node.jsrentzako plugin espezifikoak
**TL;PL:** ESLintek Vanilla JavaScript babesteko dituen arau estandarretatik aparte, komeni da Node.jsren osagai espeziko batzuk erabiltzea, hala nola [eslint-plugin-node](https://www.npmjs.com/package/eslint-plugin-node), [eslint-plugin-mocha](https://www.npmjs.com/package/eslint-plugin-mocha) eta [eslint-plugin-node-security](https://www.npmjs.com/package/eslint-plugin-security)
**Bestela:** Node.jsren arau akastun batzuek radarraren kontrolari ihes egin ahal diote. Esaterako, garatzaileek sarbide moduan aldagai jakin baten beharra izan dezakete (require(variableCommeChemin)), edozein JS script erabiltzeko aukera ematen diena erasotzaileei. Node.jsren linterrek patroi horiek atzeman ditzakete eta garaiz jo alarma
<br/><br/>
## ![✔] 3.3 Jarri kode multzo baten giltzak lerro bakarrean
**TL;PL:** kode bloke baten hasierako parentesiak irekiera instrukzioaren lerroan egon behar du
### Kode adibidea
```javascript
// Egin
function edozeinFuntzio() {
// kode blokea
}
// Baztertu
function edozeinFuntzio()
{
// kode blokea
}
```
**Bestela:** praktika on hau ez erabiltzeak ustekabeko emaitzak eragin ditzake, behean dagoen StackOverflow-en eztabaida harian ikus daitekeen bezala:
🔗 [**Informazio gehiago:** “Zergatik aldatzen dira emaitzak giltzen kokapenaren arabera?” (StackOverflow)](https://stackoverflow.com/questions/3641519/why-does-a-results-vary-based-on-curly-brace-placement)
<br/><br/>
## ![✔] 3.4 Bereizi instrukzioak modu egokian
Ez dio axola instrukzioak bereizteko puntu eta koma erabiltzen duzun edo ez, ohiko lerro jauzi okerrak edo koma txertatze automatikoak ezagutzeak lagundu egingo dizu ohiko errore sintaktikoak ez egiten
**TL;PL:** erabili ESLint bereizketetan izaten diren erroreez jabetzeko. [Prettier](https://prettier.io/) edo [Standardjs](https://standardjs.com/) erabiliz automatikoki konpon ditzakezu arazo horiek
**Bestela:** aurreko atalean esan bezala, JavaScripteko interpreteak automatikoki “puntu eta koma” gehitzen du instrukzio baten amaieran “puntu eta koma”rik ez badago edo instrukzioa behar den tokian ez dela amaitu eta horrek okerreko emaitzak eragin ditzakeela pentsatzen badu. Ustekabeko errore gehienak ekiditeko, esleipenak erabil ditzakezu eta, horrela, berehala deitutako funtzio adierazpenak erabiltzea saihestuko duzu
### Kode Adibidea
```javascript
// Egin
function eginZerbait() {
// ...
}
eginZerbait()
// Egin
const items = [1, 2, 3]
items.forEach(console.log)
// Baztertu — salbuespen bat jaurtitzen du
const m = new Map()
const a = [1,2,3]
[...m.values()].forEach(console.log)
> [...m.values()].forEach(console.log)
> ^^^
> SyntaxError: Unexpected token ...
// egin zerbait — salbuespen bat jaurtitzen du
const count = 2 // 2() burutzen saiatzen da, baina 2() ez da funtzio bat
(function egin zerbait() {
// egin zerbait paregabea
}())
// jarri puntu eta koma berehala deitutako funtzioa baino lehen, const definizioaren ostean, funtzio anonimoak bueltatutako balioa aldagarri batean gorde edo baztertu IIFE guztiak
```
🔗 [**Informazio gehiago:** "Semi ESLint araua"](https://eslint.org/docs/rules/semi)
🔗 [**Informazio gehiago:** "Ez dago ustekabeko ESLint arau lerroaniztunik"](https://eslint.org/docs/rules/no-unexpected-multiline)
<br/><br/>
## ![✔] 3.5 Izendatu funtzio guztiak
**TL;PL:** izendatu funtzio guztiak, itxierak eta deiak. Saihestu funtzio anonimoak. Hau bereziki erabilgarria da node aplikazio bat profilatzerakoan. Funtzio guztiak izendatzeak memoria argazkia egiaztatzean aukera emango dizu zer bilatzen ari zaren ulertzen
**Bestela:** zaila izan liteke ekoizpen arazoak araztea memoria erregistroak erabiliz (memoria argazkia), funtzio anonimoetako memoria kontsumoa handia denean
<br/><br/>
## ![✔] 3.6 Erabili izen deskriptiboak aldagaiak, konstanteak, funtzioak eta klaseak izendatzeko
**TL;PL:** Erabili **_lowerCamelCase_** konstanteak, aldagaiak eta funtzioak izendatzean eta **_UpperCamelCase_** (maiuskulazko lehen letra ere) klaseak izendatzean. Horrek lagunduko dizu aldagai/funtzio arruntak eta instantziazioa behar duten klaseak erraz bereizten. Erabili izen deskriptiboak, baina saiatu laburrak izan daitezen
**Bestela:** Javascript munduko hizkuntza bakarra da eraikitzailea ("Klasea") zuzenean deitzea ahalbidetzen duena aurretik eskatu/instantziatu gabe. Horrenbestez, klaseak eta funtzio eraikitzaileak bereizten dira UpperCamelCase-tik hasita
### 3.6 Kode eredua
```javascript
// funtzioa izendatzeko UpperCamelCase erabiltzen dugu
class KlaseBatenAdibidea {}
// konstanteak izendatzeko const hitz gakoa eta lowerCamelCase erabiltzen ditugu
const config = {
key: "balioa",
};
// aldagaiak eta funtzioak izendatzeko lowerCamelCase erabiltzen dugu
let aldagaiBatenAdibidea = "balioa";
function eginZerbait() {}
```
<br/><br/>
## ![✔] 3.7 Aukeratu const, let ordez. Ez erabili var
**TL;PL:** `const` erabiltzeak esan nahi du behin aldagai bat esleituta ezin dela berriro esleitu. Beraz, erabilera desberdinetarako aldagai bakarra erabiltzeko joera baztertzen lagunduko dizu `const` erabiltzeak, bai eta kodea garbitzen ere. Aldagai bat behin baino gehiagotan esleitu behar baduzu –for begizta batean, adibidez– erabili `let`, garbiagoa da eta. Leten beste alderdi garrantzitsu bat da definitu duzun blokearen eremuan bakarrik eskura dezakezula deklaratutako aldagia. `var` funtzioen eremukoa da, ez blokearena, eta [ez da ES6n erabili behar](https://hackernoon.com/why-you-shouldnt-use-var-anymore-f109a58b9b70), `const` eta `let` erabiltzeko aukera duzu eta
**Bestela:** arazketa askoz ere astunagoa da, maiz aldatzen den aldagai baten jarraipena egitean
🔗 [**Informazio gehiago: JavaScript ES6 +: var, let, edo const?** ](https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75)
<br/><br/>
## ![✔] 3.8 Erabili moduluak lehenengo, barne funtzioen partez
**TL;PL:** moduluak fitxategi bakoitzaren hasieran erabili behar dira, edozein funtzioren aurretik eta kanpo. Praktika on eta sinple honek lagunduko dizu fitxategiaren menpekotasunak erraz eta azkar atzematen haren eskuineko goi aldean, baita arazo posible batzuk ekiditen ere
**Bestela:** Node.jsk aldi berean exekutatzen ditu require-ak. Funtzio batek dei egiten badie, egoera kritikoago batean dauden beste eskaera batzuk blokea daitezke. Gainera, deitutako moduluetako batek edo haren menpeko ataza batek errore bat izanez gero, komeni da lehenbailehen haren berri jakitea, eta agian ezingo da hori egin, modulu horri funtzio batek deitzen badio
<br/><br/>
## ![✔] 3.9 Inportatu moduluak karpetaka eta ez artxiboak zuzenean
**TL;PL:** modulua/liburutegia karpeta batean garatzean, sartu index.js fitxategia, moduluaren barruko osagarriak agerian jarri eta erabiltzaile guztiek bertara joko dute eta. Hori eginez gero, moduluaren 'interfaze' gisa lan egiten du, eta geroago egin beharreko aldaketak errazten ditu kontratua hautsi gabe
**Bestela:** fitxategien barne egitura edo sinadura aldatzeak erabiltzaileen interfazea apur dezake
### 3.9 Kodea adibidea
```javascript
// Egin
module.exports.SMSProvider = require("./SMSProvider");
module.exports.SMSNumberResolver = require("./SMSNumberResolver");
// Baztertu
module.exports.SMSProvider = require("./SMSProvider/SMSProvider.js");
module.exports.SMSNumberResolver = require("./SMSNumberResolver/SMSNumberResolver.js");
```
<br/><br/>
## ![✔] 3.10 Erabili `===` eragilea
**TL;PL:** hobetsi berdintasunaren eragile zorrotza `===` berdintasun abstraktuaren eragile ahulagoa baino `==`. `==` eragileak bi aldagai alderatuko ditu, behin aldagai arrunt bihurtu ondoren. `===` eragileak ez du aldagai motaren bihurketarik egiten, eta bi aldagaiek mota berekoak izan behar dute berdinak izateko
**Bestela:** `==` eragileak, berdinak ez diren aldagaiak alderatuz gero, berdinak direlako mezua helaraz dezake
### 3.10 Kode adibidea
```javascript
"" == "0"; // false
0 == ""; // true
0 == "0"; // true
false == "false"; // false
false == "0"; // true
false == undefined; // false
false == null; // false
null == undefined; // true
" \t\r\n " == 0; // true
```
Aurreko azalpen guztiak faltsuak izango lirateke `===` eragilea erabili izan balitz
<br/><br/>
## ![✔] 3.11 Erabili Async Await, ekidin callbackak
**TL;PL:** Node 8 LTS erabat bateragarria da orain Async-awaitekin, eta, horrela kode asinkronikoa kudeatzeko aukera ematen du, callbackik eta agintzarik erabili gabe. Async-awaitek ez du blokeorik eragiten, eta kode asinkronikoak sinkroniko bihurtzen ditu. Zure kodeari egin ahal diozun oparirik onena async-await erabiltzea da, eskaintzen duen kode sintaxia askoz ere trinkoagoa eta ezagunagoa da eta
**Bestela:** gaizki pasatu eta infernura joateko biderik azkarrena hartu nahi baduzu, erabili callbackak errore asinkronoak kudeatzeko, seguruenik, infernura joateko biderik azkarrena aukeratuko duzu. Estilo honek gune guztietako erroreak egiaztatzera behartzen du, eta, gainera, kode habiaratze beti deserosoaren kudeaketa eta kode fluxua ulertzea zailtzen du
🔗[**Informazio gehiago:** async-await 1.0ren gida](https://github.com/yortus/asyncawait)
<br/><br/>
## ![✔] 3.12 Erabili gezi funtzioak (=>)
**TL;PL:** agintzak eta callbackak onartzen dituzten API zaharrekin async-await erabiltzea eta funtzio parametroak ekiditea gomendarria bada ere, gezi funtzioek kodearen egitura trinkotu egiten dute eta erro funtzioaren testuinguru lexikoa bermatu (hau da, `this`)
**Bestela:** (ES5 funtzioetan) kode luzeek erroreak izateko joera handiagoa dute, eta, gainera, irakurtzeko astunak dira
🔗 [**Informazio gehiago: gezi funtzioak erabiltzeko garaia da**](https://medium.com/javascript-scene/familiarity-bias-is-holding-you-back-its-time-to-embrace-arrow-functions-3d37e1a9bb75)
<br/><br/><br/>
<p align="right"><a href="#edukien-aurkibidea">⬆ Itzuli hasierara</a></p>
# `4. Probak eta kalitate orokorra`
## ![✔] 4.1 Idatzi APIaren probak (osagaia), gutxienez
**TL;PL:** proiektu gehienei ez zaie proba automatikorik egiten denbora gutxian egiten direlako edo, maiz, 'proba proiektua' kontroletik kanpo geratu eta bertan behera uzten delako. Hori dela eta, lehentasuna eman API probei eta hasi beraiek egiten; izan ere, hori da idazteko erarik errazena eta, gainera, proba unitarioek baino estaldura handiagoa eskaintzen dute; are gehiago, API probak sor ditzakezu, [Postman](https://www.getpostman.com/) bezalako tresnak erabiliz. Ondoren, baliabide eta denbora gehiago edukiz gero, jarraitu proba aurreratuak egiten, hala nola proba unitarioak, datu baseen probak, errendimendu probak, etab.
**Bestela:** luzaroan aritu zintezke proba unitarioak idazten, azkenean soilik %20ko estaldura lortu duzula jakiteko
<br/><br/>
## ![✔] 4.2 Erabili 3 zati proba izen bakoitzean
**TL;PL:** proba adierazgarria izan behar da eskakizunen mailan, barne kodearekin lan egiten ohituta ez dauden QAko ingeniariek eta garatzaileek berez eta erraz uler dezaten. Probaren izenean adierazi zer ari den probatzen (probapean dagoen unitatea), zer egoeratan eta zer emaitza espero den
**Bestela:** inplementazio batek huts egin du, “Gehitu produktua“ izeneko proba batek huts egin du. Esaten dizu horrek zehazki zer dabilen gaizki?
🔗 [**Informazio gehiago: erabili 3 zati proba izen bakoitzean**](./sections/testingandquality/3-parts-in-name.basque.md)
<br/><br/>
## ![✔] 4.3 Egitura probak AAA ereduaren arabera
**TL;PL:** egituratu zure probak ondo bereizitako 3 ataletan: antolatu, aritu eta baieztatu (AAA). Lehenengo atalean probaren konfigurazioa egin behar da; ondoren proba egikaritu behar da; eta, azkenik, baieztapen fasea dator. Egitura horri jarraitzeak bermatzen du irakurleak garuneko PUZik ez gastatzea proba plana ulertzen
**Bestela:** kode nagusia ulertzen egunero orduak eta orduak pasatzeaz gainera, orain zure garuna trebatzen pasatzen duzu bestela eguneko zatirik lasaiena izan behar zuena (probak)
🔗 [**Informazio gehiago: egitura probak AAA ereduaren arabera**](./sections/testingandquality/aaa.basque.md)
<br/><br/>
## ![✔] 4.4 Antzeman kodeko arazoak linter bat erabiliz
**TL;PL:** erabili kode linterra oinarrizko kalitatea egiaztatzeko eta antiereduak garaiz atzemateko. Exekutatu edozein proba baino lehen eta gehitu aurre-commit-a git kako moduan, edozein arazo berrikusteko eta zuzentzeko behar den denbora minimizatu ahal izateko. Era berean, egiaztatu [3. atala](#3-kode-estiloa), kodearen estilo praktikei dagokienez
**Bestela:** kode antiereduren bat zuzendu gabe utz dezakezu, zure ekoizpen ingurunean ahula izan litekeena
<br/><br/>
## ![✔] 4.5 Saihestu datu globalak, gehitu datu pertsonalizatuak proba bakoitzean
**TL;PL:** probak akopla daitezen ekiditeko eta proben fluxuari buruz erraz arrazoitzeko, proba bakoitzak bere datu baseko lerroen multzoan lan egin beharko luke. Proba batek datu baseko datu batzuk ba ote diren jakin nahi duenean edo haien beharra duen bakoitzean, berariaz erantsi behar dira datu horiek eta eragotzi beste erregistroren bat mutatzea
**Bestela:** probek huts egin dutela eta, inplementazioa bertan behera utzi beharra izan duzula pentsatu. Egoera horretan, lan taldeak denbora asko pasatuko du porrotaren zergatiak aztertzen, azkenean, ondorio tamalgarri honetara iristeko: sistema ondo dabil; probek, ordea, elkarri eragiten diote eta egitura hausten dute
🔗 [**Informazio gehiago: saihestu datu globalak**](./sections/testingandquality/avoid-global-test-fixture.basque.md)
<br/><br/>
## ![✔] 4.6 Etengabe ikuskatu menpekotasun ahulak
**TL;PL:** Express bezalako menpekotasun ospetsuenek ere ahultasun ezagunak dituzte, erraz gaindi daitezkeenak tresna komunitarioak eta komertzialak erabiliz, esaterako 🔗 [npm auditoria](https://docs.npmjs.com/cli/audit) eta 🔗 [snyk.io](https://snyk.io), zure CItik dei ditzakezunak konpilazio bakoitzean
**Bestela:** zure kodeak ahultasunik ez izatea lortzeko tresna dedikaturik erabili gabe, etengabe begiratu beharko duzu mehatxu berriei buruz onlinen zer argitaratzen den eta haren jarraipena egin
<br/><br/>
## ![✔] 4.7 Etiketatu zure probak
**TL;PL:** egin beharreko probak desberdinak dira eszenatokiaren arabera; ke lasterrak, input-output gabekoak, garatzaileek artxibo bat gorde edo commit egiten dutenean erabiltzen diren testak, hasieratik amaierarainoko test erabatekoak presio eskaera berri bat bidaltzen denean egikaritzen direnak, etab. Hori lor daiteke #cold #api #sanity bezalako gako hitzak erabiliz probak etiketatzean, aukera izan dezazun zure proba tresnak erabiltzeko eta behar duzun azpimultzoari deitzeko. Adibidez, honela deitu ahal izango zenioke zentzutasun proba multzoari [Mocha](https://mochajs.org/) erabiliz: mocha --grep 'sanity'
**Bestela:** garatzaile batek aldaketa txiki bat egiten duen bakoitzean oso motela izan daiteke proba guztiak exekutatzea, datu baseak kontsultatzen dituzten probak barne. Horrelako kasuetan, garatzaileei etsigarria gertatuko zaie probak egitea
<br/><br/>
## ![✔] 4.8 Egiaztatu zure proben estaldura, proba eredu okerrak identifikatzen laguntzen du eta
**TL;PL:** [Istanbul](https://github.com/istanbuljs/istanbuljs)/[NYC](https://github.com/istanbuljs/nyc) bezalako estaldura tresnak oso aproposak dira 3 arrazoirengatik: dohainik dira, hau da, ez da lanik egin behar txostenak lortzeko; proben estaldura gutxitu den identifikatzen laguntzen dute; eta, azkenik, baina ez garrantzi txikiagokoa, proben desdoikuntzak agerian jartzen dituzte. Koloretako kode estalduraren txostenak aztertzean, baliteke harrapaketa kapsula moduan sekula testatzen ez diren kode arloak ikustea, adibidez. Horrek esan nahi du probek bide arrakastatsuak besterik ez dituztela atzematen eta ez aplikazioak nola jokatzen duen erroreak gertatzen direnean. Konfiguratu zure probak estaldura maila batetik behera jaisten denean erroreak eragiteko
**Bestela:** ez da inolako neurgailu automatizaturik egongo zure kodearen zati handi bat proben estalduratik kanpo dagoela esango dizuna
<br/><br/>
## ![✔] 4.9 Ikuskatu pakete zaharkituak
**TL;PL:** erabili zure tresnarik gogokoena (adibidez, 'npm outdated' edo [npm-check-updates](https://www.npmjs.com/package/npm-check-updates) zaharkituta dauden paketeak atzemateko, ezarri kontrol hau zure IEren bideetan eta, are gehiago, eragin konpilazio batek huts egitea ingurune kritikoetan. Adibidez, agertoki kritikoa izan daiteke instalatutako pakete batek 5 adabaki baieztatuak dituenean (adibidez, bertsio lokala 1.3.1 da eta biltegi bertsioa 1.3.8) edo haren egileak zaharkitu etiketa jarri dionean. Kasu horretan, ezabatu konpilazioa eta ekidin bertsio hori erabiltzea
**Bestela:** modu esplizituan arriskutsutzat etiketatuta dauden paketeak egikarituko ditu zure produkzioak
<br/><br/>
## ![✔] 4.10 Erabili production bezalako inguruneak e2e probetarako
**TL;PL:** zuzeneko datuak erabiltzen dituen hasieratik amaierarainoko proba (e2e) lehen IEren prozesuko katebegirik ahulena izaten zen, datu baseak bezalako zerbitzu astun askoren menpean dago eta. Erabili zure ekoizpen errealetik ahalik eta hurbilen dagoen ingurunea
**Bestela:** docker-compose erabili ezean, taldeek ingurune bakoitzeko proben datu baseak mantendu behar izaten dituzte, garatzaileen makinak barne. Mantendu beti datu base horiek sinkronizatuta, proben emaitzak alda ez daitezen ingurune batetik bestera
<br/><br/>
## ![✔] 4.11 Eguneratu probak aldizka analisi estatikoko tresnak erabiliz
**TL;PL:** analisi estatikoko tresnak erabiltzeak lagundu egiten dizu kodearen kalitatea hobetzeko modu objektiboak lortzen eta zure kodea jasangarri izaten. Analisirako tresna estatikoak gehitu ahal dizkiozu zure IE konpilazioari, huts egingo duen susmoa duzuenean. Estaldurari dagokionean, bere aldeko puntu nagusiak dira kalitatea ikuskatzeko gaitasuna dutela fitxategi anitzen testuinguruan (adibidez, bikoizketak atzematea), azterketa aurreratuak egitea (adibidez, kodearen konplexutasuna hautematea), eta kode arazoen historiaren eta aurrerapenaren jarraipena egitea. Horretarako, bi tresna hauek erabil ditzakezu: [Sonarqube](https://www.sonarqube.org/) (2.600+ [izar](https://github.com/SonarSource/sonarqube)) eta [Code Climate](https://codeclimate.com/) (1.500+ [izar](https://github.com/codeclimate/codeclimate))
**Bestela:** kodearen kalitatea txarra denean, erroreek eta errendimenduak beti emango dituzte arazoak, azken belaunaldiko ezaugarriak dituen liburutegi berri distiratsu batek ere konpontzerik izango ez dituenak
🔗 [**Informazio gehiago: berregituratu!**](./sections/testingandquality/refactoring.basque.md)
<br/><br/>
## ![✔] 4.12 Aukeratu arretaz zure IE plataforma (Jenkins vs CircleCI vs Travis vs gainerako mundua)
**TL;PL:** zure integrazio jarraituaren plataformak (CICD) kalitateko tresna guztiak (adib. testak, lintak) ostatatu behar ditu, eta, beraz, indartsua izan beharko du bere pluginen ekosistemak. Aspaldian [Jenkins](https://jenkins.io/) proiektu askoren balio lehenetsia izan ohi zen, komunitaterik handiena eta oso plataforma indartsua baititu, ordainetan konfigurazio konplexu samarra eta ikaste kurba pikoa baditu ere. Gaur egun, askoz errazagoa da IE irtenbide bat sortzea [CircleCI](https://circleci.com) eta haren antzeko SaaS tresnak erabiliz. Tresna horiek IE hodi malgu bat sortzea ahalbidetzen dute azpiegitura osoa kudeatzeko zama hartu beharra izan gabe. Azken batean, sendotasuna eta abiaduraren arteko oreka lortzea da kontua. Egin zure aukera arretaz
**Bestela:** hornitzaile espezializatu bat aukeratzeak blokeatu zaitzake, pertsonalizazio aurreratu bat behar duzunean. Bestalde, Jenkins erabiltzeak denbora asko eska dezake azpiegitura konfiguratzean
🔗 [**Informazio gehiago: aukeratu IE plataforma**](./sections/testingandquality/citools.basque.md)
<br/><br/>
## ![✔] 4.13 Probatu zure middlewareak eurak bakarrik
**TL;PL:** middlewareak eskaera askori erantzuten dion logika sendo bat duenean, merezi du middlewarea probatzea bera bakarrik, web esparru osoa aktibatu gabe. Hori erraz lor daiteke {req, res, next} objektuak atzemanez eta behatuz
**Bestela:** middleware Expressean === errorea izanez gero, errorea gertatuko zaizu eskaera guztietan edo gehienetan
🔗 [**Informazio gehiago: probatu zure middlewareak eurak bakarrik**](./sections/testingandquality/test-middlewares.basque.md)
<br/><br/><br/>
<p align="right"><a href="#edukien-aurkibidea">⬆ Itzuli hasierara</a></p>
# `5. Ekoizpena`
## ![✔] 5.1. Monitorizazioa
**TL;PL:** bezeroek baino lehenago arazoak aurkitzeko joku bat da monitorizazioa. Jakina, garrantzi handia eman behar zaio. Merkatua eskaintzez gainezka dago, eta, beraz, komeni zaizu zehazten hastea zeintzuk diren hartu behar dituzun oinarrizko neurriak (hemen dituzu nire iradokizunak); ondoren, pentsatu zer neurri osagarri ezarri behar dituzun; eta, azkenik, aukeratu hipotesi guztiak kontuan hartzen dituen soluzioa. Egin klik soluzioen ikuspegi orokorra izateko
**Bestela:** hutsegitea === bezero zapuztuak
🔗 [**Informazio gehiago: monitorizazioa!**](./sections/production/monitoring.basque.md)
<br/><br/>
## ![✔] 5.2. Gardentasuna handitu erregistratze plataforma adimendunak erabiliz
**TL;PL:** erregistroak arazketa adierazpen hutsalen biltegia izan daitezke edo zure aplikazioaren historia kontatzen duen aginte mahai praktikoa. Planifikatu zure erregistratze plataforma lehenengo egunetik: hau da, nola bildu, gorde eta aztertuko dituzun erregistroak, nahi duzun informazioa benetan eskura daitekeela bermatzeko (adibidez, zein den errore tasa, zerbitzu eta zerbitzarien bidez transakzio oso bat egin ondoren, eta abar)
**Bestela:** kutxa beltz batekin amaituko duzu, eta zaila izango zaizu han jasotako ezarpenen zergatia aurkitzea. Azkenean, erregistro adierazpen guztiak idazten hasiko zara informazio osagarria gehitzeko
🔗 [**Informazio gehiago: gardentasuna handitu erregistratze plataforma adimendunak erabiliz**](./sections/production/smartlogging.basque.md)
<br/><br/>
## ![✔] 5.3. Delegatu ahal den guztia alderantzizko proxy batean (adibidez, gzip, SSL)
**TL;PL:** Node izugarri txarra da PUZen zeregin intentsiboak egiten, esate baterako, gzipping, SSL termination. Haien partez benetako middleware zerbitzuak erabili behar dituzu –hala nola nginx eta Haproxy–
edo hornitzaileen lainoko zerbitzuak
**Bestela:** zure hari bakarra lanpetuta egongo da azpiegitura lanak egiten, zure aplikazioaren guneari kasu egin beharrean, eta, ondorioz, haren errendimenduak behera egingo du
🔗 [**Informazio gehiago: delegatu ahal den guztia alderantzizko proxy batean (adibidez, gzip, SSL)**](./sections/production/delegatetoproxy.basque.md)
<br/><br/>
## ![✔] 5.4. Blokeatu menpekotasunak
**TL;PL:** zure kodeak berdin-berdina izan behar du ingurune guztietan, baina harrigarria bada ere npm lehenetsita dago menpekotasunei ingurune batetik bestera pasatzen uzteko. Instalatzen dituzunean paketeak hainbat ingurunetan, paketeen azken bertsioa eskuratzen saiatzen da. Hori saihesteko, erabili npm edo .npmrc konfigurazio artxiboak, ingurune bakoitzean dagokion paketearen zein bertsio zehatz (eta ez derrigorrez berriena) komeni zaizun adieraziko dizu eta. Bestela, kontrola fintze aldera, erabili `npm shrinkwrap`. \*Eguneratzea: NPM5 bertsiotik aurrera, menpekotasunak defektuz blokeatzeko konfiguratuta dator. Yarn pakete kudeatzaile berria ere lehenetsita dago horrela lan egiteko
**Bestela:** QAk kodea xeheki probatuko du eta onartuko duen bertsioak desberdin jokatuko du produkzioan. Are okerrago, produkzio talde bereko zerbitzarien kodeak desberdinak izan litezke
🔗 [**Informazio gehiago: blokeatu menpekotasunak**](./sections/production/lockdependencies.basque.md)
<br/><br/>
## ![✔] 5.5. Babestu prozesuaren erabilgarritasuna tresna egokiak erabiliz
**TL;PL:** prozesuak huts eginez gero, aurrera egin eta berrabiarazi beharra dago. Egoera arruntetan, nahikoak izan daitezke PM2 bezalako prozesuak kudeatzeko tresnak, baina gaur egungo mundu ”docker”-izatuan, taldeak kudeatzeko tresnak ere kontuan hartu behar dira
**Bestela:** estrategia argirik gabe dozenaka eskaera exekutatzeak DevOpsa nahaste-borrastera eraman dezake, hartarako aldi berean tresna gehiegi (talde kudeaketa, dockerra, PM2) erabiliz gero
🔗 [**Informazio gehiago: babestu prozesuaren erabilgarritasuna tresna egokiak erabiliz**](./sections/production/guardprocess.basque.md)
<br/><br/>
## ![✔] 5.6. Erabili PUZeko nukleo guztiak
**TL;PL:** Noderen oinarrizko bertsioa PUZeko nukleo bakar batean exekutatzen da, eta beste nukleo guztiak geldi geratzen dira. Beharrezkoa da Noderen prozesua erreplikatzea PUZ guztiak erabiliz: aplikazio txiki eta ertainekin, Node Cluster edo PM2 erabil dezakezu; aplikazio handi samarrekin, berriz, saiatu erabiltzen Docker tankerako talderen bat (adibidez, K8S, ECS) edo Linux hasieratze sisteman oinarritutako garatze idazkerak (adibidez, systemd)
**Bestela:** seguruenik, zure aplikazioak erabilgarri dituen baliabideen %25a besterik ez du erabiltzen (!), edo gutxiago, agian. Kontuan izan ohiko zerbitzariek gutxienez lau nukleo dituztela PUZen, eta Node.jsren garatzaile soilak bat bakarra erabiltzen duela (AWS beanstalk bezalako PaaS zerbitzuekin lan egiten duenean ere)
🔗 [**Informazio gehiago: erabili PUZeko nukleo guztiak**](./sections/production/utilizecpu.basque.md)
<br/><br/>
## ![✔] 5.7. Sortu ‘mantentze lanen amaiera puntua‘
**TL;PL:** API seguru batean, jarri agerian sistemarekin lotutako informazio multzo bat, hala nola, memoriaren erabilera eta REPL, etab. Nahiz eta gomendagarria den proba estandarretan eta tresna arruntetan oinarritzea, zenbait informazio eta eragiketa baliotsu errazago egiten dira kodea erabiliz
**Bestela:** konturatuko zara “diagnostiko-inplementazio“ asko egiten ari zarela, eta kodea produkziora bidaltzen duzula soilik informazioa lortzeko diagnostikoa egite aldera
🔗 [**Informazio gehiago: sortu ‘mantentze lanen amaiera puntua‘**](./sections/production/createmaintenanceendpoint.basque.md)
<br/><br/>
## ![✔] 5.8. Aurkitu erroreak eta geldialdiak APM produktuak erabiliz
**TL;PL:** aplikazioen jarraipen eta errendimendu produktuek (APM deritzona) modu proaktiboan neurtzen dituzte kode basea eta APIa, modu automatikoan ohiko jarraipenetik haratago joateko eta erabiltzaileen esperientzia arrunta zerbitzu eta maila guztietan neurtzeko. Adibidez, APM produktu batzuek agerian jarri dezakete azken erabiltzaileen aldean motelegi kargatzen dela transakzio bat, sakoneko arrazoia iradokitzen duten bitartean
**Bestela:** APIaren errendimendua eta geldialdiak neurtzeko ahalegin handia egin zenezake, eta, ziurrenik, ez zinateke jabetuko zein diren zure kodearen atalik motelenak mundu errealeko eszenatokian eta nola eragiten dioten zure erabiltzaile esperientziari
🔗 [**Informazio gehiago: aurkitu erroreak eta geldialdiak APM produktuak erabiliz**](./sections/production/apmproducts.basque.md)
<br/><br/>
## ![✔] 5.9. Prestatu zure kodea ekoizpenerako
**TL;PL:** programatu helburua kontuan izanik; planifikatu produkzioa lehenengo egunetik hasita. Horrek lausoa eta zehazgabea ematen duenez, produkzioaren mantentzeari estu-estu lotuta dauden garatze aholku batzuk bildu ditut (egin klik hemen behean dagoen Gist estekan)
**Bestela:** IT / DevOps arloko munduko txapeldun batek ere ez du salbatuko gaizki idatzita dagoen sistema
🔗 [**Informazio gehiago: prestatu zure kodea ekoizpenerako**](./sections/production/productioncode.basque.md)
<br/><br/>
## ![✔] 5.10. Neurtu eta babestu memoriaren erabilera
**TL;PL:** Node.jsk harreman gatazkatsuak ditu memoriarekin: v8 motorrak muga leunak dauzka memoria erabiltzean (1,4 GB) eta ezaguna da zein bidetatik galtzen duen Noderen kodeak memoria. Beraz, ezinbestekoa da Noderen prozesu memoriari erreparatzea. Aplikazio txikietan memoria aldizka neur dezakezu geruza komandoak erabiliz; baina aplikazio ertainetan eta handietan aztertu beharko zenuke ez ote zaizun komeni zure memoria erlojua kontrol sistema sendo baten erara erabiltzea
**Bestela:** zure memoria prozesuak 100 bat megabyte gal dezake egunean, [Walmart](https://www.joyent.com/blog/walmart-node-js-memory-leak)-i gertatu zitzaion bezala
🔗 [**Informazio gehiago: neurtu eta babestu memoriaren erabilera**](./sections/production/measurememory.basque.md)
<br/><br/>
## ![✔] 5.11. Atera zure frontend modulu aktiboak Nodetik
**TL;PL:** prestatu frontend edukia middleware dedikatu bat erabiliz (adibidez, nginx, S3, CDN), zeren Noderen errendimenduak behera egiten baitu artxibo estatiko askorekin lan egiten duenean, bera azpiprozesu bakarrekoa da eta
**Bestela:** Node eduki dinamikoa eskaintzeko sortu zen arren, haren hari bakarra lanpetuta egongo da html / images / angular / react erako ehunka fitxategi bidaltzen, bera egiteko sortua izan zen zereginei esleitu barik bere baliabide guztiak
🔗 [**Informazio gehiago: atera zure frontend/interfazeko modulu aktiboak Nodetik**](./sections/production/frontendout.basque.md)
<br/><br/>
## ![✔] 5.12. Izan aberrigabea, hil zerbitzariak ia egunero
**TL;PL:** gorde edozein datu mota (adibidez, erabiltzaile saioak, cacheak, kargatutako fitxategiak) kanpoko datu biltegietan; eta aztertu ez ote zenituzkeen zure zerbitzari guztiak aldian behin “hil” beharko edo “zerbitzaririk gabe”ko plataformaren bat erabili (adibidez, AWS Lambda), berariaz aberrigabe (stateless) jokaera duena
**Bestela:** zerbitzari jakin batek huts eginez gero, makina akastun bat hil beharrean, aplikazioen geldialdia eragingo du. Gainera, gero eta zailagoa izango da mailaketaren elastikotasuna, zerbitzari jakin baten menpeko izanda
🔗 [**Informazio gehiago: izan aberrigabea, hil zerbitzariak ia egunero**](./sections/production/bestateless.basque.md)
<br/><br/>
## ![✔] 5.13. Erabili menpekotasunak automatikoki atzematen dituzten tresnak
**TL;PL:** menpekotasun ezagunenek ere –Express, adibidez– badituzte (noizean behin) ahulezia ezagunak, sistema arriskuan jar ditzaketenak. Horrek konponbide erraza du, ordea, tresna komunitario eta komertzialak erabiliz gero, ahuleziak etengabe kontrolatu eta haien berri ematen dute eta (bertan edo GitHub-en)
**Bestela:** zure kodea ahulezia eta zaurgarritasunetatik garbi mantentzeko tresna dedikaturik gabe, jarraipen estua egin beharko diezu mehatxu berriei buruz linean egiten diren argitalpenei, bide batez esanda, aspergarri samarra izaten dena
🔗 [**Informazio gehiago: erabili menpekotasunak automatikoki atzematen dituzten tresnak**](./sections/production/detectvulnerabilities.basque.md)
<br/><br/>
## ![✔] 5.14. Esleitu transakzio identifikazio bana adierazpen erregistro bakoitzari
**TL;PL:** esleitu identifikatzaile bera –transakzio-: {balioren bat}– erregistro sarrera bakoitzari eskaera bakar baten barruan. Ondoren, erregistroetako erroreak ikuskatzean, erraz konturatuko zara zer gertatu zen aurretik eta ondoren. Zoritxarrez, hori ez da erraz lortzen Noden, haren izaera asinkronoa da eta. Ikusi kodearen adibideak beheko estekan
**Bestela:** produkzioko erroreen erregistroa testuingururik gabe ikustean – aurretik gertatu zena, alegia –, askoz zailagoa eta motelagoa da arazoa aztertzea
🔗 [**Informazio gehiago: esleitu transakzio identifikazio bana adierazpen erregistro bakoitzari**](./sections/production/assigntransactionid.basque.md)
<br/><br/>
## ![✔] 5.15. Ezarri NODE_ENV = produkzioa
**TL;PL:** ezarri NODE_ENV ingurune aldagaia ‘produkzioa‘ edo ‘garapena‘ ataletan produkzioaren optimizazioak aktibatu beharra dagoen adierazteko; npm pakete askok uneko ingurunea zehazten dute eta haren kodea optimizatzen dute ekoizpenerako
**Bestela:** ezaugarri soil hori gabe errendimendua asko jaits liteke. Adibidez, Express erabiltzean zerbitzarira bideratzeko `NODE_ENV` gabe, errendimendua heren bat moteltzen da
🔗 [**Informazio gehiago: Ezarri NODE_ENV = produkzioa**](./sections/production/setnodeenv.basque.md)
<br/><br/>
## ![✔] 5.16. Diseinatu inplementazio automatizatuak, atomikoak eta geldialdi gabekoak
**TL;PL:** ikerketek frogatu dute inplementazio ugari egiten dituzten taldeek ekoizpen arazo kritikoak izateko probabilitatea txikiagotzen dutela. Eskuz egin beharreko urrats arriskutsurik eta zerbitzuen geldialdirik ez duten inplementazio azkar eta automatizatuek nabarmen hobetzen dute inplementazio prozesua. Baliteke hori bera lortzea Docker eta IE tresnak, biak batera, erabiliz, inplementazio sinplifikatuari dagokionez industriaren estandarra bihurtu dira eta
**Bestela:** inplementazio luzeak -> produkzioaren geldialdia eta gizakiak eragindako erroreak -> inplementazioan konfiantzarik ez duen taldea -> inplementazio eta funtzio gutxiago egitea
<br/><br/>
## ![✔] 5.17. Erabili Node.jsren LTS bertsio berria
**TL;PL:** ziurtatu Node.jsren LTS bertsioa erabiltzen ari zarela errore kritikoen zuzenketak, segurtasun eguneratzeak eta errendimenduaren hobekuntzak jasotzeko
**Bestela:** aurkitu berri diren erroreak edo ahuleziak erabil litezke produkzioan exekutatzen den aplikazio bat ustiatzeko eta baliteke zure aplikazioa ez izatea bateragarria hainbat modulurekin eta zailagoa gertatzea hura mantentzea
🔗 [**Informazio gehiago: Erabili NTS.jsren LTS bertsioa**](./sections/production/LTSrelease.basque.md)
<br/><br/>
## ![✔] 5.18. Ez bideratu erregistrorik aplikazioaren barruan
**TL;PL:** garatzaileek ez dituzte erregistroen helmugak aplikazio kodearen barruan kodetu behar, aplikazioa exekutatzen den inguruneak berak definitu beharko ditu eta. Garatzaileek `stdout`-ean idatzi behar dituzte erregistroak erregistratze tresna bat erabiliz, eta gero exekuzio inguruneak (edukiontzia, zerbitzaria eta abar) bideratuko du `stdout` korrontea helmuga egokira (hau da, Splunk, Graylog, ElasticSearch eta abar)
**Bestela:** aplikazioen kudeaketaren erregistroak bideratzea === zaila da eskalatzen, erregistroen galera dakar, eskasa izaten da kezken bereizketa
🔗 [**Informazio gehiago: erregistroen bideraketa**](./sections/production/logrouting.basque.md)
<br/><br/>
## ![✔] 5.19. Instalatu zure paketeak `npm ci` erabiliz
**TL;PL:** ziurtatu ekoizpen kodeak erabiltzen duela probak egiteko erabili dituzun paketeen bertsio berdina. Exekutatu `npm ci` zure package.json eta package-lock.json paketen menpekotasunen instalazio garbia egiteko
**Bestela:** QAk kodea sakonki probatuko du eta produkzioan modu desberdinean jokatuko duen bertsioa onartuko du. Are okerrago, produkzio talde bateko hainbat zerbitzarik kode desberdinak exekuta ditzake
🔗 [**Informazio gehiago: erabili npm ci**](./sections/production/installpackageswithnpmci.basque.md)
<br/><br/><br/>
<p align="right"><a href="#edukien-aurkibidea">⬆ Itzuli hasierara</a></p>
# `6. Segurtasuna`
<div align="center">
<img src="https://img.shields.io/badge/OWASP%20Threats-Top%2010-green.svg" alt="54 items"/>
</div>
## ![✔] 6.1. Erabili linter segurtasun arauak
<a href="https://www.owasp.org/index.php/Top_10-2017_A1-Injection" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20XSS%20-green.svg" alt=""/></a>
**TL;PL:** erabili segurtasunarekin lotutako linter pluginak, [eslint-plugin-security](https://github.com/nodesecurity/eslint-plugin-security) bezalako segurtasun ahuleziak eta arazoak lehenbailehen atzemateko, ahal bada kodetzen ari diren bitartean. Horrek segurtasun ahuleziak atzematen lagun dezake, hala nola eval erabiltzea, bigarren mailako prozesu bat deitzea edo modulu bat inportatzea kate literal batekin (adibidez, erabiltzailearen sarrera). Egin klik 'Informazio gehiago' atalean segurtasun liner batek atzematen dituen kode adibideak ikusteko
**Bestela:** garapenean zehar segurtasun ahulezia zuzena izan zitekeena produkzioaren arazo nagusia bihurtzen da. Gainera, baliteke proiektuak kodeen segurtasun praktika koherenterik ez jarraitzea, ahuleziak sartzea edo urruneko biltegietan sartutako sekretu konfidentzialak sortzea
🔗 [**Informazio gehiago: lint arauak**](./sections/security/lintrules.basque.md)
<br/><br/>
## ![✔] 6.2. Mugatu aldi baterako eskaerak middlewareak erabiliz
<a href="https://www.owasp.org/index.php/Denial_of_Service" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20DDOS%20-green.svg" alt=""/></a>
**TL;PL:** DOS erasoak oso ezagunak dira, eta nahiko erraz eragin daitezke. Ezarri abiadura muga kanpoko zerbitzu bat erabiliz, hala nola hodeiko karga orekatzaileak, hodeiko suebakiak, nginx, [abiadura-mugatzaile-malgua](https://www.npmjs.com/package/rate-limiter-flexible) (rate-limiter-flexible) edo (aplikazio txikiagoak eta ez hain kritikoetarako) abiadura mugatzeko middleware bat (adibidez, [express-rate-limit](https://www.npmjs.com/package/express-rate-limit), express abiadura mugatzailea)
**Bestela:** aplikazio batek erasoak jasan ahal ditu, haren erabiltzaileei ukatzen bazaie jaso beharko luketen zerbitzua, aplikazioa egoera txarrean dagoelako edo eskuragarri ez dagoelako
🔗 [**Informazio gehiago: ezarri abiadura muga**](./sections/security/limitrequests.basque.md)
<br/><br/>
## ![✔] 6.3 Kendu sekretuak konfigurazio fitxategietatik edo erabili paketeak enkriptatzeko
<a href="https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A3-Sensitive_Data_Exposure" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A3:Sensitive%20Data%20Exposure%20-green.svg" alt=""/></a>
**TL;PL:** ez gorde inoiz testu arrunteko sekreturik konfigurazio fitxategietan edo iturburu kodean. Horren ordez, erabili sekretuak kudeatzeko sistemak, hala nola Vault produktuak, Kubernetes / Docker Secrets edo ingurune aldagaiak. Azken baliabide gisa, iturburuko kontrolean gordetako sekretuak enkriptatu eta kudeatu egin behar dira (gako birakariak, iraungitzeak, ikuskaritza, etab.). Erabili aurre-commit/push kakoak, ustekabean sekreturik gordetzea saihesteko
**Bestela:** iturburu kodearen kontrola publiko egin daiteke akats baten ondorioz, biltegi pribatuetan ere, eta orduan sekretu guztiak agerian geratzen dira. Kanpoko norbaitek iturburuko kontrolaren sarbidea ezagutzeak nahi gabe eragingo du erlazionatutako sistemetarako sarbideak ere ezagutzea (datu baseak, APIak, zerbitzuak, etab.)
🔗 [**Informazio gehiago: kudeaketa sekretua**](./sections/security/secretmanagement.basque.md)
<br/><br/>
## ![✔] 6.4. Saihestu kontsultak injektatzeko ahultasunak ORM / ODM liburutegiekin
<a href="https://www.owasp.org/index.php/Top_10-2017_A1-Injection" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg" alt=""/></a>
**TL;PL:** SQL / NoSQL injekzioa eta beste eraso maltzur batzuk ekiditeko, erabili beti ORM / ODM edo datuetatik ihes egiten duen datu baseen liburutegia, edo kontsulta parametro izendatuak edo indexatuak onartzen dituena eta espero diren erabiltzaileen sarrera balioztatzen duena. Inoiz ez erabili JavaScript txantiloien kateak edo katearen kateatzea balioak kontsultetan txertatzeko, horrek zure aplikazioa ahultasunen espektro zabalera irekitzen baitu. Node.js entzute handiko datuen liburutegi guztiek injekzio erasoen aurkako babesa dute (adibidez, [Sequelize](https://github.com/sequelize/sequelize), [Knex](https://github.com/tgriesser/knex), [mongoose](https://github.com/Automattic/mongoose))
**Bestela:** balidatu gabeko edo baimendu gabeko erabiltzaileen sarrerak operadorearen injekzioa ekar dezake NoSQLrako MongoDB-rekin lan egitean, eta saneamendu sistema edo ORM egokia ez erabiltzeak SQL injekzio erasoak ahalbidetuko ditu, ahultasun erraldoia sortuz
🔗 [**Informazio gehiago: kontsulten injekzioaren prebentzioa ORM / ODM liburutegiak erabiliz**](./sections/security/ormodmusage.basque.md)
<br/><br/>
## ![✔] 6.5. Segurtasuneko praktika onen bilduma
**TL;PL:** Node.jsrekin zuzenean loturarik ez duen segurtasuneko aholku bilduma bat da: Noderen inplementazioa ez da hain desberdina beste edozein hizkuntzaren inplementazioaren aldean. Egin klik “Informazio gehiago” botoian sakontzeko
🔗 [**Informazio gehiago: ohiko segurtasun praktika onak**](./sections/security/commonsecuritybestpractices.basque.md)
<br/><br/>
## ![✔] 6.6. Doitu HTTP erantzunen izenburuak segurtasun hobea lortzeko
<a href="https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg" alt=""/></a>
**TL;PL:** zure aplikazioak izenburu seguruak erabili beharko lituzke erasotzaileek gune arteko scriptak (XSS), clickjacking-a eta beste eraso maltzur arruntak egitea saihesteko. Horiek erraz konfigura daitezke [helmet](https://www.npmjs.com/package/helmet) bezalako moduluak erabiliz
**Bestela:** erasotzaileek zure aplikazioaren erabiltzaileen aurkako eraso zuzenak egin ditzakete, segurtasun ahultasun handiak sortuz
🔗 [**Informazio gehiago: erabili izenburu seguruak zure aplikazioan**](./sections/security/secureheaders.basque.md)
<br/><br/>
## ![✔] 6.7. Etengabe eta automatikoki ikuskatu ba ote dagoen erasotzen errazak diren menpekotasunak
<a href="https://www.owasp.org/index.php/Top_10-2017_A9-Using_Components_with_Known_Vulnerabilities" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A9:Known%20Vulnerabilities%20-green.svg" alt=""/></a>
**TL;PL:** npm ekosistemarekin ohikoa da proiektu batek menpekotasun ugari izatea. Menpekotasunak beti kontrolatuta egon behar dira ahultasun berriak aurkitzen diren heinean. Erabili [npm audit](https://docs.npmjs.com/cli/audit) edo [snyk](https://snyk.io/) bezalako tresnak, erasotzen errazak diren menpekotasunen jarraipena egiteko, kontrolatzeko eta adabakiak jartzeko. Tresna horiek zure IE konfigurazioarekin integratu, erasotzen errazak diren menpekotasunenak atzemateko ekoizpenera iritsi aurretik
**Bestela:** erasotzaile batek zure web esparrua detektatu eta ageriko ahultasun guztiei eraso ahal die
🔗 [**Informazio gehiago: menpekotasunen segurtasuna**](./sections/security/dependencysecurity.basque.md)
<br/><br/>
## ![✔] 6.8. Babestu erabiltzaileen pasahitzak / sekretuak BCrypt edo Script erabiliz
<a href="https://www.owasp.org/index.php/Top_10-2017_A2-Broken_Authentication" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A9:Broken%20Authentication%20-green.svg" alt=""/></a>
**TL;PL:** pasahitzak eta sekretuak (adibidez API giltzak) gorde behar dira hash + gatz funtzio seguru bat erabiliz, esaterako, `bcrypt`edo `scrypt`; eta kasurik okerrenean, `pbkdf2`
**Bestela:** funtzio segururik erabili gabe gordetzen diren pasahitzak eta sekretuak bortxaz erasotuak izan daitezke edo hiztegi erasoak jasan ditzakete. Azkenean agerian gera daitezke, bai eta agian zabaldu ere
🔗 [**Informazio gehiago: erabiltzaileen pasahitzak**](./sections/security/userpasswords.basque.md)
<br/><br/>
## ![✔] 6.9. Ekidin HTML, JS eta CSS irteerak
<a href="https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7:XSS%20-green.svg" alt=""/></a>
**TL;PL:** arakatzailera bidaltzen diren datu ez fidagarriak bistaratu beharrean exekutatu egin daitezke, normalean cross-site-scripting (XSS) erasoa deritzona. Arindu hori datuak inoiz exekutatu behar ez diren eduki huts gisa (hau da, kodetu, ihes)esplizituki markatzen dituzten liburutegi espezializatuak erabiliz
**Bestela:** erasotzaile batek JavaScript kodeketa kaltegarria gorde dezake zure DBn, gero bezero gizajoei dagoen moduan bidaliko zaiena
🔗 [**Informazio gehiago: ihes irteera**](./sections/security/escape-output.basque.md)
<br/><br/>
## ![✔] 6.10. Balidatu sarrerako JSON eskemak
<a href="https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7: XSS%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A8-Insecure_Deserialization" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A8:Insecured%20Deserialization%20-green.svg" alt=""/></a>
**TL;PL:** balidatu sarrerako eskaeren gorputzeko zama erabilgarria eta ziurtatu zure itxaropenak betetzen dituela; eta, haiek bete ezean, huts eragin. Ibilbide bakoitzaren balioztatze kodetze neketsua saihesteko JSONen oinarritutako balioztatze eskema arinak erabil ditzakezu, hala nola [jsonschema](https://www.npmjs.com/package/jsonschema) edo [joi](https://www.npmjs.com/package/joi)
**Bestela:** zure eskuzabaltasunak eta ikuspegi permisiboak asko handitzen dute erasoaren tamainua, eta erasotzailea sarrera asko probatzera bultzatzen du, aplikazioa kraskatzeko konbinazio bat aurkitu arte
🔗 [**Informazio gehiago: balidatu sarrerako JSON eskemak**](./sections/security/validation.basque.md)
<br/><br/>
## ![✔] 6.11. Onartu JWTen zerrenda beltzak
<a href="https://www.owasp.org/index.php/Top_10-2017_A2-Broken_Authentication" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A9:Broken%20Authentication%20-green.svg" alt=""/></a>
**TL;PL:** JSON web fitxak erabiltzean (adibidez, [Passport.js](https://github.com/jaredhanson/passport))-rekin), lehenespenez ez dago igorritako fitxen sarbidea ezeztatzeko mekanismorik. Erabiltzaileen jarduera maltzurren bat aurkitu ondoren, ez dago modurik sistemara sartzea eragozteko, baliozko fitxaren bat duten bitartean. Konpondu hori eskaera bakoitzean balioztatuko diren fitxa ezfidagarrien zerrenda beltza erabiliz
**Bestela:** edozeinek erabil litzake iraungitako edo gaizki kokatutako fitxak, maltzurki aplikazio batera sartzeko eta fitxaren jabea ordezkatzeko
🔗 [**Informazio gehiago: JSON web fitxen zerrenda beltzak**](./sections/security/expirejwt.basque.md)
<br/><br/>
## ![✔] 6.12. Aurrea hartu baimenaren aurkako eraso basatiei
<a href="https://www.owasp.org/index.php/Top_10-2017_A2-Broken_Authentication" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A9:Broken%20Authentication%20-green.svg" alt=""/></a>
**TL;PL:** oso teknika sinple eta eraginkorra da baimen saiakerak mugatzea bi metrika erabiliz:
1. Lehenengoa, erabiltzaile beraren ID / izen eta IP helbide bakarrak jarraian huts egin duen saiakera kopurua
2. Bigarrena, IP helbide batek denbora tarte luze batean huts egin duen saiakera kopurua. Adibidez, blokeatu IP helbide bat, egun batean 100 saiakera huts egiten baditu
**Bestela:** erasotzaile batek pasahitz automatizatuen saiakera mugagabeak egin ditzake aplikazio bateko kontu pribilegiatuetara sartzeko
🔗 [**Informazio gehiago: mugatu saioa hasteko abiadura**](./sections/security/login-rate-limit.basque.md)
<br/><br/>
## ![✔] 6.13. Exekutatu Node.js erabiltzaile ez-erro gisa
<a href="https://www.owasp.org/index.php/Top_10-2017_A5-Broken_Access_Control" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A5:Broken%20Access%20Access%20Control-green.svg" alt=""/></a>
**TL;PL:** eszenatoki arrunt batean Node.js baimen mugagabeak dituen erro erabiltzaile gisa exekutatzen da. Hori da, adibidez, Docker edukiontzietako portaera lehenetsia. Gomendagarria da erro ez den erabiltzaile bat sortzea eta Docker irudian sartzea (behean azaltzen dira adibideak) edo prozesua erabiltzaile horren izenean abiaraztea "-u username" marka duen edukiontzia deituz
**Bestela:** zerbitzarian script bat exekutatzea lortzen duten erasotzaileek botere mugagabea lortzen dute makina lokalaren gainean (adibidez, iptable aldatu eta trafikoa beren zerbitzarira bideratzea)
🔗 [**Informazio gehiago: exekutatu Node.js erabiltzaile ez-erro gisa**](./sections/security/non-root-user.basque.md)
<br/><br/>
## ![✔] 6.14. Mugatu kargaren tamaina alderantzizko proxy edo middlewareak erabiliz
<a href="https://www.owasp.org/index.php/Top_10-2017_A8-Insecure_Deserialization" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A8:Insecured%20Deserialization%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A1-Injection" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20DDOS%20-green.svg" alt=""/></a>
**TL;PL:** zenbat eta gorputzaren karga handiagoa izan, orduan eta zailagoa da zure hari bakarra lan egitea hura prozesatzean. Hori da erasotzaileek zerbitzariak belauniko jartzeko aukera ona eskaera kopuru izugarririk egin gabe (DOS / DDOS erasoak). Murriztu arriskua ertzean jasotako eskaeren gorputzaren tamaina mugatuz (adibidez, suebakia, ELB) edo [express body parser](https://github.com/expressjs/body-parser) konfiguratuz tamaina txikiko kargak bakarrik onartzeko
**Bestela:** zure aplikazioak eskaera handiei aurre egin beharko die, eta ezingo du prozesatu egin behar duen beste lan garrantzitsua, ondorioz errendimendua gutxituz eta DOS erasoekiko ahulduz
🔗 [**Informazio gehiago: mugatu kargaren tamaina**](./sections/security/requestpayloadsizelimit.basque.md)
<br/><br/>
## ![✔] 6.15. Saihestu JavaScripten eval adierazpenak
<a href="https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7:XSS%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A1-Injection" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A4:External%20Entities%20-green.svg" alt=""/></a>
**TL;PL:** `eval` arriskutsua da, exekutatzeko garaian JavaScript kode pertsonalizatua exekutatzea baimentzen baitu. Hori ez da errendimendu arazo bat bakarrik, baizik eta segurtasun arazo garrantzitsua, erabiltzaileen sarreratik JavaScript kode gaiztoa lor daiteke eta. Halaber, `new Function constructor` ere saihestu beharra dago; eta, azkenik, `setTimeout` eta `setInterval`, ez dira inoiz pasatu behar, ezta JavaScript kode dinamikoa ere
**Bestela:** Javascript kode gaiztoak bidea aurkitzen du `eval` testura edo JavaScript hizkuntzak denbora errealean ebaluatzeko dituen funtzioetara sartzeko, eta sarbide osoa lortuko du JavaScripten orrialdeko baimenetara. Ahultasun hori XSS eraso gisa agertzen da askotan
🔗 [**Informazio gehiago: saihestu JavaScript eval adierazpenak**](./sections/security/avoideval.basque.md)
<br/><br/>
## ![✔] 6.16. Saihestu RegEx gaiztoak zure exekuzio hari bakarra gainkargatzea
<a href="https://www.owasp.org/index.php/Denial_of_Service" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20DDOS%20-green.svg" alt=""/></a>
**TL;PL:** adierazpen erregularrak, oso erabilgarriak izan arren, benetako mehatxua dira JavaScript aplikazioentzat, oro har, eta Node.js plataformarentzat, bereziki. Erabiltzaile baten sarrera prozesatzeko testuarekin bat etor dadin, gerta liteke PUZeko ziklo kopuru handia behar izatea. RegExen prozesamenduaren eraginkortasuna hain txikia izan daiteke, ezen 10 hitz balioztatzen dituen eskaera bakar batek blokea baitezake gertaeren begizta osoa 6 segundoz, eta PUZa su hartzeko moduan jarri 🔥. Hori dela eta, erasotzen errazak diren ohiko adierazpen ahulen txantiloiak atzemateko erabili hirugarrenen balidazio paketeak -esaterako, [validator.js](https://github.com/chriso/validator.js)-, zuk zeure Regex ereduak idatzi edo [safe-regex](https://github.com/substack/safe-regex) erabili gabe
**Bestela:** gaizki idatzitako ohiko adierazpenek Regular Expression DoSen erasoak jasan ditzakete, gertaeren begizta erabat blokeatuko dutenak. Adibidez, 2017ko azaroan, RegExen erabilera gaiztoak agerian jarri zuen `moment` pakete ezagunaren ahultasuna
🔗 [**Informazio gehiago: saihestu RegEx gaiztoa erabiltzea**](./sections/security/regex.basque.md)
<br/><br/>
## ![✔] 6.17. Saihestu moduluak kargatzea aldagai bat erabiliz
<a href="https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7:XSS%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A1-Injection" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A4:External%20Entities%20-green.svg" alt=""/></a>
**TL;PL:** bide bat erabiltzailea sartu ondoren sortua ote den kezka baduzu eta horregatik parametro gisa ezarri baduzu, saihestu bide hori erabiltzea beste fitxategi bat deitzeko / inportatzeko. Arau hori, oro har, edozein fitxategitara sartzeko erabil daiteke (hau da, `fs.readFile()`) edo erabiltzailea sartu ondoren sortutako aldagai dinamikoak dituen beste baliabide konfidentzialetara sartzeko. [Eslint-plugin-security](https://www.npmjs.com/package/eslint-plugin-security) linterrek eredu horiek atzeman eta nahikoa goiz ohartaraz dezake
**Bestela:** erabiltzaile gaiztoen sarrerak manipulatutako fitxategiak deitzeko erabiltzen den parametro batera jo dezake, adibidez, aurretik fitxategi sisteman kargatutako fitxategietara edo lehendik sisteman bazeuden fitxategietara sartzeko
🔗 [**Informazio gehiago: moduluaren karga segurua**](./sections/security/safemoduleloading.basque.md)
<br/><br/>
## ![✔] 6.18. Exekutatu kode ez segurua sandbox batean
<a href="https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7:XSS%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A1-Injection" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A4:External%20Entities%20-green.svg" alt=""/></a>
**TL;PL:** exekuzio garaian ematen den kanpoko kodea exekutatu behar duzunean (adibidez, plugina), erabili kode nagusia isolatu eta pluginetik babesten duen 'sandbox' tankerako edozein exekuzio ingurune mota. Hori lor daiteke prozesu dedikatu baten bidez (adibidez, `cluster.fork()`), zerbitzaririk gabeko ingurune bat erabiliz edo sandbox bat balitz bezala jokatzen duten npm pakete dedikatuak erabiliz
**Bestela:** plugin batek bide ugari erabil ditzake erasotzeko, hala nola begizta infinituak erabiliz, memoria gainkargatuz eta prozesu ingurune eraso errazen aldagaiak eskuratuz
🔗 [**Informazio gehiago: exekutatu kode ez segurua sandbox batean**](./sections/security/sandbox.basque.md)
<br/><br/>
## ![✔] 6.19. Kontu handia izan bigarren mailako prozesuekin lan egitean
<a href="https://www.owasp.org/index.php/Top_10-2017_A7-Cross-Site_Scripting_(XSS)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A7:XSS%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A1-Injection" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg" alt=""/></a> <a href="https://www.owasp.org/index.php/Top_10-2017_A4-XML_External_Entities_(XXE)" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A4:External%20Entities%20-green.svg" alt=""/></a>
**TL;PL:** ahal dela, saihestu bigarren mailako prozesuak, eta, hala behar izanez gero, balioztatu eta garbitu sarrera, shell injekzioko erasoak arintzeko. Hobetsi `child_process.execFile` fitxategia, definizioz komando bakarra exekutatuko duena atributu multzo batekin eta shell parametroen hedapena onartuko ez duena
**Bestela:** bigarren mailako prozesuak ganorarik gabe erabiltzeak urruneko komandoen exekuzioa edo shell injekzioko erasoak eragin ditzake, desinfektatu gabeko sistema komando batera erabiltzaile gaiztoren bat sartu dela eta
🔗 [**Informazio gehiago: kontuz ibili bigarren mailako prozesuekin lan egitean**](./sections/security/childprocesses.basque.md)
<br/><br/>
## ![✔] 6.20. Ezkutatu bezeroari erroreen xehetasunak
<a href="https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg" alt=""/></a>
**TL;PL:** errore integratuen kudeatzaile lasterrek lehenespenez ezkutatzen dituzte erroreen xehetasunak. Haatik, aukera handia dago inplementa dezan errore pertsonalizatuak dituzten objektuak kudeatzeko berak daukan logika (batzuen ustez praktika ona dena). Hala eginez gero, ziurtatu bezeroari errorearen objektu osoa ez itzultzea, horrek aplikazioen datu sentikorrak izan litzake eta
**Bestela:** aplikazioaren xehetasun sentikorrak —hala nola, zerbitzariko fitxategien bideak, erabiltzen ari diren hirugarrenen moduluak eta erasotzaile batek balia ditzakeen aplikazioaren barneko beste lan fluxuak— atera daitezke pila aztarna batean aurkitutako informazioetatik
🔗 [**Informazio gehiago: ezkutatu bezeroari erroreen xehetasunak**](./sections/security/hideerrors.basque.md)
<br/><br/>
## ![✔] 6.21. Konfiguratu 2FA npm edo Yarn-entzat
<a href="https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg" alt=""/></a>
**TL;PL:** garapen katearen edozein urrats MFArekin (faktore anitzeko autentifikazioarekin) babestu behar da. Iza ere, npm / Yarn aukera paregabea da garatzaile batzuen pasahitza eskuratu nahi duten erasotzaileentzat. Garatzaileen egiaztagiriak erabiliz, erasotzaileek kode gaiztoa txerta dezakete proiektu eta zerbitzuetan instalatuta dauden liburutegietan, eta, agian, sarean bertan ere, jendaurrean argitarauta badago. npm-n autentifikazioa 2 faktore bidez egin beharra ezartzeak ia zero aukera uzten die erasotzaileei zure pakete kodea aldatzeko
**Bestela:** [ba al duzu pasahitza bahitu zuten eslint garatzailearen berri?](https://medium.com/@oprearocks/eslint-backdoor-what-it-is-and-how-to-fix-the-issue-221f58f1a8c8)
<br/><br/>
## ![✔] 6.22. Aldatu saioko middlewarearen ezarpenak
<a href="https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg" alt=""/></a>
**TL;PL:** web esparru eta teknologia bakoitzak bere ahulguneak ditu: erasotzaileei esatea zein web esparru erabiltzen dugun laguntza handia da haientzat. Saioaren middlewareen ezarpen lehenetsiak erabiltzeak eragin dezake zure moduluko eta esparruko berariazko bahiketa erasoak izatea zure aplikazioak, `X-Powered-By` izenburukoaren antzekoak. Saiatu ezkutatzen zure pila teknologkoa identifikatzen eta agerian uzten duen edozein gauza (adibidez, Node.js, express)
**Bestela:** cookieak segurtasunik gabeko konexioen bidez bidal litezke, eta erasotzaile batek saioaren identifikazioa erabil lezake web aplikazioaren barruko esparrua eta moduluen berariazko ahultasunak ere identifikatzeko
🔗 [**Informazio gehiago: cookieak eta saioaren segurtasuna**](./sections/security/sessions.basque.md)
<br/><br/>
## ![✔] 6.23. Saihestu DOS erasoak prozesuak noiz huts egin behar duen berariaz ezarriz
<a href="https://www.owasp.org/index.php/Denial_of_Service" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20DDOS%20-green.svg" alt=""/></a>
**TL;PL:** Node prozesuak huts egingo du akatsak kudeatzen ez direnean. Praktika onetako askok irtetea gomendatzen dute, akats bat atzeman eta kudeatuta badago ere. Expressek, adibidez, huts egiten du errore asinkronoren bat izanez gero –blokeatze klausula batekin ibilbideak biltzen ez badituzu behintzat. Horrek oso eraso bide aproposa irekitzen die erasotzaileei, zer informaziok eragiten duen prozesuaren blokeoa jakinda, behin eta berriz eskaera bera bidaltzen baitute prozesua blokeatzea lortu arte. Horretarako ez dago berehalako erremediorik, baina teknika batzuek mina arindu dezakete: abisatu zorroztasun kritikoarekin, kontrolatu gabeko errore baten ondorioz prozesuak huts egiten duen bakoitzean, balioztatu sarrera eta saihestu prozesua blokeatuta gelditzea erabiltzailearen sarrera baliogabea delako, bildu ibilbide guztiak cacth batekin eta kontuan hartu prozesuak ez duela huts egin behar eskaera batean errore bat sortzen denean (oro har, gertatzen denaren kontra)
**Bestela:** hau uste oneko suposizio soil bat besterik ez da. Node.js aplikazio asko edukiz gero, JSON gorputz huts bat POST eskaera guztietara pasatzen saiatzen bagara, zenbait aplikazio blokeatu egingo dira. Une horretan, eskaera bera berbidal dezakegu, aplikazioak erraz ezabatzeko
<br/><br/>
## ![✔] 6.24. Saihestu birbideratze ez seguruak
<a href="https://www.owasp.org/index.php/Top_10-2017_A1-Injection" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A1:Injection%20-green.svg" alt=""/></a>
**TL;PL:** erabiltzaileen sarrerak balioztatzen ez dituzten birbideratzeek ahalbidetzen dute erasotzaileek phishing iruzurrak abiatzea, erabiltzaileen egiaztagiriak lapurtzea eta beste ekintza kaltegarri batzuk burutzea
**Bestela:** erasotzailea ohartzen bada erabiltzaileek emandako kanpo sarrerarik ez dela balioztatzen, ahultasun hori balia dezake foroetan, sare sozialetan eta beste toki publiko batzuetan hartarako bereziki sortutako estekak argitaratzean, erabiltzaileek bertan klik egin dezaten
🔗 [**Informazio gehiago: saihestu birbideratze ez seguruak**](./sections/security/saferedirects.basque.md)
<br/><br/>
## ![✔] 6.25. Saihestu sekretuak npm erregistroan argitaratzea
<a href="https://www.owasp.org/index.php/Top_10-2017_A6-Security_Misconfiguration" target="_blank"><img src="https://img.shields.io/badge/%E2%9C%94%20OWASP%20Threats%20-%20A6:Security%20Misconfiguration%20-green.svg" alt=""/></a>
**TL;PL:** neurriak hartu behar dira npm erregistro publikoetan sekretuak nahi gabe argitaratzeko arriskua ekiditeko. Erabil daiteke `.npmignore` fitxategi bat karpeta edo fitxategi espezikoak zerrenda beltz batean jartzeko eta `files` matrizea `package.json` artxiboarekin erabil daiteke zerrenda zuri moduan lan egin dezan
**Bestela:** arriskua dago norbaitek zure proiektuaren API giltzak, pasahitzak edo beste sekretu batzuk aurkitu eta erasoak egiten saiatzeko, eta horrek galera ekonomikoak, nortasun arazoak eta bestelako arriskuak sor ditzake
🔗 [**Informazio gehiago: saihestu sekretuak argitaratzea**](./sections/security/avoid_publishing_secrets.basque.md)
<br/><br/><br/>
<p align="right"><a href="#edukien-aurkibidea">⬆ Itzuli hasierara</a></p>
# `7. Zirriborroa: errendimendua`
## Gure laguntzaileak lanean ari dira atal honetan. [Parte hartu nahi zenuke?](https://github.com/goldbergyoni/nodebestpractices/issues/256)
<br/><br/>
## ![✔] 7.1. Ez blokeatu gertaeren begizta
**TL;PL:** saihestu PUZen zeregin intentsiboak, gertaeren begizta blokeatuko baitute. Izan ere, gertaera horietako gehienak azpiprozesu bakarrekoak dira, eta deskargatuak izango baitira azpiprozesu dedikatu batean, prozesu batean edo teknologia desberdinetan, dauden testuinguruaren arabera
**Bestela:** gertaeren begizta blokeatuta dagoenez, Node.jsk ezin izango du beste eskaera bat kudeatu eta, ondorioz, atzerapena eragin diezaieke erabiltzaileei. **3000 erabiltzaile erantzunaren zain daude, edukia zerbitzatzeko prest dago, baina eskaera bakar batek emaitzak berriro bidaltzea galarazten dio zerbitzariari**
🔗 [**Informazio gehiago: ez blokeatu gertaeraren begizta**](./sections/performance/block-loop.basque.md)
<br /><br /><br />
## ![✔] 7.2. Hobetsi jatorrizko JS metodoak Lodash bezalako erabiltzaileen baliabideak baino
**TL;PL:** askotan zorrotzagoa da `lodash` eta `underscore` bezalako baliabide liburutegiak erabiltzea jatorrizko metodoak baino, beharrezkoak ez diren menpekotasunak eragin eta abiadura moteltzen baitu. Gogoan izan, V8 motor berria ES estandar berriekin batera, bertako metodoak hobetu egin zirela, eta gaur egun baliabide liburutegiak % 50 inguru eraginkorragoak direla liburutegi publikoak baino
**Bestela:** errendimendu txikiagoko proiektuak mantendu beharko zenituzke, non **dagoeneko** eskura zenuena erabili beharko baitzenuke edo, fitxategi batzu gehiagoren truke, beste zenbait lerro landu
🔗 [**Informazio gehiago: erabiltzaileen jatorrizko baliabideak**](./sections/performance/nativeoverutil.basque.md)
<br/><br/><br/>
<p align="right"><a href="#edukien-aurkibidea">⬆ Itzuli hasierara</a></p>
# `8. Docker, praktika onak`
🏅 Mila esker [Bret Fisher](https://github.com/BretFisher)-i, ondorengo praktika hauetako asko ikasi baikenituen berarengandik
<br/><br/>
## ![✔] 8.1 Erabili etapa anitzeko konpilazioak Docker irudi sinpleagoak eta seguruagoak lortzeko
**TL;PL:** erabili etapa anitzeko konpilazioak beharrezko produkzio objektuak soilik kopiatzeko. Konpilazio menpekotasun eta fitxategi asko ez dira beharrezkoak zure aplikazioa exekutatzeko. Etapa anitzeko konpilazioak erabiliz gero, baliabide horiek konpilazioan zehar erabil daitezke, denboraren exekuzio inguruneak beharrezko baliabideak besterik ez duen bitartean. Etapa anitzeko konpilazioak oso modu erraza dira gehiegizko pisua kendu eta segurtasun mehatxuak saihesteko
**Bestela:** irudi handiagoek denbora gehiago beharko dute konpilatzeko eta zabaltzeko. Eraikitzeko soilik diren tresnek ahultasunak eduki ditzakete eta eraikitze faserako soilik gordetako sekretuak filtratu daitezke
### Etapa anitzeko eraikuntzetarako Dockerfile fitxategiaren adibidea
```dockerfile
FROM node:14.4.0 AS build
COPY . .
RUN npm ci && npm run build
FROM node:slim-14.4.0
USER node
EXPOSE 8080
COPY --from=build /home/node/app/dist /home/node/app/package.json /home/node/app/package-lock.json ./
RUN npm ci --production
CMD [ "node", "dist/app.js" ]
```
🔗 [**Informazio gehiago: erabili etapa anitzeko konpilazioak**](./sections/docker/multi_stage_builds.basque.md)
<br /><br /><br />
## ![✔] 8.2. Abiarazi edukiontzia node komandoa erabiliz, saihestu npm
**TL;PL:** erabili `CMD ['node','server.js']` aplikazioa abiarazteko, saihestu OS seinaleak kodera pasatzen ez dituzten npm scriptak erabiltzea. Horrek arazoak izatea ekiditen du bigarren mailako prozesuetan, seinaleak kudeatzean, itxiera seguruetan eta prozesu zonbietan
**Bestela:** seinalerik pasatzen ez denean, zure kodeak ez du inoiz izango itzalaldien berri, eta, hori gabe, ez da behar bezala itxiko, unean uneko eskaerak eta / edo datuak galduz
[**Informazio gehiago: abiarazi edukiontzia 'node' komandoa erabiliz, saihestu npm abiatzea**](./sections/docker/bootstrap-using-node.basque.md)
<br /><br /><br />
## ![✔] 8.3. Utzi Dockeren egikaritze denborari erreplikatu eta jardueraren iraupena kudeatzen
**TL;PL:** Dockerren exekuzio denboraren orkestratzailea erabiltzen duzunean (adibidez, Kubernetes), deitu Node.js prozesua zuzenean, prozesua errepikatzen duten bitarteko prozesuen kudeatzailerik edo koderik pertsonalizatu gabe (adibidez, PM2, Cluster modulua). Exekuzio denboraren plataformak datu kopuru eta ikusgarritasun handiena dauzka kokapenari buruzko erabakiak hartzeko: badaki zenbat prozesu behar diren, nola antolatu prozesuok eta zer egin huts eginez gero
**Bestela:** edukiontziak huts egiten jarraituko du baliabide faltagatik, eta prozesuen kudeatzaileak behin eta berriro berrabiaraziko du, gelditu gabe. Kubernetes horretaz jabetuko balitz, beste toki zabal batera lekualda lezake
🔗 [**Informazio gehiago: utzi Dockeren exekuzio denborari erreplikatu eta jardueraren iraupena kudeatzen**](./sections/docker/restart-and-replicate-processes.basque.md)
<br/><br /><br />
## ![✔] 8.4. Erabili .dockerignore sekretuak filtratzea ekiditeko
**TL;DR**: erabili `.dockerignore` fitxategia, fitxategi sekretu arruntak eta garapeneko objektuak iragazten ditu eta. Horrela, sekretuak irudira ez sartzea lor dezakezu. Eta onura gehigarri bat izango duzu: eraikitzeko denbora nabarmen murriztuko da. Gainera, ziurtatu fitxategi guztiak ez direla behin eta berriro kopiatzen eta berariaz aukeratu zer kopiatu behar den Dockerren
**Bestela**: irudira sarbidea duen edonorekin partekatuko dira `.env`, `.aws` eta `.npmrc` bezalako fitxategi sekretu pertsonal arruntak (adibidez, Docker biltegia)
🔗 [**Informazio gehiago: erabili .dockerignore**](./sections/docker/docker-ignore.basque.md)
<br /><br /><br />
## ![✔] 8.5. Garbitu menpekotasunak ekoizpenaren aurretik
**TL;PL:** nahiz eta dev-menpekotasunak (dev-dependencies) batzuetan eraikuntza eta probako bizitza zikloan zehar beharrezkoak izan, azkenean ekoizpenera bidaltzen den irudiak ahalik eta txikiena izan behar du eta ez du garapeneko menpekotasunik eduki behar. Hori eginez gero, beharrezko kodea soilik bidaliko dela eta balizko erasoen kopurua (hau da, erasoaren azalera) minimizatuko dela bermatzen da, eta, hori lor daiteke menpekotasun guztiak lehenik instalatuz eta azkenean `npm ci --production` exekutatuz, beti ere etapa anitzeko eraikuntza erabiltzen denean (ikusi buleta dedikatua)
**Bestela:** npm segurtasun arau hauste ezagun asko garapen paketeen barruan aurkitu izan dira (adibidez, [eslint-scope](https://eslint.org/blog/2018/07/postmortem-for-malicious-package-publishes))
🔗 Informazio gehiago: [ezabatu garapen menpekotasunak](./sections/docker/install-for-production.basque.md)
<br /><br /><br />
## ![✔] 8.6. Itzali arazorik gabe eta dotore
**TL;PL:** kudeatu prozesuaren SIGTERM gertaera eta garbitu lehendik dauden konexio eta baliabide guztiak. Hori etengabeko eskaerei erantzutean egin behar da. Dockerized exekutatzen den bitartean edukiontziak ixtea ez da arraroa, baizik eta ohiko lanaren zati gisa maiz gertatzen den zerbait. Hori lortzeko ondo pentsatutako kodea prestatu beharra dago hainbat elementu koordinatuz: karga orekatzailea, mantentze konexioak, HTTP zerbitzaria eta beste baliabide batzuk
**Bestela:** berehala hiltzeak etsita dauden milaka erabiltzaileri ez erantzutea ekarriko du
🔗 [**Informazio gehiago: itzalaldi dotorea**](./sections/docker/graceful-shutdown.basque.md)
<br /><br /><br />
## ![✔] 8.7. Ezarri memoria mugak Docker eta v8 erabiliz
**TL;PL:** konfiguratu beti memoria muga bai Docker bai JavaScript exekuzio adierazgailak erabiliz. Dockerren muga beharrezkoa da edukiontzien kokapena erabakitzeko; --v8ren bandera max-old-space beharrezkoa da GC garaiz abiarazteko eta memoria erabiltzea saihesteko. Praktikan, ezarri v8rren espazio memoria zaharra edukiontziaren muga baino apur bat txikiagoa izan dadin
**Bestela:** Dockerren definizioa beharrezkoa da eskalatutako erabakiak burutzeko eta beste herritarrak gosez hiltzea ekiditeko. V8rren mugak zehaztu gabe ere, edukiontziaren baliabideak erabiliko ditu. Argibide espliziturik gabe, baliabideen %50-60a erabiltzean huts egiten du
🔗 [**Informazio gehiago: ezarri memoria mugak Docker erabiliz soilik**](./sections/docker/memory-limit.basque.md)
<br /><br /><br />
## ![✔] 8.8. Baliatu cachea konpilazio denbora murrizteko
**TL;PL:** Dockerren irudi osoa cache-tik berreraikitzea ia berehalakoa izan daiteke, zuzen eginez gero. Eguneratu ez diren argibideek Dockerfile fitxategiaren goialdean egon behar dute, eta etengabe aldatzen ari direnek (aplikazioaren kodea, esate baterako) beheko aldean egon behar dute
**Bestela:** Docker eraikitzeak oso luze jo dezake eta baliabide asko kontsumituko ditu, nahiz eta aldaketa txikiak egin
🔗 [**Informazio gehiago: baliatu cachea konpilazio denborak murrizteko**](./sections/docker/use-cache-for-shorter-build-time.basque.md)
<br /><br /><br />
## ![✔] 8.9. Erabili irudiaren erreferentzia esplizitua, saihestu "azken" (`latest`) etiketa
**TL;PL:** zehaztu irudi laburpen esplizitu bat edo etiketa baten bertsioa, inoiz ez aipatu `latest`. Garatzaileek sarritan uste izaten dute, `latest` adieraziz gero, biltegiko azken irudia eskuratuko dutela, baina ez da horrela. Laburpena erabiltzeak zerbitzuaren instantzia guztiek kode bera exekutatuko dutela bermatzen du
Gainera, irudi etiketa bat aipatzen bada, oinarrizko irudia aldatu egin daiteke, ez baitago irudi etiketekin fidatzerik instalazio determinista bat egiteko orduan. Horren ordez, instalazioa determinista izanez gero, SHA256 laburpena erabil daiteke irudi zehatza erreferentziatzeko
**Bestela:** oinarrizko irudi baten bertsio berri bat erabiliz gero, aldaketa handiak gerta litezke produkzioan, horrek aplikazioaren nahigabeko portaera sortuz
🔗 [**Informazio gehiago: ulertu irudi etiketak eta erabili "azken" (`latest`) etiketa kontu handiz**](./sections/docker/image-tags.basque.md)
<br /><br /><br />
## ![✔] 8.10. Hobetsi Docker oinarrizko irudi txikiagoak
**TL;PL:** irudi handiek ahultasun gehiago izateko arriskua handitu eta baliabideen kontsumoa areagotzen dute. Docker irudi arinagoak erabiltzeak, Slim eta Alpine Linux aldaerak adibidez, arazo hori arindu egiten du
**Bestela:** batetik, denbora gehiago beharko da irudiak eraiki, txertatu eta ateratzeko; bestetik, erabiltzaile maltzurrek eraso bektore ezezagunak erabil ditzakete; eta, azkenik, baliabide gehiago beharko dira
🔗 [**Informazio gehiago: hobetsi irudi txikiagoak**](./sections/docker/smaller_base_images.basque.md)
<br /><br /><br />
## ![✔] 8.11. Garbitu eraikitze faseko sekretuak, saihestu sekretuak argudioetan
**TL;PL:** saihestu Dockerren konpilazio inguruneko sekretuak agerian geratzea. Docker irudi bat IE bezalako ingurune anitzetan eta ekoizpena bezain garbituta ez dauden erregistroetan partekatzen da normalean. Adibide tipikoa npm giltza (tokena) da, normalean dockerfile fitxategi batera pasatzen dena argumentu gisa. Giltza hori irudiaren barruan geratzen da denbora luzez beharrezkoa izateari utzi ondoren ere, eta erasotzaileari npm erregistro pribatura sartzeko aukera ematen dio. Hori ekidin daiteke sekretua `.npmrc` bezalako fitxategi batean kopiatuz, eta, ondoren, sekretu hori kenduz etapa anitzeko eraikuntza bat erabiliz (kontuz, eraikitze
gitextract_l1sblc9v/
├── .all-contributorsrc
├── .github/
│ ├── stale.yml
│ └── workflows/
│ ├── automerge-prs.yml
│ ├── lint-and-generate-html-from-markdown.yml
│ ├── update-date-in-last-update-badge.yml
│ └── update-last-update-badge.sh
├── .gitignore
├── .operations/
│ ├── .markdownlint.json
│ ├── CONTRIBUTING.md
│ ├── common-answers.md
│ ├── operations-manual.md
│ ├── writing-guidelines.basque.md
│ ├── writing-guidelines.chinese.md
│ ├── writing-guidelines.french.md
│ ├── writing-guidelines.indonesia.md
│ ├── writing-guidelines.japanese.md
│ ├── writing-guidelines.md
│ ├── writing-guidelines.polish.md
│ └── writing-guidelines.russian.md
├── LICENSE
├── README.basque.md
├── README.brazilian-portuguese.md
├── README.chinese.md
├── README.french.md
├── README.hebrew.md
├── README.indonesian.md
├── README.japanese.md
├── README.korean.md
├── README.md
├── README.polish.md
├── README.russian.md
├── assets/
│ └── images/
│ ├── members/
│ │ └── create-member-icon.md
│ └── placeholdet.txt
├── package.json
└── sections/
├── codestylepractices/
│ ├── eslint_prettier.basque.md
│ ├── eslint_prettier.brazilian-portuguese.md
│ ├── eslint_prettier.chinese.md
│ ├── eslint_prettier.french.md
│ ├── eslint_prettier.japanese.md
│ ├── eslint_prettier.korean.md
│ ├── eslint_prettier.md
│ ├── eslint_prettier.polish.md
│ └── eslint_prettier.russian.md
├── docker/
│ ├── avoid-build-time-secrets.basque.md
│ ├── avoid-build-time-secrets.chinese.md
│ ├── avoid-build-time-secrets.french.md
│ ├── avoid-build-time-secrets.japanese.md
│ ├── avoid-build-time-secrets.md
│ ├── bootstrap-using-node.basque.md
│ ├── bootstrap-using-node.chinese.md
│ ├── bootstrap-using-node.french.md
│ ├── bootstrap-using-node.japanese.md
│ ├── bootstrap-using-node.md
│ ├── clean-cache.basque.md
│ ├── clean-cache.chinese.md
│ ├── clean-cache.french.md
│ ├── clean-cache.japanese.md
│ ├── clean-cache.md
│ ├── docker-ignore.basque.md
│ ├── docker-ignore.chinese.md
│ ├── docker-ignore.french.md
│ ├── docker-ignore.japanese.md
│ ├── docker-ignore.md
│ ├── generic-tips.basque.md
│ ├── generic-tips.chinese.md
│ ├── generic-tips.french.md
│ ├── generic-tips.japanese.md
│ ├── generic-tips.md
│ ├── graceful-shutdown.basque.md
│ ├── graceful-shutdown.french.md
│ ├── graceful-shutdown.japanese.md
│ ├── graceful-shutdown.md
│ ├── image-tags.basque.md
│ ├── image-tags.french.md
│ ├── image-tags.japanese.md
│ ├── image-tags.md
│ ├── install-for-production.basque.md
│ ├── install-for-production.french.md
│ ├── install-for-production.japanese.md
│ ├── install-for-production.md
│ ├── lint-dockerfile.basque.md
│ ├── lint-dockerfile.french.md
│ ├── lint-dockerfile.japanese.md
│ ├── lint-dockerfile.md
│ ├── memory-limit.basque.md
│ ├── memory-limit.french.md
│ ├── memory-limit.japanese.md
│ ├── memory-limit.md
│ ├── multi_stage_builds.basque.md
│ ├── multi_stage_builds.french.md
│ ├── multi_stage_builds.japanese.md
│ ├── multi_stage_builds.md
│ ├── restart-and-replicate-processes.basque.md
│ ├── restart-and-replicate-processes.french.md
│ ├── restart-and-replicate-processes.japanese.md
│ ├── restart-and-replicate-processes.md
│ ├── scan-images.basque.md
│ ├── scan-images.french.md
│ ├── scan-images.japanese.md
│ ├── scan-images.md
│ ├── smaller_base_images.basque.md
│ ├── smaller_base_images.french.md
│ ├── smaller_base_images.japanese.md
│ ├── smaller_base_images.md
│ ├── use-cache-for-shorter-build-time.basque.md
│ ├── use-cache-for-shorter-build-time.french.md
│ ├── use-cache-for-shorter-build-time.japanese.md
│ └── use-cache-for-shorter-build-time.md
├── drafts/
│ ├── readme-general-toc-1.md
│ ├── readme-general-toc-2.md
│ ├── readme-general-toc-3.md
│ └── readme-general-toc-4.md
├── errorhandling/
│ ├── apmproducts.basque.md
│ ├── apmproducts.brazilian-portuguese.md
│ ├── apmproducts.chinese.md
│ ├── apmproducts.french.md
│ ├── apmproducts.japanese.md
│ ├── apmproducts.korean.md
│ ├── apmproducts.md
│ ├── apmproducts.polish.md
│ ├── apmproducts.russian.md
│ ├── asyncerrorhandling.basque.md
│ ├── asyncerrorhandling.brazilian-portuguese.md
│ ├── asyncerrorhandling.chinese.md
│ ├── asyncerrorhandling.french.md
│ ├── asyncerrorhandling.japanese.md
│ ├── asyncerrorhandling.korean.md
│ ├── asyncerrorhandling.md
│ ├── asyncerrorhandling.polish.md
│ ├── asyncerrorhandling.russian.md
│ ├── catchunhandledpromiserejection.basque.md
│ ├── catchunhandledpromiserejection.brazilian-portuguese.md
│ ├── catchunhandledpromiserejection.chinese.md
│ ├── catchunhandledpromiserejection.french.md
│ ├── catchunhandledpromiserejection.japanese.md
│ ├── catchunhandledpromiserejection.korean.md
│ ├── catchunhandledpromiserejection.md
│ ├── catchunhandledpromiserejection.polish.md
│ ├── catchunhandledpromiserejection.russian.md
│ ├── centralizedhandling.basque.md
│ ├── centralizedhandling.brazilian-portuguese.md
│ ├── centralizedhandling.chinese.md
│ ├── centralizedhandling.french.md
│ ├── centralizedhandling.japanese.md
│ ├── centralizedhandling.korean.md
│ ├── centralizedhandling.md
│ ├── centralizedhandling.polish.md
│ ├── centralizedhandling.russian.md
│ ├── documentingusingswagger.basque.md
│ ├── documentingusingswagger.brazilian-portuguese.md
│ ├── documentingusingswagger.chinese.md
│ ├── documentingusingswagger.french.md
│ ├── documentingusingswagger.japanese.md
│ ├── documentingusingswagger.korean.md
│ ├── documentingusingswagger.md
│ ├── documentingusingswagger.polish.md
│ ├── documentingusingswagger.russian.md
│ ├── failfast.basque.md
│ ├── failfast.brazilian-portuguese.md
│ ├── failfast.chinese.md
│ ├── failfast.french.md
│ ├── failfast.japanese.md
│ ├── failfast.korean.md
│ ├── failfast.md
│ ├── failfast.polish.md
│ ├── failfast.russian.md
│ ├── monitoring.chinese.md
│ ├── monitoring.french.md
│ ├── monitoring.japanese.md
│ ├── monitoring.md
│ ├── monitoring.russian.md
│ ├── operationalvsprogrammererror.basque.md
│ ├── operationalvsprogrammererror.brazilian-portuguese.md
│ ├── operationalvsprogrammererror.chinese.md
│ ├── operationalvsprogrammererror.french.md
│ ├── operationalvsprogrammererror.japanese.md
│ ├── operationalvsprogrammererror.korean.md
│ ├── operationalvsprogrammererror.md
│ ├── operationalvsprogrammererror.polish.md
│ ├── operationalvsprogrammererror.russian.md
│ ├── returningpromises.basque.md
│ ├── returningpromises.french.md
│ ├── returningpromises.md
│ ├── returningpromises.russian.md
│ ├── shuttingtheprocess.basque.md
│ ├── shuttingtheprocess.brazilian-portuguese.md
│ ├── shuttingtheprocess.chinese.md
│ ├── shuttingtheprocess.french.md
│ ├── shuttingtheprocess.japanese.md
│ ├── shuttingtheprocess.korean.md
│ ├── shuttingtheprocess.md
│ ├── shuttingtheprocess.polish.md
│ ├── shuttingtheprocess.russian.md
│ ├── testingerrorflows.basque.md
│ ├── testingerrorflows.brazilian-portuguese.md
│ ├── testingerrorflows.chinese.md
│ ├── testingerrorflows.french.md
│ ├── testingerrorflows.japanese.md
│ ├── testingerrorflows.korean.md
│ ├── testingerrorflows.md
│ ├── testingerrorflows.polish.md
│ ├── testingerrorflows.russian.md
│ ├── usematurelogger.basque.md
│ ├── usematurelogger.brazilian-portuguese.md
│ ├── usematurelogger.chinese.md
│ ├── usematurelogger.french.md
│ ├── usematurelogger.japanese.md
│ ├── usematurelogger.korean.md
│ ├── usematurelogger.md
│ ├── usematurelogger.polish.md
│ ├── usematurelogger.russian.md
│ ├── useonlythebuiltinerror.basque.md
│ ├── useonlythebuiltinerror.brazilian-portuguese.md
│ ├── useonlythebuiltinerror.chinese.md
│ ├── useonlythebuiltinerror.french.md
│ ├── useonlythebuiltinerror.japanese.md
│ ├── useonlythebuiltinerror.korean.md
│ ├── useonlythebuiltinerror.md
│ ├── useonlythebuiltinerror.polish.md
│ └── useonlythebuiltinerror.russian.md
├── examples/
│ └── dockerfile/
│ ├── .dockerignore
│ ├── .npmrc
│ ├── Dockerfile
│ ├── package.json
│ └── src/
│ └── app.ts
├── performance/
│ ├── block-loop.basque.md
│ ├── block-loop.french.md
│ ├── block-loop.japanese.md
│ ├── block-loop.md
│ ├── block-loop.polish.md
│ ├── block-loop.russian.md
│ ├── nativeoverutil.basque.md
│ ├── nativeoverutil.brazilian-portuguese.md
│ ├── nativeoverutil.french.md
│ ├── nativeoverutil.japanese.md
│ ├── nativeoverutil.md
│ ├── nativeoverutil.polish.md
│ └── nativeoverutil.russian.md
├── production/
│ ├── LTSrelease.basque.md
│ ├── LTSrelease.brazilian-portuguese.md
│ ├── LTSrelease.chinese.md
│ ├── LTSrelease.french.md
│ ├── LTSrelease.japanese.md
│ ├── LTSrelease.korean.md
│ ├── LTSrelease.md
│ ├── LTSrelease.polish.md
│ ├── LTSrelease.russian.md
│ ├── apmproducts.basque.md
│ ├── apmproducts.brazilian-portuguese.md
│ ├── apmproducts.chinese.md
│ ├── apmproducts.french.md
│ ├── apmproducts.japanese.md
│ ├── apmproducts.korean.md
│ ├── apmproducts.md
│ ├── apmproducts.polish.md
│ ├── apmproducts.russian.md
│ ├── assigntransactionid.basque.md
│ ├── assigntransactionid.brazilian-portuguese.md
│ ├── assigntransactionid.chinese.md
│ ├── assigntransactionid.french.md
│ ├── assigntransactionid.japanese.md
│ ├── assigntransactionid.korean.md
│ ├── assigntransactionid.md
│ ├── assigntransactionid.polish.md
│ ├── assigntransactionid.russian.md
│ ├── bestateless.basque.md
│ ├── bestateless.brazilian-portuguese.md
│ ├── bestateless.chinese.md
│ ├── bestateless.french.md
│ ├── bestateless.japanese.md
│ ├── bestateless.korean.md
│ ├── bestateless.md
│ ├── bestateless.polish.md
│ ├── bestateless.russian.md
│ ├── createmaintenanceendpoint.basque.md
│ ├── createmaintenanceendpoint.brazilian-portuguese.md
│ ├── createmaintenanceendpoint.chinese.md
│ ├── createmaintenanceendpoint.french.md
│ ├── createmaintenanceendpoint.japanese.md
│ ├── createmaintenanceendpoint.korean.md
│ ├── createmaintenanceendpoint.md
│ ├── createmaintenanceendpoint.polish.md
│ ├── createmaintenanceendpoint.russian.md
│ ├── delegatetoproxy.basque.md
│ ├── delegatetoproxy.brazilian-portuguese.md
│ ├── delegatetoproxy.chinese.md
│ ├── delegatetoproxy.french.md
│ ├── delegatetoproxy.japanese.md
│ ├── delegatetoproxy.korean.md
│ ├── delegatetoproxy.md
│ ├── delegatetoproxy.polish.md
│ ├── delegatetoproxy.russian.md
│ ├── detectvulnerabilities.basque.md
│ ├── detectvulnerabilities.brazilian-portuguese.md
│ ├── detectvulnerabilities.chinese.md
│ ├── detectvulnerabilities.french.md
│ ├── detectvulnerabilities.japanese.md
│ ├── detectvulnerabilities.korean.md
│ ├── detectvulnerabilities.md
│ ├── detectvulnerabilities.polish.md
│ ├── detectvulnerabilities.russian.md
│ ├── frontendout.basque.md
│ ├── frontendout.brazilian-portuguese.md
│ ├── frontendout.chinese.md
│ ├── frontendout.french.md
│ ├── frontendout.japanese.md
│ ├── frontendout.korean.md
│ ├── frontendout.md
│ ├── frontendout.polish.md
│ ├── frontendout.russian.md
│ ├── guardprocess.basque.md
│ ├── guardprocess.brazilian-portuguese.md
│ ├── guardprocess.chinese.md
│ ├── guardprocess.french.md
│ ├── guardprocess.japanese.md
│ ├── guardprocess.korean.md
│ ├── guardprocess.md
│ ├── guardprocess.polish.md
│ ├── guardprocess.russian.md
│ ├── installpackageswithnpmci.basque.md
│ ├── installpackageswithnpmci.french.md
│ ├── installpackageswithnpmci.japanese.md
│ ├── installpackageswithnpmci.md
│ ├── lockdependencies.basque.md
│ ├── lockdependencies.brazilian-portuguese.md
│ ├── lockdependencies.chinese.md
│ ├── lockdependencies.french.md
│ ├── lockdependencies.japanese.md
│ ├── lockdependencies.korean.md
│ ├── lockdependencies.md
│ ├── lockdependencies.polish.md
│ ├── lockdependencies.russian.md
│ ├── logrouting.basque.md
│ ├── logrouting.brazilian-portuguese.md
│ ├── logrouting.french.md
│ ├── logrouting.japanese.md
│ ├── logrouting.md
│ ├── logrouting.polish.md
│ ├── logrouting.russian.md
│ ├── measurememory.basque.md
│ ├── measurememory.brazilian-portuguese.md
│ ├── measurememory.chinese.md
│ ├── measurememory.french.md
│ ├── measurememory.japanese.md
│ ├── measurememory.korean.md
│ ├── measurememory.md
│ ├── measurememory.polish.md
│ ├── measurememory.russian.md
│ ├── monitoring.basque.md
│ ├── monitoring.brazilian-portuguese.md
│ ├── monitoring.chinese.md
│ ├── monitoring.french.md
│ ├── monitoring.japanese.md
│ ├── monitoring.korean.md
│ ├── monitoring.md
│ ├── monitoring.polish.md
│ ├── monitoring.russian.md
│ ├── productioncode.basque.md
│ ├── productioncode.brazilian-portuguese.md
│ ├── productioncode.chinese.md
│ ├── productioncode.french.md
│ ├── productioncode.japanese.md
│ ├── productioncode.korean.md
│ ├── productioncode.md
│ ├── productioncode.polish.md
│ ├── productioncode.russian.md
│ ├── setnodeenv.basque.md
│ ├── setnodeenv.brazilian-portuguese.md
│ ├── setnodeenv.chinese.md
│ ├── setnodeenv.french.md
│ ├── setnodeenv.japanese.md
│ ├── setnodeenv.korean.md
│ ├── setnodeenv.md
│ ├── setnodeenv.polish.md
│ ├── setnodeenv.russian.md
│ ├── smartlogging.basque.md
│ ├── smartlogging.brazilian-portuguese.md
│ ├── smartlogging.chinese.md
│ ├── smartlogging.french.md
│ ├── smartlogging.japanese.md
│ ├── smartlogging.korean.md
│ ├── smartlogging.md
│ ├── smartlogging.polish.md
│ ├── smartlogging.russian.md
│ ├── utilizecpu.basque.md
│ ├── utilizecpu.brazilian-portuguese.md
│ ├── utilizecpu.chinese.md
│ ├── utilizecpu.french.md
│ ├── utilizecpu.japanese.md
│ ├── utilizecpu.korean.md
│ ├── utilizecpu.md
│ ├── utilizecpu.polish.md
│ └── utilizecpu.russian.md
├── projectstructre/
│ ├── breakintcomponents.basque.md
│ ├── breakintcomponents.brazilian-portuguese.md
│ ├── breakintcomponents.chinese.md
│ ├── breakintcomponents.french.md
│ ├── breakintcomponents.japanese.md
│ ├── breakintcomponents.korean.md
│ ├── breakintcomponents.md
│ ├── breakintcomponents.polish.md
│ ├── breakintcomponents.russian.md
│ ├── choose-framework.md
│ ├── configguide.basque.md
│ ├── configguide.brazilian-portuguese.md
│ ├── configguide.chinese.md
│ ├── configguide.french.md
│ ├── configguide.japanese.md
│ ├── configguide.korean.md
│ ├── configguide.md
│ ├── configguide.polish.md
│ ├── configguide.russian.md
│ ├── createlayers.basque.md
│ ├── createlayers.brazilian-portuguese.md
│ ├── createlayers.chinese.md
│ ├── createlayers.french.md
│ ├── createlayers.japanese.md
│ ├── createlayers.korean.md
│ ├── createlayers.md
│ ├── createlayers.polish.md
│ ├── createlayers.russian.md
│ ├── separateexpress.basque.md
│ ├── separateexpress.brazilian-portuguese.md
│ ├── separateexpress.chinese.md
│ ├── separateexpress.french.md
│ ├── separateexpress.japanese.md
│ ├── separateexpress.korean.md
│ ├── separateexpress.polish.md
│ ├── separateexpress.russian.md
│ ├── thincomponents.chinese.md
│ ├── thincomponents.french.md
│ ├── thincomponents.japanese.md
│ ├── thincomponents.md
│ ├── thincomponents.russian.md
│ ├── typescript-considerations.md
│ ├── wraputilities.basque.md
│ ├── wraputilities.brazilian-portuguese.md
│ ├── wraputilities.chinese.md
│ ├── wraputilities.french.md
│ ├── wraputilities.japanese.md
│ ├── wraputilities.korean.md
│ ├── wraputilities.md
│ ├── wraputilities.polish.md
│ └── wraputilities.russian.md
├── security/
│ ├── avoid_publishing_secrets.basque.md
│ ├── avoid_publishing_secrets.brazilian-portuguese.md
│ ├── avoid_publishing_secrets.french.md
│ ├── avoid_publishing_secrets.japanese.md
│ ├── avoid_publishing_secrets.md
│ ├── avoid_publishing_secrets.polish.md
│ ├── avoid_publishing_secrets.russian.md
│ ├── avoideval.basque.md
│ ├── avoideval.brazilian-portuguese.md
│ ├── avoideval.chinese.md
│ ├── avoideval.french.md
│ ├── avoideval.japanese.md
│ ├── avoideval.md
│ ├── avoideval.polish.md
│ ├── avoideval.russian.md
│ ├── bcryptpasswords.brazilian-portuguese.md
│ ├── bcryptpasswords.chinese.md
│ ├── bcryptpasswords.japanese.md
│ ├── bcryptpasswords.polish.md
│ ├── bcryptpasswords.russian.md
│ ├── childprocesses.basque.md
│ ├── childprocesses.brazilian-portuguese.md
│ ├── childprocesses.chinese.md
│ ├── childprocesses.french.md
│ ├── childprocesses.japanese.md
│ ├── childprocesses.md
│ ├── childprocesses.polish.md
│ ├── childprocesses.russian.md
│ ├── commonsecuritybestpractices.basque.md
│ ├── commonsecuritybestpractices.brazilian-portuguese.md
│ ├── commonsecuritybestpractices.french.md
│ ├── commonsecuritybestpractices.japanese.md
│ ├── commonsecuritybestpractices.md
│ ├── commonsecuritybestpractices.polish.md
│ ├── commonsecuritybestpractices.russian.md
│ ├── dependencysecurity.basque.md
│ ├── dependencysecurity.brazilian-portuguese.md
│ ├── dependencysecurity.french.md
│ ├── dependencysecurity.japanese.md
│ ├── dependencysecurity.md
│ ├── dependencysecurity.polish.md
│ ├── dependencysecurity.russian.md
│ ├── escape-output.basque.md
│ ├── escape-output.brazilian-portuguese.md
│ ├── escape-output.french.md
│ ├── escape-output.japanese.md
│ ├── escape-output.md
│ ├── escape-output.polish.md
│ ├── escape-output.russian.md
│ ├── expirejwt.basque.md
│ ├── expirejwt.brazilian-portuguese.md
│ ├── expirejwt.chinese.md
│ ├── expirejwt.french.md
│ ├── expirejwt.japanese.md
│ ├── expirejwt.md
│ ├── expirejwt.polish.md
│ ├── expirejwt.russian.md
│ ├── hideerrors.basque.md
│ ├── hideerrors.brazilian-portuguese.md
│ ├── hideerrors.chinese.md
│ ├── hideerrors.french.md
│ ├── hideerrors.japanese.md
│ ├── hideerrors.md
│ ├── hideerrors.polish.md
│ ├── hideerrors.russian.md
│ ├── limitrequests.basque.md
│ ├── limitrequests.brazilian-portuguese.md
│ ├── limitrequests.chinese.md
│ ├── limitrequests.french.md
│ ├── limitrequests.japanese.md
│ ├── limitrequests.md
│ ├── limitrequests.polish.md
│ ├── limitrequests.russian.md
│ ├── lintrules.basque.md
│ ├── lintrules.brazilian-portuguese.md
│ ├── lintrules.french.md
│ ├── lintrules.japanese.md
│ ├── lintrules.md
│ ├── lintrules.polish.md
│ ├── lintrules.russian.md
│ ├── login-rate-limit.basque.md
│ ├── login-rate-limit.brazilian-portuguese.md
│ ├── login-rate-limit.french.md
│ ├── login-rate-limit.japanese.md
│ ├── login-rate-limit.md
│ ├── login-rate-limit.polish.md
│ ├── login-rate-limit.russian.md
│ ├── non-root-user.basque.md
│ ├── non-root-user.brazilian-portuguese.md
│ ├── non-root-user.french.md
│ ├── non-root-user.japanese.md
│ ├── non-root-user.md
│ ├── non-root-user.polish.md
│ ├── non-root-user.russian.md
│ ├── ormodmusage.basque.md
│ ├── ormodmusage.brazilian-portuguese.md
│ ├── ormodmusage.french.md
│ ├── ormodmusage.japanese.md
│ ├── ormodmusage.md
│ ├── ormodmusage.polish.md
│ ├── ormodmusage.russian.md
│ ├── regex.basque.md
│ ├── regex.brazilian-portuguese.md
│ ├── regex.french.md
│ ├── regex.japanese.md
│ ├── regex.md
│ ├── regex.polish.md
│ ├── regex.russian.md
│ ├── requestpayloadsizelimit.basque.md
│ ├── requestpayloadsizelimit.brazilian-portuguese.md
│ ├── requestpayloadsizelimit.french.md
│ ├── requestpayloadsizelimit.japanese.md
│ ├── requestpayloadsizelimit.md
│ ├── requestpayloadsizelimit.polish.md
│ ├── requestpayloadsizelimit.russian.md
│ ├── safemoduleloading.basque.md
│ ├── safemoduleloading.brazilian-portuguese.md
│ ├── safemoduleloading.chinese.md
│ ├── safemoduleloading.french.md
│ ├── safemoduleloading.japanese.md
│ ├── safemoduleloading.md
│ ├── safemoduleloading.polish.md
│ ├── safemoduleloading.russian.md
│ ├── saferedirects.basque.md
│ ├── saferedirects.brazilian-portuguese.md
│ ├── saferedirects.chinese.md
│ ├── saferedirects.french.md
│ ├── saferedirects.japanese.md
│ ├── saferedirects.md
│ ├── saferedirects.polish.md
│ ├── saferedirects.russian.md
│ ├── sandbox.basque.md
│ ├── sandbox.brazilian-portuguese.md
│ ├── sandbox.chinese.md
│ ├── sandbox.french.md
│ ├── sandbox.japanese.md
│ ├── sandbox.md
│ ├── sandbox.polish.md
│ ├── sandbox.russian.md
│ ├── secretmanagement.basque.md
│ ├── secretmanagement.brazilian-portuguese.md
│ ├── secretmanagement.french.md
│ ├── secretmanagement.japanese.md
│ ├── secretmanagement.md
│ ├── secretmanagement.polish.md
│ ├── secretmanagement.russian.md
│ ├── secureheaders.basque.md
│ ├── secureheaders.brazilian-portuguese.md
│ ├── secureheaders.french.md
│ ├── secureheaders.japanese.md
│ ├── secureheaders.md
│ ├── secureheaders.polish.md
│ ├── secureheaders.russian.md
│ ├── secureserver.basque.md
│ ├── secureserver.brazilian-portuguese.md
│ ├── secureserver.chinese.md
│ ├── secureserver.french.md
│ ├── secureserver.japanese.md
│ ├── secureserver.md
│ ├── secureserver.russian.md
│ ├── sessions.basque.md
│ ├── sessions.brazilian-portuguese.md
│ ├── sessions.french.md
│ ├── sessions.japanese.md
│ ├── sessions.md
│ ├── sessions.polish.md
│ ├── sessions.russian.md
│ ├── userpasswords.basque.md
│ ├── userpasswords.french.md
│ ├── userpasswords.md
│ ├── validation.basque.md
│ ├── validation.brazilian-portuguese.md
│ ├── validation.french.md
│ ├── validation.japanese.md
│ ├── validation.md
│ ├── validation.polish.md
│ └── validation.russian.md
├── template.basque.md
├── template.md
└── testingandquality/
├── 3-parts-in-name.basque.md
├── 3-parts-in-name.brazilian-portuguese.md
├── 3-parts-in-name.french.md
├── 3-parts-in-name.japanese.md
├── 3-parts-in-name.md
├── 3-parts-in-name.polish.md
├── 3-parts-in-name.russian.md
├── aaa.basque.md
├── aaa.french.md
├── aaa.japanese.md
├── aaa.md
├── aaa.polish.md
├── aaa.russian.md
├── avoid-global-test-fixture.basque.md
├── avoid-global-test-fixture.brazilian-portuguese.md
├── avoid-global-test-fixture.french.md
├── avoid-global-test-fixture.japanese.md
├── avoid-global-test-fixture.md
├── avoid-global-test-fixture.polish.md
├── avoid-global-test-fixture.russian.md
├── bumpversion.japanese.md
├── bumpversion.md
├── citools.basque.md
├── citools.brazilian-portuguese.md
├── citools.chinese.md
├── citools.french.md
├── citools.japanese.md
├── citools.korean.md
├── citools.polish.md
├── citools.russian.md
├── mock-external-services.md
├── randomize-port.md
├── refactoring.basque.md
├── refactoring.brazilian-portuguese.md
├── refactoring.french.md
├── refactoring.japanese.md
├── refactoring.korean.md
├── refactoring.md
├── refactoring.polish.md
├── refactoring.russian.md
├── test-five-outcomes.md
├── test-middlewares.basque.md
├── test-middlewares.french.md
├── test-middlewares.japanese.md
├── test-middlewares.korean.md
└── test-middlewares.md
Condensed preview — 669 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,504K chars).
[
{
"path": ".all-contributorsrc",
"chars": 48792,
"preview": "{\n \"files\": [\n \"README.basque.md\",\n \"README.brazilian-portuguese.md\",\n \"README.chinese.md\",\n \"README.french"
},
{
"path": ".github/stale.yml",
"chars": 798,
"preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 90\n# Number of days of inactivity before a "
},
{
"path": ".github/workflows/automerge-prs.yml",
"chars": 730,
"preview": "name: automerge\non:\n pull_request:\n types:\n - labeled\n - unlabeled\n - synchronize\n - opened\n "
},
{
"path": ".github/workflows/lint-and-generate-html-from-markdown.yml",
"chars": 494,
"preview": "name: Lint & Generate HTML from Markdown\non:\n push:\n branches:\n - master\n pull_request:\n\ndefaults:\n run:\n "
},
{
"path": ".github/workflows/update-date-in-last-update-badge.yml",
"chars": 1266,
"preview": "name: Update date in last update badge\non:\n push:\n branches:\n - master\n\njobs:\n run:\n name: Update the date "
},
{
"path": ".github/workflows/update-last-update-badge.sh",
"chars": 1829,
"preview": "#!/bin/bash\nset -e\n\nINPUT_FILE=$1\n\nurl_encode() {\n # url_encode <string>\n local length=\"${#1}\"\n for (( i = 0; i"
},
{
"path": ".gitignore",
"chars": 217,
"preview": "*.log\r\n.idea\r\n.vscode\r\n.idea/**/*\r\n.vscode/**/*\r\n.nyc_output\r\nmochawesome-report\r\n.DS_Store\r\nnpm-debug.log.*\r\nnode_modul"
},
{
"path": ".operations/.markdownlint.json",
"chars": 93,
"preview": "{\n \"default\": true,\n \"MD033\": false,\n \"MD001\": false,\n \"MD013\": false,\n \"MD039\": false\n}"
},
{
"path": ".operations/CONTRIBUTING.md",
"chars": 3765,
"preview": "# Contribution guidelines\n\n## Lovely & friendly atmosphere\n\nOur code of conduct is 5 words long: we are all friends here"
},
{
"path": ".operations/common-answers.md",
"chars": 1434,
"preview": "**Welcoming new translators**\n\n@name - Welcome aboard, it's great to have you here! 🎆\n\nHaving A Slovak translation could"
},
{
"path": ".operations/operations-manual.md",
"chars": 4271,
"preview": "# Operations Manual - Organizing and Maximizing Our Work\r\nBuilding knowledge and a community by efficiently handling iss"
},
{
"path": ".operations/writing-guidelines.basque.md",
"chars": 2923,
"preview": "# Gure agiriko edukia hobeto idazteko\r\n\r\nNola hobetu gure bisitarien irakurtzeko eta ikasteko esperientzia\r\n\r\n## 1. Sinp"
},
{
"path": ".operations/writing-guidelines.chinese.md",
"chars": 1008,
"preview": "# 我们创作内容的准则\r\n\r\n提高访问者的阅读和学习体验\r\n\r\n## 1. 越简单越好\r\n\r\n我们的使命,是使知识更易于理解与吸收。因此,我们专注于将复杂和无趣的话题转化为一个简化的清单,用简短但细节相对不精确的列表,去避免超负荷的信息量。"
},
{
"path": ".operations/writing-guidelines.french.md",
"chars": 3303,
"preview": "# Notre manifeste de rédaction de contenu\n\nComment nous améliorons l'expérience de lecture et l'apprentissage pour nos v"
},
{
"path": ".operations/writing-guidelines.indonesia.md",
"chars": 2987,
"preview": "# Manifes penulisan konten kami\n\nBagaimana kami meningkatkan pengalaman membaca dan belajar bagi pengunjung kami.\n\n## 1."
},
{
"path": ".operations/writing-guidelines.japanese.md",
"chars": 2729,
"preview": "# Our content writing manifest\r\n\r\nHow we enhance the reading and learning experience for our visitors.\r\n\r\n## 1. Simple i"
},
{
"path": ".operations/writing-guidelines.md",
"chars": 2729,
"preview": "# Our content writing manifest\r\n\r\nHow we enhance the reading and learning experience for our visitors.\r\n\r\n## 1. Simple i"
},
{
"path": ".operations/writing-guidelines.polish.md",
"chars": 2833,
"preview": "# Nasz manifest pisania treści\n\nJak zwiększamy komfort czytania i uczenia się dla naszych gości.\n\n## 1. Proste jest leps"
},
{
"path": ".operations/writing-guidelines.russian.md",
"chars": 2959,
"preview": "# Наш манифест по написанию контента\r\n\r\nКак мы улучшаем процесс чтения и обучения для наших посетителей.\r\n\r\n## 1. Просто"
},
{
"path": "LICENSE",
"chars": 18664,
"preview": "## creative commons\r\n\r\n# Attribution-ShareAlike 4.0 International\r\n\r\nCreative Commons Corporation (“Creative Commons”) i"
},
{
"path": "README.basque.md",
"chars": 182640,
"preview": "[✔]: assets/images/checkbox-small-blue.png\n\n# Node.js-ren praktika onak\n\n<h1 align=\"center\">\n <img src=\"assets/images/b"
},
{
"path": "README.brazilian-portuguese.md",
"chars": 89119,
"preview": "[✔]: assets/images/checkbox-small-blue.png\n\n# Melhores Práticas em Node.js\n\n<h1 align=\"center\">\n <img src=\"assets/image"
},
{
"path": "README.chinese.md",
"chars": 39456,
"preview": "[✔]: assets/images/checkbox-small-blue.png\n\n# Node.js 最佳实践\n\n<h1 align=\"center\">\n <img src=\"assets/images/banner-2.jpg\" "
},
{
"path": "README.french.md",
"chars": 189945,
"preview": "[✔]: assets/images/checkbox-small-blue.png\n\n# Bonnes pratiques Node.js\n\n<h1 align=\"center\">\n <img src=\"assets/images/ba"
},
{
"path": "README.hebrew.md",
"chars": 195009,
"preview": "[✔]: assets/images/checkbox-small-blue.png\r\n\r\n# שיטות עבודה מומלצות ב Node.js\r\n\r\n<h1 align=\"center\">\r\n <img src=\"assets"
},
{
"path": "README.indonesian.md",
"chars": 180110,
"preview": "[✔]: assets/images/checkbox-small-blue.png\n\n# Praktik Terbaik Node.js\n\n<h1 align=\"center\">\n <img src=\"assets/images/ban"
},
{
"path": "README.japanese.md",
"chars": 144967,
"preview": "[✔]: assets/images/checkbox-small-blue.png\n\n# Node.js ベストプラクティス\n\n<h1 align=\"center\">\n <img src=\"assets/images/banner-2."
},
{
"path": "README.korean.md",
"chars": 135365,
"preview": "[✔]: assets/images/checkbox-small-blue.png\n\n# Node.js 모범 사례\n\n<h1 align=\"center\">\n <img src=\"assets/images/banner-2.jpg\""
},
{
"path": "README.md",
"chars": 199496,
"preview": "[✔]: assets/images/checkbox-small-blue.png\n\n# Node.js Best Practices\n\n<h1 align=\"center\">\n <img src=\"assets/images/bann"
},
{
"path": "README.polish.md",
"chars": 86415,
"preview": "[✔]: assets/images/checkbox-small-blue.png\n\n# Node.js - Najlepsze praktyki\n\n<h1 align=\"center\">\n <img src=\"assets/image"
},
{
"path": "README.russian.md",
"chars": 88508,
"preview": "[✔]: assets/images/checkbox-small-blue.png\n\n# Node.js Лучшие практики\n\n<h1 align=\"center\">\n <img src=\"assets/images/ban"
},
{
"path": "assets/images/members/create-member-icon.md",
"chars": 1062,
"preview": "## How to create a new color coded icon image\n\nTo create a new image for yourself in either the collaborators or committ"
},
{
"path": "assets/images/placeholdet.txt",
"chars": 13,
"preview": "lorem ipsum\r\n"
},
{
"path": "package.json",
"chars": 573,
"preview": "{\n \"name\": \"nodebestpractices\",\n \"version\": \"1.0.0\",\n \"description\": \"[✔]: assets/images/checkbox-small-blue.png\",\n "
},
{
"path": "sections/codestylepractices/eslint_prettier.basque.md",
"chars": 1366,
"preview": "# Erabili ESLint eta Prettier\r\n\r\n### ESLint eta Prettier alderatzen\r\n\r\nKode hau formateatzen baduzu ESLint erabiliz, abi"
},
{
"path": "sections/codestylepractices/eslint_prettier.brazilian-portuguese.md",
"chars": 1286,
"preview": "# Use ESLint e Prettier\r\n\r\n\r\n### Comparando ESLint com Prettier\r\n\r\nSe você formatar este código usando o ESLint, ele ape"
},
{
"path": "sections/codestylepractices/eslint_prettier.chinese.md",
"chars": 1018,
"preview": "# 使用 ESLint 和 Prettier\r\n\r\n\r\n### 比较 ESLint 和 Prettier\r\n\r\n如果你使用ESLint格式化代码,它只是给你一个警告,比如这一行太宽(取决于你的`最大长度`设置)。Prettier会自动为你格"
},
{
"path": "sections/codestylepractices/eslint_prettier.french.md",
"chars": 1302,
"preview": "# Utilisez ESLint et Prettier\n\n\n### Comparaison d'ESLint et de Prettier\n\nSi vous formatez ce code à l'aide d'ESLint, il "
},
{
"path": "sections/codestylepractices/eslint_prettier.japanese.md",
"chars": 1079,
"preview": "# ESLint と Prettier を使う\r\n\r\n\r\n### ESLint と Prettier の比較\r\n\r\n以下のコードを ESLint でフォーマットすると、幅が広すぎるという警告が表示されます( `max-len` の設定により"
},
{
"path": "sections/codestylepractices/eslint_prettier.korean.md",
"chars": 1080,
"preview": "# ESLint와 Prettier 사용하기\n\n### ESLint와 Prettier 비교하기\n\n만약 당신이 ESLint를 사용해서 이 코드를 포맷한다면, 당신에게 너무 넓다는 경고만 줄 것이다 (당신의 `mas-len"
},
{
"path": "sections/codestylepractices/eslint_prettier.md",
"chars": 1266,
"preview": "# Using ESLint and Prettier\r\n\r\n\r\n### Comparing ESLint and Prettier\r\n\r\nIf you format this code using ESLint, it will just"
},
{
"path": "sections/codestylepractices/eslint_prettier.polish.md",
"chars": 1258,
"preview": "# Używanie ESLint oraz Prettier\n\n\n### Porównanie ESLint i Prettier\n\nJeśli sformatujesz ten kod za pomocą ESLint, wyświet"
},
{
"path": "sections/codestylepractices/eslint_prettier.russian.md",
"chars": 1321,
"preview": "# Использование ESLint и Prettier\r\n\r\n\r\n### Сравнение ESLint и Prettier\r\n\r\nЕсли вы отформатируете код ниже с помощью ESLi"
},
{
"path": "sections/docker/avoid-build-time-secrets.basque.md",
"chars": 3540,
"preview": "# Garbitu eraikitze faseko sekretuak, saihestu sekretuak argudioetan\r\n\r\n<br/><br/>\r\n\r\n### Azalpena\r\n\r\nDocker irudi bat e"
},
{
"path": "sections/docker/avoid-build-time-secrets.chinese.md",
"chars": 2062,
"preview": "# 清理编译过程中的秘钥,避免使用秘钥作为参数\n\n<br/><br/>\n\n### 一段解释\n\nDocker映像不仅仅是一堆文件,而是展示构建期间所发生的层级关系。在普通场景中,开发人员在构建过程中需要知道npm令牌(主要是对于私有regis"
},
{
"path": "sections/docker/avoid-build-time-secrets.french.md",
"chars": 3225,
"preview": "# Clean build-time secrets, avoid secrets as args\n\n<br/><br/>\n\n### One Paragraph Explainer\n\n\nA Docker image isn't just a"
},
{
"path": "sections/docker/avoid-build-time-secrets.japanese.md",
"chars": 2673,
"preview": "# ビルド時のシークレットをクリーンアウトし、引数にシークレットを含めることを避ける\r\n\r\n<br/><br/>\r\n\r\n### 一段落説明\r\n\r\nDocker イメージは単なるファイルの束ではなく、ビルド時に何が起こったかを明らかにする、複"
},
{
"path": "sections/docker/avoid-build-time-secrets.md",
"chars": 3326,
"preview": "# Clean build-time secrets, avoid secrets as args\r\n\r\n<br/><br/>\r\n\r\n### One Paragraph Explainer\r\n\r\n\r\nA Docker image isn't"
},
{
"path": "sections/docker/bootstrap-using-node.basque.md",
"chars": 2455,
"preview": "# Abiarazi edukiontzia node komandoa erabiliz npm erabili ordez\n\n## Azalpena\n\nOhikoa da jendeak `CMD 'npm start'` erabil"
},
{
"path": "sections/docker/bootstrap-using-node.chinese.md",
"chars": 1795,
"preview": "# 使用node命令而不是npm启动容器\n\n## 一段解释\n\n我们经常看到开发者使用`CMD 'npm start'`启动app的代码示例。这是一个不好的做法。因为`npm`不会向您的app转发信号(signals),这将阻止应用优雅关闭("
},
{
"path": "sections/docker/bootstrap-using-node.french.md",
"chars": 2304,
"preview": "# Bootstrap container using node command instead of npm\n\n## One paragraph explainer\n\nWe are used to see code examples wh"
},
{
"path": "sections/docker/bootstrap-using-node.japanese.md",
"chars": 2000,
"preview": "# npm の代わりに node コマンドを使用した Bootstrap コンテナ\n\n## 一段落説明\n\n`CMD 'npm start'` を使ってアプリを起動するコード例をよく見かけます。これは悪いプラクティスです。`npm` バイナリ"
},
{
"path": "sections/docker/bootstrap-using-node.md",
"chars": 2306,
"preview": "# Bootstrap container using node command instead of npm\n\n## One paragraph explainer\n\nWe are used to see code examples wh"
},
{
"path": "sections/docker/clean-cache.basque.md",
"chars": 1315,
"preview": "# Garbitu NODE_MODULE cachea\n\n<br/><br/>\n\n### Azalpena\n\nnpm eta Yarn Node paketeen kudeatzaileek cachean gordetzen dituz"
},
{
"path": "sections/docker/clean-cache.chinese.md",
"chars": 606,
"preview": "# 清除NODE_MODULE缓存\n\n<br/><br/>\n\n### 一段解释\n\nnode包管理器,npm和Yarn,会本地缓存安装过的包,以便在未来的项目中,如果需要同样的包,就不需要从远程仓库重新获取。尽管这会导致包的重复,消耗更多的存"
},
{
"path": "sections/docker/clean-cache.french.md",
"chars": 1192,
"preview": "# Clean NODE_MODULE cache\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nNode package managers, npm & Yarn, cache the install"
},
{
"path": "sections/docker/clean-cache.japanese.md",
"chars": 788,
"preview": "# NODE_MODULE キャッシュをクリーンアップする\n\n<br/><br/>\n\n### 一段落説明\n\nNode パッケージマネージャである npm や Yarn は、同じライブラリを必要とする将来のプロジェクトがリモートリポジトリから"
},
{
"path": "sections/docker/clean-cache.md",
"chars": 1193,
"preview": "# Clean NODE_MODULE cache\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nNode package managers, npm & Yarn, cache the install"
},
{
"path": "sections/docker/docker-ignore.basque.md",
"chars": 1599,
"preview": "# Erabili .dockerignore sekretuak filtratzea ekiditeko\n\n<br/><br/>\n\n### Azalpena\n\nDocker konpilazio komandoak tokian tok"
},
{
"path": "sections/docker/docker-ignore.chinese.md",
"chars": 876,
"preview": "# 使用.dockerignore防止泄漏机密\n\n<br/><br/>\n\n### 一段解释\n\nDocker的build命令会通过一个虚拟网络(virtual network)拷贝本地文件到构建的上下文环境。注意 - 开发和CI文件夹会包含机"
},
{
"path": "sections/docker/docker-ignore.french.md",
"chars": 1447,
"preview": "# Use .dockerignore to prevent leaking secrets\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nThe Docker build command copies"
},
{
"path": "sections/docker/docker-ignore.japanese.md",
"chars": 980,
"preview": "# .dockerignore を使用してシークレット情報の漏洩を防ぐ\n\n<br/><br/>\n\n### 一段落説明\n\nDocker ビルドコマンドは、仮想ネットワークを介してローカルファイルをビルドコンテキスト環境にコピーします。注意して"
},
{
"path": "sections/docker/docker-ignore.md",
"chars": 1448,
"preview": "# Use .dockerignore to prevent leaking secrets\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nThe Docker build command copies"
},
{
"path": "sections/docker/generic-tips.basque.md",
"chars": 2145,
"preview": "[✔]: ../../assets/images/checkbox-small-blue.png\n\n# Common Node.js Dockeren praktika onak\n\nDockeren praktika arrunten at"
},
{
"path": "sections/docker/generic-tips.chinese.md",
"chars": 839,
"preview": "[✔]: ../../assets/images/checkbox-small-blue.png\n\n# 通用的Node.js Docker最佳实践\n\n此通用Docker指南部分包含所有编程语言中标准化的最佳实践,并没有针对Node.js的特"
},
{
"path": "sections/docker/generic-tips.french.md",
"chars": 1865,
"preview": "[✔]: ../../assets/images/checkbox-small-blue.png\n\n# Common Node.js Docker best practices\n\nThis common Docker guidelines "
},
{
"path": "sections/docker/generic-tips.japanese.md",
"chars": 1179,
"preview": "[✔]: ../../assets/images/checkbox-small-blue.png\n\n# 一般的な Docker のベストプラクティス\n\nこの Docker ガイドラインのセクションでは、すべてのプログラミング言語の間で共通し"
},
{
"path": "sections/docker/generic-tips.md",
"chars": 1866,
"preview": "[✔]: ../../assets/images/checkbox-small-blue.png\n\n# Common Node.js Docker best practices\n\nThis common Docker guidelines "
},
{
"path": "sections/docker/graceful-shutdown.basque.md",
"chars": 2953,
"preview": "# Itzalaldi dotorea\n\n<br/><br/>\n\n### Azalpena\n\nKubernetes bezalako exekuzio ingurune Dockerizatu batean, edukiontziak sa"
},
{
"path": "sections/docker/graceful-shutdown.french.md",
"chars": 2630,
"preview": "# Shutdown gracefully\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nIn a Dockerized runtime like Kubernetes, containers are "
},
{
"path": "sections/docker/graceful-shutdown.japanese.md",
"chars": 1876,
"preview": "# グレースフルにシャットダウンする\n\n<br/><br/>\n\n### 一段落説明\n\nKubernetes のような Docker 化されたランタイムでは、コンテナは頻繁に生まれては死にます。これはエラーが発生したときだけでなく、コンテナの"
},
{
"path": "sections/docker/graceful-shutdown.md",
"chars": 2631,
"preview": "# Shutdown gracefully\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nIn a Dockerized runtime like Kubernetes, containers are "
},
{
"path": "sections/docker/image-tags.basque.md",
"chars": 1157,
"preview": "# Ulertu irudi etiketak eta laburpenak eta erabili \"azken\" (latest) etiketak kontu handiz\n\n### Azalpena\n\nEkoizpen aldian"
},
{
"path": "sections/docker/image-tags.french.md",
"chars": 1183,
"preview": "# Understand image tags vs digests and use the `:latest` tag with caution\n\n### One Paragraph Explainer\n\nIf this is a pro"
},
{
"path": "sections/docker/image-tags.japanese.md",
"chars": 829,
"preview": "# イメージタグ vs ダイジェストを理解し、`:latest` タグは注意深く利用する\n\n### 一段落説明\n\n本番環境で、セキュリティと安定性を重視するのであれば、「利便性」はベストな決定要因ではないかもしれません。`:latest` "
},
{
"path": "sections/docker/image-tags.md",
"chars": 1184,
"preview": "# Understand image tags vs digests and use the `:latest` tag with caution\n\n### One Paragraph Explainer\n\nIf this is a pro"
},
{
"path": "sections/docker/install-for-production.basque.md",
"chars": 3382,
"preview": "# Ezabatu garapen menpekotasunak\n\n<br/><br/>\n\n### Azalpena\n\nGarapen menpekotasunek asko handitzen dute edukiontziaren er"
},
{
"path": "sections/docker/install-for-production.french.md",
"chars": 3135,
"preview": "# Remove development dependencies\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nDev dependencies greatly increase the contai"
},
{
"path": "sections/docker/install-for-production.japanese.md",
"chars": 2381,
"preview": "# 開発依存性の除去\n\n<br/><br/>\n\n### 一段落説明\n\nDev-Dependencies は、コンテナへの攻撃面 (つまり潜在的なセキュリティ上の弱点) とコンテナサイズを大幅に増加させます。例として、最も影響力のある npm"
},
{
"path": "sections/docker/install-for-production.md",
"chars": 3136,
"preview": "# Remove development dependencies\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nDev dependencies greatly increase the contai"
},
{
"path": "sections/docker/lint-dockerfile.basque.md",
"chars": 2464,
"preview": "# Garbitu zure Dockerfile fitxategia\n\n### Azalpena\n\nGure oinarrizko aplikazioaren kodea praktika onen arabera lan egitek"
},
{
"path": "sections/docker/lint-dockerfile.french.md",
"chars": 2302,
"preview": "# Lint your Dockerfile\n\n### One Paragraph Explainer\n\nAs our core application code is linted to conform to best practices"
},
{
"path": "sections/docker/lint-dockerfile.japanese.md",
"chars": 1558,
"preview": "# Dockerfile を lint する\n\n### 一段落説明\n\nコアアプリケーションのコードをベストプラクティスに従わせ、問題になる前にイシューやバグを取り除くために lint を利用するように、Dockerfile も同様に lin"
},
{
"path": "sections/docker/lint-dockerfile.md",
"chars": 2303,
"preview": "# Lint your Dockerfile\n\n### One Paragraph Explainer\n\nAs our core application code is linted to conform to best practices"
},
{
"path": "sections/docker/memory-limit.basque.md",
"chars": 3906,
"preview": "# Ezarri memoria mugak Docker eta v8 erabiliz\n\n<br/><br/>\n\n### Azalpena\n\nMemoria mugatzeak prozesuari/edukiontziari adie"
},
{
"path": "sections/docker/memory-limit.french.md",
"chars": 3632,
"preview": "# Set memory limits using both Docker and v8\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nA memory limit tells the process/"
},
{
"path": "sections/docker/memory-limit.japanese.md",
"chars": 2525,
"preview": "# Docker と v8 の両方を使ってメモリ制限を設定する\n\n<br/><br/>\n\n### 一段落説明\n\nメモリ制限はプロセス/コンテナに許容されるメモリ使用量の最大値を伝えます - この数を超えるリクエストや使用はプロセスを強制終了"
},
{
"path": "sections/docker/memory-limit.md",
"chars": 3633,
"preview": "# Set memory limits using both Docker and v8\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nA memory limit tells the process/"
},
{
"path": "sections/docker/multi_stage_builds.basque.md",
"chars": 4666,
"preview": "# Erabili etapa anitzeko konpilazioak\n\n### Azalpena\n\nEtapa anitzeko konpilazioek aukera ematen dute eraikuntzei eta exek"
},
{
"path": "sections/docker/multi_stage_builds.french.md",
"chars": 4277,
"preview": "# Use multi-stage builds\n\n### One Paragraph Explainer\n\nMulti-stage builds allow to separate build- and runtime-specific "
},
{
"path": "sections/docker/multi_stage_builds.japanese.md",
"chars": 3063,
"preview": "# マルチステージビルドを使用する\n\n### 一段落説明\n\nマルチステージビルドでは、利用可能なバイナリや公開されている環境変数、さらには基礎となるOSなど、ビルドとランタイム固有の環境の詳細を分離することができます。Dockerfile "
},
{
"path": "sections/docker/multi_stage_builds.md",
"chars": 4278,
"preview": "# Use multi-stage builds\n\n### One Paragraph Explainer\n\nMulti-stage builds allow to separate build- and runtime-specific "
},
{
"path": "sections/docker/restart-and-replicate-processes.basque.md",
"chars": 1829,
"preview": "# Utzi Dockeren exekuzio denborari erreplikatu eta jardueraren iraupena kudeatzen\n\n<br/><br/>\n\n### Azalpena\n\nDockeren ex"
},
{
"path": "sections/docker/restart-and-replicate-processes.french.md",
"chars": 1697,
"preview": "# Let the Docker orchestrator restart and replicate processes\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nDocker runtime o"
},
{
"path": "sections/docker/restart-and-replicate-processes.japanese.md",
"chars": 993,
"preview": "# プロセスを再起動と複製をDocker オーケストレーターに任せる\n\n<br/><br/>\n\n### 一段落説明\n\nKubernetes のような Docker ランタイムオーケストレータは、コンテナの健全性と配置の決定を行うのが非常に得"
},
{
"path": "sections/docker/restart-and-replicate-processes.md",
"chars": 1698,
"preview": "# Let the Docker orchestrator restart and replicate processes\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nDocker runtime o"
},
{
"path": "sections/docker/scan-images.basque.md",
"chars": 2041,
"preview": "# Eskaneatu irudi osoa ekoiztu aurretik\n\n<br/><br/>\n\n### Azalpena\n\nKodea eskaneatzea ahultasunak aurkitzeko ekintza bali"
},
{
"path": "sections/docker/scan-images.french.md",
"chars": 1876,
"preview": "# Scan the entire image before production\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nScanning the code for vulnerabilitie"
},
{
"path": "sections/docker/scan-images.japanese.md",
"chars": 1378,
"preview": "# プロダクションの前にイメージ全体をスキャンする\n\n<br/><br/>\n\n### One Paragraph Explainer\n\n脆弱性のためにコードをスキャンすることは価値のある行動ですが、すべての潜在的な脅威をカバーできるものでは"
},
{
"path": "sections/docker/scan-images.md",
"chars": 1877,
"preview": "# Scan the entire image before production\n\n<br/><br/>\n\n### One Paragraph Explainer\n\nScanning the code for vulnerabilitie"
},
{
"path": "sections/docker/smaller_base_images.basque.md",
"chars": 1809,
"preview": "# Hobetsi Docker oinarrizko irudi txikiagoak\n\nDocker irudi handiek ahultasun gehiago sor ditzakete eta baliabideen konts"
},
{
"path": "sections/docker/smaller_base_images.french.md",
"chars": 1692,
"preview": "\nLarge Docker images can lead to higher exposure to vulnerabilities and increased resource consumption. Often you don't "
},
{
"path": "sections/docker/smaller_base_images.japanese.md",
"chars": 1098,
"preview": "# 小さな Docker ベースイメージを優先する\n\nサイズの大きな Docker イメージは脆弱性にさらされる可能性を高め、リソースの消費量を増加させます。多くの場合、ビルド時に必要なパッケージは実行時にインストールする必要はありません。"
},
{
"path": "sections/docker/smaller_base_images.md",
"chars": 1693,
"preview": "\nLarge Docker images can lead to higher exposure to vulnerabilities and increased resource consumption. Often you don't "
},
{
"path": "sections/docker/use-cache-for-shorter-build-time.basque.md",
"chars": 4192,
"preview": "# Baliatu cachea konpilazio denborak murrizteko\n\n## Azalpena\n\nDocker irudiak geruzen konbinazioak dira. Izan ere, zure D"
},
{
"path": "sections/docker/use-cache-for-shorter-build-time.french.md",
"chars": 3750,
"preview": "# Leverage caching to reduce build times\n\n## One paragraph explainer\n\nDocker images are a combination of layers, each in"
},
{
"path": "sections/docker/use-cache-for-shorter-build-time.japanese.md",
"chars": 2805,
"preview": "# キャッシュを活用してビルド時間を短縮する\n\n## 一段落説明\n\nDocker イメージはレイヤーの組み合わせであり、Dockerfile 内の各指示はそれぞれレイヤーを作成します。もし指示が同じであるか、`COPY` や `ADD` の"
},
{
"path": "sections/docker/use-cache-for-shorter-build-time.md",
"chars": 3751,
"preview": "# Leverage caching to reduce build times\n\n## One paragraph explainer\n\nDocker images are a combination of layers, each in"
},
{
"path": "sections/drafts/readme-general-toc-1.md",
"chars": 4398,
"preview": "<!--- # Node.js Best Practices -->\r\n<!---  -->\r\n<h1 align=\"ce"
},
{
"path": "sections/drafts/readme-general-toc-2.md",
"chars": 4179,
"preview": "# Node.js Best Practices\r\n\r\n<img src=\"https://img.shields.io/badge/⚙%20Item%20count%20-%2053%20Best%20practices-blue.svg"
},
{
"path": "sections/drafts/readme-general-toc-3.md",
"chars": 4422,
"preview": "<!--- # Node.js Best Practices -->\r\n<!---  -->\r\n<h1 align=\"ce"
},
{
"path": "sections/drafts/readme-general-toc-4.md",
"chars": 6571,
"preview": "<!--- # Node.js Best Practices -->\r\n<!---  -->\r\n<h1 align=\"ce"
},
{
"path": "sections/errorhandling/apmproducts.basque.md",
"chars": 3281,
"preview": "# Aurkitu erroreak eta jardunik gabeko uneak APM produktuak erabiliz\r\n\r\n### Azalpena\r\n\r\nSalbuespena != Errorea. Erroreen"
},
{
"path": "sections/errorhandling/apmproducts.brazilian-portuguese.md",
"chars": 3056,
"preview": "# Descubra erros e downtime usando APM\r\n\r\n\r\n### Explicação em um Parágrafo\r\n\r\nExceção != Erro. O tratamento de erros tra"
},
{
"path": "sections/errorhandling/apmproducts.chinese.md",
"chars": 1248,
"preview": "# 使用 APM 产品发现错误和宕机时间\r\n\r\n\r\n### 一段解释\r\n\r\n异常 != 错误。传统的错误处理假定存在异常,但应用程序错误可能以代码路径慢,API停机,缺少计算资源等形式出现。因为APM产品允许使用最小的设置来先前一步地检测各"
},
{
"path": "sections/errorhandling/apmproducts.french.md",
"chars": 3543,
"preview": "# Découvrez les erreurs et les indisponibilités à l'aide des produits de gestion de la performance applicative\n\n\n### Un "
},
{
"path": "sections/errorhandling/apmproducts.japanese.md",
"chars": 1642,
"preview": "# APM 製品を利用してエラーとダウンタイムを発見する\r\n\r\n\r\n### 一段落説明\r\n\r\n例外 != エラーです。従来のエラー処理では、コードが関連する問題としての例外の存在を想定していましたが、アプリケーションエラーは処理の遅いコード"
},
{
"path": "sections/errorhandling/apmproducts.korean.md",
"chars": 2752,
"preview": "# Discover errors and downtime using APM products\r\n\r\n\r\n### One Paragraph Explainer\r\n\r\nException != Error. Traditional er"
},
{
"path": "sections/errorhandling/apmproducts.md",
"chars": 2778,
"preview": "# Discover errors and downtime using APM products\r\n\r\n\r\n### One Paragraph Explainer\r\n\r\nException != Error. Traditional er"
},
{
"path": "sections/errorhandling/apmproducts.polish.md",
"chars": 2795,
"preview": "# Odkryj błędy i przestoje przy użyciu produktów APM\n\n\n### Wyjaśnienie jednego akapitu\n\nWyjątek != Błąd. Tradycyjna obsł"
},
{
"path": "sections/errorhandling/apmproducts.russian.md",
"chars": 2993,
"preview": "# Обнаружение ошибок и простоев с использованием продуктов APM\r\n\r\n\r\n### Объяснение в один абзац\r\n\r\nИсключение != Ошибка."
},
{
"path": "sections/errorhandling/asyncerrorhandling.basque.md",
"chars": 5089,
"preview": "# Erabili Async-Await edo errore asinkronoak kudeatzeko promesak\r\n\r\n### Azalpena\r\n\r\nCallbackak ez dira kudea errazak pro"
},
{
"path": "sections/errorhandling/asyncerrorhandling.brazilian-portuguese.md",
"chars": 3837,
"preview": "# Use Async-Await ou promises para tratamento de erros assíncronos\r\n\r\n### Explicação em um Parágrafo\r\n\r\nCallbacks não te"
},
{
"path": "sections/errorhandling/asyncerrorhandling.chinese.md",
"chars": 2840,
"preview": "# 对于异步的错误处理,请使用 Async-Await 或者 promises\r\n\r\n### 一段解释\r\n由于大多数的程序员不熟悉回调,不能很好的掌控回调函数,导致被迫到处检测错误,处理让人不快的代码嵌套和难以理解的代码流程。Promise"
},
{
"path": "sections/errorhandling/asyncerrorhandling.french.md",
"chars": 5455,
"preview": "# Utilisez Async-Await ou les promesses pour le traitement des erreurs asynchrones\n\n### Un paragraphe d'explication\n\nLes"
},
{
"path": "sections/errorhandling/asyncerrorhandling.japanese.md",
"chars": 3756,
"preview": "# 非同期エラーハンドリングに Async-Await または promises を使う\r\n\r\n### 一段落説明\r\n\r\nコールバックはあまりスケールしません。なぜなら、ほとんどのプログラマーはコールバックに馴染みがないからです。コールバッ"
},
{
"path": "sections/errorhandling/asyncerrorhandling.korean.md",
"chars": 3570,
"preview": "# Use Async-Await or promises for async error handling\r\n\r\n### One Paragraph Explainer\r\n\r\nCallbacks don’t scale well sinc"
},
{
"path": "sections/errorhandling/asyncerrorhandling.md",
"chars": 4795,
"preview": "# Use Async-Await or promises for async error handling\r\n\r\n### One Paragraph Explainer\r\n\r\nCallbacks don’t scale well sinc"
},
{
"path": "sections/errorhandling/asyncerrorhandling.polish.md",
"chars": 4736,
"preview": "# Użyj Async-Await lub promises do obsługi błędów asynchronicznych\n\n### Wyjaśnienie jednym akapitem\n\nCallbacks nie skalu"
},
{
"path": "sections/errorhandling/asyncerrorhandling.russian.md",
"chars": 4918,
"preview": "# Используйте Async-Await или обещания для асинхронной обработки ошибок\r\n\r\n### Объяснение в один абзац\r\n\r\nОбратные вызов"
},
{
"path": "sections/errorhandling/catchunhandledpromiserejection.basque.md",
"chars": 4054,
"preview": "# Atzeman kudeatu gabeko agintzen arbuioak\r\n\r\n<br/><br/>\r\n\r\n### Azalpena\r\n\r\nNormalean, Node.js/Express aplikazio kode mo"
},
{
"path": "sections/errorhandling/catchunhandledpromiserejection.brazilian-portuguese.md",
"chars": 3178,
"preview": "# Capture rejeições de promises não tratadas\r\n\r\n<br/><br/>\r\n\r\n### Explicação em um Parágrafo\r\n\r\nNormalmente, a maioria d"
},
{
"path": "sections/errorhandling/catchunhandledpromiserejection.chinese.md",
"chars": 1669,
"preview": "# 捕获未处理的promise rejections\r\n<br/><br/>\r\n\r\n\r\n### 一段解释\r\n\r\n通常,大部分的现代node.js/express应用代码运行在promise里 – 或者是在.then里处理,一个回调函数中,或"
},
{
"path": "sections/errorhandling/catchunhandledpromiserejection.french.md",
"chars": 4099,
"preview": "# Capturez les rejets de promesses non gérés\n\n<br/><br/>\n\n### Un paragraphe d'explication\n\nEn règle générale, la plupart"
},
{
"path": "sections/errorhandling/catchunhandledpromiserejection.japanese.md",
"chars": 2657,
"preview": "# 未処理の reject された promise を捕捉する\r\n\r\n<br/><br/>\r\n\r\n### 一段落説明\r\n\r\n一般的に、モダンな Node.js/Express アプリケーションのコードの多くは、promise の中で実行され"
},
{
"path": "sections/errorhandling/catchunhandledpromiserejection.korean.md",
"chars": 2937,
"preview": "# Catch unhandled promise rejections\r\n\r\n<br/><br/>\r\n\r\n### One Paragraph Explainer\r\n\r\nTypically, most of modern Node.js/E"
},
{
"path": "sections/errorhandling/catchunhandledpromiserejection.md",
"chars": 3683,
"preview": "# Catch unhandled promise rejections\r\n\r\n<br/><br/>\r\n\r\n### One Paragraph Explainer\r\n\r\nTypically, most of modern Node.js/E"
},
{
"path": "sections/errorhandling/catchunhandledpromiserejection.polish.md",
"chars": 3731,
"preview": "# Złap nieobsłużone odrzucenia promises\n\n<br/><br/>\n\n### Wyjaśnienie jednym akapitem\n\nZazwyczaj większość współczesnego "
},
{
"path": "sections/errorhandling/catchunhandledpromiserejection.russian.md",
"chars": 3844,
"preview": "# Перехватывайте необработанные отказы от обещаний\r\n\r\n<br/><br/>\r\n\r\n### Объяснение в один абзац\r\n\r\nКак правило, большая "
},
{
"path": "sections/errorhandling/centralizedhandling.basque.md",
"chars": 7330,
"preview": "# Kudeatu erroreak gune bakar batean, Express middleware erabili partez\n\n### Azalpena\n\nErroreak kudeatzeko objektu dedik"
},
{
"path": "sections/errorhandling/centralizedhandling.brazilian-portuguese.md",
"chars": 4648,
"preview": "# Lide com erros de forma centralizada. Não dentro de middlewares\n\n### Explicação em um Parágrafo\n\nSem um objeto dedicad"
},
{
"path": "sections/errorhandling/centralizedhandling.chinese.md",
"chars": 2380,
"preview": "# 集中处理错误,通过但不是在中间件里处理错误\r\n\r\n\r\n### 一段解释\r\n\r\n如果没有一个专用的错误处理对象,那么由于操作不当,在雷达下重要错误被隐藏的可能性就会更大。错误处理对象负责使错误可见,例如通过写入一个格式化良好的logger"
},
{
"path": "sections/errorhandling/centralizedhandling.french.md",
"chars": 7805,
"preview": "# Gérez les erreurs de manière centralisée, pas dans les middlewares\n\n### Un paragraphe d'explication\n\nSans un objet déd"
},
{
"path": "sections/errorhandling/centralizedhandling.japanese.md",
"chars": 4991,
"preview": "# エラー処理を一元化し、ミドウェア内で処理をしない\n\n### 一段落説明\n\nエラー処理専用のオブジェクトがないと、不適切な処理が原因となって重要なエラーが発見されない可能性が高くなります。エラー処理オブジェクトは、エラーを可視化する責任を"
},
{
"path": "sections/errorhandling/centralizedhandling.korean.md",
"chars": 2948,
"preview": "# 에러를 미들웨어에서 처리하지 말고 한군데에서 집중적으로 처리해라\n\n### 한문단 설명\n\n에러 처리를 위한 전용 객체가 없으면 잘못된 처리로 인해 중요한 에러가 숨어있을 가능성이 더 커진다. 예를 들어, 에러 처리"
},
{
"path": "sections/errorhandling/centralizedhandling.md",
"chars": 6950,
"preview": "# Handle errors centrally. Not within middlewares\n\n### One Paragraph Explainer\n\nWithout one dedicated object for error h"
},
{
"path": "sections/errorhandling/centralizedhandling.polish.md",
"chars": 6389,
"preview": "# Obsługuj błędy centralnie. Nie w ramach oprogramowania pośredniego\n\n### Wyjaśnienie jednym akapitem\n\nBez jednego obiek"
},
{
"path": "sections/errorhandling/centralizedhandling.russian.md",
"chars": 6583,
"preview": "# Обрабатывайте ошибки централизованно. Не в промежуточных слоях\n\n### Объяснение в один абзац\n\nБез выделенного объекта д"
},
{
"path": "sections/errorhandling/documentingusingswagger.basque.md",
"chars": 2577,
"preview": "# Dokumentatu API erroreak OpenAPI (aurretik Swagger bezala ezagutua) edo GraphQL-ren laguntzarekin\r\n\r\n### Azalpena\r\n\r\nR"
},
{
"path": "sections/errorhandling/documentingusingswagger.brazilian-portuguese.md",
"chars": 2527,
"preview": "# Documente erros de API usando o Swagger ou GraphQL\r\n\r\n### Explicação em um Parágrafo\r\n\r\nAs APIs REST retornam resultad"
},
{
"path": "sections/errorhandling/documentingusingswagger.chinese.md",
"chars": 607,
"preview": "# 使用Swagger对API错误文档化\r\n\r\n\r\n### 一段解释\r\n\r\nREST API使用HTTP代码返回结果, API用户不仅绝对需要了解API schema, 而且还要注意潜在错误 – 调用方可能会捕获错误并巧妙地处理它。例如, "
},
{
"path": "sections/errorhandling/documentingusingswagger.french.md",
"chars": 2671,
"preview": "# Documentez les erreurs de l'API à l'aide de Swagger ou GraphQL\n\n### Un paragraphe d'explication\n\nLes API REST renvoien"
},
{
"path": "sections/errorhandling/documentingusingswagger.japanese.md",
"chars": 1667,
"preview": "# Swagger または GraphQL を利用して API のエラーをドキュメント化する\r\n\r\n### 一段落説明\r\n\r\nREST API は HTTP ステータスコードを利用して結果を返しますが、API の利用者は、API のスキーマ"
},
{
"path": "sections/errorhandling/documentingusingswagger.korean.md",
"chars": 2304,
"preview": "# Document API errors using Swagger or GraphQL\r\n\r\n### One Paragraph Explainer\r\n\r\nREST APIs return results using HTTP sta"
},
{
"path": "sections/errorhandling/documentingusingswagger.md",
"chars": 2359,
"preview": "# Document API errors using OpenAPI Specification (earlier known as Swagger) or GraphQL\r\n\r\n### One Paragraph Explainer\r\n"
},
{
"path": "sections/errorhandling/documentingusingswagger.polish.md",
"chars": 2313,
"preview": "# Dokumentuj błędy interfejsu API za pomocą Swagger lub GraphQL\n\n### Wyjaśnienie jednym akapitem\n\nREST API zwracają wyni"
},
{
"path": "sections/errorhandling/documentingusingswagger.russian.md",
"chars": 2431,
"preview": "# Документироваие ошибок API при использовании Swagger или GraphQL\r\n\r\n### Объяснение в один абзац\r\n\r\nAPI-интерфейсы REST"
},
{
"path": "sections/errorhandling/failfast.basque.md",
"chars": 3229,
"preview": "# Huts eragin azkar, balidatu argudioak liburutegi dedikatu baten laguntzarekin\r\n\r\n### Azalpena\r\n\r\nDenok dakigu argudioa"
},
{
"path": "sections/errorhandling/failfast.brazilian-portuguese.md",
"chars": 2498,
"preview": "# Falhe rápido, valide argumentos usando uma biblioteca dedicada\r\n\r\n### Explicação em um Parágrafo\r\n\r\nNós todos sabemos "
},
{
"path": "sections/errorhandling/failfast.chinese.md",
"chars": 1246,
"preview": "# 快速报错,使用专用库验证参数\r\n\r\n\r\n### 一段解释\r\n\r\n我们都知道如何检查参数和快速报错对于避免隐藏的错误很重要(见下面的反模式代码示例)。如果没有,请阅读显式编程和防御性编程。在现实中,由于对其编码是件恼人的事情(比如考虑验证"
},
{
"path": "sections/errorhandling/failfast.french.md",
"chars": 3323,
"preview": "# Échouez rapidement, valider les arguments à l'aide d'une bibliothèque dédiée\n\n### Un paragraphe d'explication\n\nNous sa"
},
{
"path": "sections/errorhandling/failfast.japanese.md",
"chars": 2178,
"preview": "# 専用のライブラリを利用して引数の検証を高速に行う\r\n\r\n### 一段落説明\r\n\r\n隠れたバグを避けるためには、引数をチェックすること、そして高速に失敗することが重要であると誰もが知っています(下記のアンチパターンコード例を参照)。もし知"
},
{
"path": "sections/errorhandling/failfast.korean.md",
"chars": 2339,
"preview": "# Fail fast, validate arguments using a dedicated library\r\n\r\n### One Paragraph Explainer\r\n\r\nWe all know how checking arg"
},
{
"path": "sections/errorhandling/failfast.md",
"chars": 2954,
"preview": "# Fail fast, validate arguments using a dedicated library\r\n\r\n### One Paragraph Explainer\r\n\r\nWe all know how checking arg"
},
{
"path": "sections/errorhandling/failfast.polish.md",
"chars": 3107,
"preview": "# Szybko się nie powiedzie, sprawdź poprawność argumentów za pomocą dedykowanej biblioteki\n\n### Wyjaśnienie jednym akapi"
},
{
"path": "sections/errorhandling/failfast.russian.md",
"chars": 3072,
"preview": "# Быстро проваливайтесь, проверяя аргументы, используя выделенную библиотеку\r\n\r\n### Объяснение в один абзац\r\n\r\nМы все зн"
},
{
"path": "sections/errorhandling/monitoring.chinese.md",
"chars": 896,
"preview": "# 监控\r\n\r\n\r\n### 一段解释\r\n\r\n> 在最基本的层面上,监控意味着您可以很*容易地识别出在生产环境中发生了什么不好的事情,例如,通过电子邮件或Slack通知。挑战在于选择合适的工具集来满足您的需求而不会破坏您的防护。我建议,从确定"
},
{
"path": "sections/errorhandling/monitoring.french.md",
"chars": 2873,
"preview": "# Surveillance\n\n### Un paragraphe d'explication\n\n> Au niveau le plus élémentaire, la surveillance signifie que vous pouv"
},
{
"path": "sections/errorhandling/monitoring.japanese.md",
"chars": 2347,
"preview": "# Monitoring\r\n\r\n### One Paragraph Explainer\r\n\r\n> At the very basic level, monitoring means you can *easily identify when"
},
{
"path": "sections/errorhandling/monitoring.md",
"chars": 2347,
"preview": "# Monitoring\r\n\r\n### One Paragraph Explainer\r\n\r\n> At the very basic level, monitoring means you can *easily identify when"
},
{
"path": "sections/errorhandling/monitoring.russian.md",
"chars": 2740,
"preview": "# Мониторинг\r\n\r\n### Объяснение в один абзац\r\n\r\n> На самом базовом уровне мониторинг означает, что вы можете *легко опред"
},
{
"path": "sections/errorhandling/operationalvsprogrammererror.basque.md",
"chars": 4834,
"preview": "# Bereizi eragiketa erroreak eta programazio erroreak\r\n\r\n### Azalpena\r\n\r\nOndorengo bi errore mota hauek bereizteak zure "
},
{
"path": "sections/errorhandling/operationalvsprogrammererror.brazilian-portuguese.md",
"chars": 3866,
"preview": "# Diferencie erros operacionais vs erros de programação\r\n\r\n### Explicação em um Parágrafo\r\n\r\nDistinguir os dois tipos de"
},
{
"path": "sections/errorhandling/operationalvsprogrammererror.chinese.md",
"chars": 1701,
"preview": "# 区分操作型错误和程序型错误\r\n\r\n### 一段解释\r\n\r\n区分以下两种错误类型将最大限度地减少应用程序停机时间并帮助避免出现荒唐的错误: 操作型错误指的是您了解发生了什么情况及其影响的情形 – 例如, 由于连接问题而导致对某些 HTTP"
},
{
"path": "sections/errorhandling/operationalvsprogrammererror.french.md",
"chars": 5035,
"preview": "# Distinguez les erreurs opérationnelles des erreurs de programmation\n\n### Un paragraphe d'explication\n\nLa distinction d"
},
{
"path": "sections/errorhandling/operationalvsprogrammererror.japanese.md",
"chars": 3249,
"preview": "# 操作上のエラーとプログラマーのエラーを区別する\r\n\r\n### 一段落説明\r\n\r\n操作上のエラーとプログラマーのエラーという 2 つのエラーを区別することは、アプリケーションのダウンタイムを最小化し、とんでもないバグを避ける手助けになりま"
},
{
"path": "sections/errorhandling/operationalvsprogrammererror.korean.md",
"chars": 2250,
"preview": "# 동작상의 에러 vs 프로그래머 에러\r\n\r\n### 한문단 설명\r\n\r\n다음 두 가지의 에러 유형을 구별하면 앱 다운타임(downtime)을 최소화하고 심각한 버그를 방지하는데 도움이 될 것이다: 동작 오류는 발생한 "
},
{
"path": "sections/errorhandling/operationalvsprogrammererror.md",
"chars": 4458,
"preview": "# Distinguish operational vs programmer errors\r\n\r\n### One Paragraph Explainer\r\n\r\nDistinguishing the following two error "
},
{
"path": "sections/errorhandling/operationalvsprogrammererror.polish.md",
"chars": 4403,
"preview": "# Rozróżnij błędy operacyjne i programistyczne\n\n### Wyjaśnienie jednym akapitem\n\nRozróżnienie następujących dwóch typów "
},
{
"path": "sections/errorhandling/operationalvsprogrammererror.russian.md",
"chars": 4737,
"preview": "# Различайте операционные ошибки и ошибки программиста\r\n\r\n### Объяснение в один абзац\r\n\r\nРазделение ошибок на эти два ти"
},
{
"path": "sections/errorhandling/returningpromises.basque.md",
"chars": 10642,
"preview": "# Agintzak itzultzea\n\n<br/>\n\n### Azalpena\n\nErrore bat gertatzen denean fluxu sinkrono edo asinkrono batetik abiatuta, de"
},
{
"path": "sections/errorhandling/returningpromises.french.md",
"chars": 10708,
"preview": "# Le retour des promesses\n\n<br/>\n\n### Un paragraphe d'explication\n\nLorsqu'une erreur se produit, qu'elle provienne d'un "
},
{
"path": "sections/errorhandling/returningpromises.md",
"chars": 9521,
"preview": "# Returning promises\n\n<br/>\n\n### One Paragraph Explainer\n\nWhen an error occurs, whether from a synchronous or asynchrono"
},
{
"path": "sections/errorhandling/returningpromises.russian.md",
"chars": 9616,
"preview": "# Возвращение промисов\n\n<br/>\n\n### Короткое объяснение\n\nУ v8 есть особая способность, называемая \"бесплатные асинхронные"
},
{
"path": "sections/errorhandling/shuttingtheprocess.basque.md",
"chars": 4861,
"preview": "# Irten prozesutik elegantziarekin kanpoko norbait iristen denean hirira\r\n\r\n### Azalpena\r\n\r\nZure kodearen lekuren batean"
},
{
"path": "sections/errorhandling/shuttingtheprocess.brazilian-portuguese.md",
"chars": 3250,
"preview": "# Finalize o processo quando um estranho chegar\r\n\r\n### Explicação em um Parágrafo\r\n\r\nEm algum lugar dentro do seu código"
},
{
"path": "sections/errorhandling/shuttingtheprocess.chinese.md",
"chars": 1425,
"preview": "# 特殊情况产生时,优雅地退出服务\r\n\r\n\r\n### 一段解释\r\n\r\n在您的代码的某个地方,当一个错误抛出的时候,错误处理对象负责决定如何进行时 – 如果错误是可信的(即操作型错误,在最佳实践#3了解进一步的解释),写入日志文件可能是足够的"
},
{
"path": "sections/errorhandling/shuttingtheprocess.french.md",
"chars": 4897,
"preview": "# Quittez le processus avec élégance lorsqu'un étranger arrive en ville\n\n### Un paragraphe d'explication\n\nQuelque part d"
},
{
"path": "sections/errorhandling/shuttingtheprocess.japanese.md",
"chars": 3376,
"preview": "# 見ず知らずの事象が起きたら潔くプロセスを終了する\r\n\r\n### 一段落説明\r\n\r\nコード内のどこかで、エラーハンドラオブジェクトがエラー発生時にどのように処理するかを決定することに責任を負っているとき ー エラーが信頼されている場合は("
},
{
"path": "sections/errorhandling/shuttingtheprocess.korean.md",
"chars": 3038,
"preview": "# Exit the process gracefully when a stranger comes to town\r\n\r\n### One Paragraph Explainer\r\n\r\nSomewhere within your code"
},
{
"path": "sections/errorhandling/shuttingtheprocess.md",
"chars": 4393,
"preview": "# Exit the process gracefully when a stranger comes to town\r\n\r\n### One Paragraph Explainer\r\n\r\nSomewhere within your code"
},
{
"path": "sections/errorhandling/shuttingtheprocess.polish.md",
"chars": 4356,
"preview": "# Opuść ten proces z wdziękiem, gdy do miasta przybywa nieznajomy\n\n### Wyjaśnienie jednym akapitem\n\nGdzieś w twoim kodzi"
},
{
"path": "sections/errorhandling/shuttingtheprocess.russian.md",
"chars": 4499,
"preview": "# Изящно выходите из процесса, когда неизвестное случается\r\n\r\n### Объяснение в один абзац\r\n\r\nГде-то в вашем коде объект-"
},
{
"path": "sections/errorhandling/testingerrorflows.basque.md",
"chars": 2893,
"preview": "# Testeatu erroreen fluxua zure test framework gustukoena erabiliz\r\n\r\n### Azalpena\r\n\r\nBide ‘alaiak’ probatzea ez da huts"
},
{
"path": "sections/errorhandling/testingerrorflows.brazilian-portuguese.md",
"chars": 1601,
"preview": "# Fluxos de testes de erros usando seu framework favorito\r\n\r\n### Explicação em um Parágrafo\r\n\r\nTestar caminhos \"felizes\""
},
{
"path": "sections/errorhandling/testingerrorflows.chinese.md",
"chars": 1017,
"preview": "# 使用您喜欢的测试框架测试错误流\r\n\r\n\r\n### 一段解释\r\n\r\n测试‘正确’路径并不比测试失败更好。良好的测试代码覆盖率要求测试异常路径。否则,异常确实被处理正确是不可信的。每个单元测试框架,如[Mocha](https://moch"
},
{
"path": "sections/errorhandling/testingerrorflows.french.md",
"chars": 2799,
"preview": "# Testez les flux d'erreurs en utilisant votre framework de test préféré\n\n### Un paragraphe d'explication\n\nTester les ch"
},
{
"path": "sections/errorhandling/testingerrorflows.japanese.md",
"chars": 2324,
"preview": "# お気に入りのテストフレームワークを使用してエラーフローをテストする\r\n\r\n### 一段落説明\r\n\r\n「ハッピー」パスをテストすることは、失敗をテストすることも同然です。良いテストコードカバレッジは、例外パスをテストすることを要求します。"
},
{
"path": "sections/errorhandling/testingerrorflows.korean.md",
"chars": 1498,
"preview": "# Test error flows using your favorite test framework\r\n\r\n### One Paragraph Explainer\r\n\r\nTesting ‘happy’ paths is no bett"
},
{
"path": "sections/errorhandling/testingerrorflows.md",
"chars": 2468,
"preview": "# Test error flows using your favorite test framework\r\n\r\n### One Paragraph Explainer\r\n\r\nTesting ‘happy’ paths is no bett"
}
]
// ... and 469 more files (download for full content)
About this extraction
This page contains the full source code of the goldbergyoni/nodebestpractices GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 669 files (3.2 MB), approximately 868.8k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.