@thegetty/quire-cli 1.0.0-rc.37 → 1.0.0-rc.39

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.
Files changed (104) hide show
  1. package/package.json +5 -2
  2. package/src/commands/build.js +13 -6
  3. package/src/commands/clean.js +10 -2
  4. package/src/commands/clean.spec.js +10 -0
  5. package/src/commands/clean.test.js +122 -0
  6. package/src/commands/config.js +3 -1
  7. package/src/commands/config.test.js +42 -1
  8. package/src/commands/doctor.js +251 -0
  9. package/src/commands/doctor.spec.js +115 -0
  10. package/src/commands/doctor.test.js +1409 -0
  11. package/src/commands/epub.js +9 -2
  12. package/src/commands/help.js +60 -0
  13. package/src/commands/help.test.js +132 -0
  14. package/src/commands/info.js +79 -71
  15. package/src/commands/info.spec.js +8 -0
  16. package/src/commands/info.test.js +173 -76
  17. package/src/commands/pdf.js +10 -3
  18. package/src/commands/validate.js +39 -7
  19. package/src/commands/validate.spec.js +8 -0
  20. package/src/commands/validate.test.js +144 -0
  21. package/src/errors/help/help-topic-not-found-error.js +22 -0
  22. package/src/errors/help/index.js +8 -0
  23. package/src/errors/index.js +6 -0
  24. package/src/errors/input/index.js +8 -0
  25. package/src/errors/input/invalid-input-error.js +21 -0
  26. package/src/helpers/pager.js +59 -0
  27. package/src/helpers/pager.test.js +85 -0
  28. package/src/lib/README.md +77 -22
  29. package/src/lib/conf/README.md +6 -0
  30. package/src/lib/conf/build-status.js +103 -0
  31. package/src/lib/conf/build-status.test.js +247 -0
  32. package/src/lib/conf/defaults.js +14 -0
  33. package/src/lib/conf/format.js +1 -1
  34. package/src/lib/conf/schema.js +46 -1
  35. package/src/lib/constants.js +28 -0
  36. package/src/lib/doctor/README.md +667 -0
  37. package/src/lib/doctor/checks/environment/cli-version.js +62 -0
  38. package/src/lib/doctor/checks/environment/cli-version.test.js +132 -0
  39. package/src/lib/doctor/checks/environment/git-available.js +77 -0
  40. package/src/lib/doctor/checks/environment/git-available.test.js +52 -0
  41. package/src/lib/doctor/checks/environment/index.js +13 -0
  42. package/src/lib/doctor/checks/environment/node-version.js +66 -0
  43. package/src/lib/doctor/checks/environment/node-version.test.js +17 -0
  44. package/src/lib/doctor/checks/environment/npm-available.js +66 -0
  45. package/src/lib/doctor/checks/environment/npm-available.test.js +52 -0
  46. package/src/lib/doctor/checks/environment/os-info.js +48 -0
  47. package/src/lib/doctor/checks/environment/os-info.test.js +81 -0
  48. package/src/lib/doctor/checks/environment/runtime-info.js +51 -0
  49. package/src/lib/doctor/checks/environment/runtime-info.test.js +132 -0
  50. package/src/lib/doctor/checks/outputs/epub-output.js +119 -0
  51. package/src/lib/doctor/checks/outputs/epub-output.test.js +277 -0
  52. package/src/lib/doctor/checks/outputs/index.js +10 -0
  53. package/src/lib/doctor/checks/outputs/pdf-output.js +144 -0
  54. package/src/lib/doctor/checks/outputs/pdf-output.test.js +377 -0
  55. package/src/lib/doctor/checks/outputs/stale-build.js +122 -0
  56. package/src/lib/doctor/checks/outputs/stale-build.test.js +282 -0
  57. package/src/lib/doctor/checks/project/data-files.js +56 -0
  58. package/src/lib/doctor/checks/project/data-files.test.js +125 -0
  59. package/src/lib/doctor/checks/project/dependencies.js +53 -0
  60. package/src/lib/doctor/checks/project/dependencies.test.js +71 -0
  61. package/src/lib/doctor/checks/project/index.js +11 -0
  62. package/src/lib/doctor/checks/project/quire-11ty.js +98 -0
  63. package/src/lib/doctor/checks/project/quire-11ty.test.js +170 -0
  64. package/src/lib/doctor/checks/project/quire-project.js +38 -0
  65. package/src/lib/doctor/checks/project/quire-project.test.js +47 -0
  66. package/src/lib/doctor/checks/tools/index.js +10 -0
  67. package/src/lib/doctor/checks/tools/pandoc-available.js +82 -0
  68. package/src/lib/doctor/checks/tools/pandoc-available.test.js +73 -0
  69. package/src/lib/doctor/checks/tools/prince-available.js +81 -0
  70. package/src/lib/doctor/checks/tools/prince-available.test.js +73 -0
  71. package/src/lib/doctor/constants.js +39 -0
  72. package/src/lib/doctor/formatDuration.js +108 -0
  73. package/src/lib/doctor/formatDuration.test.js +76 -0
  74. package/src/lib/doctor/formatters/human.js +257 -0
  75. package/src/lib/doctor/formatters/human.test.js +463 -0
  76. package/src/lib/doctor/formatters/index.js +8 -0
  77. package/src/lib/doctor/formatters/json.js +78 -0
  78. package/src/lib/doctor/formatters/json.test.js +174 -0
  79. package/src/lib/doctor/formatters/shared.js +129 -0
  80. package/src/lib/doctor/formatters/shared.test.js +194 -0
  81. package/src/lib/doctor/index.js +271 -0
  82. package/src/lib/doctor/index.test.js +797 -0
  83. package/src/lib/help/frontmatter.js +77 -0
  84. package/src/lib/help/frontmatter.test.js +139 -0
  85. package/src/lib/help/index.js +135 -0
  86. package/src/lib/help/index.test.js +160 -0
  87. package/src/lib/help/topics/configuration.md +77 -0
  88. package/src/lib/help/topics/debugging.md +69 -0
  89. package/src/lib/help/topics/epub.md +74 -0
  90. package/src/lib/help/topics/pdf.md +74 -0
  91. package/src/lib/help/topics/publishing.md +80 -0
  92. package/src/lib/help/topics/workflows.md +50 -0
  93. package/src/lib/platform.js +95 -0
  94. package/src/lib/project/build.js +44 -25
  95. package/src/lib/project/build.test.js +30 -8
  96. package/src/lib/project/detect.js +16 -2
  97. package/src/lib/project/index.js +18 -2
  98. package/src/lib/project/output-paths.js +87 -0
  99. package/src/lib/project/output-paths.test.js +66 -0
  100. package/src/lib/project/paths.js +48 -0
  101. package/src/main.js +38 -3
  102. package/src/packageConfig.js +17 -0
  103. package/src/validators/validate-data-files.js +154 -0
  104. package/src/validators/validate-data-files.test.js +217 -0
