@flarum/cli 2.0.0-beta.9 → 2.0.1
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/LICENSE +1 -1
- package/README.md +161 -49
- package/bin/run +2 -1
- package/bin/splitsh-lite-darwin +0 -0
- package/bin/splitsh-lite-linux +0 -0
- package/boilerplate/skeleton/extension/.gitattributes +16 -14
- package/boilerplate/skeleton/extension/.github/workflows/backend.yml +2 -6
- package/boilerplate/skeleton/extension/.github/workflows/frontend.yml +4 -6
- package/boilerplate/skeleton/extension/LICENSE.md +1 -1
- package/boilerplate/skeleton/extension/README.md +1 -1
- package/boilerplate/skeleton/extension/composer.json +6 -4
- package/boilerplate/skeleton/extension/extend.php +2 -2
- package/boilerplate/skeleton/extension/js/admin.ts +2 -0
- package/boilerplate/skeleton/extension/js/forum.ts +2 -0
- package/boilerplate/skeleton/extension/js/package.json +5 -1
- package/boilerplate/skeleton/extension/js/src/admin/index.ts +5 -0
- package/boilerplate/skeleton/extension/js/src/common/index.ts +5 -0
- package/boilerplate/skeleton/extension/js/src/forum/index.ts +5 -0
- package/boilerplate/skeleton/extension/js/tsconfig.json +10 -2
- package/boilerplate/skeleton/extension/locale/en.yml +1 -1
- package/boilerplate/skeleton/extension/tests/phpunit.integration.xml +1 -0
- package/lib/base-command.d.ts +3 -1
- package/lib/base-command.js +44 -31
- package/lib/boilersmith/io.d.ts +28 -8
- package/lib/boilersmith/io.js +4 -2
- package/lib/boilersmith/paths.d.ts +2 -2
- package/lib/boilersmith/paths.js +7 -7
- package/lib/boilersmith/scaffolding/audit-step-factory.js +11 -11
- package/lib/boilersmith/scaffolding/infra-step-factory.js +2 -2
- package/lib/boilersmith/scaffolding/init-step-factory.js +5 -5
- package/lib/boilersmith/scaffolding/module.d.ts +28 -8
- package/lib/boilersmith/scaffolding/module.js +59 -17
- package/lib/boilersmith/scaffolding/scaffolder.d.ts +4 -1
- package/lib/boilersmith/scaffolding/scaffolder.js +32 -32
- package/lib/boilersmith/scaffolding/template-param.d.ts +1 -1
- package/lib/boilersmith/scaffolding/template-param.js +2 -2
- package/lib/boilersmith/step-manager.d.ts +0 -1
- package/lib/boilersmith/step-manager.js +10 -20
- package/lib/boilersmith/steps/stub-base.js +3 -3
- package/lib/boilersmith/utils/clone-and-fill.js +1 -1
- package/lib/boilersmith/utils/commit-async.d.ts +2 -0
- package/lib/boilersmith/utils/commit-async.js +15 -0
- package/lib/boilersmith/utils/read-tpl.js +2 -2
- package/lib/commands/audit/infra.d.ts +1 -1
- package/lib/commands/audit/infra.js +30 -8
- package/lib/commands/flarum/change.d.ts +16 -0
- package/lib/commands/flarum/change.js +103 -0
- package/lib/commands/flarum/info.d.ts +5 -0
- package/lib/commands/flarum/info.js +17 -0
- package/lib/commands/infra.d.ts +2 -2
- package/lib/commands/infra.js +18 -12
- package/lib/commands/init.d.ts +1 -1
- package/lib/commands/init.js +4 -2
- package/lib/commands/make/backend/api-controller.js +1 -2
- package/lib/commands/make/backend/api-serializer-attributes.js +1 -2
- package/lib/commands/make/backend/command.js +1 -2
- package/lib/commands/make/backend/event-listener.js +1 -2
- package/lib/commands/make/backend/handler.js +2 -5
- package/lib/commands/make/backend/integration-test.js +2 -4
- package/lib/commands/make/backend/migration.js +1 -2
- package/lib/commands/make/backend/model.js +1 -2
- package/lib/commands/make/backend/policy.js +1 -2
- package/lib/commands/make/backend/route.js +1 -2
- package/lib/commands/make/backend/service-provider.js +1 -2
- package/lib/commands/make/frontend/model.js +2 -5
- package/lib/commands/monorepo/create.d.ts +15 -0
- package/lib/commands/monorepo/create.js +20 -0
- package/lib/commands/monorepo/split.d.ts +15 -0
- package/lib/commands/monorepo/split.js +19 -0
- package/lib/commands/update/js-imports.js +1 -2
- package/lib/help.js +1 -1
- package/lib/providers/php-provider.js +2 -2
- package/lib/steps/gen-ext-scaffolder.d.ts +2 -2
- package/lib/steps/gen-ext-scaffolder.js +185 -51
- package/lib/steps/js/base.js +2 -4
- package/lib/steps/js/model.js +4 -4
- package/lib/steps/misc/composer.js +2 -2
- package/lib/steps/misc/git.d.ts +1 -1
- package/lib/steps/misc/git.js +2 -2
- package/lib/steps/misc/npm.d.ts +11 -0
- package/lib/steps/misc/npm.js +19 -0
- package/lib/steps/misc/yarn.js +2 -2
- package/lib/steps/monorepo/create.d.ts +17 -0
- package/lib/steps/monorepo/create.js +186 -0
- package/lib/steps/monorepo/split.d.ts +14 -0
- package/lib/steps/monorepo/split.js +99 -0
- package/lib/steps/stubs/backend/api-controller.d.ts +1 -1
- package/lib/steps/stubs/backend/api-controller.js +3 -0
- package/lib/steps/stubs/backend/api-serializer.d.ts +1 -1
- package/lib/steps/stubs/backend/api-serializer.js +3 -0
- package/lib/steps/stubs/backend/command.d.ts +0 -5
- package/lib/steps/stubs/backend/command.js +1 -0
- package/lib/steps/stubs/backend/event-listener.d.ts +1 -1
- package/lib/steps/stubs/backend/event-listener.js +2 -0
- package/lib/steps/stubs/backend/handler-command.d.ts +1 -1
- package/lib/steps/stubs/backend/handler-command.js +1 -0
- package/lib/steps/stubs/backend/handler.d.ts +1 -1
- package/lib/steps/stubs/backend/handler.js +4 -0
- package/lib/steps/stubs/backend/integration-test.d.ts +1 -1
- package/lib/steps/stubs/backend/integration-test.js +2 -0
- package/lib/steps/stubs/backend/job.d.ts +1 -1
- package/lib/steps/stubs/backend/job.js +1 -0
- package/lib/steps/stubs/backend/migration.js +6 -3
- package/lib/steps/stubs/backend/model.d.ts +1 -1
- package/lib/steps/stubs/backend/model.js +1 -0
- package/lib/steps/stubs/backend/policy.d.ts +1 -1
- package/lib/steps/stubs/backend/policy.js +2 -0
- package/lib/steps/stubs/backend/repository.d.ts +1 -1
- package/lib/steps/stubs/backend/repository.js +2 -0
- package/lib/steps/stubs/backend/service-provider.d.ts +1 -1
- package/lib/steps/stubs/backend/service-provider.js +1 -0
- package/lib/steps/stubs/backend/validator.d.ts +1 -1
- package/lib/steps/stubs/backend/validator.js +1 -0
- package/lib/steps/stubs/flarum-base.js +1 -1
- package/lib/steps/stubs/frontend/component.d.ts +0 -5
- package/lib/steps/stubs/frontend/component.js +1 -0
- package/lib/steps/stubs/frontend/modal.d.ts +0 -5
- package/lib/steps/stubs/frontend/modal.js +1 -0
- package/lib/steps/stubs/frontend/model.d.ts +0 -5
- package/lib/steps/stubs/frontend/model.js +1 -0
- package/lib/steps/stubs/js-base.js +8 -5
- package/lib/steps/stubs/php-base.js +10 -8
- package/lib/steps/update/js-imports.js +8 -2
- package/lib/utils/composer.d.ts +1 -0
- package/lib/utils/migration.js +3 -1
- package/lib/utils/monorepo.d.ts +24 -0
- package/lib/utils/monorepo.js +24 -0
- package/lib/utils/validation.d.ts +2 -0
- package/lib/utils/validation.js +6 -0
- package/oclif.manifest.json +1 -1
- package/package.json +12 -5
- package/php-subsystem/composer.json +9 -9
- package/php-subsystem/composer.lock +64 -71
- package/php-subsystem/vendor/composer/installed.json +54 -61
- package/php-subsystem/vendor/nikic/php-parser/README.md +55 -59
- package/php-subsystem/vendor/nikic/php-parser/composer.json +39 -39
- package/php-subsystem/vendor/nikic/php-parser/grammar/README.md +17 -20
|
@@ -5,7 +5,9 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const scaffolder_1 = require("boilersmith/scaffolding/scaffolder");
|
|
6
6
|
const chalk_1 = (0, tslib_1.__importDefault)(require("chalk"));
|
|
7
7
|
const mem_fs_editor_1 = require("mem-fs-editor");
|
|
8
|
-
const
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = require("path");
|
|
9
11
|
const simple_git_1 = (0, tslib_1.__importDefault)(require("simple-git"));
|
|
10
12
|
const simple_1 = (0, tslib_1.__importDefault)(require("spdx-license-list/simple"));
|
|
11
13
|
const composer_1 = require("../utils/composer");
|
|
@@ -21,8 +23,8 @@ exports.EXTENSION_PARAMS = [
|
|
|
21
23
|
'extensionName',
|
|
22
24
|
'licenseType',
|
|
23
25
|
'mainGitBranch',
|
|
26
|
+
'jsPackageManager',
|
|
24
27
|
'licenseText',
|
|
25
|
-
'packageNamespaceEscapedSlash',
|
|
26
28
|
'extensionId',
|
|
27
29
|
'year',
|
|
28
30
|
'backendDirectory',
|
|
@@ -36,8 +38,8 @@ function paramNamesToDef(name) {
|
|
|
36
38
|
name,
|
|
37
39
|
type: 'text',
|
|
38
40
|
message: `Package ${chalk_1.default.dim('(vendor/extension-name)')}`,
|
|
39
|
-
validate: s => /^([\dA-Za-z-]{2,})\/([\dA-Za-z-]{2,})$/.test(s.trim()) || 'Invalid package name format',
|
|
40
|
-
format: s => s.toLowerCase(),
|
|
41
|
+
validate: (s) => /^([\dA-Za-z-]{2,})\/([\dA-Za-z-]{2,})$/.test(s.trim()) || 'Invalid package name format',
|
|
42
|
+
format: (s) => s.toLowerCase(),
|
|
41
43
|
},
|
|
42
44
|
getCurrVal: async (fs, paths) => {
|
|
43
45
|
const json = (0, composer_1.getComposerJson)(fs, paths);
|
|
@@ -63,11 +65,11 @@ function paramNamesToDef(name) {
|
|
|
63
65
|
name,
|
|
64
66
|
type: 'text',
|
|
65
67
|
message: `Package namespace ${chalk_1.default.dim('(Vendor\\ExtensionName)')}`,
|
|
66
|
-
validate: s => /^([\dA-Za-z]+)\\([\dA-Za-z]+)$/.test(s.trim()) || 'Invalid namespace format',
|
|
68
|
+
validate: (s) => /^([\dA-Za-z]+)\\([\dA-Za-z]+)$/.test(s.trim()) || 'Invalid namespace format',
|
|
67
69
|
format: (str) => str &&
|
|
68
70
|
str
|
|
69
71
|
.split('\\')
|
|
70
|
-
.map(s => s[0].toUpperCase() + s.slice(1))
|
|
72
|
+
.map((s) => s[0].toUpperCase() + s.slice(1))
|
|
71
73
|
.join('\\'),
|
|
72
74
|
},
|
|
73
75
|
getCurrVal: async (fs, paths) => {
|
|
@@ -96,7 +98,7 @@ function paramNamesToDef(name) {
|
|
|
96
98
|
name,
|
|
97
99
|
type: 'text',
|
|
98
100
|
message: 'Author email',
|
|
99
|
-
validate: s => !s || /^[\w!#$%&*+./=?^`{|}~’-]+@[\dA-Za-z-]+(?:\.[\dA-Za-z-]+)*$/.test(s) || 'Invalid email format',
|
|
101
|
+
validate: (s) => !s || /^[\w!#$%&*+./=?^`{|}~’-]+@[\dA-Za-z-]+(?:\.[\dA-Za-z-]+)*$/.test(s) || 'Invalid email format',
|
|
100
102
|
},
|
|
101
103
|
getCurrVal: async (fs, paths) => {
|
|
102
104
|
var _a, _b, _c;
|
|
@@ -110,8 +112,8 @@ function paramNamesToDef(name) {
|
|
|
110
112
|
name,
|
|
111
113
|
type: 'text',
|
|
112
114
|
message: 'Extension name',
|
|
113
|
-
validate: str => Boolean(str.trim()) || 'The extension name is required',
|
|
114
|
-
format: str => str
|
|
115
|
+
validate: (str) => Boolean(str.trim()) || 'The extension name is required',
|
|
116
|
+
format: (str) => str
|
|
115
117
|
.split(' ')
|
|
116
118
|
.map((s) => (s.length > 3 ? s[0].toUpperCase() + s.slice(1) : s))
|
|
117
119
|
.join(' '),
|
|
@@ -130,7 +132,7 @@ function paramNamesToDef(name) {
|
|
|
130
132
|
name,
|
|
131
133
|
type: 'autocomplete',
|
|
132
134
|
message: 'License',
|
|
133
|
-
choices: [...simple_1.default].map(e => ({ title: e, value: e })),
|
|
135
|
+
choices: [...simple_1.default].map((e) => ({ title: e, value: e })),
|
|
134
136
|
},
|
|
135
137
|
getCurrVal: async (fs, paths) => {
|
|
136
138
|
var _a;
|
|
@@ -144,12 +146,6 @@ function paramNamesToDef(name) {
|
|
|
144
146
|
uses: ['licenseType'],
|
|
145
147
|
compute: async (_paths, licenseType) => (licenseType ? require(`spdx-license-list/licenses/${licenseType}`).licenseText : ''),
|
|
146
148
|
};
|
|
147
|
-
case 'packageNamespaceEscapedSlash':
|
|
148
|
-
return {
|
|
149
|
-
name,
|
|
150
|
-
uses: ['packageNamespace'],
|
|
151
|
-
compute: async (_paths, packageNamespace) => packageNamespace.replace('\\', '\\\\'),
|
|
152
|
-
};
|
|
153
149
|
case 'extensionId':
|
|
154
150
|
return {
|
|
155
151
|
name,
|
|
@@ -169,12 +165,37 @@ function paramNamesToDef(name) {
|
|
|
169
165
|
type: 'text',
|
|
170
166
|
message: `Main git branch ${chalk_1.default.dim('(JS will automatically build when changes are pushed to GitHub on this branch)')}`,
|
|
171
167
|
// See https://stackoverflow.com/a/12093994/11091039
|
|
172
|
-
validate: s => /^(?!.*\/\.)(?!.*\.\.)(?!\/)(?!.*\/\/)(?!.*@{)(?!.*\\)[^\000-\037 *:?[^~\177]+(?<!\.lock)(?<!\/)(?<!\.)$/.test(s.trim()) ||
|
|
168
|
+
validate: (s) => /^(?!.*\/\.)(?!.*\.\.)(?!\/)(?!.*\/\/)(?!.*@{)(?!.*\\)[^\000-\037 *:?[^~\177]+(?<!\.lock)(?<!\/)(?<!\.)$/.test(s.trim()) ||
|
|
169
|
+
'Invalid git branch',
|
|
173
170
|
initial: 'main',
|
|
174
171
|
},
|
|
175
|
-
getCurrVal: async () => {
|
|
176
|
-
var _a;
|
|
177
|
-
|
|
172
|
+
getCurrVal: async (_fs, paths) => {
|
|
173
|
+
var _a, _b;
|
|
174
|
+
const cwd = (_a = paths.monorepo()) !== null && _a !== void 0 ? _a : paths.package();
|
|
175
|
+
try {
|
|
176
|
+
const remotes = (0, child_process_1.execSync)('git remote', { cwd, timeout: 2000 }).toString().split('\n');
|
|
177
|
+
if (remotes.includes('origin')) {
|
|
178
|
+
return (0, child_process_1.execSync)("git remote show origin | grep 'HEAD branch' | cut -d' ' -f5", { cwd, timeout: 2000 }).toString();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (_c) { }
|
|
182
|
+
return (_b = (await (0, simple_git_1.default)(cwd, { timeout: { block: 2000 } }).getConfig('init.defaultBranch')).value) !== null && _b !== void 0 ? _b : 'main';
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
case 'jsPackageManager':
|
|
186
|
+
return {
|
|
187
|
+
prompt: {
|
|
188
|
+
name,
|
|
189
|
+
type: 'select',
|
|
190
|
+
message: 'JS Package Manager',
|
|
191
|
+
initial: 0,
|
|
192
|
+
choices: [
|
|
193
|
+
{ title: 'Yarn', value: 'yarn' },
|
|
194
|
+
{ title: 'NPM', value: 'npm' },
|
|
195
|
+
],
|
|
196
|
+
},
|
|
197
|
+
getCurrVal: async (fs, paths) => {
|
|
198
|
+
return (0, mem_fs_editor_1.create)(fs).exists(paths.package('js/yarn.lock')) ? 'yarn' : 'npm';
|
|
178
199
|
},
|
|
179
200
|
};
|
|
180
201
|
case 'backendDirectory':
|
|
@@ -201,6 +222,8 @@ function paramNamesToDef(name) {
|
|
|
201
222
|
exports.EXTENSION_MODULES = [
|
|
202
223
|
'core',
|
|
203
224
|
'icon',
|
|
225
|
+
'admin',
|
|
226
|
+
'forum',
|
|
204
227
|
'js',
|
|
205
228
|
'jsCommon',
|
|
206
229
|
'css',
|
|
@@ -222,14 +245,7 @@ function moduleNameToDef(name) {
|
|
|
222
245
|
updatable: false,
|
|
223
246
|
togglable: false,
|
|
224
247
|
shortDescription: 'Core Functionality',
|
|
225
|
-
filesToReplace: [
|
|
226
|
-
'extend.php',
|
|
227
|
-
'README.md',
|
|
228
|
-
'LICENSE.md',
|
|
229
|
-
{ path: 'js/src/admin/index.js', needsOtherModules: ['js'] },
|
|
230
|
-
{ path: 'js/src/forum/index.js', needsOtherModules: ['js'] },
|
|
231
|
-
{ path: 'js/src/common/index.js', needsOtherModules: ['js', 'jsCommon'] },
|
|
232
|
-
],
|
|
248
|
+
filesToReplace: ['extend.php', 'README.md', 'LICENSE.md'],
|
|
233
249
|
jsonToAugment: {
|
|
234
250
|
'composer.json': [
|
|
235
251
|
'name',
|
|
@@ -239,15 +255,17 @@ function moduleNameToDef(name) {
|
|
|
239
255
|
'license',
|
|
240
256
|
'require.flarum/core',
|
|
241
257
|
'authors',
|
|
242
|
-
'autoload.psr-4.${params.
|
|
258
|
+
'autoload.psr-4.${params.packageNamespace}\\',
|
|
243
259
|
'extra.flarum-extension.title',
|
|
244
260
|
'extra.flarum-extension.category',
|
|
261
|
+
'minimum-stability',
|
|
262
|
+
'prefer-stable',
|
|
245
263
|
],
|
|
246
264
|
},
|
|
247
265
|
needsTemplateParams: [
|
|
248
266
|
'packageName',
|
|
249
267
|
'packageNamespace',
|
|
250
|
-
'
|
|
268
|
+
'packageNamespace',
|
|
251
269
|
'packageDescription',
|
|
252
270
|
'extensionName',
|
|
253
271
|
'licenseType',
|
|
@@ -270,6 +288,50 @@ function moduleNameToDef(name) {
|
|
|
270
288
|
},
|
|
271
289
|
needsTemplateParams: [],
|
|
272
290
|
};
|
|
291
|
+
case 'admin':
|
|
292
|
+
return {
|
|
293
|
+
name,
|
|
294
|
+
updatable: true,
|
|
295
|
+
defaultEnabled: true,
|
|
296
|
+
dependsOn: [],
|
|
297
|
+
togglable: true,
|
|
298
|
+
shortDescription: 'Admin Frontend',
|
|
299
|
+
filesToReplace: [
|
|
300
|
+
{ path: 'js/admin.js', moduleDeps: ['js', { module: 'typescript', enabled: false }] },
|
|
301
|
+
{ path: 'js/admin.ts', moduleDeps: ['js', { module: 'typescript', enabled: true }] },
|
|
302
|
+
{ path: 'js/src/admin/index.js', doNotUpdate: true, moduleDeps: ['js', { module: 'typescript', enabled: false }] },
|
|
303
|
+
{ path: 'js/src/admin/index.ts', doNotUpdate: true, moduleDeps: ['js', { module: 'typescript', enabled: true }] },
|
|
304
|
+
],
|
|
305
|
+
jsonToAugment: {},
|
|
306
|
+
needsTemplateParams: [],
|
|
307
|
+
inferEnabled: async (_fs, paths) => {
|
|
308
|
+
if (!(0, fs_1.existsSync)(paths.package('js')))
|
|
309
|
+
undefined;
|
|
310
|
+
return (0, fs_1.existsSync)(paths.package('js/src/admin'));
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
case 'forum':
|
|
314
|
+
return {
|
|
315
|
+
name,
|
|
316
|
+
updatable: true,
|
|
317
|
+
defaultEnabled: true,
|
|
318
|
+
dependsOn: [],
|
|
319
|
+
togglable: true,
|
|
320
|
+
shortDescription: 'Forum Frontend',
|
|
321
|
+
filesToReplace: [
|
|
322
|
+
{ path: 'js/forum.js', moduleDeps: ['js', { module: 'typescript', enabled: false }] },
|
|
323
|
+
{ path: 'js/forum.ts', moduleDeps: ['js', { module: 'typescript', enabled: true }] },
|
|
324
|
+
{ path: 'js/src/forum/index.js', doNotUpdate: true, moduleDeps: ['js', { module: 'typescript', enabled: false }] },
|
|
325
|
+
{ path: 'js/src/forum/index.ts', doNotUpdate: true, moduleDeps: ['js', { module: 'typescript', enabled: true }] },
|
|
326
|
+
],
|
|
327
|
+
jsonToAugment: {},
|
|
328
|
+
needsTemplateParams: [],
|
|
329
|
+
inferEnabled: async (_fs, paths) => {
|
|
330
|
+
if (!(0, fs_1.existsSync)(paths.package('js')))
|
|
331
|
+
undefined;
|
|
332
|
+
return (0, fs_1.existsSync)(paths.package('js/src/forum'));
|
|
333
|
+
},
|
|
334
|
+
};
|
|
273
335
|
case 'js':
|
|
274
336
|
return {
|
|
275
337
|
name,
|
|
@@ -279,11 +341,24 @@ function moduleNameToDef(name) {
|
|
|
279
341
|
shortDescription: 'Javascript',
|
|
280
342
|
longDescription: "Files, tools, and scripts to build Flarum's frontend.",
|
|
281
343
|
dependsOn: [],
|
|
282
|
-
filesToReplace: [
|
|
344
|
+
filesToReplace: [
|
|
345
|
+
'js/webpack.config.js',
|
|
346
|
+
{ path: 'js/admin.js', moduleDeps: ['admin', { module: 'typescript', enabled: false }] },
|
|
347
|
+
{ path: 'js/forum.js', moduleDeps: ['forum', { module: 'typescript', enabled: false }] },
|
|
348
|
+
{ path: 'js/admin.ts', moduleDeps: ['admin', { module: 'typescript', enabled: true }] },
|
|
349
|
+
{ path: 'js/forum.ts', moduleDeps: ['forum', { module: 'typescript', enabled: true }] },
|
|
350
|
+
{ path: 'js/src/admin/index.js', doNotUpdate: true, moduleDeps: ['admin', { module: 'typescript', enabled: false }] },
|
|
351
|
+
{ path: 'js/src/forum/index.js', doNotUpdate: true, moduleDeps: ['forum', { module: 'typescript', enabled: false }] },
|
|
352
|
+
{ path: 'js/src/common/index.js', doNotUpdate: true, moduleDeps: ['jsCommon', { module: 'typescript', enabled: false }] },
|
|
353
|
+
{ path: 'js/src/admin/index.ts', doNotUpdate: true, moduleDeps: ['admin', { module: 'typescript', enabled: true }] },
|
|
354
|
+
{ path: 'js/src/forum/index.ts', doNotUpdate: true, moduleDeps: ['forum', { module: 'typescript', enabled: true }] },
|
|
355
|
+
{ path: 'js/src/common/index.ts', doNotUpdate: true, moduleDeps: ['jsCommon', { module: 'typescript', enabled: true }] },
|
|
356
|
+
],
|
|
283
357
|
jsonToAugment: {
|
|
284
358
|
'js/package.json': [
|
|
285
359
|
'name',
|
|
286
360
|
'private',
|
|
361
|
+
'version',
|
|
287
362
|
'devDependencies.flarum-webpack-config',
|
|
288
363
|
'devDependencies.webpack',
|
|
289
364
|
'devDependencies.webpack-cli',
|
|
@@ -292,7 +367,10 @@ function moduleNameToDef(name) {
|
|
|
292
367
|
'scripts.analyze',
|
|
293
368
|
],
|
|
294
369
|
},
|
|
295
|
-
needsTemplateParams: ['packageName'],
|
|
370
|
+
needsTemplateParams: ['packageName', 'jsPackageManager'],
|
|
371
|
+
inferEnabled: async (_fs, paths) => {
|
|
372
|
+
return (0, fs_1.existsSync)(paths.package('js'));
|
|
373
|
+
},
|
|
296
374
|
};
|
|
297
375
|
case 'jsCommon':
|
|
298
376
|
return {
|
|
@@ -303,22 +381,38 @@ function moduleNameToDef(name) {
|
|
|
303
381
|
shortDescription: 'JS common code',
|
|
304
382
|
longDescription: 'Shared code between the forum and the admin frontends',
|
|
305
383
|
dependsOn: ['js'],
|
|
306
|
-
filesToReplace: [
|
|
384
|
+
filesToReplace: [
|
|
385
|
+
{ path: 'js/admin.js', moduleDeps: ['admin', { module: 'typescript', enabled: false }] },
|
|
386
|
+
{ path: 'js/forum.js', moduleDeps: ['forum', { module: 'typescript', enabled: false }] },
|
|
387
|
+
{ path: 'js/admin.ts', moduleDeps: ['admin', { module: 'typescript', enabled: true }] },
|
|
388
|
+
{ path: 'js/forum.ts', moduleDeps: ['forum', { module: 'typescript', enabled: true }] },
|
|
389
|
+
{ path: 'js/src/common/index.js', doNotUpdate: true, moduleDeps: [{ module: 'typescript', enabled: false }] },
|
|
390
|
+
{ path: 'js/src/common/index.ts', doNotUpdate: true, moduleDeps: [{ module: 'typescript', enabled: true }] },
|
|
391
|
+
],
|
|
307
392
|
jsonToAugment: {},
|
|
308
393
|
needsTemplateParams: [],
|
|
394
|
+
inferEnabled: async (_fs, paths) => {
|
|
395
|
+
return (0, fs_1.existsSync)(paths.package('js/src/common'));
|
|
396
|
+
},
|
|
309
397
|
};
|
|
310
398
|
case 'css':
|
|
311
399
|
return {
|
|
312
400
|
name,
|
|
313
|
-
updatable:
|
|
401
|
+
updatable: true,
|
|
314
402
|
togglable: true,
|
|
315
403
|
defaultEnabled: true,
|
|
316
404
|
shortDescription: 'CSS',
|
|
317
405
|
longDescription: "LESS starter files for Flarum's frontend styling.",
|
|
318
406
|
dependsOn: [],
|
|
319
|
-
filesToReplace: [
|
|
407
|
+
filesToReplace: [
|
|
408
|
+
{ path: 'less/admin.less', doNotUpdate: true, moduleDeps: ['admin'] },
|
|
409
|
+
{ path: 'less/forum.less', doNotUpdate: true, moduleDeps: ['forum'] },
|
|
410
|
+
],
|
|
320
411
|
jsonToAugment: {},
|
|
321
412
|
needsTemplateParams: [],
|
|
413
|
+
inferEnabled: async (_fs, paths) => {
|
|
414
|
+
return (0, fs_1.existsSync)(paths.package('less'));
|
|
415
|
+
},
|
|
322
416
|
};
|
|
323
417
|
case 'locale':
|
|
324
418
|
return {
|
|
@@ -329,9 +423,12 @@ function moduleNameToDef(name) {
|
|
|
329
423
|
shortDescription: 'Locale',
|
|
330
424
|
longDescription: 'Translation starter files.',
|
|
331
425
|
dependsOn: [],
|
|
332
|
-
filesToReplace: ['locale/en.yml'],
|
|
426
|
+
filesToReplace: [{ path: 'locale/en.yml', doNotUpdate: true }],
|
|
333
427
|
jsonToAugment: {},
|
|
334
428
|
needsTemplateParams: [],
|
|
429
|
+
inferEnabled: async (_fs, paths) => {
|
|
430
|
+
return (0, fs_1.existsSync)(paths.package('locale'));
|
|
431
|
+
},
|
|
335
432
|
};
|
|
336
433
|
case 'gitConf':
|
|
337
434
|
return {
|
|
@@ -342,7 +439,11 @@ function moduleNameToDef(name) {
|
|
|
342
439
|
shortDescription: 'Git Configuration',
|
|
343
440
|
longDescription: 'Git config files (e.g. .gitignore, .gitattributes).',
|
|
344
441
|
dependsOn: [],
|
|
345
|
-
filesToReplace: [
|
|
442
|
+
filesToReplace: [
|
|
443
|
+
{ path: 'gitignore', destPath: '.gitignore' },
|
|
444
|
+
{ path: 'js/gitignore', moduleDeps: ['js'], destPath: 'js/.gitignore' },
|
|
445
|
+
{ path: '.gitattributes', monorepoPath: '.gitattributes' },
|
|
446
|
+
],
|
|
346
447
|
jsonToAugment: {},
|
|
347
448
|
needsTemplateParams: [],
|
|
348
449
|
};
|
|
@@ -356,8 +457,17 @@ function moduleNameToDef(name) {
|
|
|
356
457
|
longDescription: 'Automatically run checks via GitHub Actions CI. Free for open source projects.',
|
|
357
458
|
dependsOn: [],
|
|
358
459
|
filesToReplace: [
|
|
359
|
-
{
|
|
360
|
-
|
|
460
|
+
{
|
|
461
|
+
path: '.github/workflows/frontend.yml',
|
|
462
|
+
monorepoPath: '.github/workflows/${params.extensionId}-frontend.yml',
|
|
463
|
+
requireMonorepo: false,
|
|
464
|
+
moduleDeps: ['js'],
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
path: '.github/workflows/backend.yml',
|
|
468
|
+
monorepoPath: '.github/workflows/${params.extensionId}-backend.yml',
|
|
469
|
+
requireMonorepo: false,
|
|
470
|
+
},
|
|
361
471
|
],
|
|
362
472
|
jsonToAugment: {},
|
|
363
473
|
needsTemplateParams: ['frontendDirectory', 'backendDirectory', 'mainGitBranch', 'extensionId', 'extensionName'],
|
|
@@ -372,9 +482,21 @@ function moduleNameToDef(name) {
|
|
|
372
482
|
dependsOn: ['js'],
|
|
373
483
|
filesToReplace: [],
|
|
374
484
|
jsonToAugment: {
|
|
375
|
-
'js/package.json': [
|
|
485
|
+
'js/package.json': [
|
|
486
|
+
'prettier',
|
|
487
|
+
'devDependencies.prettier',
|
|
488
|
+
'devDependencies.@flarum/prettier-config',
|
|
489
|
+
'scripts.format',
|
|
490
|
+
'scripts.format-check',
|
|
491
|
+
],
|
|
376
492
|
},
|
|
377
493
|
needsTemplateParams: [],
|
|
494
|
+
inferEnabled: async (_fs, paths) => {
|
|
495
|
+
if (!(0, fs_1.existsSync)(paths.package('js/package.json'))) {
|
|
496
|
+
return false;
|
|
497
|
+
}
|
|
498
|
+
return (0, fs_1.readFileSync)(paths.package('js/package.json')).includes('prettier');
|
|
499
|
+
},
|
|
378
500
|
};
|
|
379
501
|
case 'typescript':
|
|
380
502
|
return {
|
|
@@ -387,15 +509,20 @@ function moduleNameToDef(name) {
|
|
|
387
509
|
filesToReplace: ['js/tsconfig.json'],
|
|
388
510
|
jsonToAugment: {
|
|
389
511
|
'js/package.json': [
|
|
390
|
-
'prettier',
|
|
391
512
|
'devDependencies.flarum-tsconfig',
|
|
392
513
|
'devDependencies.typescript',
|
|
393
514
|
'devDependencies.typescript-coverage-report',
|
|
515
|
+
'scripts.clean-typings',
|
|
516
|
+
'scripts.build-typings',
|
|
517
|
+
'scripts.post-build-typings',
|
|
394
518
|
'scripts.check-typings',
|
|
395
519
|
'scripts.check-typings-coverage',
|
|
396
520
|
],
|
|
397
521
|
},
|
|
398
522
|
needsTemplateParams: [],
|
|
523
|
+
inferEnabled: async (_fs, paths) => {
|
|
524
|
+
return (0, fs_1.existsSync)(paths.package('js/tsconfig.json'));
|
|
525
|
+
},
|
|
399
526
|
};
|
|
400
527
|
case 'bundlewatch':
|
|
401
528
|
return {
|
|
@@ -408,6 +535,9 @@ function moduleNameToDef(name) {
|
|
|
408
535
|
filesToReplace: ['js/.bundlewatch.config.json'],
|
|
409
536
|
jsonToAugment: {},
|
|
410
537
|
needsTemplateParams: [],
|
|
538
|
+
inferEnabled: async (_fs, paths) => {
|
|
539
|
+
return (0, fs_1.existsSync)(paths.package('js/.bundlewatch.config.json'));
|
|
540
|
+
},
|
|
411
541
|
};
|
|
412
542
|
case 'backendTesting':
|
|
413
543
|
return {
|
|
@@ -426,7 +556,7 @@ function moduleNameToDef(name) {
|
|
|
426
556
|
],
|
|
427
557
|
jsonToAugment: {
|
|
428
558
|
'composer.json': [
|
|
429
|
-
'autoload-dev.psr-4.${params.
|
|
559
|
+
'autoload-dev.psr-4.${params.packageNamespace}\\Tests\\',
|
|
430
560
|
'scripts.test',
|
|
431
561
|
'scripts.test:unit',
|
|
432
562
|
'scripts.test:integration',
|
|
@@ -438,7 +568,10 @@ function moduleNameToDef(name) {
|
|
|
438
568
|
'require-dev.flarum/testing',
|
|
439
569
|
],
|
|
440
570
|
},
|
|
441
|
-
needsTemplateParams: ['
|
|
571
|
+
needsTemplateParams: ['packageNamespace'],
|
|
572
|
+
inferEnabled: async (_fs, paths) => {
|
|
573
|
+
return (0, fs_1.existsSync)(paths.package('tests'));
|
|
574
|
+
},
|
|
442
575
|
};
|
|
443
576
|
case 'editorConfig':
|
|
444
577
|
return {
|
|
@@ -460,9 +593,7 @@ function moduleNameToDef(name) {
|
|
|
460
593
|
defaultEnabled: true,
|
|
461
594
|
shortDescription: 'StyleCI config file',
|
|
462
595
|
dependsOn: [],
|
|
463
|
-
filesToReplace: [
|
|
464
|
-
{ path: '.styleci.yml', monorepoPath: '.styleci.yml' },
|
|
465
|
-
],
|
|
596
|
+
filesToReplace: [{ path: '.styleci.yml', monorepoPath: '.styleci.yml', requireMonorepo: false }],
|
|
466
597
|
jsonToAugment: {},
|
|
467
598
|
needsTemplateParams: [],
|
|
468
599
|
};
|
|
@@ -475,9 +606,9 @@ function genExtScaffolder() {
|
|
|
475
606
|
return cached;
|
|
476
607
|
const moduleStatusCache = {
|
|
477
608
|
get: async (module, fs, paths) => {
|
|
478
|
-
var _a, _b, _c
|
|
609
|
+
var _a, _b, _c;
|
|
479
610
|
const json = (0, composer_1.getComposerJson)(fs, paths);
|
|
480
|
-
return !module.togglable || ((
|
|
611
|
+
return !module.togglable || ((_c = (_b = (_a = json === null || json === void 0 ? void 0 : json.extra) === null || _a === void 0 ? void 0 : _a['flarum-cli']) === null || _b === void 0 ? void 0 : _b.modules) === null || _c === void 0 ? void 0 : _c[module.name]);
|
|
481
612
|
},
|
|
482
613
|
set: async (module, enabled, fs, paths) => {
|
|
483
614
|
const json = {
|
|
@@ -493,11 +624,14 @@ function genExtScaffolder() {
|
|
|
493
624
|
},
|
|
494
625
|
};
|
|
495
626
|
const excludeScaffoldingFunc = (fs, paths) => {
|
|
496
|
-
var _a, _b, _c;
|
|
627
|
+
var _a, _b, _c, _d, _e, _f;
|
|
497
628
|
const json = (0, composer_1.getComposerJson)(fs, paths);
|
|
498
|
-
return
|
|
629
|
+
return {
|
|
630
|
+
files: (_c = (_b = (_a = json === null || json === void 0 ? void 0 : json.extra) === null || _a === void 0 ? void 0 : _a['flarum-cli']) === null || _b === void 0 ? void 0 : _b.excludeScaffolding) !== null && _c !== void 0 ? _c : [],
|
|
631
|
+
configKeys: (_f = (_e = (_d = json === null || json === void 0 ? void 0 : json.extra) === null || _d === void 0 ? void 0 : _d['flarum-cli']) === null || _e === void 0 ? void 0 : _e.excludeScaffoldingConfigKeys) !== null && _f !== void 0 ? _f : {},
|
|
632
|
+
};
|
|
499
633
|
};
|
|
500
|
-
const scaffolder = new scaffolder_1.Scaffolder((0,
|
|
634
|
+
const scaffolder = new scaffolder_1.Scaffolder((0, path_1.resolve)(__dirname, '../../boilerplate/skeleton/extension'), moduleStatusCache, excludeScaffoldingFunc);
|
|
501
635
|
for (const name of exports.EXTENSION_MODULES) {
|
|
502
636
|
scaffolder.registerModule(moduleNameToDef(name));
|
|
503
637
|
}
|
package/lib/steps/js/base.js
CHANGED
|
@@ -13,7 +13,7 @@ class BaseJsStep {
|
|
|
13
13
|
}
|
|
14
14
|
async run(fs, paths, io, _providers) {
|
|
15
15
|
const fsEditor = (0, mem_fs_editor_1.create)(fs);
|
|
16
|
-
const frontend = await io.getParam({ name: 'frontend', type: 'text' });
|
|
16
|
+
const frontend = await io.getParam({ name: 'frontend', message: 'Frontend', type: 'text' });
|
|
17
17
|
let frontends = [frontend];
|
|
18
18
|
if (frontend === 'common') {
|
|
19
19
|
frontends = ['admin', 'forum'];
|
|
@@ -27,9 +27,7 @@ class BaseJsStep {
|
|
|
27
27
|
const currContents = fsEditor.read(match);
|
|
28
28
|
const imports = await this.getImports(frontend, paths, io);
|
|
29
29
|
const definition = await this.getDefinition(io);
|
|
30
|
-
const newContents = currContents
|
|
31
|
-
.replace(INIT_REGEX, `$1\n ${definition}\n`)
|
|
32
|
-
.replace(IMPORTS_REGEX, `$1${imports}\n\n$5`);
|
|
30
|
+
const newContents = currContents.replace(INIT_REGEX, `$1\n ${definition}\n`).replace(IMPORTS_REGEX, `$1${imports}\n\n$5`);
|
|
33
31
|
fsEditor.write(match, newContents);
|
|
34
32
|
});
|
|
35
33
|
}
|
package/lib/steps/js/model.js
CHANGED
|
@@ -9,14 +9,14 @@ class GenerateModelDefinition extends base_1.BaseJsStep {
|
|
|
9
9
|
this.exposes = [];
|
|
10
10
|
}
|
|
11
11
|
async getDefinition(io) {
|
|
12
|
-
const className = await io.getParam({ name: 'className', type: 'text' });
|
|
13
|
-
let modelType = await io.getParam({ name: 'modelType', type: 'text' });
|
|
12
|
+
const className = await io.getParam({ name: 'className', message: 'Class name', type: 'text' });
|
|
13
|
+
let modelType = await io.getParam({ name: 'modelType', message: 'Model type', type: 'text' });
|
|
14
14
|
modelType = modelType.includes('-') ? `['${modelType}']` : `.${modelType}`;
|
|
15
15
|
return `app.store.models${modelType} = ${className};`;
|
|
16
16
|
}
|
|
17
17
|
async getImports(frontend, paths, io) {
|
|
18
|
-
const className = await io.getParam({ name: 'className', type: 'text' });
|
|
19
|
-
const classNamespace = await io.getParam({ name: 'classNamespace', type: 'text' });
|
|
18
|
+
const className = await io.getParam({ name: 'className', message: 'Class name', type: 'text' });
|
|
19
|
+
const classNamespace = await io.getParam({ name: 'classNamespace', message: 'Class namespace', type: 'text' });
|
|
20
20
|
const importPath = this.importPath(frontend, classNamespace);
|
|
21
21
|
return `import ${className} from '${importPath}';`;
|
|
22
22
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ComposerInstall = void 0;
|
|
4
|
-
const
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
5
|
class ComposerInstall {
|
|
6
6
|
constructor() {
|
|
7
7
|
this.type = 'Run composer install/update';
|
|
@@ -9,7 +9,7 @@ class ComposerInstall {
|
|
|
9
9
|
this.exposes = [];
|
|
10
10
|
}
|
|
11
11
|
async run(fs, paths, _paramProvider, _providers) {
|
|
12
|
-
(0,
|
|
12
|
+
(0, child_process_1.execSync)('composer update', { cwd: paths.package('') });
|
|
13
13
|
return fs;
|
|
14
14
|
}
|
|
15
15
|
getExposed() {
|
package/lib/steps/misc/git.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { DefaultProviders, Step } from 'boilersmith/step-manager';
|
|
|
5
5
|
export declare class GitInit implements Step {
|
|
6
6
|
type: string;
|
|
7
7
|
composable: boolean;
|
|
8
|
-
run(fs: Store,
|
|
8
|
+
run(fs: Store, paths: Paths, _paramProvider: IO, _providers: DefaultProviders): Promise<Store>;
|
|
9
9
|
exposes: never[];
|
|
10
10
|
getExposed(): Record<string, unknown>;
|
|
11
11
|
}
|
package/lib/steps/misc/git.js
CHANGED
|
@@ -9,8 +9,8 @@ class GitInit {
|
|
|
9
9
|
this.composable = false;
|
|
10
10
|
this.exposes = [];
|
|
11
11
|
}
|
|
12
|
-
async run(fs,
|
|
13
|
-
(0, simple_git_1.default)().init();
|
|
12
|
+
async run(fs, paths, _paramProvider, _providers) {
|
|
13
|
+
(0, simple_git_1.default)(paths.package()).init();
|
|
14
14
|
return fs;
|
|
15
15
|
}
|
|
16
16
|
getExposed() {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Store } from 'mem-fs';
|
|
2
|
+
import { IO } from 'boilersmith/io';
|
|
3
|
+
import { Paths } from 'boilersmith/paths';
|
|
4
|
+
import { DefaultProviders, Step } from 'boilersmith/step-manager';
|
|
5
|
+
export declare class NpmInstall implements Step {
|
|
6
|
+
type: string;
|
|
7
|
+
composable: boolean;
|
|
8
|
+
run(fs: Store, paths: Paths, _paramProvider: IO, _providers: DefaultProviders): Promise<Store>;
|
|
9
|
+
exposes: never[];
|
|
10
|
+
getExposed(): Record<string, unknown>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NpmInstall = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
class NpmInstall {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.type = 'Run npm install';
|
|
8
|
+
this.composable = false;
|
|
9
|
+
this.exposes = [];
|
|
10
|
+
}
|
|
11
|
+
async run(fs, paths, _paramProvider, _providers) {
|
|
12
|
+
(0, child_process_1.execSync)('npm install', { cwd: paths.package('js') });
|
|
13
|
+
return fs;
|
|
14
|
+
}
|
|
15
|
+
getExposed() {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.NpmInstall = NpmInstall;
|
package/lib/steps/misc/yarn.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.YarnInstall = void 0;
|
|
4
|
-
const
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
5
|
class YarnInstall {
|
|
6
6
|
constructor() {
|
|
7
7
|
this.type = 'Run yarn install';
|
|
@@ -9,7 +9,7 @@ class YarnInstall {
|
|
|
9
9
|
this.exposes = [];
|
|
10
10
|
}
|
|
11
11
|
async run(fs, paths, _paramProvider, _providers) {
|
|
12
|
-
(0,
|
|
12
|
+
(0, child_process_1.execSync)('yarn install', { cwd: paths.package('js') });
|
|
13
13
|
return fs;
|
|
14
14
|
}
|
|
15
15
|
getExposed() {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Store } from 'mem-fs';
|
|
2
|
+
import { IO } from 'boilersmith/io';
|
|
3
|
+
import { Paths } from 'boilersmith/paths';
|
|
4
|
+
import { Step } from 'boilersmith/step-manager';
|
|
5
|
+
import { FlarumProviders } from '../../providers';
|
|
6
|
+
import { Scaffolder } from 'boilersmith/scaffolding/scaffolder';
|
|
7
|
+
import { ExtensionModules, ExtensionParams } from '../gen-ext-scaffolder';
|
|
8
|
+
export declare class MonorepoCreate implements Step<FlarumProviders> {
|
|
9
|
+
type: string;
|
|
10
|
+
composable: boolean;
|
|
11
|
+
protected monorepoConfPath?: string;
|
|
12
|
+
protected scaffolder: Scaffolder<ExtensionParams, ExtensionModules>;
|
|
13
|
+
constructor(scaffolder: Scaffolder<ExtensionParams, ExtensionModules>, monorepoConfPath?: string);
|
|
14
|
+
run(fs: Store, paths: Paths, io: IO, providers: FlarumProviders): Promise<Store>;
|
|
15
|
+
exposes: never[];
|
|
16
|
+
getExposed(): Record<string, unknown>;
|
|
17
|
+
}
|