create-forgeon 0.1.2 → 0.1.6

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 (143) hide show
  1. package/README.md +19 -17
  2. package/bin/create-forgeon.mjs +22 -22
  3. package/package.json +1 -1
  4. package/src/cli/add-help.mjs +12 -12
  5. package/src/cli/add-options.mjs +54 -54
  6. package/src/cli/add-options.test.mjs +24 -24
  7. package/src/cli/help.mjs +20 -20
  8. package/src/cli/options.mjs +121 -121
  9. package/src/cli/options.test.mjs +41 -41
  10. package/src/cli/prompt-select.mjs +94 -94
  11. package/src/cli/prompt-select.test.mjs +148 -148
  12. package/src/constants.mjs +13 -13
  13. package/src/core/docs.mjs +128 -128
  14. package/src/core/docs.test.mjs +91 -91
  15. package/src/core/install.mjs +14 -14
  16. package/src/core/scaffold.mjs +48 -45
  17. package/src/core/validate.mjs +12 -12
  18. package/src/core/validate.test.mjs +73 -73
  19. package/src/databases/index.mjs +26 -26
  20. package/src/frameworks/index.mjs +32 -32
  21. package/src/infrastructure/proxy.mjs +12 -12
  22. package/src/modules/docs.mjs +70 -70
  23. package/src/modules/executor.mjs +39 -21
  24. package/src/modules/executor.test.mjs +95 -45
  25. package/src/modules/i18n.mjs +283 -0
  26. package/src/modules/registry.mjs +43 -35
  27. package/src/presets/i18n.mjs +228 -180
  28. package/src/presets/index.mjs +2 -2
  29. package/src/presets/proxy.mjs +32 -32
  30. package/src/run-add-module.mjs +47 -47
  31. package/src/run-create-forgeon.mjs +72 -72
  32. package/src/utils/fs.mjs +26 -26
  33. package/src/utils/values.mjs +20 -20
  34. package/templates/base/.dockerignore +7 -7
  35. package/templates/base/.editorconfig +11 -11
  36. package/templates/base/README.md +46 -46
  37. package/templates/base/apps/api/Dockerfile +24 -24
  38. package/templates/base/apps/api/package.json +39 -39
  39. package/templates/base/apps/api/prisma/migrations/0001_init/migration.sql +11 -11
  40. package/templates/base/apps/api/prisma/schema.prisma +14 -14
  41. package/templates/base/apps/api/prisma/seed.ts +19 -19
  42. package/templates/base/apps/api/src/app.module.ts +32 -32
  43. package/templates/base/apps/api/src/common/dto/echo-query.dto.ts +5 -5
  44. package/templates/base/apps/api/src/common/filters/app-exception.filter.ts +129 -129
  45. package/templates/base/apps/api/src/config/app.config.ts +12 -12
  46. package/templates/base/apps/api/src/health/health.controller.ts +30 -30
  47. package/templates/base/apps/api/src/main.ts +25 -25
  48. package/templates/base/apps/api/src/prisma/prisma.module.ts +8 -8
  49. package/templates/base/apps/api/src/prisma/prisma.service.ts +26 -26
  50. package/templates/base/apps/api/tsconfig.build.json +8 -8
  51. package/templates/base/apps/api/tsconfig.json +8 -8
  52. package/templates/base/apps/web/Dockerfile +12 -12
  53. package/templates/base/apps/web/index.html +11 -11
  54. package/templates/base/apps/web/package.json +21 -21
  55. package/templates/base/apps/web/src/App.tsx +35 -35
  56. package/templates/base/apps/web/src/main.tsx +8 -8
  57. package/templates/base/apps/web/src/styles.css +32 -32
  58. package/templates/base/apps/web/tsconfig.json +17 -17
  59. package/templates/base/apps/web/vite.config.ts +14 -14
  60. package/templates/base/docs/AI/ARCHITECTURE.md +37 -37
  61. package/templates/base/docs/AI/MODULE_SPEC.md +56 -56
  62. package/templates/base/docs/AI/PROJECT.md +31 -31
  63. package/templates/base/docs/AI/TASKS.md +57 -57
  64. package/templates/base/docs/README.md +6 -6
  65. package/templates/base/infra/caddy/Caddyfile +15 -15
  66. package/templates/base/infra/docker/.env.example +9 -9
  67. package/templates/base/infra/docker/caddy.Dockerfile +15 -15
  68. package/templates/base/infra/docker/compose.caddy.yml +44 -44
  69. package/templates/base/infra/docker/compose.nginx.yml +44 -44
  70. package/templates/base/infra/docker/compose.none.yml +37 -37
  71. package/templates/base/infra/docker/compose.yml +44 -44
  72. package/templates/base/infra/docker/nginx.Dockerfile +15 -15
  73. package/templates/base/infra/nginx/nginx.conf +31 -31
  74. package/templates/base/package.json +23 -23
  75. package/templates/base/packages/core/README.md +2 -2
  76. package/templates/base/packages/core/package.json +13 -13
  77. package/templates/base/packages/core/tsconfig.json +7 -7
  78. package/templates/base/packages/i18n/package.json +18 -18
  79. package/templates/base/packages/i18n/src/forgeon-i18n.module.ts +45 -45
  80. package/templates/base/packages/i18n/tsconfig.json +8 -8
  81. package/templates/base/pnpm-workspace.yaml +2 -2
  82. package/templates/base/resources/i18n/en/common.json +4 -4
  83. package/templates/base/resources/i18n/en/validation.json +2 -2
  84. package/templates/base/resources/i18n/uk/common.json +4 -4
  85. package/templates/base/resources/i18n/uk/validation.json +2 -2
  86. package/templates/base/tsconfig.base.json +16 -16
  87. package/templates/docs-fragments/AI_ARCHITECTURE/00_title.md +1 -1
  88. package/templates/docs-fragments/AI_ARCHITECTURE/10_layout_base.md +6 -6
  89. package/templates/docs-fragments/AI_ARCHITECTURE/11_layout_infra.md +1 -1
  90. package/templates/docs-fragments/AI_ARCHITECTURE/12_layout_i18n_resources.md +1 -1
  91. package/templates/docs-fragments/AI_ARCHITECTURE/20_env_base.md +4 -4
  92. package/templates/docs-fragments/AI_ARCHITECTURE/21_env_i18n.md +3 -3
  93. package/templates/docs-fragments/AI_ARCHITECTURE/30_default_db.md +7 -7
  94. package/templates/docs-fragments/AI_ARCHITECTURE/31_docker_runtime.md +5 -5
  95. package/templates/docs-fragments/AI_ARCHITECTURE/32_scope_freeze.md +5 -5
  96. package/templates/docs-fragments/AI_ARCHITECTURE/40_docs_generation.md +9 -9
  97. package/templates/docs-fragments/AI_ARCHITECTURE/50_extension_points.md +8 -8
  98. package/templates/docs-fragments/AI_PROJECT/00_title.md +1 -1
  99. package/templates/docs-fragments/AI_PROJECT/10_what_is.md +3 -3
  100. package/templates/docs-fragments/AI_PROJECT/20_structure_base.md +5 -5
  101. package/templates/docs-fragments/AI_PROJECT/21_structure_i18n.md +2 -0
  102. package/templates/docs-fragments/AI_PROJECT/22_structure_docker.md +1 -1
  103. package/templates/docs-fragments/AI_PROJECT/23_structure_docs.md +1 -1
  104. package/templates/docs-fragments/AI_PROJECT/30_run_dev.md +8 -8
  105. package/templates/docs-fragments/AI_PROJECT/31_run_docker.md +5 -5
  106. package/templates/docs-fragments/AI_PROJECT/32_proxy_notes.md +5 -5
  107. package/templates/docs-fragments/AI_PROJECT/32_proxy_notes_none.md +5 -5
  108. package/templates/docs-fragments/AI_PROJECT/33_i18n_notes.md +2 -0
  109. package/templates/docs-fragments/AI_PROJECT/40_change_boundaries_base.md +3 -3
  110. package/templates/docs-fragments/AI_PROJECT/41_change_boundaries_docker.md +1 -1
  111. package/templates/docs-fragments/README/00_title.md +3 -3
  112. package/templates/docs-fragments/README/10_stack.md +8 -8
  113. package/templates/docs-fragments/README/20_quick_start_dev_intro.md +6 -6
  114. package/templates/docs-fragments/README/21_quick_start_dev_db_docker.md +4 -4
  115. package/templates/docs-fragments/README/21_quick_start_dev_db_local.md +1 -1
  116. package/templates/docs-fragments/README/22_quick_start_dev_outro.md +7 -7
  117. package/templates/docs-fragments/README/30_quick_start_docker.md +7 -7
  118. package/templates/docs-fragments/README/30_quick_start_docker_none.md +9 -9
  119. package/templates/docs-fragments/README/31_proxy_preset_caddy.md +9 -9
  120. package/templates/docs-fragments/README/31_proxy_preset_nginx.md +8 -8
  121. package/templates/docs-fragments/README/31_proxy_preset_none.md +6 -6
  122. package/templates/docs-fragments/README/32_prisma_container_start.md +5 -5
  123. package/templates/docs-fragments/README/40_i18n.md +14 -8
  124. package/templates/docs-fragments/README/90_next_steps.md +7 -7
  125. package/templates/module-fragments/i18n/00_title.md +5 -0
  126. package/templates/module-fragments/i18n/10_overview.md +9 -0
  127. package/templates/module-fragments/i18n/20_scope.md +7 -0
  128. package/templates/module-fragments/i18n/90_status_implemented.md +3 -0
  129. package/templates/module-fragments/jwt-auth/00_title.md +1 -1
  130. package/templates/module-fragments/jwt-auth/10_overview.md +6 -6
  131. package/templates/module-fragments/jwt-auth/20_scope.md +7 -7
  132. package/templates/module-fragments/jwt-auth/90_status_planned.md +3 -3
  133. package/templates/module-fragments/queue/00_title.md +1 -1
  134. package/templates/module-fragments/queue/10_overview.md +6 -6
  135. package/templates/module-fragments/queue/20_scope.md +7 -7
  136. package/templates/module-fragments/queue/90_status_planned.md +3 -3
  137. package/templates/module-presets/i18n/apps/web/src/App.tsx +61 -0
  138. package/templates/module-presets/i18n/packages/i18n-contracts/package.json +14 -0
  139. package/templates/module-presets/i18n/packages/i18n-contracts/src/index.ts +7 -0
  140. package/templates/module-presets/i18n/packages/i18n-contracts/tsconfig.json +8 -0
  141. package/templates/module-presets/i18n/packages/i18n-web/package.json +17 -0
  142. package/templates/module-presets/i18n/packages/i18n-web/src/index.ts +50 -0
  143. package/templates/module-presets/i18n/packages/i18n-web/tsconfig.json +8 -0
