@w5s/mrm-preset 1.0.0-alpha.2 → 1.0.0-alpha.21

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 (51) hide show
  1. package/.turbo/turbo-build.log +11 -0
  2. package/.turbo/turbo-docs.log +43 -0
  3. package/.turbo/turbo-format.log +7 -0
  4. package/.turbo/turbo-lint.log +7 -0
  5. package/.turbo/turbo-prepare.log +2 -0
  6. package/.turbo/turbo-test.log +19 -0
  7. package/CHANGELOG.md +237 -0
  8. package/README.md +1 -1
  9. package/bootstrap/index.js +43 -42
  10. package/ci/_gitlab/AutoDevopsInclude.gitlab-ci.yml +2 -0
  11. package/ci/github.js +47 -0
  12. package/ci/gitlab.js +1 -1
  13. package/ci/index.js +7 -2
  14. package/commitlint/index.js +5 -2
  15. package/config.json +1 -0
  16. package/contributing/index.js +1 -1
  17. package/contributing/templates/CODE_OF_CONDUCT.md +3 -4
  18. package/core/block.js +2 -3
  19. package/core/commitlint.js +3 -3
  20. package/core/cspell.js +1 -10
  21. package/core/eslint.js +25 -6
  22. package/{gitignore/template.js → core/git.ignore.js} +32 -6
  23. package/core/git.js +21 -18
  24. package/core/githooks.js +8 -7
  25. package/core/githubCI.js +56 -0
  26. package/core/jest.js +50 -69
  27. package/core/jsonFile.js +8 -7
  28. package/core/lintStaged.js +3 -3
  29. package/core/npm.js +52 -15
  30. package/core/pkg.js +92 -14
  31. package/core/project.js +6 -0
  32. package/core/semanticRelease.js +4 -4
  33. package/core/turbo.js +57 -0
  34. package/core/typedoc.js +7 -20
  35. package/core/vscode.js +1 -1
  36. package/cspell/index.js +20 -10
  37. package/editorconfig/index.js +3 -1
  38. package/eslint/index.js +81 -32
  39. package/githooks/index.js +47 -56
  40. package/gitignore/index.js +5 -22
  41. package/jest/index.js +13 -17
  42. package/lang/.eslintrc.json +4 -1
  43. package/lang/index.js +22 -19
  44. package/licenses/index.js +26 -0
  45. package/package.json +17 -12
  46. package/postconfigure/index.js +3 -3
  47. package/project/index.js +217 -156
  48. package/release/index.js +5 -5
  49. package/renovate/index.js +7 -5
  50. package/tsconfig.json +2 -1
  51. package/core/workspace.js +0 -6
package/project/index.js CHANGED
@@ -1,207 +1,268 @@
1
+ const { dirname } = require('node:path');
1
2
  const { packageJson, json, makeDirs } = require('mrm-core');
2
- const git = require('../core/git');
3
- const pkg = require('../core/pkg');
4
- const npm = require('../core/npm');
5
- const { vscodeTask } = require('../core/vscode');
6
- const project = require('../core/project');
3
+ const git = require('../core/git.js');
4
+ const pkg = require('../core/pkg.js');
5
+ const npm = require('../core/npm.js');
6
+ const { vscodeTask } = require('../core/vscode.js');
7
+ const project = require('../core/project.js');
7
8
  const mrmPackageJson = require('../package.json');
9
+ const { turbo } = require('../core/turbo.js');
8
10
 