@@ -0,0 +1,115 @@
1
+ import { Command, Option } from 'commander'
2
+ import program from '#src/main.js'
3
+ import test from 'ava'
4
+
5
+ /**
6
+ * Command Contract/Interface Tests
7
+ *
8
+ * Verifies the command's public API and Commander.js integration.
9
+ * @see docs/testing-commands.md
10
+ */
11
+
12
+ test.before((t) => {
13
+ // Get the registered command (from program.commands) once and share across all tests
14
+ t.context.command = program.commands.find((cmd) => cmd.name() === 'doctor')
15
+ })
16
+
17
+ test('command is registered in CLI program', (t) => {
18
+ const { command } = t.context
19
+
20
+ t.truthy(command, 'command "doctor" should be registered in program')
21
+ t.true(command instanceof Command, 'registered command should be Commander.js Command instance')
22
+ })
23
+
24
+ test('registered command has correct metadata', (t) => {
25
+ const { command } = t.context
26
+
27
+ t.is(command.name(), 'doctor')
28
+ t.truthy(command.description())
29
+ t.is(typeof command._actionHandler, 'function', 'command should have action handler')
30
+ })
31
+
32
+ test('registered command has correct aliases', (t) => {
33
+ const { command } = t.context
34
+ const aliases = command.aliases()
35
+
36
+ t.true(aliases.includes('checkup'), 'should have "checkup" alias')
37
+ t.true(aliases.includes('diagnostic'), 'should have "diagnostic" alias')
38
+ t.true(aliases.includes('health'), 'should have "health" alias')
39
+ })
40
+
41
+ test('registered command has variadic checks argument', (t) => {
42
+ const { command } = t.context
43
+ const registeredArguments = command.registeredArguments
44
+
45
+ t.is(registeredArguments.length, 1, 'doctor command should have one argument')
46
+
47
+ const checksArg = registeredArguments[0]
48
+ t.is(checksArg.name(), 'checks', 'argument should be named "checks"')
49
+ t.false(checksArg.required, 'checks argument should be optional')
50
+ t.true(checksArg.variadic, 'checks argument should be variadic')
51
+ t.truthy(checksArg.description, 'checks argument should have a description')
52
+ t.true(checksArg.description.includes('all'), 'description should mention "all"')
53
+ t.true(checksArg.description.includes('environment'), 'description should mention section names')
54
+ t.true(checksArg.description.includes('node'), 'description should mention check IDs')
55
+ })
56
+
57
+ test('registered command has correct options', (t) => {
58
+ const { command } = t.context
59
+
60
+ // Doctor command has 4 local + 4 shared output mode options = 8
61
+ // Local: --errors, --warnings, --json, --reset
62
+ // Shared (via withOutputModes): --quiet, --verbose, --progress, --debug
63
+ t.is(command.options.length, 8, 'doctor command should have 8 options')
64
+
65
+ // Verify --errors option
66
+ const errorsOption = command.options.find((opt) => opt.long === '--errors')
67
+ t.truthy(errorsOption, '--errors option should exist')
68
+ t.true(errorsOption instanceof Option, '--errors should be Option instance')
69
+ t.is(errorsOption.short, '-e', '--errors should have -e short flag')
70
+ t.truthy(errorsOption.description)
71
+
72
+ // Verify --warnings option
73
+ const warningsOption = command.options.find((opt) => opt.long === '--warnings')
74
+ t.truthy(warningsOption, '--warnings option should exist')
75
+ t.true(warningsOption instanceof Option, '--warnings should be Option instance')
76
+ t.is(warningsOption.short, '-w', '--warnings should have -w short flag')
77
+ t.truthy(warningsOption.description)
78
+
79
+ // Verify --json option with optional file parameter
80
+ const jsonOption = command.options.find((opt) => opt.long === '--json')
81
+ t.truthy(jsonOption, '--json option should exist')
82
+ t.true(jsonOption instanceof Option, '--json should be Option instance')
83
+ t.truthy(jsonOption.description)
84
+ t.true(jsonOption.description.includes('JSON'), 'description should mention JSON')
85
+ t.true(jsonOption.description.includes('file'), 'description should mention file output')
86
+
87
+ // Verify --reset option
88
+ const resetOption = command.options.find((opt) => opt.long === '--reset')
89
+ t.truthy(resetOption, '--reset option should exist')
90
+ t.true(resetOption instanceof Option, '--reset should be Option instance')
91
+ t.truthy(resetOption.description)
92
+
93
+ // Verify shared output mode options (via withOutputModes)
94
+ const quietOption = command.options.find((opt) => opt.long === '--quiet')
95
+ t.truthy(quietOption, '--quiet option should exist')
96
+ t.is(quietOption.short, '-q', '--quiet should have -q short flag')
97
+
98
+ const verboseOption = command.options.find((opt) => opt.long === '--verbose')
99
+ t.truthy(verboseOption, '--verbose option should exist')
100
+ t.is(verboseOption.short, '-v', '--verbose should have -v short flag')
101
+
102
+ const progressOption = command.options.find((opt) => opt.long === '--progress')
103
+ t.truthy(progressOption, '--progress option should exist (hidden alias for --verbose)')
104
+
105
+ const debugOption = command.options.find((opt) => opt.long === '--debug')
106
+ t.truthy(debugOption, '--debug option should exist')
107
+ })
108
+
109
+ test('command is accessible via checkup alias', (t) => {
110
+ // Find command by alias
111
+ const command = program.commands.find((cmd) => cmd.aliases().includes('checkup'))
112
+
113
+ t.truthy(command, 'command should be findable via "checkup" alias')
114
+ t.is(command.name(), 'doctor', 'alias should resolve to doctor command')
115
+ })