@@ -1,94 +1,94 @@
1
- import readline from 'node:readline';
2
- import { stdin as input, stdout as output } from 'node:process';
3
-
4
- export async function promptSelect({
5
- message,
6
- choices,
7
- defaultValue,
8
- inputStream = input,
9
- outputStream = output,
10
- }) {
11
- if (!Array.isArray(choices) || choices.length === 0) {
12
- throw new Error('promptSelect requires at least one choice.');
13
- }
14
-
15
- let index = choices.findIndex((choice) => choice.value === defaultValue);
16
- if (index < 0) index = 0;
17
-
18
- if (!inputStream.isTTY || !outputStream.isTTY) {
19
- return choices[index].value;
20
- }
21
-
22
- readline.emitKeypressEvents(inputStream);
23
-
24
- const canSetRawMode = typeof inputStream.setRawMode === 'function';
25
- const wasRawModeEnabled = Boolean(inputStream.isRaw);
26
- const canResume = typeof inputStream.resume === 'function';
27
- const canPause = typeof inputStream.pause === 'function';
28
- if (canResume) inputStream.resume();
29
-
30
- if (canSetRawMode && !wasRawModeEnabled) {
31
- inputStream.setRawMode(true);
32
- }
33
-
34
- let renderedLines = 0;
35
-
36
- const render = () => {
37
- if (renderedLines > 0) {
38
- readline.moveCursor(outputStream, 0, -renderedLines);
39
- readline.cursorTo(outputStream, 0);
40
- readline.clearScreenDown(outputStream);
41
- }
42
-
43
- outputStream.write(`${message}\n`);
44
- for (let i = 0; i < choices.length; i += 1) {
45
- const marker = i === index ? '>' : ' ';
46
- outputStream.write(`${marker} ${choices[i].label}\n`);
47
- }
48
- outputStream.write('Use Up/Down arrows and Enter.\n');
49
-
50
- renderedLines = choices.length + 2;
51
- };
52
-
53
- return new Promise((resolve, reject) => {
54
- const cleanup = () => {
55
- inputStream.off('keypress', onKeypress);
56
- if (canSetRawMode && !wasRawModeEnabled) {
57
- inputStream.setRawMode(false);
58
- }
59
- if (canPause) inputStream.pause();
60
- outputStream.write('\n');
61
- };
62
-
63
- const onKeypress = (_str, key) => {
64
- if (!key) return;
65
-
66
- if (key.ctrl && key.name === 'c') {
67
- cleanup();
68
- reject(new Error('Prompt cancelled.'));
69
- return;
70
- }
71
-
72
- if (key.name === 'up') {
73
- index = (index - 1 + choices.length) % choices.length;
74
- render();
75
- return;
76
- }
77
-
78
- if (key.name === 'down') {
79
- index = (index + 1) % choices.length;
80
- render();
81
- return;
82
- }
83
-
84
- if (key.name === 'return' || key.name === 'enter') {
85
- const selected = choices[index].value;
86
- cleanup();
87
- resolve(selected);
88
- }
89
- };
90
-
91
- render();
92
- inputStream.on('keypress', onKeypress);
93
- });
94
- }
1
+ import readline from 'node:readline';
2
+ import { stdin as input, stdout as output } from 'node:process';
3
+
4
+ export async function promptSelect({
5
+ message,
6
+ choices,
7
+ defaultValue,
8
+ inputStream = input,
9
+ outputStream = output,
10
+ }) {
11
+ if (!Array.isArray(choices) || choices.length === 0) {
12
+ throw new Error('promptSelect requires at least one choice.');
13
+ }
14
+
15
+ let index = choices.findIndex((choice) => choice.value === defaultValue);
16
+ if (index < 0) index = 0;
17
+
18
+ if (!inputStream.isTTY || !outputStream.isTTY) {
19
+ return choices[index].value;
20
+ }
21
+
22
+ readline.emitKeypressEvents(inputStream);
23
+
24
+ const canSetRawMode = typeof inputStream.setRawMode === 'function';
25
+ const wasRawModeEnabled = Boolean(inputStream.isRaw);
26
+ const canResume = typeof inputStream.resume === 'function';
27
+ const canPause = typeof inputStream.pause === 'function';
28
+ if (canResume) inputStream.resume();
29
+
30
+ if (canSetRawMode && !wasRawModeEnabled) {
31
+ inputStream.setRawMode(true);
32
+ }
33
+
34
+ let renderedLines = 0;
35
+
36
+ const render = () => {
37
+ if (renderedLines > 0) {
38
+ readline.moveCursor(outputStream, 0, -renderedLines);
39
+ readline.cursorTo(outputStream, 0);
40
+ readline.clearScreenDown(outputStream);
41
+ }
42
+
43
+ outputStream.write(`${message}\n`);
44
+ for (let i = 0; i < choices.length; i += 1) {
45
+ const marker = i === index ? '>' : ' ';
46
+ outputStream.write(`${marker} ${choices[i].label}\n`);
47
+ }
48
+ outputStream.write('Use Up/Down arrows and Enter.\n');
49
+
50
+ renderedLines = choices.length + 2;
51
+ };
52
+
53
+ return new Promise((resolve, reject) => {
54
+ const cleanup = () => {
55
+ inputStream.off('keypress', onKeypress);
56
+ if (canSetRawMode && !wasRawModeEnabled) {
57
+ inputStream.setRawMode(false);
58
+ }
59
+ if (canPause) inputStream.pause();
60
+ outputStream.write('\n');
61
+ };
62
+
63
+ const onKeypress = (_str, key) => {
64
+ if (!key) return;
65
+
66
+ if (key.ctrl && key.name === 'c') {
67
+ cleanup();
68
+ reject(new Error('Prompt cancelled.'));
69
+ return;
70
+ }
71
+
72
+ if (key.name === 'up') {
73
+ index = (index - 1 + choices.length) % choices.length;
74
+ render();
75
+ return;
76
+ }
77
+
78
+ if (key.name === 'down') {
79
+ index = (index + 1) % choices.length;
80
+ render();
81
+ return;
82
+ }
83
+
84
+ if (key.name === 'return' || key.name === 'enter') {
85
+ const selected = choices[index].value;
86
+ cleanup();
87
+ resolve(selected);
88
+ }
89
+ };
90
+
91
+ render();
92
+ inputStream.on('keypress', onKeypress);
93
+ });
94
+ }
@@ -1,148 +1,148 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { EventEmitter } from 'node:events';
4
- import { promptSelect } from './prompt-select.mjs';
5
-
6
- describe('promptSelect', () => {
7
- it('returns default choice in non-tty mode', async () => {
8
- const value = await promptSelect({
9
- message: 'Pick one',
10
- defaultValue: 'b',
11
- choices: [
12
- { label: 'A', value: 'a' },
13
- { label: 'B', value: 'b' },
14
- ],
15
- inputStream: { isTTY: false },
16
- outputStream: { isTTY: false },
17
- });
18
-
19
- assert.equal(value, 'b');
20
- });
21
-
22
- it('throws for empty choices', async () => {
23
- await assert.rejects(
24
- () =>
25
- promptSelect({
26
- message: 'Pick one',
27
- defaultValue: 'a',
28
- choices: [],
29
- inputStream: { isTTY: false },
30
- outputStream: { isTTY: false },
31
- }),
32
- /requires at least one choice/,
33
- );
34
- });
35
-
36
- it('restores paused stdin state after interactive selection', async () => {
37
- class MockInput extends EventEmitter {
38
- constructor() {
39
- super();
40
- this.isTTY = true;
41
- this.isRaw = false;
42
- this._paused = true;
43
- }
44
-
45
- setRawMode(value) {
46
- this.isRaw = value;
47
- }
48
-
49
- pause() {
50
- this._paused = true;
51
- }
52
-
53
- resume() {
54
- this._paused = false;
55
- }
56
-
57
- isPaused() {
58
- return this._paused;
59
- }
60
- }
61
-
62
- class MockOutput {
63
- constructor() {
64
- this.isTTY = true;
65
- }
66
-
67
- write() {}
68
- }
69
-
70
- const inputStream = new MockInput();
71
- const outputStream = new MockOutput();
72
-
73
- const selectionPromise = promptSelect({
74
- message: 'Pick one',
75
- defaultValue: 'a',
76
- choices: [
77
- { label: 'A', value: 'a' },
78
- { label: 'B', value: 'b' },
79
- ],
80
- inputStream,
81
- outputStream,
82
- });
83
-
84
- inputStream.emit('keypress', '', { name: 'down' });
85
- inputStream.emit('keypress', '', { name: 'return' });
86
-
87
- const value = await selectionPromise;
88
-
89
- assert.equal(value, 'b');
90
- assert.equal(inputStream.isPaused(), true);
91
- assert.equal(inputStream.isRaw, false);
92
- });
93
-
94
- it('pauses stdin after interactive selection even when initially resumed', async () => {
95
- class MockInput extends EventEmitter {
96
- constructor() {
97
- super();
98
- this.isTTY = true;
99
- this.isRaw = false;
100
- this._paused = false;
101
- }
102
-
103
- setRawMode(value) {
104
- this.isRaw = value;
105
- }
106
-
107
- pause() {
108
- this._paused = true;
109
- }
110
-
111
- resume() {
112
- this._paused = false;
113
- }
114
-
115
- isPaused() {
116
- return this._paused;
117
- }
118
- }
119
-
120
- class MockOutput {
121
- constructor() {
122
- this.isTTY = true;
123
- }
124
-
125
- write() {}
126
- }
127
-
128
- const inputStream = new MockInput();
129
- const outputStream = new MockOutput();
130
-
131
- const selectionPromise = promptSelect({
132
- message: 'Pick one',
133
- defaultValue: 'a',
134
- choices: [
135
- { label: 'A', value: 'a' },
136
- { label: 'B', value: 'b' },
137
- ],
138
- inputStream,
139
- outputStream,
140
- });
141
-
142
- inputStream.emit('keypress', '', { name: 'return' });
143
- const value = await selectionPromise;
144
-
145
- assert.equal(value, 'a');
146
- assert.equal(inputStream.isPaused(), true);
147
- });
148
- });
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { EventEmitter } from 'node:events';
4
+ import { promptSelect } from './prompt-select.mjs';
5
+
6
+ describe('promptSelect', () => {
7
+ it('returns default choice in non-tty mode', async () => {
8
+ const value = await promptSelect({
9
+ message: 'Pick one',
10
+ defaultValue: 'b',
11
+ choices: [
12
+ { label: 'A', value: 'a' },
13
+ { label: 'B', value: 'b' },
14
+ ],
15
+ inputStream: { isTTY: false },
16
+ outputStream: { isTTY: false },
17
+ });
18
+
19
+ assert.equal(value, 'b');
20
+ });
21
+
22
+ it('throws for empty choices', async () => {
23
+ await assert.rejects(
24
+ () =>
25
+ promptSelect({
26
+ message: 'Pick one',
27
+ defaultValue: 'a',
28
+ choices: [],
29
+ inputStream: { isTTY: false },
30
+ outputStream: { isTTY: false },
31
+ }),
32
+ /requires at least one choice/,
33
+ );
34
+ });
35
+
36
+ it('restores paused stdin state after interactive selection', async () => {
37
+ class MockInput extends EventEmitter {
38
+ constructor() {
39
+ super();
40
+ this.isTTY = true;
41
+ this.isRaw = false;
42
+ this._paused = true;
43
+ }
44
+
45
+ setRawMode(value) {
46
+ this.isRaw = value;
47
+ }
48
+
49
+ pause() {
50
+ this._paused = true;
51
+ }
52
+
53
+ resume() {
54
+ this._paused = false;
55
+ }
56
+
57
+ isPaused() {
58
+ return this._paused;
59
+ }
60
+ }
61
+
62
+ class MockOutput {
63
+ constructor() {
64
+ this.isTTY = true;
65
+ }
66
+
67
+ write() {}
68
+ }
69
+
70
+ const inputStream = new MockInput();
71
+ const outputStream = new MockOutput();
72
+
73
+ const selectionPromise = promptSelect({
74
+ message: 'Pick one',
75
+ defaultValue: 'a',
76
+ choices: [
77
+ { label: 'A', value: 'a' },
78
+ { label: 'B', value: 'b' },
79
+ ],
80
+ inputStream,
81
+ outputStream,
82
+ });
83
+
84
+ inputStream.emit('keypress', '', { name: 'down' });
85
+ inputStream.emit('keypress', '', { name: 'return' });
86
+
87
+ const value = await selectionPromise;
88
+
89
+ assert.equal(value, 'b');
90
+ assert.equal(inputStream.isPaused(), true);
91
+ assert.equal(inputStream.isRaw, false);
92
+ });
93
+
94
+ it('pauses stdin after interactive selection even when initially resumed', async () => {
95
+ class MockInput extends EventEmitter {
96
+ constructor() {
97
+ super();
98
+ this.isTTY = true;
99
+ this.isRaw = false;
100
+ this._paused = false;
101
+ }
102
+
103
+ setRawMode(value) {
104
+ this.isRaw = value;
105
+ }
106
+
107
+ pause() {
108
+ this._paused = true;
109
+ }
110
+
111
+ resume() {
112
+ this._paused = false;
113
+ }
114
+
115
+ isPaused() {
116
+ return this._paused;
117
+ }
118
+ }
119
+
120
+ class MockOutput {
121
+ constructor() {
122
+ this.isTTY = true;
123
+ }
124
+
125
+ write() {}
126
+ }
127
+
128
+ const inputStream = new MockInput();
129
+ const outputStream = new MockOutput();
130
+
131
+ const selectionPromise = promptSelect({
132
+ message: 'Pick one',
133
+ defaultValue: 'a',
134
+ choices: [
135
+ { label: 'A', value: 'a' },
136
+ { label: 'B', value: 'b' },
137
+ ],
138
+ inputStream,
139
+ outputStream,
140
+ });
141
+
142
+ inputStream.emit('keypress', '', { name: 'return' });
143
+ const value = await selectionPromise;
144
+
145
+ assert.equal(value, 'a');
146
+ assert.equal(inputStream.isPaused(), true);
147
+ });
148
+ });
package/src/constants.mjs CHANGED
@@ -1,13 +1,13 @@
1
- export const DEFAULT_FRONTEND = 'react';
2
- export const DEFAULT_DB = 'prisma';
3
- export const DEFAULT_PROXY = 'caddy';
4
- export const FIXED_DOCKER_ENABLED = true;
5
-
6
- export const DEFAULT_OPTIONS = {
7
- name: undefined,
8
- i18n: undefined,
9
- proxy: undefined,
10
- install: false,
11
- yes: false,
12
- help: false,
13
- };
1
+ export const DEFAULT_FRONTEND = 'react';
2
+ export const DEFAULT_DB = 'prisma';
3
+ export const DEFAULT_PROXY = 'caddy';
4
+ export const FIXED_DOCKER_ENABLED = true;
5
+
6
+ export const DEFAULT_OPTIONS = {
7
+ name: undefined,
8
+ i18n: undefined,
9
+ proxy: undefined,
10
+ install: false,
11
+ yes: false,
12
+ help: false,
13
+ };