11
+ /**
12
+ *
13
+ * @param {string} script
14
+ */
15
+ const npmRun = (script) => {
16
+ switch (script) {
17
+ case project.install:
18
+ case project.test:
19
+ return `npm ${script}`;
20
+ default:
21
+ return `npm run ${script}`;
22
+ }
23
+ };
24
+ /**
25
+ *
26
+ * @param {string} script
27
+ */
28
+ const turboRun = (script) => `turbo run ${script}`;
29
+
30
+ /**
31
+ *
32
+ * @param {string} script
33
+ * @param {boolean} allowEmpty
34
+ */
35
+ const npmRunAll = (script, allowEmpty) => `concurrently "npm:${script}:*" ${allowEmpty ? `"${pkg.emptyScript}"` : ''}`;
9
36
  function task() {
10
- const packageFile = packageJson();
37
+ const rootPackageFile = packageJson();
38
+ const rootUseWorkspace = pkg.hasWorkspaces(rootPackageFile);
39
+ const rootEngineMinVersion = Object.assign(
40
+ {
41
+ node: '>=12.x',
42
+ yarn: '>=1.x',
43
+ npm: '>=6.x',
44
+ },
45
+ mrmPackageJson.engines
46
+ );
11
47
  const gitSupported = git.hasGit();
12
- const useWorkspace = packageFile.get('mrmConfig.packageArchetype') === 'workspace';
13
- const packageManager = pkg.manager(packageFile);
14
-
15
- /**
16
- *
17
- * @param {string} script
18
- */
19
- const npmRun = (script) => {
20
- switch (script) {
21
- case project.install:
22
- case project.test:
23
- return `npm ${script}`;
24
- default:
25
- return `npm run ${script}`;
26
- }
27
- };
28
- /**
29
- *
30
- * @param {string} script
31
- */
32
- const lernaRun = (script) => `lerna run ${script}`;
33
-
34
- /**
35
- *
36
- * @param {string} script
37
- */
38
- const npmRunAll = (script) => `npm-run-all -p "${script}:*"`;
48
+ const packageManager = pkg.manager(rootPackageFile);
49
+ const gitRepository = git.remoteSync();
39
50
 
40
51
  // Detect git repository
41
- pkg.value(packageFile, {
42
- path: 'repository',
43
- state: 'present',
44
- update: () => {
45
- const gitRepository = git.remoteSync();
46
- if (gitRepository) {
47
- return {
48
- type: 'git',
49
- url: gitRepository,
50
- };
51
- }
52
-
53
- return undefined;
54
- },
55
- });
52
+ if (rootUseWorkspace) {
53
+ const dirs = pkg.listWorkspaceMatchers(rootPackageFile).map(dirname);
54
+ makeDirs(dirs);
55
+ }
56
56
 
57
- // build & clean
58
- pkg.script(packageFile, {
59
- name: project.build,
60
- script: npmRunAll(project.build),
61
- state: 'present',
62
- });
63
- pkg.script(packageFile, {
64
- name: `${project.build}:empty`,
65
- script: pkg.emptyScript,
66
- state: 'present',
67
- });
68
- pkg.script(packageFile, {
69
- name: `${project.build}:packages`,
70
- script: lernaRun(project.build),
71
- state: useWorkspace ? 'present' : 'absent',
72
- });
73
- pkg.script(packageFile, {
74
- name: project.clean,
75
- script: useWorkspace ? lernaRun(project.clean) : pkg.emptyScript,
76
- state: useWorkspace ? 'present' : 'default',
77
- });
57
+ const addScripts = (/** @type {import("mrm-core").Json} */ currentPackageFile, /** @type {boolean} */ root) => {
58
+ const useWorkspace = pkg.hasWorkspaces(currentPackageFile);
78
59
 
79
- // develop & auto build & load
80
- pkg.script(packageFile, {
81
- name: project.develop,
82
- script: pkg.emptyScript,
83
- state: 'default',
84
- });
60
+ // build
61
+ pkg.script(currentPackageFile, {
62
+ name: project.build,
63
+ script: npmRunAll(project.build, false),
64
+ state: 'present',
65
+ });
66
+ pkg.script(currentPackageFile, {
67
+ name: `${project.build}:packages`,
68
+ script: turboRun(project.build),
69
+ state: useWorkspace ? 'present' : 'absent',
70
+ });
85
71
 
86
- // lint
87
- pkg.script(packageFile, {
88
- name: project.lint,
89
- script: pkg.emptyScript,
90
- state: 'default',
91
- });
92
- pkg.script(packageFile, {
93
- name: project.format,
94
- script: pkg.emptyScript,
95
- state: 'default',
96
- });
72
+ // lint
73
+ pkg.script(currentPackageFile, {
74
+ name: project.lint,
75
+ script: npmRunAll(project.lint, true),
76
+ state: 'present',
77
+ });
78
+ pkg.script(currentPackageFile, {
79
+ name: project.format,
80
+ script: npmRunAll(project.format, true),
81
+ state: 'present',
82
+ });
97
83
 
98
- // test
99
- pkg.script(packageFile, {
100
- name: project.coverage,
101
- script: pkg.emptyScript,
102
- state: 'default',
103
- });
104
- pkg.script(packageFile, {
105
- name: project.test,
106
- script: useWorkspace ? lernaRun(project.test) : pkg.emptyScript,
107
- state: useWorkspace ? 'present' : 'default',
108
- });
109
- pkg.script(packageFile, {
110
- name: project.validate,
111
- script: `${npmRun(project.build)} && ${npmRun(project.lint)} && ${npmRun(project.test)}`,
112
- state: 'present',
113
- });
84
+ // test
85
+ // pkg.script(currentPackageFile, {
86
+ // name: project.coverage,
87
+ // script: pkg.emptyScript,
88
+ // state: 'default',
89
+ // });
90
+ pkg.script(currentPackageFile, {
91
+ name: project.test,
92
+ script: useWorkspace ? npmRunAll(project.test, false) : pkg.emptyScript,
93
+ state: useWorkspace ? 'present' : 'default',
94
+ });
114
95
 
115
- // code analysis
116
- pkg.script(packageFile, {
117
- name: project.codeAnalysis,
118
- script: pkg.emptyScript,
119
- state: 'default',
120
- });
96
+ // prepare
97
+ pkg.script(currentPackageFile, {
98
+ name: project.prepare,
99
+ script: npmRunAll(project.prepare, true),
100
+ state: 'present',
101
+ });
121
102
 
122
- // prepare
123
- pkg.script(packageFile, {
124
- name: project.prepare,
125
- script: npmRunAll(project.prepare),
126
- state: 'present',
127
- });
128
- pkg.script(packageFile, {
129
- name: `${project.prepare}:empty`,
130
- script: pkg.emptyScript,
131
- state: 'default',
132
- });
133
- pkg.script(packageFile, {
134
- name: `${project.prepare}:packages`,
135
- script: 'lerna bootstrap',
136
- state: useWorkspace ? 'present' : 'absent',
137
- });
103
+ // clean
104
+ pkg.script(currentPackageFile, {
105
+ name: project.clean,
106
+ script: npmRunAll(project.clean, true),
107
+ state: 'present',
108
+ });
109
+ pkg.script(currentPackageFile, {
110
+ name: `${project.clean}:packages`,
111
+ script: turboRun(project.clean),
112
+ state: useWorkspace ? 'present' : 'absent',
113
+ });
138
114
 
139
- // rescue
140
- pkg.script(packageFile, {
141
- name: project.rescue,
142
- script: `${gitSupported ? 'git clean -fdx' : ''};${packageManager} install`,
143
- state: 'present',
115
+ // Root
116
+
117
+ // rescue
118
+ pkg.script(currentPackageFile, {
119
+ name: project.rescue,
120
+ script: `${gitSupported ? 'git clean -fdx' : ''};${packageManager} install`,
121
+ state: root ? 'present' : 'absent',
122
+ });
123
+
124
+ // release
125
+ pkg.script(currentPackageFile, {
126
+ name: project.release,
127
+ script: pkg.emptyScript,
128
+ state: root ? 'default' : 'absent',
129
+ });
130
+
131
+ // code analysis
132
+ pkg.script(currentPackageFile, {
133
+ name: project.codeAnalysis,
134
+ script: pkg.emptyScript,
135
+ state: root ? 'default' : 'absent',
136
+ });
137
+
138
+ // develop & auto build & load
139
+ pkg.script(currentPackageFile, {
140
+ name: project.develop,
141
+ script: pkg.emptyScript,
142
+ state: root ? 'default' : 'absent',
143
+ });
144
+ };
145
+
146
+ // eslint-disable-next-line no-shadow
147
+ pkg.withPackageJson((packageFile) => {
148
+ pkg.value(packageFile, {
149
+ path: 'repository',
150
+ state: 'present',
151
+ update: () =>
152
+ gitRepository
153
+ ? {
154
+ type: 'git',
155
+ url: gitRepository,
156
+ }
157
+ : undefined,
158
+ });
159
+
160
+ addScripts(packageFile, true);
161
+
162
+ pkg.script(packageFile, {
163
+ name: project.validate,
164
+ script: `${npmRun(project.build)} && ${npmRun(project.lint)} && ${npmRun(project.test)}`,
165
+ state: 'present',
166
+ });
167
+
168
+ // Engine
169
+ pkg.engineMinVersion(packageFile, rootEngineMinVersion);
144
170
  });
171
+ pkg.forEachWorkspace((workspace) => {
172
+ pkg.value(workspace.packageFile, {
173
+ path: 'repository',
174
+ state: 'present',
175
+ update: () =>
176
+ gitRepository
177
+ ? {
178
+ type: 'git',
179
+ url: gitRepository,
180
+ directory: workspace.projectDir,
181
+ }
182
+ : undefined,
183
+ });
184
+ addScripts(workspace.packageFile, false);
145
185
 
146
- // release
147
- pkg.script(packageFile, {
148
- name: project.release,
149
- script: pkg.emptyScript,
150
- state: 'default',
186
+ // Engine
187
+ pkg.engineMinVersion(workspace.packageFile, { node: rootEngineMinVersion.node });
151
188
  });
152
189
 
153
190
  // workspace
154
191
  const lernaConfig = json('lerna.json', {
155
- version: packageFile.get('version'),
192
+ version: rootPackageFile.get('version'),
156
193
  });
157
- if (useWorkspace) {
158
- const packages = ['packages/*'];
194
+ if (rootUseWorkspace) {
159
195
  const versionIndependent = lernaConfig.get('version') === 'independent';
160
- packageFile.merge({ workspaces: { packages } });
196
+ const gitmoji = true;
197
+
161
198
  lernaConfig.merge({
199
+ $schema: 'https://json.schemastore.org/lerna.json',
162
200
  command: {
163
201
  publish: {
164
202
  conventionalCommits: true,
165
203
  npmClient: 'npm',
166
204
  },
167
205
  version: {
168
- message: `chore(release): publish${versionIndependent ? '' : ' %s'}`,
206
+ message: gitmoji
207
+ ? `🔖 Publish${versionIndependent ? '' : ' %s'}`
208
+ : `chore(release): publish${versionIndependent ? '' : ' %s'}`,
169
209
  },
170
210
  },
171
211
  npmClient: packageManager,
172
- useWorkspaces: useWorkspace,
212
+ useWorkspaces: rootUseWorkspace,
213
+ changelogPreset: 'gitmoji-config',
173
214
  });
174
215
  lernaConfig.save();
175
- makeDirs('packages');
176
216
  } else {
177
- packageFile.unset('workspaces');
178
217
  lernaConfig.delete();
179
218
  }
180
219
 
181
- // Engine
182
- pkg.engineMinVersion(
183
- packageFile,
184
- Object.assign(
185
- {
186
- node: '>=12.x',
187
- yarn: '>=1.x',
188
- npm: '>=6.x',
220
+ rootPackageFile.save();
221
+
222
+ // Turbo config
223
+ turbo({
224
+ state: rootUseWorkspace ? 'present' : 'absent',
225
+ update: (_) => ({
226
+ ..._,
227
+ baseBranch: 'origin/main',
228
+ pipeline: {
229
+ [project.build]: {
230
+ dependsOn: ['^build'],
231
+ outputs: ['lib/**', 'dist/**', '.next/**'],
232
+ },
233
+ [project.test]: {},
234
+ [project.lint]: {},
235
+ [project.prepare]: {},
236
+ [project.format]: {},
237
+ [project.docs]: {},
238
+ [project.spellcheck]: {},
239
+ [project.clean]: {
240
+ cache: false,
241
+ },
242
+ [project.develop]: {
243
+ cache: false,
244
+ },
189
245
  },
190
- mrmPackageJson.engines
191
- )
192
- );
193
- packageFile.save();
246
+ globalDependencies: ['tsconfig.settings.json'],
247
+ }),
248
+ });
194
249
 
195
250
  // Dependencies
251
+ // clean
196
252
  npm.dependency({
197
253
  dev: true,
198
254
  name: ['npm-run-all'],
255
+ state: 'absent',
256
+ });
257
+ npm.dependency({
258
+ dev: true,
259
+ name: ['concurrently'],
199
260
  state: 'present',
200
261
  });
201
262
  npm.dependency({
202
263
  dev: true,
203
- name: ['lerna'],
204
- state: useWorkspace ? 'present' : 'absent',
264
+ name: ['lerna', 'conventional-changelog-gitmoji-config'],
265
+ state: rootUseWorkspace ? 'present' : 'absent',
205
266
  });
206
267
 
207
268
  // VSCode
package/release/index.js CHANGED
@@ -1,17 +1,17 @@
1
1
  const { packageJson } = require('mrm-core');
2
- const pkg = require('../core/pkg');
3
- const project = require('../core/project');
4
- const { semanticRelease } = require('../core/semanticRelease');
2
+ const pkg = require('../core/pkg.js');
3
+ const project = require('../core/project.js');
4
+ const { semanticRelease } = require('../core/semanticRelease.js');
5
5
 
6
6
  function task() {
7
- const useWorkspace = packageJson().get('mrmConfig.packageArchetype') === 'workspace';
7
+ const useWorkspace = pkg.hasWorkspaces(packageJson());
8
8
 
9
9
  // release
10
10
  pkg.withPackageJson((packageFile) => {
11
11
  pkg.script(packageFile, {
12
12
  name: project.release,
13
13
  // eslint-disable-next-line no-template-curly-in-string
14
- script: useWorkspace ? 'CI=$(is-ci) lerna publish ${CI:+"--yes"}' : semanticRelease.command(),
14
+ script: useWorkspace ? 'is-ci && lerna publish --yes || lerna publish' : semanticRelease.command(),
15
15
  state: 'present',
16
16
  });
17
17
  });
package/renovate/index.js CHANGED
@@ -1,10 +1,11 @@
1
1
  const { json, packageJson } = require('mrm-core');
2
- const { hasGit } = require('../core/git');
2
+ const { hasGit } = require('../core/git.js');
3
+ const pkg = require('../core/pkg.js');
3
4
 
4
5
  /**
5
6
  *
6
7
  * @param {{
7
- * renovatePresetApplication: string
8
+ * renovatePresetApplication: string,
8
9
  * renovatePresetLibrary: string
9
10
  * }} config
10
11
  */
@@ -19,7 +20,8 @@ function createRenovate({ renovatePresetApplication, renovatePresetLibrary }) {
19
20
  const gitSupported = hasGit();
20
21
 
21
22
  if (gitSupported) {
22
- const packageArchetype = packageJson().get('mrmConfig.packageArchetype', 'library');
23
+ const packageFile = packageJson();
24
+ const packageArchetype = pkg.archetype(packageFile);
23
25
  const renovatePresetResolved =
24
26
  renovatePreset || (packageArchetype === 'application' ? renovatePresetApplication : renovatePresetLibrary);
25
27
  const renovateFile = json('renovate.json');
@@ -54,6 +56,6 @@ function createRenovate({ renovatePresetApplication, renovatePresetLibrary }) {
54
56
  }
55
57
 
56
58
  module.exports = createRenovate({
57
- renovatePresetApplication: '@w5s/renovate-config:application',
58
- renovatePresetLibrary: '@w5s/renovate-config:library',
59
+ renovatePresetApplication: 'github>w5s/renovate-config:application',
60
+ renovatePresetLibrary: 'github>w5s/renovate-config:library',
59
61
  });
package/tsconfig.json CHANGED
@@ -1,5 +1,6 @@
1
1
  {
2
- "extends": "../../tsconfig.json",
2
+ "$schema": "https://json.schemastore.org/tsconfig.json",
3
+ "extends": "../../tsconfig.settings.json",
3
4
  "compilerOptions": {
4
5
  "allowJs": true,
5
6
  "checkJs": true,
package/core/workspace.js DELETED
@@ -1,6 +0,0 @@
1
- const { packageJson } = require('mrm-core');
2
-
3
- function useWorkspaces() {
4
- return packageJson().get('mrmConfig.packageArchetype') === 'workspace';
5
- }
6
- exports.useWorkspaces = useWorkspaces;