@k2works/claude-code-booster 2.7.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +271 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +323 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +562 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +506 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +526 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +197 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +381 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +204 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +382 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +353 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +412 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +401 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +320 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +322 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +230 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +175 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +323 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -0
- package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +448 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +199 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +326 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +389 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +427 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +682 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +199 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -0
- package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -0
- package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -0
- package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -0
- package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -0
- package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -0
- package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -0
- package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -0
- package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -0
- package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -0
- package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -0
- package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -0
- package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -0
- package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -0
- package/lib/assets/docs/article/getting-start-tdd/index.md +93 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +405 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +274 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -0
- package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -0
- package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -0
- package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -0
- package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -0
- package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -0
- package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -0
- package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -0
- package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -0
- package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -0
- package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -0
- package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -0
- package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -0
- package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -0
- package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -0
- package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -0
- package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -0
- package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -0
- package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -0
- package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -0
- package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -0
- package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -0
- package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -0
- package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -0
- package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -0
- package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -0
- package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -0
- package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -0
- package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -0
- package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -0
- package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -0
- package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -0
- package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -0
- package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -0
- package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -0
- package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -0
- package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -0
- package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -0
- package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -0
- package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -0
- package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -0
- package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -0
- package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -0
- package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -0
- package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -0
- package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -0
- package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -0
- package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -0
- package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -0
- package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -0
- package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -0
- package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -0
- package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +233 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -0
- package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -0
- package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -0
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -0
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -0
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -0
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -0
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -0
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -0
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -0
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -0
- package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -0
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -0
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -0
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -0
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -0
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -0
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -0
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -0
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -0
- package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -0
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -0
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -0
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -0
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -0
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -0
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -0
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -0
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -0
- package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -0
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -0
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -0
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -0
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -0
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -0
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -0
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -0
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -0
- package/lib/assets/docs/article/grokking-concurrency/index.md +66 -0
- package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -0
- package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -0
- package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -0
- package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -0
- package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -0
- package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -0
- package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -0
- package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -0
- package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -0
- package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -0
- package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -0
- package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -0
- package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -0
- package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -0
- package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -0
- package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -0
- package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -0
- package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -0
- package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -0
- package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -0
- package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -0
- package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -0
- package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -0
- package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -0
- package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -0
- package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -0
- package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -0
- package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -0
- package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -0
- package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -0
- package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -0
- package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -0
- package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -0
- package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -0
- package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -0
- package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -0
- package/lib/assets/docs/article/grokkingfp/all/index.md +368 -0
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -0
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -0
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1122 -0
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -0
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -0
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +777 -0
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -0
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -0
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -0
- package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -0
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -0
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -0
- package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +696 -0
- package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -0
- package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -0
- package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +710 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1284 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1047 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +920 -0
- package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +876 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +842 -0
- package/lib/assets/docs/article/grokkingfp/index.md +143 -0
- package/lib/assets/docs/article/grokkingfp/java/index.md +211 -0
- package/lib/assets/docs/article/grokkingfp/java/part-1.md +646 -0
- package/lib/assets/docs/article/grokkingfp/java/part-2.md +667 -0
- package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -0
- package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -0
- package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -0
- package/lib/assets/docs/article/grokkingfp/java/part-6.md +1324 -0
- package/lib/assets/docs/article/grokkingfp/python/index.md +258 -0
- package/lib/assets/docs/article/grokkingfp/python/part-1.md +437 -0
- package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -0
- package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -0
- package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -0
- package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -0
- package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -0
- package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +753 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1410 -0
- package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-4.md +571 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -0
- package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-1.md +541 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-3.md +917 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-6.md +865 -0
- package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +559 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1085 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +980 -0
- package/lib/assets/docs/article/index.md +36 -0
- package/lib/assets/docs/design/index.md +39 -27
- package/lib/assets/docs/development/index.md +11 -1
- package/lib/assets/docs/index.md +33 -103
- package/lib/assets/docs/operation/index.md +16 -6
- package/lib/assets/docs/reference/index.md +5 -4
- package/lib/assets/docs/requirements/index.md +13 -6
- package/lib/assets/docs/review/index.md +5 -0
- package/lib/assets/docs/strategy/index.md +15 -0
- package/lib/assets/docs/template/index.md +9 -5
- package/lib/assets/mkdocs.yml +33 -19
- package/package.json +1 -1
- package/lib/assets/docs/analysis/index.md +0 -8
- /package/lib/assets/docs/{analysis → strategy}/slide/.gitkeep +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# 第 4 章: バージョン管理と Conventional Commits
|
|
2
|
+
|
|
3
|
+
## 4.1 はじめに
|
|
4
|
+
|
|
5
|
+
前章までで、TDD の基本サイクルを通じて FizzBuzz プログラムを完成させました。この章からは「動作するきれいなコード」を書き続けるために必要な **ソフトウェア開発の三種の神器** を整備していきます。
|
|
6
|
+
|
|
7
|
+
> 今日のソフトウェア開発の世界において絶対になければならない 3 つの技術的な柱があります。三本柱と言ったり、三種の神器と言ったりしていますが、それらは
|
|
8
|
+
>
|
|
9
|
+
> - バージョン管理
|
|
10
|
+
> - テスティング
|
|
11
|
+
> - 自動化
|
|
12
|
+
>
|
|
13
|
+
> の 3 つです。
|
|
14
|
+
>
|
|
15
|
+
> — 和田卓人
|
|
16
|
+
|
|
17
|
+
**バージョン管理** と **テスティング** に関しては第 1 部で触れました。本章ではバージョン管理をさらに深掘りし、**コミットメッセージの規約** について解説します。
|
|
18
|
+
|
|
19
|
+
## 4.2 コミットメッセージの重要性
|
|
20
|
+
|
|
21
|
+
これまでの作業では、区切りごとにリポジトリにコミットしてきました。しかし、コミットメッセージの書き方に一貫性がないと、後からプロジェクトの履歴を追うのが難しくなります。
|
|
22
|
+
|
|
23
|
+
チーム開発では特に、誰がいつ何のためにコードを変更したのかを明確にすることが重要です。そこで役立つのが **Conventional Commits** です。
|
|
24
|
+
|
|
25
|
+
## 4.3 Conventional Commits
|
|
26
|
+
|
|
27
|
+
本プロジェクトでは [Angular ルール](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type) に基づいた **Conventional Commits** の書式を採用します。
|
|
28
|
+
|
|
29
|
+
### コミットメッセージのフォーマット
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
<タイプ>(<スコープ>): <タイトル>
|
|
33
|
+
<空行>
|
|
34
|
+
<ボディ>
|
|
35
|
+
<空行>
|
|
36
|
+
<フッタ>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- **ヘッダ** は必須です
|
|
40
|
+
- **スコープ** は任意です
|
|
41
|
+
- タイトルは **50 文字以内** にしてください(GitHub 上で読みやすくなります)
|
|
42
|
+
|
|
43
|
+
### コミットのタイプ
|
|
44
|
+
|
|
45
|
+
| タイプ | 説明 | 使用場面 |
|
|
46
|
+
|--------|------|---------|
|
|
47
|
+
| `feat` | A new feature(新しい機能) | 新機能の追加 |
|
|
48
|
+
| `fix` | A bug fix(バグ修正) | バグの修正 |
|
|
49
|
+
| `docs` | Documentation only changes(ドキュメント変更のみ) | README やコメントの更新 |
|
|
50
|
+
| `style` | Changes that do not affect the meaning of the code(コードに影響を与えない変更) | フォーマット、セミコロンの追加など |
|
|
51
|
+
| `refactor` | A code change that neither fixes a bug nor adds a feature(リファクタリング) | コード構造の改善 |
|
|
52
|
+
| `perf` | A code change that improves performance(パフォーマンス改善) | 処理速度の向上 |
|
|
53
|
+
| `test` | Adding missing or correcting existing tests(テストの追加・修正) | テストコードの変更 |
|
|
54
|
+
| `chore` | Changes to the build process or auxiliary tools(ビルドプロセスや補助ツールの変更) | 設定ファイルの更新 |
|
|
55
|
+
|
|
56
|
+
### コミットメッセージの例
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# 新機能の追加
|
|
60
|
+
$ git commit -m 'feat: FizzBuzz のリスト生成機能を追加'
|
|
61
|
+
|
|
62
|
+
# バグ修正
|
|
63
|
+
$ git commit -m 'fix: 15 の倍数の判定ロジックを修正'
|
|
64
|
+
|
|
65
|
+
# リファクタリング
|
|
66
|
+
$ git commit -m 'refactor: generate メソッドの条件分岐を整理'
|
|
67
|
+
|
|
68
|
+
# テストの追加
|
|
69
|
+
$ git commit -m 'test: FizzBuzz の境界値テストを追加'
|
|
70
|
+
|
|
71
|
+
# ビルド設定の変更
|
|
72
|
+
$ git commit -m 'chore: Vitest と TypeScript の設定を更新'
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 4.4 TDD とコミットのタイミング
|
|
76
|
+
|
|
77
|
+
TDD の Red-Green-Refactor サイクルにおいて、コミットする適切なタイミングは以下の通りです。
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
Red(テスト作成)→ Green(テスト成功)→ コミット → Refactor(リファクタリング)→ コミット
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
1. **Green の後** — テストが通った時点でコミット(`feat:` や `fix:`)
|
|
84
|
+
2. **Refactor の後** — リファクタリングが完了しテストがパスした時点でコミット(`refactor:`)
|
|
85
|
+
|
|
86
|
+
### 実際のコミット例
|
|
87
|
+
|
|
88
|
+
FizzBuzz の開発過程では、以下のようなコミット履歴になります。
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
$ git log --oneline
|
|
92
|
+
|
|
93
|
+
abc1234 refactor: generate メソッドの条件順序を最適化
|
|
94
|
+
def5678 feat: 3 と 5 の倍数で FizzBuzz を返す機能を追加
|
|
95
|
+
ghi9012 feat: 5 の倍数で Buzz を返す機能を追加
|
|
96
|
+
jkl3456 feat: 3 の倍数で Fizz を返す機能を追加
|
|
97
|
+
mno7890 feat: 数を文字列に変換する generate メソッドを実装
|
|
98
|
+
pqr1234 test: FizzBuzz の最初のテストを作成
|
|
99
|
+
stu5678 chore: Vitest + TypeScript プロジェクトを初期化
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
各コミットが小さく、明確な目的を持っていることがわかります。
|
|
103
|
+
|
|
104
|
+
## 4.5 まとめ
|
|
105
|
+
|
|
106
|
+
この章では、以下の内容を学びました。
|
|
107
|
+
|
|
108
|
+
1. **Conventional Commits** — コミットメッセージの統一フォーマット
|
|
109
|
+
2. **コミットのタイプ** — feat、fix、refactor、test、chore などの使い分け
|
|
110
|
+
3. **TDD とコミットのタイミング** — Green 後と Refactor 後にコミット
|
|
111
|
+
|
|
112
|
+
次の章では、パッケージ管理ツールと静的コード解析を導入し、コードの品質を自動でチェックできるようにします。
|
package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# 第 5 章: パッケージ管理と静的解析
|
|
2
|
+
|
|
3
|
+
## 5.1 はじめに
|
|
4
|
+
|
|
5
|
+
前章では Conventional Commits によるコミットメッセージの規約を学びました。この章では、**パッケージ管理** と **静的コード解析** を導入し、コードの品質を自動でチェックできるようにします。
|
|
6
|
+
|
|
7
|
+
## 5.2 npm によるパッケージ管理
|
|
8
|
+
|
|
9
|
+
### npm とは
|
|
10
|
+
|
|
11
|
+
> npm(Node Package Manager)は、Node.js のパッケージマネージャです。`package.json` で依存関係を管理し、プロジェクトのビルドプロセスを自動化できます。
|
|
12
|
+
|
|
13
|
+
第 1 部で Vitest と TypeScript はすでに導入しています。ここでは、品質管理ツールのための依存関係を追加します。
|
|
14
|
+
|
|
15
|
+
### package.json の更新
|
|
16
|
+
|
|
17
|
+
品質管理ツールを追加した `package.json` は以下のようになります。
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"name": "fizzbuzz",
|
|
22
|
+
"version": "0.1.0",
|
|
23
|
+
"description": "FizzBuzz TDD project for Node (JS/TS)",
|
|
24
|
+
"private": true,
|
|
25
|
+
"type": "module",
|
|
26
|
+
"scripts": {
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest",
|
|
29
|
+
"test:coverage": "vitest run --coverage",
|
|
30
|
+
"lint": "eslint src/ test/",
|
|
31
|
+
"lint:fix": "eslint src/ test/ --fix",
|
|
32
|
+
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
33
|
+
"format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
34
|
+
"typecheck": "tsc --noEmit",
|
|
35
|
+
"check": "npm run format:check && npm run lint && npm run typecheck && npm test",
|
|
36
|
+
"fix": "npm run format && npm run lint:fix",
|
|
37
|
+
"setup": "npm install && npm run check"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"typescript": "^5.7",
|
|
41
|
+
"@types/node": "^24.0",
|
|
42
|
+
"vitest": "^3.2",
|
|
43
|
+
"@vitest/coverage-v8": "^3.2",
|
|
44
|
+
"eslint": "^9.0",
|
|
45
|
+
"@typescript-eslint/parser": "^8.0",
|
|
46
|
+
"@typescript-eslint/eslint-plugin": "^8.0",
|
|
47
|
+
"eslint-config-prettier": "^10.0",
|
|
48
|
+
"prettier": "^3.4"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
依存関係をインストールします。
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
$ npm install
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### devDependencies の解説
|
|
60
|
+
|
|
61
|
+
| パッケージ | 用途 |
|
|
62
|
+
|-----------|------|
|
|
63
|
+
| `typescript` | TypeScript コンパイラ |
|
|
64
|
+
| `@types/node` | Node.js の型定義 |
|
|
65
|
+
| `vitest` | テスティングフレームワーク |
|
|
66
|
+
| `@vitest/coverage-v8` | コードカバレッジ(V8 ベース) |
|
|
67
|
+
| `eslint` | 静的コード解析 |
|
|
68
|
+
| `@typescript-eslint/parser` | TypeScript 用 ESLint パーサー |
|
|
69
|
+
| `@typescript-eslint/eslint-plugin` | TypeScript 用 ESLint ルール |
|
|
70
|
+
| `eslint-config-prettier` | ESLint と Prettier の競合回避 |
|
|
71
|
+
| `prettier` | コードフォーマッター |
|
|
72
|
+
|
|
73
|
+
## 5.3 静的コード解析(ESLint)
|
|
74
|
+
|
|
75
|
+
### ESLint とは
|
|
76
|
+
|
|
77
|
+
> ESLint は JavaScript / TypeScript のための静的解析ツールです。コードの問題を自動的に検出し、一部は自動修正できます。
|
|
78
|
+
|
|
79
|
+
Java の Checkstyle や PMD に相当するツールです。
|
|
80
|
+
|
|
81
|
+
### eslint.config.mjs の設定
|
|
82
|
+
|
|
83
|
+
ESLint v9 では **フラットコンフィグ** 形式を使用します。
|
|
84
|
+
|
|
85
|
+
```javascript
|
|
86
|
+
// eslint.config.mjs
|
|
87
|
+
import tseslint from "@typescript-eslint/eslint-plugin";
|
|
88
|
+
import tsparser from "@typescript-eslint/parser";
|
|
89
|
+
import eslintConfigPrettier from "eslint-config-prettier";
|
|
90
|
+
|
|
91
|
+
export default [
|
|
92
|
+
{
|
|
93
|
+
files: ["src/**/*.ts", "test/**/*.ts"],
|
|
94
|
+
languageOptions: {
|
|
95
|
+
parser: tsparser,
|
|
96
|
+
parserOptions: {
|
|
97
|
+
ecmaVersion: "latest",
|
|
98
|
+
sourceType: "module",
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
plugins: {
|
|
102
|
+
"@typescript-eslint": tseslint,
|
|
103
|
+
},
|
|
104
|
+
rules: {
|
|
105
|
+
...tseslint.configs.recommended.rules,
|
|
106
|
+
"no-console": "off",
|
|
107
|
+
"@typescript-eslint/no-unused-vars": "warn",
|
|
108
|
+
complexity: ["error", { max: 7 }],
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
eslintConfigPrettier,
|
|
112
|
+
];
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 循環的複雑度の制限
|
|
116
|
+
|
|
117
|
+
`complexity: ["error", { max: 7 }]` は **循環的複雑度**(Cyclomatic Complexity)を 7 以下に制限するルールです。
|
|
118
|
+
|
|
119
|
+
Java の PMD で設定した `CyclomaticComplexity` や Python の Ruff で設定した `max-complexity` と同じ基準です。複雑度が高いメソッドは分割を検討しましょう。
|
|
120
|
+
|
|
121
|
+
### ESLint の実行
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# 解析の実行
|
|
125
|
+
$ npx eslint src/ test/
|
|
126
|
+
|
|
127
|
+
# 自動修正
|
|
128
|
+
$ npx eslint src/ test/ --fix
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 5.4 コードフォーマッター(Prettier)
|
|
132
|
+
|
|
133
|
+
### Prettier とは
|
|
134
|
+
|
|
135
|
+
> Prettier はコードフォーマッターです。コードの見た目を統一し、スタイルに関する議論をなくします。
|
|
136
|
+
|
|
137
|
+
Java の Checkstyle(フォーマットルール)や Python の Ruff(フォーマッター機能)に相当します。
|
|
138
|
+
|
|
139
|
+
### .prettierrc の設定
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"semi": true,
|
|
144
|
+
"trailingComma": "all",
|
|
145
|
+
"singleQuote": false,
|
|
146
|
+
"printWidth": 80,
|
|
147
|
+
"tabWidth": 2
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
| 設定 | 値 | 説明 |
|
|
152
|
+
|------|-----|------|
|
|
153
|
+
| `semi` | `true` | 文末にセミコロンを付ける |
|
|
154
|
+
| `trailingComma` | `"all"` | 末尾カンマを付ける |
|
|
155
|
+
| `singleQuote` | `false` | ダブルクォートを使用 |
|
|
156
|
+
| `printWidth` | `80` | 1 行の最大文字数 |
|
|
157
|
+
| `tabWidth` | `2` | インデント幅 |
|
|
158
|
+
|
|
159
|
+
### Prettier の実行
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# フォーマットチェック
|
|
163
|
+
$ npx prettier --check "src/**/*.ts" "test/**/*.ts"
|
|
164
|
+
|
|
165
|
+
# 自動フォーマット
|
|
166
|
+
$ npx prettier --write "src/**/*.ts" "test/**/*.ts"
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## 5.5 TypeScript コンパイラ(型チェック)
|
|
170
|
+
|
|
171
|
+
### 型チェックの重要性
|
|
172
|
+
|
|
173
|
+
TypeScript の大きな利点は **静的型付け** です。`tsc --noEmit` で型チェックのみを実行し、型エラーを早期に検出できます。
|
|
174
|
+
|
|
175
|
+
Java のコンパイルチェックや Python の mypy に相当します。
|
|
176
|
+
|
|
177
|
+
### tsconfig.json
|
|
178
|
+
|
|
179
|
+
```json
|
|
180
|
+
{
|
|
181
|
+
"compilerOptions": {
|
|
182
|
+
"target": "ES2022",
|
|
183
|
+
"module": "ES2022",
|
|
184
|
+
"moduleResolution": "bundler",
|
|
185
|
+
"lib": ["ES2022"],
|
|
186
|
+
"outDir": "./dist",
|
|
187
|
+
"rootDir": ".",
|
|
188
|
+
"strict": true,
|
|
189
|
+
"esModuleInterop": true,
|
|
190
|
+
"skipLibCheck": true,
|
|
191
|
+
"forceConsistentCasingInFileNames": true,
|
|
192
|
+
"resolveJsonModule": true,
|
|
193
|
+
"declaration": true,
|
|
194
|
+
"declarationMap": true,
|
|
195
|
+
"sourceMap": true
|
|
196
|
+
},
|
|
197
|
+
"include": ["src/**/*.ts", "test/**/*.ts"],
|
|
198
|
+
"exclude": ["node_modules", "dist"]
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`"strict": true` により、以下の厳格な型チェックが有効になります。
|
|
203
|
+
|
|
204
|
+
- `strictNullChecks` — null / undefined の厳格なチェック
|
|
205
|
+
- `noImplicitAny` — 暗黙の any を禁止
|
|
206
|
+
- `strictFunctionTypes` — 関数型の厳格なチェック
|
|
207
|
+
|
|
208
|
+
### 型チェックの実行
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
$ npx tsc --noEmit
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## 5.6 コードカバレッジ
|
|
215
|
+
|
|
216
|
+
### Vitest のカバレッジ機能
|
|
217
|
+
|
|
218
|
+
Vitest には V8 ベースのカバレッジ機能が組み込まれています。Java の JaCoCo や Python の pytest-cov に相当します。
|
|
219
|
+
|
|
220
|
+
### vitest.config.ts の設定
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
import { defineConfig } from "vitest/config";
|
|
224
|
+
|
|
225
|
+
export default defineConfig({
|
|
226
|
+
test: {
|
|
227
|
+
globals: false,
|
|
228
|
+
environment: "node",
|
|
229
|
+
include: ["test/**/*.test.ts"],
|
|
230
|
+
coverage: {
|
|
231
|
+
provider: "v8",
|
|
232
|
+
reporter: ["text", "text-summary"],
|
|
233
|
+
reportsDirectory: "coverage",
|
|
234
|
+
exclude: [
|
|
235
|
+
"node_modules/**",
|
|
236
|
+
"dist/**",
|
|
237
|
+
"**/*.test.ts",
|
|
238
|
+
"**/*.config.*",
|
|
239
|
+
"src/index.ts",
|
|
240
|
+
"gulpfile.js",
|
|
241
|
+
],
|
|
242
|
+
thresholds: {
|
|
243
|
+
global: {
|
|
244
|
+
branches: 80,
|
|
245
|
+
functions: 80,
|
|
246
|
+
lines: 80,
|
|
247
|
+
statements: 80,
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
`thresholds` でカバレッジの最低基準を設定しています。80% を下回ると CI が失敗します。
|
|
256
|
+
|
|
257
|
+
### カバレッジの実行
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
$ npm run test:coverage
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
✓ test/fizzbuzz.test.ts (6 tests) 5ms
|
|
265
|
+
|
|
266
|
+
% Coverage report from v8
|
|
267
|
+
-------------|---------|----------|---------|---------|-------------------
|
|
268
|
+
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
|
|
269
|
+
-------------|---------|----------|---------|---------|-------------------
|
|
270
|
+
All files | 83.33 | 100 | 66.66 | 83.33 |
|
|
271
|
+
fizzbuzz.ts | 83.33 | 100 | 66.66 | 83.33 | 23-26
|
|
272
|
+
-------------|---------|----------|---------|---------|-------------------
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
`printFizzBuzz` メソッド(23-26 行目)が未カバーですが、これは学習用テストのため想定通りです。
|
|
276
|
+
|
|
277
|
+
## 5.7 品質チェックの一括実行
|
|
278
|
+
|
|
279
|
+
すべての品質チェックを一括で実行する `check` スクリプトを定義しています。
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
$ npm run check
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
このコマンドは以下を順番に実行します。
|
|
286
|
+
|
|
287
|
+
1. `format:check` — Prettier のフォーマットチェック
|
|
288
|
+
2. `lint` — ESLint の静的解析
|
|
289
|
+
3. `typecheck` — TypeScript の型チェック
|
|
290
|
+
4. `test` — Vitest のテスト実行
|
|
291
|
+
|
|
292
|
+
### 各言語の品質ツール比較
|
|
293
|
+
|
|
294
|
+
| 用途 | TypeScript | Java | Python |
|
|
295
|
+
|------|-----------|------|--------|
|
|
296
|
+
| パッケージ管理 | npm | Gradle | uv |
|
|
297
|
+
| テスト | Vitest | JUnit 5 | pytest |
|
|
298
|
+
| 静的解析 | ESLint | Checkstyle + PMD | Ruff |
|
|
299
|
+
| フォーマッター | Prettier | Checkstyle | Ruff |
|
|
300
|
+
| 型チェック | tsc | javac(暗黙) | mypy |
|
|
301
|
+
| カバレッジ | @vitest/coverage-v8 | JaCoCo | pytest-cov |
|
|
302
|
+
| 複雑度チェック | ESLint complexity | PMD | Ruff McCabe |
|
|
303
|
+
|
|
304
|
+
## 5.8 まとめ
|
|
305
|
+
|
|
306
|
+
この章では、以下の品質管理ツールを導入しました。
|
|
307
|
+
|
|
308
|
+
1. **npm** — パッケージ管理と依存関係の管理
|
|
309
|
+
2. **ESLint** — 静的コード解析(循環的複雑度の制限を含む)
|
|
310
|
+
3. **Prettier** — コードフォーマットの統一
|
|
311
|
+
4. **TypeScript コンパイラ** — 型チェックによるエラーの早期検出
|
|
312
|
+
5. **Vitest カバレッジ** — コードカバレッジの計測(80% 閾値)
|
|
313
|
+
|
|
314
|
+
次の章では、タスクランナーを導入してこれらの品質チェックを自動化し、CI/CD パイプラインを構築します。
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# 第 6 章: タスクランナーと CI/CD
|
|
2
|
+
|
|
3
|
+
## 6.1 はじめに
|
|
4
|
+
|
|
5
|
+
前章では静的コード解析ツールとコードカバレッジを導入しました。テストの実行、静的解析、フォーマットチェック、型チェック、カバレッジ計測と、様々なコマンドを使えるようになりましたが、毎回それぞれのコマンドを覚えて実行するのは面倒です。
|
|
6
|
+
|
|
7
|
+
この章では **タスクランナー** を使ってこれらのタスクをまとめて実行できるようにし、さらに **CI/CD** パイプラインを構築します。
|
|
8
|
+
|
|
9
|
+
## 6.2 npm scripts
|
|
10
|
+
|
|
11
|
+
### npm scripts とは
|
|
12
|
+
|
|
13
|
+
`package.json` の `scripts` セクションでコマンドを定義し、`npm run <script名>` で実行できます。第 1 部から使ってきた `npm test` も npm scripts の機能です。
|
|
14
|
+
|
|
15
|
+
### 品質チェックスクリプト
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"scripts": {
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:watch": "vitest",
|
|
22
|
+
"test:coverage": "vitest run --coverage",
|
|
23
|
+
"lint": "eslint src/ test/",
|
|
24
|
+
"lint:fix": "eslint src/ test/ --fix",
|
|
25
|
+
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
26
|
+
"format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"check": "npm run format:check && npm run lint && npm run typecheck && npm test",
|
|
29
|
+
"fix": "npm run format && npm run lint:fix"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 主要スクリプトの解説
|
|
35
|
+
|
|
36
|
+
| スクリプト | 説明 |
|
|
37
|
+
|-----------|------|
|
|
38
|
+
| `npm test` | テストを実行 |
|
|
39
|
+
| `npm run test:watch` | ファイル監視モードでテスト実行 |
|
|
40
|
+
| `npm run test:coverage` | テスト実行 + カバレッジレポート |
|
|
41
|
+
| `npm run lint` | ESLint による静的解析 |
|
|
42
|
+
| `npm run format:check` | Prettier のフォーマットチェック |
|
|
43
|
+
| `npm run typecheck` | TypeScript の型チェック |
|
|
44
|
+
| `npm run check` | 全品質チェックを一括実行 |
|
|
45
|
+
| `npm run fix` | フォーマットと ESLint の自動修正 |
|
|
46
|
+
|
|
47
|
+
`check` スクリプトは `&&` で複数のコマンドを連結しており、前のコマンドが成功した場合のみ次が実行されます。
|
|
48
|
+
|
|
49
|
+
## 6.3 タスクランナー — Gulp
|
|
50
|
+
|
|
51
|
+
npm scripts だけでも基本的なタスク管理は可能ですが、**ファイル監視** や **タスクの組み合わせ** をより柔軟に行うために [Gulp](https://gulpjs.com/) を導入します。
|
|
52
|
+
|
|
53
|
+
Java の Gradle カスタムタスクや Python の tox に相当します。
|
|
54
|
+
|
|
55
|
+
### Gulp のインストール
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
$ npm install --save-dev gulp gulp-shell
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### gulpfile.js の設定
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
// gulpfile.js
|
|
65
|
+
import { watch, series } from "gulp";
|
|
66
|
+
import shell from "gulp-shell";
|
|
67
|
+
|
|
68
|
+
// 基本タスク
|
|
69
|
+
export const test = shell.task(["npm run test"]);
|
|
70
|
+
export const coverage = shell.task(["npm run test:coverage"]);
|
|
71
|
+
export const lint = shell.task(["npm run lint"]);
|
|
72
|
+
export const lintFix = shell.task(["npm run lint:fix"]);
|
|
73
|
+
export const format = shell.task(["npm run format"]);
|
|
74
|
+
export const formatCheck = shell.task(["npm run format:check"]);
|
|
75
|
+
export const typecheck = shell.task(["npm run typecheck"]);
|
|
76
|
+
|
|
77
|
+
// 複合タスク:リント修正 → フォーマット → テスト
|
|
78
|
+
export const checkAndFix = series(lintFix, format, test);
|
|
79
|
+
|
|
80
|
+
// ファイル監視タスク(Guard 機能)
|
|
81
|
+
export function guard() {
|
|
82
|
+
console.log("Guard is watching for file changes...");
|
|
83
|
+
watch("src/**/*.ts", series(lintFix, format, test));
|
|
84
|
+
watch("test/**/*.ts", series(test));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// デフォルトタスク
|
|
88
|
+
export default series(checkAndFix, guard);
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Gulp タスクの実行
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Guard モード(ファイル監視 + 自動テスト)
|
|
95
|
+
$ npm run guard
|
|
96
|
+
|
|
97
|
+
# 品質チェック + 自動修正
|
|
98
|
+
$ npx gulp checkAndFix
|
|
99
|
+
|
|
100
|
+
# 個別タスクの実行
|
|
101
|
+
$ npx gulp test
|
|
102
|
+
$ npx gulp lint
|
|
103
|
+
$ npx gulp coverage
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Guard 機能
|
|
107
|
+
|
|
108
|
+
`guard` タスクはファイルの変更を監視し、変更があるたびに自動でリント、フォーマット、テストを実行します。
|
|
109
|
+
|
|
110
|
+
- `src/**/*.ts` の変更 → リント修正 → フォーマット → テスト
|
|
111
|
+
- `test/**/*.ts` の変更 → テスト
|
|
112
|
+
|
|
113
|
+
TDD サイクルでは、Guard を起動した状態でコードを書くと、保存するたびにテストが自動実行され、Red/Green のフィードバックを即座に得られます。
|
|
114
|
+
|
|
115
|
+
## 6.4 GitHub Actions による CI/CD
|
|
116
|
+
|
|
117
|
+
プッシュやプルリクエスト時に自動で品質チェックを実行する CI/CD パイプラインを構築します。
|
|
118
|
+
|
|
119
|
+
### ワークフロー設定
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
# .github/workflows/node-ci.yml
|
|
123
|
+
name: Node CI
|
|
124
|
+
|
|
125
|
+
on:
|
|
126
|
+
push:
|
|
127
|
+
branches: [main, develop]
|
|
128
|
+
paths:
|
|
129
|
+
- "apps/node/**"
|
|
130
|
+
- ".github/workflows/node-ci.yml"
|
|
131
|
+
pull_request:
|
|
132
|
+
branches: [main]
|
|
133
|
+
paths:
|
|
134
|
+
- "apps/node/**"
|
|
135
|
+
|
|
136
|
+
permissions:
|
|
137
|
+
contents: read
|
|
138
|
+
|
|
139
|
+
jobs:
|
|
140
|
+
test:
|
|
141
|
+
runs-on: ubuntu-latest
|
|
142
|
+
|
|
143
|
+
steps:
|
|
144
|
+
- name: Checkout the repository
|
|
145
|
+
uses: actions/checkout@v4
|
|
146
|
+
|
|
147
|
+
- name: Install Nix
|
|
148
|
+
uses: cachix/install-nix-action@v30
|
|
149
|
+
with:
|
|
150
|
+
nix_path: nixpkgs=channel:nixos-unstable
|
|
151
|
+
|
|
152
|
+
- name: Cache Nix store
|
|
153
|
+
uses: actions/cache@v4
|
|
154
|
+
with:
|
|
155
|
+
path: /tmp/nix-cache
|
|
156
|
+
key: ${{ runner.os }}-nix-node-${{ hashFiles('flake.lock', 'ops/nix/environments/node/shell.nix') }}
|
|
157
|
+
restore-keys: |
|
|
158
|
+
${{ runner.os }}-nix-node-
|
|
159
|
+
|
|
160
|
+
- name: Install dependencies
|
|
161
|
+
run: nix develop .#node --command bash -c "cd apps/node && npm install"
|
|
162
|
+
|
|
163
|
+
- name: Run format check
|
|
164
|
+
run: nix develop .#node --command bash -c "cd apps/node && npm run format:check"
|
|
165
|
+
|
|
166
|
+
- name: Run lint
|
|
167
|
+
run: nix develop .#node --command bash -c "cd apps/node && npm run lint"
|
|
168
|
+
|
|
169
|
+
- name: Run type check
|
|
170
|
+
run: nix develop .#node --command bash -c "cd apps/node && npm run typecheck"
|
|
171
|
+
|
|
172
|
+
- name: Run tests
|
|
173
|
+
run: nix develop .#node --command bash -c "cd apps/node && npm test"
|
|
174
|
+
|
|
175
|
+
- name: Run coverage
|
|
176
|
+
run: nix develop .#node --command bash -c "cd apps/node && npm run test:coverage"
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### ワークフローのポイント
|
|
180
|
+
|
|
181
|
+
| 設定 | 説明 |
|
|
182
|
+
|------|------|
|
|
183
|
+
| `paths` フィルター | `apps/node/**` に変更があった場合のみ実行 |
|
|
184
|
+
| Nix 環境 | `nix develop .#node` で一貫した環境を保証 |
|
|
185
|
+
| キャッシュ | Nix ストアをキャッシュして CI を高速化 |
|
|
186
|
+
| ステップ分離 | 各チェックを個別ステップで実行し、失敗箇所を特定しやすく |
|
|
187
|
+
|
|
188
|
+
### 各言語の CI/CD 比較
|
|
189
|
+
|
|
190
|
+
| 項目 | TypeScript | Java | Python |
|
|
191
|
+
|------|-----------|------|--------|
|
|
192
|
+
| CI ツール | GitHub Actions | GitHub Actions | GitHub Actions |
|
|
193
|
+
| 環境管理 | Nix + npm | Nix + Gradle | Nix + uv |
|
|
194
|
+
| テスト | `npm test` | `./gradlew test` | `uv run tox -e test` |
|
|
195
|
+
| 品質チェック | `npm run check` | `./gradlew fullCheck` | `uv run tox` |
|
|
196
|
+
| タスクランナー | Gulp | Gradle | tox |
|
|
197
|
+
|
|
198
|
+
## 6.5 開発ワークフローのまとめ
|
|
199
|
+
|
|
200
|
+
ここまでの設定により、以下の開発ワークフローが確立されました。
|
|
201
|
+
|
|
202
|
+
### 日常の開発フロー
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
1. Guard を起動(npm run guard)
|
|
206
|
+
2. テストを書く(Red)
|
|
207
|
+
3. 実装する(Green)→ Guard が自動テスト
|
|
208
|
+
4. リファクタリング → Guard が自動テスト
|
|
209
|
+
5. コミット(Conventional Commits)
|
|
210
|
+
6. プッシュ → CI が自動実行
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### ツール一覧
|
|
214
|
+
|
|
215
|
+
| カテゴリ | ツール | 用途 |
|
|
216
|
+
|---------|--------|------|
|
|
217
|
+
| テスト | Vitest | テスト実行 + カバレッジ |
|
|
218
|
+
| パッケージ管理 | npm | 依存関係管理 |
|
|
219
|
+
| 静的解析 | ESLint | コード品質チェック |
|
|
220
|
+
| フォーマッター | Prettier | コードスタイル統一 |
|
|
221
|
+
| 型チェック | TypeScript (tsc) | 静的型チェック |
|
|
222
|
+
| タスクランナー | Gulp | タスク自動化 + ファイル監視 |
|
|
223
|
+
| CI/CD | GitHub Actions | 継続的インテグレーション |
|
|
224
|
+
|
|
225
|
+
## 6.6 まとめ
|
|
226
|
+
|
|
227
|
+
第 2 部(章 4〜6)を通じて、ソフトウェア開発の三種の神器を整備しました。
|
|
228
|
+
|
|
229
|
+
| 神器 | 導入したもの |
|
|
230
|
+
|------|------------|
|
|
231
|
+
| バージョン管理 | Git + Conventional Commits |
|
|
232
|
+
| テスティング | Vitest + TypeScript + カバレッジ |
|
|
233
|
+
| 自動化 | ESLint + Prettier + Gulp + GitHub Actions |
|
|
234
|
+
|
|
235
|
+
次の第 3 部では、追加仕様を題材にオブジェクト指向設計(カプセル化、ポリモーフィズム、デザインパターン)を学びます。
|