@grafana/create-plugin 0.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/.eslintrc +6 -0
- package/.github/workflows/create-release.yml +49 -0
- package/.github/workflows/npm-bump-version.yml +51 -0
- package/.github/workflows/test.yml +31 -0
- package/.prettierrc +10 -0
- package/CONTRIBUTING.md +42 -0
- package/README.md +143 -0
- package/dist/bin/run.js +17 -0
- package/dist/commands/generate.command.js +56 -0
- package/dist/commands/generate.plopfile.js +119 -0
- package/dist/commands/index.js +19 -0
- package/dist/commands/migrate.command.js +133 -0
- package/dist/commands/update.command.js +101 -0
- package/dist/constants.js +74 -0
- package/dist/utils/tests/utils.files.test.js +30 -0
- package/dist/utils/tests/utils.handlebars.test.js +26 -0
- package/dist/utils/tests/utils.npm.test.js +138 -0
- package/dist/utils/tests/utils.plugin.test.js +20 -0
- package/dist/utils/tests/utils.templates.test.js +32 -0
- package/dist/utils/utils.console.js +41 -0
- package/dist/utils/utils.files.js +61 -0
- package/dist/utils/utils.handlebars.js +73 -0
- package/dist/utils/utils.npm.js +162 -0
- package/dist/utils/utils.plugin.js +14 -0
- package/dist/utils/utils.templates.js +77 -0
- package/docs/example.mp4 +0 -0
- package/jest.config.js +20 -0
- package/package.json +69 -0
- package/src/bin/run.ts +15 -0
- package/src/commands/generate.command.ts +15 -0
- package/src/commands/generate.plopfile.ts +151 -0
- package/src/commands/index.ts +3 -0
- package/src/commands/migrate.command.ts +99 -0
- package/src/commands/update.command.ts +66 -0
- package/src/constants.ts +99 -0
- package/src/utils/tests/utils.files.test.ts +41 -0
- package/src/utils/tests/utils.handlebars.test.ts +35 -0
- package/src/utils/tests/utils.npm.test.ts +193 -0
- package/src/utils/tests/utils.plugin.test.ts +22 -0
- package/src/utils/tests/utils.templates.test.ts +44 -0
- package/src/utils/utils.console.ts +41 -0
- package/src/utils/utils.files.ts +65 -0
- package/src/utils/utils.handlebars.ts +47 -0
- package/src/utils/utils.npm.ts +189 -0
- package/src/utils/utils.plugin.ts +9 -0
- package/src/utils/utils.templates.ts +76 -0
- package/templates/_partials/backend-getting-started.md +20 -0
- package/templates/_partials/frontend-getting-started.md +59 -0
- package/templates/app/README.md +20 -0
- package/templates/app/src/components/App/App.test.tsx +32 -0
- package/templates/app/src/components/App/App.tsx +8 -0
- package/templates/app/src/components/App/index.tsx +1 -0
- package/templates/app/src/components/AppConfig/AppConfig.test.tsx +51 -0
- package/templates/app/src/components/AppConfig/AppConfig.tsx +92 -0
- package/templates/app/src/components/AppConfig/index.tsx +1 -0
- package/templates/app/src/module.ts +12 -0
- package/templates/app/src/plugin.json +33 -0
- package/templates/backend/Magefile.go +12 -0
- package/templates/backend/go.mod +5 -0
- package/templates/backend/go.sum +568 -0
- package/templates/backend/pkg/main.go +24 -0
- package/templates/backend/pkg/plugin/datasource.go +111 -0
- package/templates/backend/pkg/plugin/datasource_test.go +28 -0
- package/templates/common/.config/.eslintrc +12 -0
- package/templates/common/.config/.prettierrc.js +16 -0
- package/templates/common/.config/Dockerfile +15 -0
- package/templates/common/.config/README.md +115 -0
- package/templates/common/.config/jest-setup.js +24 -0
- package/templates/common/.config/jest.config.js +31 -0
- package/templates/common/.config/tsconfig.json +17 -0
- package/templates/common/.config/types/custom.d.ts +37 -0
- package/templates/common/.config/webpack/constants.ts +3 -0
- package/templates/common/.config/webpack/tsconfig.webpack.json +9 -0
- package/templates/common/.config/webpack/utils.ts +17 -0
- package/templates/common/.config/webpack/webpack.config.ts +187 -0
- package/templates/common/.eslintrc +3 -0
- package/templates/common/.nvmrc +1 -0
- package/templates/common/.prettierrc.js +4 -0
- package/templates/common/CHANGELOG.md +5 -0
- package/templates/common/LICENSE +201 -0
- package/templates/common/cypress/integration/01-smoke.spec.ts +10 -0
- package/templates/common/docker-compose.yaml +14 -0
- package/templates/common/jest-setup.js +2 -0
- package/templates/common/jest.config.js +4 -0
- package/templates/common/package.json +67 -0
- package/templates/common/src/README.md +5 -0
- package/templates/common/src/img/logo.svg +1 -0
- package/templates/common/tsconfig.json +3 -0
- package/templates/datasource/README.md +20 -0
- package/templates/datasource/src/components/ConfigEditor.tsx +83 -0
- package/templates/datasource/src/components/QueryEditor.tsx +50 -0
- package/templates/datasource/src/datasource.ts +46 -0
- package/templates/datasource/src/module.ts +9 -0
- package/templates/datasource/src/plugin.json +37 -0
- package/templates/datasource/src/types.ts +24 -0
- package/templates/github/ci/.github/workflows/ci.yml +76 -0
- package/templates/github/ci/.github/workflows/release.yml +165 -0
- package/templates/github/is-compatible/.github/workflows/is-compatible.yml +17 -0
- package/templates/panel/README.md +22 -0
- package/templates/panel/src/components/SimplePanel.tsx +62 -0
- package/templates/panel/src/module.test.ts +6 -0
- package/templates/panel/src/module.ts +40 -0
- package/templates/panel/src/plugin.json +33 -0
- package/templates/panel/src/types.ts +7 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.isFileStartingWith = exports.removeFilesInCwd = exports.getOnlyNotExistingInCwd = exports.getOnlyExistingInCwd = exports.readJsonFile = exports.isFile = exports.filterOutCommonFiles = void 0;
|
|
7
|
+
var path_1 = __importDefault(require("path"));
|
|
8
|
+
var fs_1 = __importDefault(require("fs"));
|
|
9
|
+
var constants_1 = require("../constants");
|
|
10
|
+
function filterOutCommonFiles(files, pluginType) {
|
|
11
|
+
var isFileCommonAndOverriden = function (file) {
|
|
12
|
+
return file.includes(constants_1.TEMPLATE_PATHS.common) &&
|
|
13
|
+
files.includes(file.replace(constants_1.TEMPLATE_PATHS.common, constants_1.TEMPLATE_PATHS[pluginType]));
|
|
14
|
+
};
|
|
15
|
+
return files.filter(function (file) { return (isFileCommonAndOverriden(file) ? false : true); });
|
|
16
|
+
}
|
|
17
|
+
exports.filterOutCommonFiles = filterOutCommonFiles;
|
|
18
|
+
function isFile(path) {
|
|
19
|
+
try {
|
|
20
|
+
return fs_1["default"].lstatSync(path).isFile();
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.isFile = isFile;
|
|
27
|
+
function readJsonFile(filename) {
|
|
28
|
+
if (!isFile(filename)) {
|
|
29
|
+
throw new Error("There is no \"".concat(path_1["default"].basename(filename), "\" file found at \"").concat(filename, "\". Make sure you run this command from a plugins root directory."));
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
return JSON.parse(fs_1["default"].readFileSync(filename).toString());
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
error.message = "Cannot parse the \"".concat(path_1["default"].basename(filename), "\" file at ").concat(filename, ".");
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.readJsonFile = readJsonFile;
|
|
40
|
+
function getOnlyExistingInCwd(files) {
|
|
41
|
+
return files.filter(function (file) { return fs_1["default"].existsSync(path_1["default"].join(process.cwd(), file)); });
|
|
42
|
+
}
|
|
43
|
+
exports.getOnlyExistingInCwd = getOnlyExistingInCwd;
|
|
44
|
+
function getOnlyNotExistingInCwd(files) {
|
|
45
|
+
return files.filter(function (file) { return !fs_1["default"].existsSync(path_1["default"].join(process.cwd(), file)); });
|
|
46
|
+
}
|
|
47
|
+
exports.getOnlyNotExistingInCwd = getOnlyNotExistingInCwd;
|
|
48
|
+
function removeFilesInCwd(files) {
|
|
49
|
+
for (var _i = 0, files_1 = files; _i < files_1.length; _i++) {
|
|
50
|
+
var file = files_1[_i];
|
|
51
|
+
fs_1["default"].rmSync(path_1["default"].join(process.cwd(), file), { recursive: true, force: true });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.removeFilesInCwd = removeFilesInCwd;
|
|
55
|
+
function isFileStartingWith(file, filter) {
|
|
56
|
+
if (Array.isArray(filter)) {
|
|
57
|
+
return filter.some(function (f) { return file.startsWith(f); });
|
|
58
|
+
}
|
|
59
|
+
return file.startsWith(filter);
|
|
60
|
+
}
|
|
61
|
+
exports.isFileStartingWith = isFileStartingWith;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
var _this = this;
|
|
29
|
+
exports.__esModule = true;
|
|
30
|
+
exports.renderHandlebarsTemplate = exports.registerHandlebarsHelpers = exports.normalizeId = exports.ifEq = void 0;
|
|
31
|
+
var handlebars_1 = __importDefault(require("handlebars"));
|
|
32
|
+
var changeCase = __importStar(require("change-case"));
|
|
33
|
+
var title_case_1 = __importDefault(require("title-case"));
|
|
34
|
+
var upper_case_1 = __importDefault(require("upper-case"));
|
|
35
|
+
var lower_case_1 = __importDefault(require("lower-case"));
|
|
36
|
+
var ifEq = function (a, b, options) {
|
|
37
|
+
return a === b ? options.fn(_this) : options.inverse(_this);
|
|
38
|
+
};
|
|
39
|
+
exports.ifEq = ifEq;
|
|
40
|
+
var normalizeId = function (pluginName, orgName, type) {
|
|
41
|
+
var re = new RegExp("-?".concat(type, "$"), 'i');
|
|
42
|
+
var newPluginName = pluginName.replace(re, '');
|
|
43
|
+
return changeCase.paramCase(orgName) + '-' + changeCase.paramCase(newPluginName) + "-".concat(type);
|
|
44
|
+
};
|
|
45
|
+
exports.normalizeId = normalizeId;
|
|
46
|
+
function registerHandlebarsHelpers() {
|
|
47
|
+
var helpers = {
|
|
48
|
+
camelCase: changeCase.camelCase,
|
|
49
|
+
snakeCase: changeCase.snakeCase,
|
|
50
|
+
dotCase: changeCase.dotCase,
|
|
51
|
+
pathCase: changeCase.pathCase,
|
|
52
|
+
lowerCase: lower_case_1["default"],
|
|
53
|
+
upperCase: upper_case_1["default"],
|
|
54
|
+
sentenceCase: changeCase.sentenceCase,
|
|
55
|
+
constantCase: changeCase.constantCase,
|
|
56
|
+
titleCase: title_case_1["default"],
|
|
57
|
+
dashCase: changeCase.paramCase,
|
|
58
|
+
kabobCase: changeCase.paramCase,
|
|
59
|
+
kebabCase: changeCase.paramCase,
|
|
60
|
+
properCase: changeCase.pascalCase,
|
|
61
|
+
pascalCase: changeCase.pascalCase,
|
|
62
|
+
if_eq: exports.ifEq
|
|
63
|
+
};
|
|
64
|
+
Object.keys(helpers).forEach(function (helperName) {
|
|
65
|
+
return handlebars_1["default"].registerHelper(helperName, helpers[helperName]);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
exports.registerHandlebarsHelpers = registerHandlebarsHelpers;
|
|
69
|
+
function renderHandlebarsTemplate(template, data) {
|
|
70
|
+
registerHandlebarsHelpers();
|
|
71
|
+
return handlebars_1["default"].compile(template)(data);
|
|
72
|
+
}
|
|
73
|
+
exports.renderHandlebarsTemplate = renderHandlebarsTemplate;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
exports.__esModule = true;
|
|
17
|
+
exports.updateNpmScripts = exports.removeNpmDependencies = exports.getRemovableNpmDependencies = exports.getUpdatableNpmDependencies = exports.getPackageJsonUpdates = exports.updateNpmDependencies = exports.updatePackageJson = exports.hasNpmDependenciesToUpdate = exports.getPackageJsonUpdatesAsText = exports.getNpmDependencyUpdatesAsText = exports.writePackageJson = exports.getLatestPackageJson = exports.getPackageJson = void 0;
|
|
18
|
+
var path_1 = __importDefault(require("path"));
|
|
19
|
+
var fs_1 = __importDefault(require("fs"));
|
|
20
|
+
var semver_1 = __importDefault(require("semver"));
|
|
21
|
+
var utils_files_1 = require("./utils.files");
|
|
22
|
+
var utils_templates_1 = require("./utils.templates");
|
|
23
|
+
var constants_1 = require("../constants");
|
|
24
|
+
function getPackageJson() {
|
|
25
|
+
return (0, utils_files_1.readJsonFile)(path_1["default"].join(process.cwd(), 'package.json'));
|
|
26
|
+
}
|
|
27
|
+
exports.getPackageJson = getPackageJson;
|
|
28
|
+
function getLatestPackageJson() {
|
|
29
|
+
var packageJsonPath = path_1["default"].join(constants_1.TEMPLATE_PATHS.common, 'package.json');
|
|
30
|
+
var data = (0, utils_templates_1.getTemplateData)();
|
|
31
|
+
return JSON.parse((0, utils_templates_1.renderTemplateFromFile)(packageJsonPath, data));
|
|
32
|
+
}
|
|
33
|
+
exports.getLatestPackageJson = getLatestPackageJson;
|
|
34
|
+
function writePackageJson(json) {
|
|
35
|
+
return fs_1["default"].writeFileSync(path_1["default"].join(process.cwd(), 'package.json'), "".concat(JSON.stringify(json, null, 2), "\n"));
|
|
36
|
+
}
|
|
37
|
+
exports.writePackageJson = writePackageJson;
|
|
38
|
+
function getNpmDependencyUpdatesAsText(dependencyUpdates) {
|
|
39
|
+
return Object.entries(dependencyUpdates)
|
|
40
|
+
.map(function (_a) {
|
|
41
|
+
var packageName = _a[0], _b = _a[1], prev = _b.prev, next = _b.next;
|
|
42
|
+
if (!prev) {
|
|
43
|
+
return "`".concat(packageName, "` - `").concat(next, "` (new)");
|
|
44
|
+
}
|
|
45
|
+
return "`".concat(packageName, "` - `").concat(prev, "` -> `").concat(next, "`");
|
|
46
|
+
})
|
|
47
|
+
.join('\n ');
|
|
48
|
+
}
|
|
49
|
+
exports.getNpmDependencyUpdatesAsText = getNpmDependencyUpdatesAsText;
|
|
50
|
+
function getPackageJsonUpdatesAsText(options) {
|
|
51
|
+
if (options === void 0) { options = {}; }
|
|
52
|
+
var asText = '';
|
|
53
|
+
var _a = getPackageJsonUpdates(options), dependencyUpdates = _a.dependencyUpdates, devDependencyUpdates = _a.devDependencyUpdates;
|
|
54
|
+
if (Object.keys(dependencyUpdates).length > 0) {
|
|
55
|
+
asText += "\n\n **Dependencies**\n ".concat(getNpmDependencyUpdatesAsText(dependencyUpdates));
|
|
56
|
+
}
|
|
57
|
+
if (Object.keys(devDependencyUpdates).length > 0) {
|
|
58
|
+
asText += "\n\n **Dev Dependencies**\n ".concat(getNpmDependencyUpdatesAsText(devDependencyUpdates));
|
|
59
|
+
}
|
|
60
|
+
return asText;
|
|
61
|
+
}
|
|
62
|
+
exports.getPackageJsonUpdatesAsText = getPackageJsonUpdatesAsText;
|
|
63
|
+
function hasNpmDependenciesToUpdate(options) {
|
|
64
|
+
if (options === void 0) { options = {}; }
|
|
65
|
+
var _a = getPackageJsonUpdates(options), dependencyUpdates = _a.dependencyUpdates, devDependencyUpdates = _a.devDependencyUpdates;
|
|
66
|
+
return Object.keys(dependencyUpdates).length > 0 || Object.keys(devDependencyUpdates).length > 0;
|
|
67
|
+
}
|
|
68
|
+
exports.hasNpmDependenciesToUpdate = hasNpmDependenciesToUpdate;
|
|
69
|
+
function updatePackageJson(options) {
|
|
70
|
+
if (options === void 0) { options = {}; }
|
|
71
|
+
var packageJson = getPackageJson();
|
|
72
|
+
var _a = getPackageJsonUpdates(options), dependencyUpdates = _a.dependencyUpdates, devDependencyUpdates = _a.devDependencyUpdates;
|
|
73
|
+
packageJson.dependencies = updateNpmDependencies(packageJson.dependencies, dependencyUpdates);
|
|
74
|
+
packageJson.devDependencies = updateNpmDependencies(packageJson.devDependencies, devDependencyUpdates);
|
|
75
|
+
writePackageJson(packageJson);
|
|
76
|
+
}
|
|
77
|
+
exports.updatePackageJson = updatePackageJson;
|
|
78
|
+
function updateNpmDependencies(dependencies, updateSummary) {
|
|
79
|
+
var updatedDependencies = __assign({}, dependencies);
|
|
80
|
+
for (var _i = 0, _a = Object.entries(updateSummary); _i < _a.length; _i++) {
|
|
81
|
+
var _b = _a[_i], packageName = _b[0], summary = _b[1];
|
|
82
|
+
updatedDependencies[packageName] = summary.next;
|
|
83
|
+
}
|
|
84
|
+
return updatedDependencies;
|
|
85
|
+
}
|
|
86
|
+
exports.updateNpmDependencies = updateNpmDependencies;
|
|
87
|
+
function getPackageJsonUpdates(options) {
|
|
88
|
+
if (options === void 0) { options = {}; }
|
|
89
|
+
var packageJson = getPackageJson();
|
|
90
|
+
var newPackageJson = getLatestPackageJson();
|
|
91
|
+
var dependencies = packageJson.dependencies || {};
|
|
92
|
+
var devDependencies = packageJson.devDependencies || {};
|
|
93
|
+
var newDependencies = newPackageJson.dependencies || {};
|
|
94
|
+
var newDevDependencies = newPackageJson.devDependencies || {};
|
|
95
|
+
var dependencyUpdates = getUpdatableNpmDependencies(dependencies, newDependencies, options);
|
|
96
|
+
var devDependencyUpdates = getUpdatableNpmDependencies(devDependencies, newDevDependencies, options);
|
|
97
|
+
return {
|
|
98
|
+
dependencyUpdates: dependencyUpdates,
|
|
99
|
+
devDependencyUpdates: devDependencyUpdates
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
exports.getPackageJsonUpdates = getPackageJsonUpdates;
|
|
103
|
+
function getUpdatableNpmDependencies(prevDeps, nextDeps, options) {
|
|
104
|
+
if (options === void 0) { options = {}; }
|
|
105
|
+
var updateSummary = {};
|
|
106
|
+
for (var _i = 0, _a = Object.entries(nextDeps); _i < _a.length; _i++) {
|
|
107
|
+
var _b = _a[_i], packageName = _b[0], newSemverRange = _b[1];
|
|
108
|
+
var currentSemverRange = prevDeps[packageName];
|
|
109
|
+
if (!currentSemverRange) {
|
|
110
|
+
updateSummary[packageName] = { prev: null, next: newSemverRange };
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (newSemverRange === currentSemverRange) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (!semver_1["default"].validRange(newSemverRange) || !semver_1["default"].validRange(currentSemverRange)) {
|
|
117
|
+
updateSummary[packageName] = { prev: currentSemverRange, next: newSemverRange };
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
var newSemverVersion = semver_1["default"].minVersion(newSemverRange);
|
|
121
|
+
var currentSemverVersion = semver_1["default"].minVersion(currentSemverRange);
|
|
122
|
+
if (!newSemverVersion || !semver_1["default"].valid(newSemverVersion)) {
|
|
123
|
+
console.warn("Skipping: invalid new semver version \"".concat(newSemverRange, "\" for \"").concat(packageName, "\""));
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (!currentSemverVersion || !semver_1["default"].valid(currentSemverVersion)) {
|
|
127
|
+
console.warn("Skipping: invalid current semver version \"".concat(currentSemverRange, "\" for \"").concat(packageName, "\""));
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (!options.onlyOutdated || semver_1["default"].gte(newSemverVersion, currentSemverVersion)) {
|
|
131
|
+
updateSummary[packageName] = { prev: currentSemverRange, next: newSemverRange };
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return updateSummary;
|
|
136
|
+
}
|
|
137
|
+
exports.getUpdatableNpmDependencies = getUpdatableNpmDependencies;
|
|
138
|
+
function getRemovableNpmDependencies(packageNames) {
|
|
139
|
+
var _a = getPackageJson(), _b = _a.dependencies, dependencies = _b === void 0 ? {} : _b, _c = _a.devDependencies, devDependencies = _c === void 0 ? {} : _c;
|
|
140
|
+
return packageNames.filter(function (packageName) { return dependencies[packageName] || devDependencies[packageName]; });
|
|
141
|
+
}
|
|
142
|
+
exports.getRemovableNpmDependencies = getRemovableNpmDependencies;
|
|
143
|
+
function removeNpmDependencies(packageNames, _a) {
|
|
144
|
+
var _b = _a === void 0 ? {} : _a, _c = _b.devOnly, devOnly = _c === void 0 ? false : _c;
|
|
145
|
+
var packageJson = getPackageJson();
|
|
146
|
+
for (var _i = 0, packageNames_1 = packageNames; _i < packageNames_1.length; _i++) {
|
|
147
|
+
var packageName = packageNames_1[_i];
|
|
148
|
+
if (!devOnly) {
|
|
149
|
+
delete packageJson.dependencies[packageName];
|
|
150
|
+
}
|
|
151
|
+
delete packageJson.devDependencies[packageName];
|
|
152
|
+
}
|
|
153
|
+
writePackageJson(packageJson);
|
|
154
|
+
}
|
|
155
|
+
exports.removeNpmDependencies = removeNpmDependencies;
|
|
156
|
+
function updateNpmScripts() {
|
|
157
|
+
var packageJson = getPackageJson();
|
|
158
|
+
var latestPackageJson = getLatestPackageJson();
|
|
159
|
+
packageJson.scripts = __assign(__assign({}, packageJson.scripts), latestPackageJson.scripts);
|
|
160
|
+
writePackageJson(packageJson);
|
|
161
|
+
}
|
|
162
|
+
exports.updateNpmScripts = updateNpmScripts;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.getPluginJson = void 0;
|
|
7
|
+
var path_1 = __importDefault(require("path"));
|
|
8
|
+
var utils_files_1 = require("./utils.files");
|
|
9
|
+
function getPluginJson(srcDir) {
|
|
10
|
+
var srcPath = srcDir || path_1["default"].join(process.cwd(), 'src');
|
|
11
|
+
var pluginJsonPath = path_1["default"].join(srcPath, 'plugin.json');
|
|
12
|
+
return (0, utils_files_1.readJsonFile)(pluginJsonPath);
|
|
13
|
+
}
|
|
14
|
+
exports.getPluginJson = getPluginJson;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
14
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
15
|
+
if (ar || !(i in from)) {
|
|
16
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
17
|
+
ar[i] = from[i];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
21
|
+
};
|
|
22
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
23
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
|
+
};
|
|
25
|
+
exports.__esModule = true;
|
|
26
|
+
exports.getTemplateData = exports.renderTemplateFromFile = exports.compileSingleTemplateFile = exports.compileTemplateFiles = exports.getProjectRelativeTemplatePath = exports.getTemplateFiles = void 0;
|
|
27
|
+
var glob_1 = __importDefault(require("glob"));
|
|
28
|
+
var path_1 = __importDefault(require("path"));
|
|
29
|
+
var fs_1 = __importDefault(require("fs"));
|
|
30
|
+
var mkdirp_1 = __importDefault(require("mkdirp"));
|
|
31
|
+
var utils_files_1 = require("./utils.files");
|
|
32
|
+
var utils_handlebars_1 = require("./utils.handlebars");
|
|
33
|
+
var utils_plugin_1 = require("./utils.plugin");
|
|
34
|
+
var constants_1 = require("../constants");
|
|
35
|
+
function getTemplateFiles(pluginType, filter) {
|
|
36
|
+
var commonFiles = glob_1["default"].sync("".concat(constants_1.TEMPLATE_PATHS.common, "/**"), { dot: true });
|
|
37
|
+
var pluginTypeSpecificFiles = glob_1["default"].sync("".concat(constants_1.TEMPLATE_PATHS[pluginType], "/**"), { dot: true });
|
|
38
|
+
var templateFiles = (0, utils_files_1.filterOutCommonFiles)(__spreadArray(__spreadArray([], commonFiles, true), pluginTypeSpecificFiles, true), pluginType);
|
|
39
|
+
if (filter) {
|
|
40
|
+
return templateFiles.filter(function (file) {
|
|
41
|
+
var projectRelativePath = getProjectRelativeTemplatePath(file, pluginType);
|
|
42
|
+
return (0, utils_files_1.isFileStartingWith)(projectRelativePath, filter);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return templateFiles;
|
|
46
|
+
}
|
|
47
|
+
exports.getTemplateFiles = getTemplateFiles;
|
|
48
|
+
function getProjectRelativeTemplatePath(file, pluginType) {
|
|
49
|
+
return file.replace(constants_1.TEMPLATE_PATHS.common, '').replace(constants_1.TEMPLATE_PATHS[pluginType], '').replace(/^\/+/, '');
|
|
50
|
+
}
|
|
51
|
+
exports.getProjectRelativeTemplatePath = getProjectRelativeTemplatePath;
|
|
52
|
+
function compileTemplateFiles(filter, data) {
|
|
53
|
+
var type = (0, utils_plugin_1.getPluginJson)().type;
|
|
54
|
+
getTemplateFiles(type, filter).forEach(function (file) { return compileSingleTemplateFile(type, file, data); });
|
|
55
|
+
}
|
|
56
|
+
exports.compileTemplateFiles = compileTemplateFiles;
|
|
57
|
+
function compileSingleTemplateFile(pluginType, templateFile, data) {
|
|
58
|
+
if (!(0, utils_files_1.isFile)(templateFile)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
var rendered = renderTemplateFromFile(templateFile, data);
|
|
62
|
+
var relativeExportPath = templateFile.replace(constants_1.TEMPLATE_PATHS.common, '').replace(constants_1.TEMPLATE_PATHS[pluginType], '');
|
|
63
|
+
var exportPath = path_1["default"].join(constants_1.EXPORT_PATH_PREFIX, relativeExportPath);
|
|
64
|
+
mkdirp_1["default"].sync(path_1["default"].dirname(exportPath));
|
|
65
|
+
fs_1["default"].writeFileSync(exportPath, rendered);
|
|
66
|
+
}
|
|
67
|
+
exports.compileSingleTemplateFile = compileSingleTemplateFile;
|
|
68
|
+
function renderTemplateFromFile(templateFile, data) {
|
|
69
|
+
return (0, utils_handlebars_1.renderHandlebarsTemplate)(fs_1["default"].readFileSync(templateFile).toString(), data);
|
|
70
|
+
}
|
|
71
|
+
exports.renderTemplateFromFile = renderTemplateFromFile;
|
|
72
|
+
function getTemplateData() {
|
|
73
|
+
var _a, _b, _c;
|
|
74
|
+
var pluginJson = (0, utils_plugin_1.getPluginJson)();
|
|
75
|
+
return __assign(__assign({}, constants_1.EXTRA_TEMPLATE_VARIABLES), { pluginId: pluginJson.id, pluginName: pluginJson.name, pluginDescription: (_a = pluginJson.info) === null || _a === void 0 ? void 0 : _a.description, hasBackend: Boolean(pluginJson.backend), orgName: (_c = (_b = pluginJson.info) === null || _b === void 0 ? void 0 : _b.author) === null || _c === void 0 ? void 0 : _c.name, pluginType: pluginJson.type });
|
|
76
|
+
}
|
|
77
|
+
exports.getTemplateData = getTemplateData;
|
package/docs/example.mp4
ADDED
|
Binary file
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
testMatch: ['<rootDir>/src/**/*.{spec,test,jest}.{js,jsx,ts,tsx}'],
|
|
3
|
+
transform: {
|
|
4
|
+
'^.+\\.(t|j)sx?$': [
|
|
5
|
+
'@swc/jest',
|
|
6
|
+
{
|
|
7
|
+
sourceMaps: true,
|
|
8
|
+
jsc: {
|
|
9
|
+
parser: {
|
|
10
|
+
syntax: 'typescript',
|
|
11
|
+
tsx: true,
|
|
12
|
+
decorators: false,
|
|
13
|
+
dynamicImport: true,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
modulePathIgnorePatterns: ['<rootDir>/templates/'],
|
|
20
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@grafana/create-plugin",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"repository": "git@github.com:grafana/create-plugin.git",
|
|
6
|
+
"author": "Grafana",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"bin": "./dist/bin/run.js",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"clean": "rm -rf ./dist ./generated",
|
|
11
|
+
"clean-generated": "find ./generated -not -path \"./generated/node_modules*\" -not -path \"./generated\" -not -path \"./generated/yarn.lock\" -print0 | xargs -0 -I {} rm -rf {}",
|
|
12
|
+
"build": "yarn clean && tsc && chmod +x ./dist/bin/run.js",
|
|
13
|
+
"dev": "CREATE_PLUGIN_DEV=true nodemon --exec 'tsc'",
|
|
14
|
+
"dev-app": "CREATE_PLUGIN_DEV=true nodemon --exec 'yarn generate-app'",
|
|
15
|
+
"dev-panel": "CREATE_PLUGIN_DEV=true nodemon --exec 'yarn generate-panel'",
|
|
16
|
+
"dev-datasource": "CREATE_PLUGIN_DEV=true nodemon --exec 'yarn generate-datasource'",
|
|
17
|
+
"generate-app": "tsc && yarn clean-generated && CREATE_PLUGIN_DEV=true node ./dist/bin/run.js -- create-plugin 'Sample app' 'sample-org' 'This is a sample app.' 'app' 't' 't' 't'",
|
|
18
|
+
"generate-panel": "tsc && yarn clean-generated && CREATE_PLUGIN_DEV=true node ./dist/bin/run.js -- create-plugin 'Sample panel' 'sample-org' 'This is a sample panel.' 'panel' 't' 't' 't'",
|
|
19
|
+
"generate-datasource": "tsc && yarn clean-generated && CREATE_PLUGIN_DEV=true node ./dist/bin/run.js -- create-plugin 'Sample datasource' 'sample-org' 'This is a sample datasource.' 'datasource' 't' 't' 't'",
|
|
20
|
+
"lint": "eslint --cache --ignore-path ./.gitignore --ext .js,.jsx,.ts,.tsx ./src",
|
|
21
|
+
"lint:fix": "yarn lint --fix",
|
|
22
|
+
"test": "jest --watch",
|
|
23
|
+
"typecheck": "tsc --noEmit"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@grafana/tsconfig": "^1.2.0-rc1",
|
|
27
|
+
"@swc/core": "^1.2.162",
|
|
28
|
+
"@types/minimist": "^1.2.2",
|
|
29
|
+
"@types/mkdirp": "^1.0.2",
|
|
30
|
+
"@types/semver": "^7.3.9",
|
|
31
|
+
"enquirer": "^2.3.6",
|
|
32
|
+
"glob": "^7.1.7",
|
|
33
|
+
"jest": "^27.5.1",
|
|
34
|
+
"marked-terminal": "^5.1.1",
|
|
35
|
+
"marked": "^4.0.12",
|
|
36
|
+
"mkdirp": "^1.0.4",
|
|
37
|
+
"plop": "^2.7.4",
|
|
38
|
+
"semver": "^7.3.5"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@grafana/eslint-config": "^2.5.0",
|
|
42
|
+
"@swc/jest": "^0.2.20",
|
|
43
|
+
"@types/jest": "^27.4.1",
|
|
44
|
+
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
|
45
|
+
"@typescript-eslint/parser": "^4.33.0",
|
|
46
|
+
"eslint": "^7.32.0",
|
|
47
|
+
"eslint-config-prettier": "^8.3.0",
|
|
48
|
+
"eslint-plugin-jsdoc": "^36.1.0",
|
|
49
|
+
"eslint-plugin-prettier": "^4.0.0",
|
|
50
|
+
"eslint-plugin-react": "^7.26.1",
|
|
51
|
+
"eslint-plugin-react-hooks": "^4.2.0",
|
|
52
|
+
"nodemon": "^2.0.13",
|
|
53
|
+
"tsc-watch": "^4.5.0",
|
|
54
|
+
"typescript": "^4.4.3"
|
|
55
|
+
},
|
|
56
|
+
"nodemonConfig": {
|
|
57
|
+
"watch": [
|
|
58
|
+
"src/**/*",
|
|
59
|
+
"templates/**/*"
|
|
60
|
+
],
|
|
61
|
+
"ext": "*",
|
|
62
|
+
"events": {
|
|
63
|
+
"start": "cls || clear"
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"engines": {
|
|
67
|
+
"node": ">=16"
|
|
68
|
+
}
|
|
69
|
+
}
|
package/src/bin/run.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import minimist from 'minimist';
|
|
4
|
+
import { generate, update, migrate } from '../commands';
|
|
5
|
+
|
|
6
|
+
const args = process.argv.slice(2);
|
|
7
|
+
const argv = minimist(args);
|
|
8
|
+
const commands: Record<string, (argv: minimist.ParsedArgs) => void> = {
|
|
9
|
+
migrate,
|
|
10
|
+
generate,
|
|
11
|
+
update,
|
|
12
|
+
};
|
|
13
|
+
const command = commands[argv._[0]] || commands.generate;
|
|
14
|
+
|
|
15
|
+
command(argv);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import minimist from 'minimist';
|
|
3
|
+
import { Plop, run } from 'plop';
|
|
4
|
+
|
|
5
|
+
export const generate = async (argv: minimist.ParsedArgs) => {
|
|
6
|
+
Plop.launch(
|
|
7
|
+
{
|
|
8
|
+
cwd: argv.cwd,
|
|
9
|
+
configPath: path.join(__dirname, 'generate.plopfile.js'),
|
|
10
|
+
require: argv.require,
|
|
11
|
+
completion: argv.completion,
|
|
12
|
+
},
|
|
13
|
+
(env) => run(env, undefined, true)
|
|
14
|
+
);
|
|
15
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { NodePlopAPI, ModifyActionConfig } from 'plop';
|
|
2
|
+
import glob from 'glob';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import { ifEq, normalizeId } from '../utils/utils.handlebars';
|
|
6
|
+
import {
|
|
7
|
+
EXPORT_PATH_PREFIX,
|
|
8
|
+
IS_DEV,
|
|
9
|
+
TEMPLATE_PATHS,
|
|
10
|
+
PARTIALS_DIR,
|
|
11
|
+
PLUGIN_TYPES,
|
|
12
|
+
EXTRA_TEMPLATE_VARIABLES,
|
|
13
|
+
} from '../constants';
|
|
14
|
+
|
|
15
|
+
type CliArgs = {
|
|
16
|
+
pluginName: string;
|
|
17
|
+
pluginDescription: string;
|
|
18
|
+
orgName: string;
|
|
19
|
+
pluginType: string;
|
|
20
|
+
hasBackend: boolean;
|
|
21
|
+
hasGithubWorkflows: boolean;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// Plopfile API documentation: https://plopjs.com/documentation/#plopfile-api
|
|
25
|
+
export default function (plop: NodePlopAPI) {
|
|
26
|
+
plop.setHelper('if_eq', ifEq);
|
|
27
|
+
plop.setHelper('normalize_id', normalizeId);
|
|
28
|
+
|
|
29
|
+
plop.setGenerator('create-plugin', {
|
|
30
|
+
description: 'used to scaffold a grafana plugin',
|
|
31
|
+
prompts: [
|
|
32
|
+
{
|
|
33
|
+
name: 'pluginName',
|
|
34
|
+
type: 'input',
|
|
35
|
+
message: 'What is going to be the name of your plugin?',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'orgName',
|
|
39
|
+
type: 'input',
|
|
40
|
+
message: 'What is the organization name of your plugin?',
|
|
41
|
+
default: 'my-org',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'pluginDescription',
|
|
45
|
+
type: 'input',
|
|
46
|
+
message: 'How would you describe your plugin?',
|
|
47
|
+
default: '<plugin description>',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'pluginType',
|
|
51
|
+
type: 'list',
|
|
52
|
+
choices: [PLUGIN_TYPES.app, PLUGIN_TYPES.datasource, PLUGIN_TYPES.panel],
|
|
53
|
+
message: 'What kind of plugin would you like? ',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'hasBackend',
|
|
57
|
+
type: 'confirm',
|
|
58
|
+
message: 'Do you want a backend part of your plugin?',
|
|
59
|
+
default: false,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'hasGithubWorkflows',
|
|
63
|
+
type: 'confirm',
|
|
64
|
+
message: 'Do you want to add Github CI and Release workflows?',
|
|
65
|
+
default: false,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'hasGithubLevitateWorkflow',
|
|
69
|
+
type: 'confirm',
|
|
70
|
+
message: 'Do you want to add a Github workflow for automatically checking "Grafana API compatibility" on PRs?',
|
|
71
|
+
default: false,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
// @ts-ignore - We would like to specify the Answers type correctly
|
|
75
|
+
actions: function ({ pluginType, hasBackend, hasGithubWorkflows, hasGithubLevitateWorkflow }: CliArgs) {
|
|
76
|
+
// Copy over files that are shared between plugins types
|
|
77
|
+
const commonActions = getActionsForTemplateFolder(TEMPLATE_PATHS.common);
|
|
78
|
+
|
|
79
|
+
// Copy over files from the plugin type specific folder, e.g. "tempaltes/app" for "app" plugins ("app" | "panel" | "datasource").
|
|
80
|
+
const pluginTypeSpecificActions = getActionsForTemplateFolder(TEMPLATE_PATHS[pluginType]);
|
|
81
|
+
|
|
82
|
+
// Copy over backend-specific files (if selected)
|
|
83
|
+
const backendActions = hasBackend ? getActionsForTemplateFolder(TEMPLATE_PATHS.backend) : [];
|
|
84
|
+
|
|
85
|
+
// Copy over Github workflow files (if selected)
|
|
86
|
+
const ciWorkflowActions = hasGithubWorkflows ? getActionsForTemplateFolder(TEMPLATE_PATHS.ciWorkflows) : [];
|
|
87
|
+
|
|
88
|
+
const isCompatibleWorkflowActions = hasGithubLevitateWorkflow
|
|
89
|
+
? getActionsForTemplateFolder(TEMPLATE_PATHS.isCompatibleWorkflow)
|
|
90
|
+
: [];
|
|
91
|
+
|
|
92
|
+
// Replace conditional bits in the Readme files
|
|
93
|
+
const readmeActions = getActionsForReadme();
|
|
94
|
+
|
|
95
|
+
return [
|
|
96
|
+
...commonActions,
|
|
97
|
+
...pluginTypeSpecificActions,
|
|
98
|
+
...backendActions,
|
|
99
|
+
...ciWorkflowActions,
|
|
100
|
+
...readmeActions,
|
|
101
|
+
...isCompatibleWorkflowActions,
|
|
102
|
+
];
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function getActionsForReadme(): ModifyActionConfig[] {
|
|
108
|
+
return [
|
|
109
|
+
replacePatternWithTemplateInReadme('-- INSERT FRONTEND GETTING STARTED --', 'frontend-getting-started.md'),
|
|
110
|
+
replacePatternWithTemplateInReadme('-- INSERT BACKEND GETTING STARTED --', 'backend-getting-started.md'),
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function replacePatternWithTemplateInReadme(pattern: string, partialsFile: string): ModifyActionConfig {
|
|
115
|
+
return {
|
|
116
|
+
type: 'modify',
|
|
117
|
+
path: path.join(EXPORT_PATH_PREFIX, 'README.md'),
|
|
118
|
+
pattern,
|
|
119
|
+
// @ts-ignore
|
|
120
|
+
template: undefined,
|
|
121
|
+
templateFile: path.join(PARTIALS_DIR, partialsFile),
|
|
122
|
+
data: EXTRA_TEMPLATE_VARIABLES,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// TODO<use Plop action `addMany` instead>
|
|
127
|
+
function getActionsForTemplateFolder(folderPath: string) {
|
|
128
|
+
const files = glob.sync(`${folderPath}/**`, { dot: true });
|
|
129
|
+
const getExportFileName = (f: string) => (path.extname(f) === '.hbs' ? path.basename(f, '.hbs') : path.basename(f));
|
|
130
|
+
const getExportPath = (f: string) => path.relative(folderPath, path.dirname(f));
|
|
131
|
+
|
|
132
|
+
return files.filter(isFile).map((f) => ({
|
|
133
|
+
type: 'add',
|
|
134
|
+
templateFile: f,
|
|
135
|
+
// The target path where the compiled template is saved to
|
|
136
|
+
path: path.join(EXPORT_PATH_PREFIX, getExportPath(f), getExportFileName(f)),
|
|
137
|
+
// We would like to override generated files in development mode
|
|
138
|
+
force: IS_DEV,
|
|
139
|
+
// We would still like to scaffold as many files as possible even if one fails
|
|
140
|
+
abortOnFail: false,
|
|
141
|
+
data: EXTRA_TEMPLATE_VARIABLES,
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function isFile(path: string) {
|
|
146
|
+
try {
|
|
147
|
+
return fs.lstatSync(path).isFile();
|
|
148
|
+
} catch (e) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|