From 8fa1bd1e0d7c5b80df8ddb429323b2b14d49e0be Mon Sep 17 00:00:00 2001 From: "dennis.ludwig" Date: Sat, 12 Jun 2021 16:11:51 +0200 Subject: [PATCH] merge scripts, tasks and config folder and convert code to typescript --- README.md | 4 +- config/paths.js | 20 -- dist_scripts/scripts/buildRadar.js | 72 +++++++ .../scripts/createStaticFiles.js | 13 +- .../scripts/generateJson.js | 49 ++++- .../scripts/generateJson}/file.js | 55 +++--- .../scripts/generateJson}/radar.js | 68 ++++--- dist_scripts/scripts/paths.js | 21 ++ {bin => dist_scripts}/src/config.js | 0 {bin => dist_scripts}/src/model.js | 0 package.json | 10 +- scripts/{buildRadar.js => buildRadar.ts} | 25 ++- .../createStaticFiles.ts | 15 +- scripts/{generateJson.js => generateJson.ts} | 17 +- {tasks => scripts/generateJson}/file.ts | 12 +- {tasks => scripts/generateJson}/radar.ts | 102 +++++----- scripts/paths.ts | 15 ++ tasks/create-static.js | 69 ------- tasks/file.js | 86 -------- tasks/radar.js | 186 ------------------ tasks/radarjson.js | 61 ------ tasks/radarjson.ts | 14 -- tsconfig.tasks.json => tsconfig.scripts.json | 4 +- 23 files changed, 336 insertions(+), 582 deletions(-) delete mode 100644 config/paths.js create mode 100644 dist_scripts/scripts/buildRadar.js rename bin/tasks/create-static.js => dist_scripts/scripts/createStaticFiles.js (88%) rename bin/tasks/radarjson.js => dist_scripts/scripts/generateJson.js (64%) rename {bin/tasks => dist_scripts/scripts/generateJson}/file.js (68%) rename {bin/tasks => dist_scripts/scripts/generateJson}/radar.js (79%) create mode 100644 dist_scripts/scripts/paths.js rename {bin => dist_scripts}/src/config.js (100%) rename {bin => dist_scripts}/src/model.js (100%) rename scripts/{buildRadar.js => buildRadar.ts} (76%) rename tasks/create-static.ts => scripts/createStaticFiles.ts (60%) rename scripts/{generateJson.js => generateJson.ts} (65%) rename {tasks => scripts/generateJson}/file.ts (80%) rename {tasks => scripts/generateJson}/radar.ts (60%) create mode 100644 scripts/paths.ts delete mode 100644 tasks/create-static.js delete mode 100644 tasks/file.js delete mode 100644 tasks/radar.js delete mode 100644 tasks/radarjson.js delete mode 100644 tasks/radarjson.ts rename tsconfig.tasks.json => tsconfig.scripts.json (85%) diff --git a/README.md b/README.md index ad4c2b4..25a5027 100644 --- a/README.md +++ b/README.md @@ -118,4 +118,6 @@ merged with the old ones, and a new history entry is created for that item. * convert scripts to typescript as well ** move scripts paths.js and tasks in one folder * Rename package to make more clear that this is a tech radar builder? -* provide only one bin script with subcommands like react-scripts? \ No newline at end of file +* provide only one bin script with subcommands like react-scripts? +* add tests for scripts +* add tests for components \ No newline at end of file diff --git a/config/paths.js b/config/paths.js deleted file mode 100644 index 6feb5b3..0000000 --- a/config/paths.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; - -const path = require("path"); -const fs = require("fs"); - -const radarJson = "rd.json"; -const appDirectory = fs.realpathSync(process.cwd()); -const resolveApp = (relativePath = "") => - path.resolve(appDirectory, relativePath); -const templateDirectory = fs.realpathSync(__dirname); -const resolveTemplate = (relativePath = "") => - path.resolve(templateDirectory, "..", relativePath); - -module.exports = { - template: resolveTemplate(), - templateBuild: resolveTemplate("build"), - appRdJson: resolveApp(`build/${radarJson}`), - appBuild: resolveApp("build"), - appYarnLock: resolveApp("yarn.lock"), -}; diff --git a/dist_scripts/scripts/buildRadar.js b/dist_scripts/scripts/buildRadar.js new file mode 100644 index 0000000..66fc3e3 --- /dev/null +++ b/dist_scripts/scripts/buildRadar.js @@ -0,0 +1,72 @@ +#!/usr/bin/env node +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var fs = __importStar(require("fs-extra")); +var child_process_1 = require("child_process"); +var paths = __importStar(require("./paths")); +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = "production"; +process.env.NODE_ENV = "production"; +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on("unhandledRejection", function (err) { + throw err; +}); +var runCommand = function (command) { + return new Promise(function (resolve, reject) { + var executedCommand = child_process_1.spawn(command, { + stdio: "inherit", + shell: true, + }); + executedCommand.on("error", function (error) { + reject(error); + }); + executedCommand.on("exit", function (code) { + if (code === 0) { + resolve(code); + } + else { + reject(); + } + }); + }).catch(function (error) { + console.error(error); + process.exit(1); + }); +}; +var buildTemplate = function () { + var packageManager = fs.existsSync(paths.appYarnLock) ? "yarn" : "npx"; + fs.emptyDirSync(paths.templateBuild); + process.chdir(paths.template); + return runCommand(packageManager + " build"); +}; +if (fs.existsSync(paths.appRdJson)) { + buildTemplate().then(function () { + fs.copySync(paths.templateBuild, paths.appBuild); + console.log(paths.appBuild + " was created and can be deployed."); + }); +} +else { + console.error(paths.appRdJson + " does not exist. You have to generate it first."); + process.exit(1); +} diff --git a/bin/tasks/create-static.js b/dist_scripts/scripts/createStaticFiles.js similarity index 88% rename from bin/tasks/create-static.js rename to dist_scripts/scripts/createStaticFiles.js index 996b5c2..93b066b 100644 --- a/bin/tasks/create-static.js +++ b/dist_scripts/scripts/createStaticFiles.js @@ -37,9 +37,18 @@ var __generator = (this && this.__generator) || function (thisArg, body) { } }; Object.defineProperty(exports, "__esModule", { value: true }); -var radar_1 = require("./radar"); var fs_1 = require("fs"); +var radar_1 = require("./generateJson/radar"); var config_1 = require("../src/config"); +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = "production"; +process.env.NODE_ENV = "production"; +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on("unhandledRejection", function (err) { + throw err; +}); (function () { return __awaiter(void 0, void 0, void 0, function () { var radar, e_1; return __generator(this, function (_a) { @@ -62,7 +71,7 @@ var config_1 = require("../src/config"); radar.items.forEach(function (item) { fs_1.copyFileSync("build/index.html", "build/" + item.quadrant + "/" + item.name + ".html"); }); - console.log("created static"); + console.log("created static files."); return [3 /*break*/, 3]; case 2: e_1 = _a.sent(); diff --git a/bin/tasks/radarjson.js b/dist_scripts/scripts/generateJson.js similarity index 64% rename from bin/tasks/radarjson.js rename to dist_scripts/scripts/generateJson.js index af63e4d..c213375 100644 --- a/bin/tasks/radarjson.js +++ b/dist_scripts/scripts/generateJson.js @@ -1,5 +1,24 @@ #!/usr/bin/env node "use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -37,10 +56,19 @@ var __generator = (this && this.__generator) || function (thisArg, body) { } }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.radarJsonGenerator = void 0; -var radar_1 = require("./radar"); -var file_1 = require("./file"); -var radarJsonGenerator = function () { return __awaiter(void 0, void 0, void 0, function () { +var paths = __importStar(require("./paths")); +var radar_1 = require("./generateJson/radar"); +var file_1 = require("./generateJson/file"); +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = "production"; +process.env.NODE_ENV = "production"; +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on("unhandledRejection", function (err) { + throw err; +}); +var generateJson = function () { return __awaiter(void 0, void 0, void 0, function () { var radar, e_1; return __generator(this, function (_a) { switch (_a.label) { @@ -49,7 +77,7 @@ var radarJsonGenerator = function () { return __awaiter(void 0, void 0, void 0, return [4 /*yield*/, radar_1.createRadar()]; case 1: radar = _a.sent(); - return [4 /*yield*/, file_1.save(JSON.stringify(radar), "rd.json")]; + return [4 /*yield*/, file_1.save(JSON.stringify(radar), paths.radarJson)]; case 2: _a.sent(); return [3 /*break*/, 4]; @@ -61,4 +89,13 @@ var radarJsonGenerator = function () { return __awaiter(void 0, void 0, void 0, } }); }); }; -exports.radarJsonGenerator = radarJsonGenerator; +generateJson() + .then(function () { + console.log(paths.appRdJson + " created."); +}) + .catch(function (err) { + if (err && err.message) { + console.error(err.message); + } + process.exit(1); +}); diff --git a/bin/tasks/file.js b/dist_scripts/scripts/generateJson/file.js similarity index 68% rename from bin/tasks/file.js rename to dist_scripts/scripts/generateJson/file.js index 7da2b7e..2a97660 100644 --- a/bin/tasks/file.js +++ b/dist_scripts/scripts/generateJson/file.js @@ -1,24 +1,39 @@ "use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; var __spreadArray = (this && this.__spreadArray) || function (to, from) { for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) to[j] = from[i]; return to; }; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; Object.defineProperty(exports, "__esModule", { value: true }); -exports.save = exports.getAllMarkdownFiles = exports.builderPath = exports.buildPath = exports.publicPath = exports.jsPath = exports.faviconPath = exports.assetsPath = exports.stylesPath = exports.radarPath = exports.relativePath = void 0; +exports.save = exports.getAllMarkdownFiles = exports.buildPath = exports.jsPath = exports.faviconPath = exports.stylesPath = exports.radarPath = exports.relativePath = void 0; var fs_extra_1 = require("fs-extra"); -var path_1 = __importDefault(require("path")); +var path = __importStar(require("path")); var walk_1 = require("walk"); var relativePath = function () { var relativePath = []; for (var _i = 0; _i < arguments.length; _i++) { relativePath[_i] = arguments[_i]; } - // path.resolve(__dirname, '..', ...relativePath) - return path_1.default.resolve.apply(path_1.default, relativePath); + return path.resolve.apply(path, relativePath); }; exports.relativePath = relativePath; var radarPath = function () { @@ -37,14 +52,6 @@ var stylesPath = function () { return exports.relativePath.apply(void 0, __spreadArray(["styles"], pathInSrc)); }; exports.stylesPath = stylesPath; -var assetsPath = function () { - var pathInSrc = []; - for (var _i = 0; _i < arguments.length; _i++) { - pathInSrc[_i] = arguments[_i]; - } - return exports.relativePath.apply(void 0, __spreadArray(["assets"], pathInSrc)); -}; -exports.assetsPath = assetsPath; var faviconPath = function () { var pathInSrc = []; for (var _i = 0; _i < arguments.length; _i++) { @@ -61,14 +68,6 @@ var jsPath = function () { return exports.relativePath.apply(void 0, __spreadArray(["js"], pathInSrc)); }; exports.jsPath = jsPath; -var publicPath = function () { - var pathInDist = []; - for (var _i = 0; _i < arguments.length; _i++) { - pathInDist[_i] = arguments[_i]; - } - return exports.relativePath.apply(void 0, __spreadArray(["public"], pathInDist)); -}; -exports.publicPath = publicPath; var buildPath = function () { var pathInDist = []; for (var _i = 0; _i < arguments.length; _i++) { @@ -77,14 +76,6 @@ var buildPath = function () { return exports.relativePath.apply(void 0, __spreadArray(["build"], pathInDist)); }; exports.buildPath = buildPath; -var builderPath = function () { - var pathInDist = []; - for (var _i = 0; _i < arguments.length; _i++) { - pathInDist[_i] = arguments[_i]; - } - return exports.relativePath.apply(void 0, __spreadArray(["node_modules", "aoe_technology_radar", "src"], pathInDist)); -}; -exports.builderPath = builderPath; var getAllMarkdownFiles = function (folder) { return getAllFiles(folder, isMarkdownFile); }; @@ -95,7 +86,7 @@ var getAllFiles = function (folder, predicate) { var files = []; walker.on("file", function (root, fileStat, next) { if (predicate(fileStat.name)) { - files.push(path_1.default.resolve(root, fileStat.name)); + files.push(path.resolve(root, fileStat.name)); } next(); }); diff --git a/bin/tasks/radar.js b/dist_scripts/scripts/generateJson/radar.js similarity index 79% rename from bin/tasks/radar.js rename to dist_scripts/scripts/generateJson/radar.js index 4b88945..98e889c 100644 --- a/bin/tasks/radar.js +++ b/dist_scripts/scripts/generateJson/radar.js @@ -10,6 +10,25 @@ var __assign = (this && this.__assign) || function () { }; return __assign.apply(this, arguments); }; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -57,12 +76,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) { Object.defineProperty(exports, "__esModule", { value: true }); exports.createRadar = void 0; var fs_extra_1 = require("fs-extra"); -var path_1 = __importDefault(require("path")); +var path = __importStar(require("path")); var front_matter_1 = __importDefault(require("front-matter")); +// @ts-ignore esModuleInterop is activated in tsconfig.scripts.json, but IDE typescript uses default typescript config var marked_1 = __importDefault(require("marked")); var highlight_js_1 = __importDefault(require("highlight.js")); -var config_1 = require("../src/config"); var file_1 = require("./file"); +var config_1 = require("../../src/config"); marked_1.default.setOptions({ highlight: function (code) { return highlight_js_1.default.highlightAuto(code).value; }, }); @@ -99,7 +119,7 @@ var checkAttributes = function (fileName, attributes) { var createRevisionsFromFiles = function (fileNames) { return Promise.all(fileNames.map(function (fileName) { return new Promise(function (resolve, reject) { - fs_extra_1.readFile(fileName, 'utf8', function (err, data) { + fs_extra_1.readFile(fileName, "utf8", function (err, data) { if (err) { reject(err); } @@ -107,7 +127,7 @@ var createRevisionsFromFiles = function (fileNames) { var fm = front_matter_1.default(data); // add target attribute to external links // todo: check path - var html = marked_1.default(fm.body.replace(/\]\(\//g, '](/techradar/')); + var html = marked_1.default(fm.body.replace(/\]\(\//g, "](/techradar/")); html = html.replace(/a href="http/g, 'a target="_blank" rel="noopener noreferrer" href="http'); resolve(__assign(__assign(__assign({}, itemInfoFromFilename(fileName)), checkAttributes(fileName, fm.attributes)), { fileName: fileName, body: html })); } @@ -116,9 +136,9 @@ var createRevisionsFromFiles = function (fileNames) { })); }; var itemInfoFromFilename = function (fileName) { - var _a = fileName.split(path_1.default.sep).slice(-2), release = _a[0], name = _a[1]; + var _a = fileName.split(path.sep).slice(-2), release = _a[0], name = _a[1]; return { - name: path_1.default.basename(name, '.md'), + name: path.basename(name, ".md"), release: release, }; }; @@ -138,28 +158,30 @@ var createItems = function (revisions) { var _a; return __assign(__assign({}, items), (_a = {}, _a[revision.name] = addRevisionToItem(items[revision.name], revision), _a)); }, {}); - return Object.values(itemMap).map(function (item) { + return Object.values(itemMap) + .map(function (item) { var _a; - return (__assign(__assign({}, item), (_a = {}, _a['title'] = item.title || item.name, _a))); - }).sort(function (x, y) { return (x.name > y.name ? 1 : -1); }); + return (__assign(__assign({}, item), (_a = {}, _a["title"] = item.title || item.name, _a))); + }) + .sort(function (x, y) { return (x.name > y.name ? 1 : -1); }); }; var ignoreEmptyRevisionBody = function (revision, item) { - if (!revision.body || revision.body.trim() === '') { + if (!revision.body || revision.body.trim() === "") { return item.body; } return revision.body; }; var addRevisionToItem = function (item, revision) { if (item === void 0) { item = { - flag: 'default', + flag: "default", featured: true, revisions: [], - name: '', - title: '', - ring: 'trial', - quadrant: '', - body: '', - info: '', + name: "", + title: "", + ring: "trial", + quadrant: "", + body: "", + info: "", }; } var newItem = __assign(__assign(__assign({}, item), revision), { body: ignoreEmptyRevisionBody(revision, item) }); if (revisionCreatesNewHistoryEntry(revision)) { @@ -168,10 +190,12 @@ var addRevisionToItem = function (item, revision) { return newItem; }; var revisionCreatesNewHistoryEntry = function (revision) { - return revision.body.trim() !== '' || typeof revision.ring !== 'undefined'; + return revision.body.trim() !== "" || typeof revision.ring !== "undefined"; }; var flagItem = function (items, allReleases) { - return items.map(function (item) { return (__assign(__assign({}, item), { flag: getItemFlag(item, allReleases) })); }, []); + return items.map(function (item) { + return (__assign(__assign({}, item), { flag: getItemFlag(item, allReleases) })); + }, []); }; var isInLastRelease = function (item, allReleases) { return item.revisions[0].release === allReleases[allReleases.length - 1]; @@ -184,10 +208,10 @@ var hasItemChanged = function (item, allReleases) { }; var getItemFlag = function (item, allReleases) { if (isNewItem(item, allReleases)) { - return 'new'; + return "new"; } if (hasItemChanged(item, allReleases)) { - return 'changed'; + return "changed"; } - return 'default'; + return "default"; }; diff --git a/dist_scripts/scripts/paths.js b/dist_scripts/scripts/paths.js new file mode 100644 index 0000000..c2b151f --- /dev/null +++ b/dist_scripts/scripts/paths.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.appYarnLock = exports.appBuild = exports.appRdJson = exports.templateBuild = exports.template = exports.radarJson = void 0; +var path_1 = require("path"); +var fs_1 = require("fs"); +exports.radarJson = "rd.json"; +var appDirectory = fs_1.realpathSync(process.cwd()); +var resolveApp = function (relativePath) { + if (relativePath === void 0) { relativePath = ""; } + return path_1.resolve(appDirectory, relativePath); +}; +var templateDirectory = fs_1.realpathSync(__dirname); +var resolveTemplate = function (relativePath) { + if (relativePath === void 0) { relativePath = ""; } + return path_1.resolve(templateDirectory, "..", relativePath); +}; +exports.template = resolveTemplate(); +exports.templateBuild = resolveTemplate("build"); +exports.appRdJson = resolveApp("build/" + exports.radarJson); +exports.appBuild = resolveApp("build"); +exports.appYarnLock = resolveApp("yarn.lock"); diff --git a/bin/src/config.js b/dist_scripts/src/config.js similarity index 100% rename from bin/src/config.js rename to dist_scripts/src/config.js diff --git a/bin/src/model.js b/dist_scripts/src/model.js similarity index 100% rename from bin/src/model.js rename to dist_scripts/src/model.js diff --git a/package.json b/package.json index d579300..1354071 100644 --- a/package.json +++ b/package.json @@ -10,15 +10,15 @@ "url": "https://github.com/AOEpeople/aoe_technology_radar.git" }, "bin": { - "aoe_technology_radar-generateJson": "scripts/generateJson.js", - "aoe_technology_radar-buildRadar": "scripts/buildRadar.js", - "aoe_technology_radar-createStaticFiles": "bin/tasks/create-static.js" + "aoe_technology_radar-generateJson": "dist_scripts/scripts/generateJson.js", + "aoe_technology_radar-buildRadar": "dist_scripts/scripts/buildRadar.js", + "aoe_technology_radar-createStaticFiles": "dist_scripts/scripts/createStaticFiles.js" }, "scripts": { - "prepare": "husky install && yarn build:tasks && yarn build", + "prepare": "husky install && yarn build:scripts", "start": "react-scripts start", "build": "react-scripts build", - "build:tasks": "tsc --project tsconfig.tasks.json", + "build:scripts": "tsc --project tsconfig.scripts.json", "test": "react-scripts test", "ts:check": "tsc --noEmit", "lint": "yarn ts:check", diff --git a/scripts/buildRadar.js b/scripts/buildRadar.ts similarity index 76% rename from scripts/buildRadar.js rename to scripts/buildRadar.ts index d40cd6d..ee7d90f 100644 --- a/scripts/buildRadar.js +++ b/scripts/buildRadar.ts @@ -1,6 +1,8 @@ #!/usr/bin/env node -"use strict"; +import * as fs from "fs-extra"; +import { spawn } from "child_process"; +import * as paths from "./paths"; // Do this as the first thing so that any code reading it knows the right env. process.env.BABEL_ENV = "production"; @@ -13,13 +15,9 @@ process.on("unhandledRejection", (err) => { throw err; }); -const fs = require("fs-extra"); -const paths = require("../config/paths"); -const childProcess = require("child_process"); - -const runCommand = (command, args) => { - return new Promise((resolve, reject) => { - const executedCommand = childProcess.spawn(command, args, { +const runCommand = (command: string) => + new Promise((resolve, reject) => { + const executedCommand = spawn(command, { stdio: "inherit", shell: true, }); @@ -30,13 +28,15 @@ const runCommand = (command, args) => { executedCommand.on("exit", (code) => { if (code === 0) { - resolve(); + resolve(code); } else { reject(); } }); + }).catch((error) => { + console.error(error); + process.exit(1); }); -}; const buildTemplate = () => { const packageManager = fs.existsSync(paths.appYarnLock) ? "yarn" : "npx"; @@ -44,10 +44,7 @@ const buildTemplate = () => { fs.emptyDirSync(paths.templateBuild); process.chdir(paths.template); - return runCommand(`${packageManager} build`).catch((error) => { - console.error(error); - process.exit(1); - }); + return runCommand(`${packageManager} build`); }; if (fs.existsSync(paths.appRdJson)) { diff --git a/tasks/create-static.ts b/scripts/createStaticFiles.ts similarity index 60% rename from tasks/create-static.ts rename to scripts/createStaticFiles.ts index f09b8f2..864548c 100644 --- a/tasks/create-static.ts +++ b/scripts/createStaticFiles.ts @@ -1,9 +1,20 @@ #!/usr/bin/env node -import { createRadar } from "./radar"; import { copyFileSync, mkdirSync, existsSync } from "fs"; +import { createRadar } from "./generateJson/radar"; import { quadrants } from "../src/config"; +// Do this as the first thing so that any code reading it knows the right env. +process.env.BABEL_ENV = "production"; +process.env.NODE_ENV = "production"; + +// Makes the script crash on unhandled rejections instead of silently +// ignoring them. In the future, promise rejections that are not handled will +// terminate the Node.js process with a non-zero exit code. +process.on("unhandledRejection", (err) => { + throw err; +}); + (async () => { try { console.log("starting static"); @@ -26,7 +37,7 @@ import { quadrants } from "../src/config"; ); }); - console.log("created static"); + console.log("created static files."); } catch (e) { console.error("error:", e); } diff --git a/scripts/generateJson.js b/scripts/generateJson.ts similarity index 65% rename from scripts/generateJson.js rename to scripts/generateJson.ts index 675f53b..045a26f 100644 --- a/scripts/generateJson.js +++ b/scripts/generateJson.ts @@ -1,6 +1,8 @@ #!/usr/bin/env node -"use strict"; +import * as paths from "./paths"; +import { createRadar } from "./generateJson/radar"; +import { save } from "./generateJson/file"; // Do this as the first thing so that any code reading it knows the right env. process.env.BABEL_ENV = "production"; @@ -13,10 +15,17 @@ process.on("unhandledRejection", (err) => { throw err; }); -const paths = require("../config/paths"); +const generateJson = async () => { + try { + const radar = await createRadar(); -require("../bin/tasks/radarjson") - .radarJsonGenerator() + await save(JSON.stringify(radar), paths.radarJson); + } catch (e) { + console.error("error:", e); + } +}; + +generateJson() .then(() => { console.log(`${paths.appRdJson} created.`); }) diff --git a/tasks/file.ts b/scripts/generateJson/file.ts similarity index 80% rename from tasks/file.ts rename to scripts/generateJson/file.ts index a5ff7f3..ca52d66 100644 --- a/tasks/file.ts +++ b/scripts/generateJson/file.ts @@ -1,9 +1,8 @@ import { outputFile } from "fs-extra"; -import path from "path"; +import * as path from "path"; import { walk } from "walk"; export const relativePath = (...relativePath: string[]): string => - // path.resolve(__dirname, '..', ...relativePath) path.resolve(...relativePath); export const radarPath = (...pathInSrc: string[]) => @@ -12,24 +11,15 @@ export const radarPath = (...pathInSrc: string[]) => export const stylesPath = (...pathInSrc: string[]) => relativePath("styles", ...pathInSrc); -export const assetsPath = (...pathInSrc: string[]) => - relativePath("assets", ...pathInSrc); - export const faviconPath = (...pathInSrc: string[]) => relativePath("assets/favicon.ico", ...pathInSrc); export const jsPath = (...pathInSrc: string[]) => relativePath("js", ...pathInSrc); -export const publicPath = (...pathInDist: string[]) => - relativePath("public", ...pathInDist); - export const buildPath = (...pathInDist: string[]) => relativePath("build", ...pathInDist); -export const builderPath = (...pathInDist: string[]) => - relativePath("node_modules", "aoe_technology_radar", "src", ...pathInDist); - export const getAllMarkdownFiles = (folder: string) => getAllFiles(folder, isMarkdownFile); diff --git a/tasks/radar.ts b/scripts/generateJson/radar.ts similarity index 60% rename from tasks/radar.ts rename to scripts/generateJson/radar.ts index 3cedb6a..230b504 100644 --- a/tasks/radar.ts +++ b/scripts/generateJson/radar.ts @@ -1,16 +1,18 @@ -import { readFile } from 'fs-extra'; -import path from 'path'; -import frontmatter from 'front-matter'; -import marked from 'marked'; -import hljs from 'highlight.js'; -import { quadrants, rings } from '../src/config'; -import { radarPath, getAllMarkdownFiles } from './file'; -import { Item, Revision, ItemAttributes, Radar } from '../src/model'; +import { readFile } from "fs-extra"; +import * as path from "path"; +import frontMatter from "front-matter"; +// @ts-ignore esModuleInterop is activated in tsconfig.scripts.json, but IDE typescript uses default typescript config +import marked from "marked"; +import highlight from "highlight.js"; -type FMAttributes = ItemAttributes +import { radarPath, getAllMarkdownFiles } from "./file"; +import { quadrants, rings } from "../../src/config"; +import { Item, Revision, ItemAttributes, Radar } from "../../src/model"; + +type FMAttributes = ItemAttributes; marked.setOptions({ - highlight: code => hljs.highlightAuto(code).value, + highlight: (code) => highlight.highlightAuto(code).value, }); export const createRadar = async (): Promise => { @@ -28,31 +30,35 @@ export const createRadar = async (): Promise => { const checkAttributes = (fileName: string, attributes: FMAttributes) => { if (attributes.ring && !rings.includes(attributes.ring)) { - throw new Error(`Error: ${fileName} has an illegal value for 'ring' - must be one of ${rings}`); + throw new Error( + `Error: ${fileName} has an illegal value for 'ring' - must be one of ${rings}` + ); } if (attributes.quadrant && !quadrants.includes(attributes.quadrant)) { - throw new Error(`Error: ${fileName} has an illegal value for 'quadrant' - must be one of ${quadrants}`); + throw new Error( + `Error: ${fileName} has an illegal value for 'quadrant' - must be one of ${quadrants}` + ); } - return attributes + return attributes; }; const createRevisionsFromFiles = (fileNames: string[]) => Promise.all( - fileNames.map(fileName => { + fileNames.map((fileName) => { return new Promise((resolve, reject) => { - readFile(fileName, 'utf8', (err, data) => { + readFile(fileName, "utf8", (err, data) => { if (err) { reject(err); } else { - const fm = frontmatter(data); + const fm = frontMatter(data); // add target attribute to external links // todo: check path - let html = marked(fm.body.replace(/\]\(\//g, '](/techradar/')); + let html = marked(fm.body.replace(/\]\(\//g, "](/techradar/")); html = html.replace( /a href="http/g, - 'a target="_blank" rel="noopener noreferrer" href="http', + 'a target="_blank" rel="noopener noreferrer" href="http' ); resolve({ @@ -64,13 +70,13 @@ const createRevisionsFromFiles = (fileNames: string[]) => } }); }); - }), + }) ); const itemInfoFromFilename = (fileName: string) => { const [release, name] = fileName.split(path.sep).slice(-2); return { - name: path.basename(name, '.md'), + name: path.basename(name, ".md"), release, }; }; @@ -86,18 +92,23 @@ const getAllReleases = (revisions: Revision[]) => .sort(); const createItems = (revisions: Revision[]) => { - const itemMap = revisions.reduce<{[name: string]: Item}>((items, revision) => { - return { - ...items, - [revision.name]: addRevisionToItem(items[revision.name], revision), - }; - }, {}); + const itemMap = revisions.reduce<{ [name: string]: Item }>( + (items, revision) => { + return { + ...items, + [revision.name]: addRevisionToItem(items[revision.name], revision), + }; + }, + {} + ); - return Object.values(itemMap).map(item => ({...item, ['title']: item.title || item.name})).sort((x, y) => (x.name > y.name ? 1 : -1)); + return Object.values(itemMap) + .map((item) => ({ ...item, ["title"]: item.title || item.name })) + .sort((x, y) => (x.name > y.name ? 1 : -1)); }; const ignoreEmptyRevisionBody = (revision: Revision, item: Item) => { - if (!revision.body || revision.body.trim() === '') { + if (!revision.body || revision.body.trim() === "") { return item.body; } return revision.body; @@ -105,17 +116,17 @@ const ignoreEmptyRevisionBody = (revision: Revision, item: Item) => { const addRevisionToItem = ( item: Item = { - flag: 'default', + flag: "default", featured: true, revisions: [], - name: '', - title: '', - ring: 'trial', - quadrant: '', - body: '', - info: '', + name: "", + title: "", + ring: "trial", + quadrant: "", + body: "", + info: "", }, - revision: Revision, + revision: Revision ): Item => { let newItem: Item = { ...item, @@ -134,16 +145,17 @@ const addRevisionToItem = ( }; const revisionCreatesNewHistoryEntry = (revision: Revision) => { - return revision.body.trim() !== '' || typeof revision.ring !== 'undefined'; + return revision.body.trim() !== "" || typeof revision.ring !== "undefined"; }; const flagItem = (items: Item[], allReleases: string[]) => items.map( - item => ({ - ...item, - flag: getItemFlag(item, allReleases), - } as Item), - [], + (item) => + ({ + ...item, + flag: getItemFlag(item, allReleases), + } as Item), + [] ); const isInLastRelease = (item: Item, allReleases: string[]) => @@ -157,10 +169,10 @@ const hasItemChanged = (item: Item, allReleases: string[]) => const getItemFlag = (item: Item, allReleases: string[]): string => { if (isNewItem(item, allReleases)) { - return 'new'; + return "new"; } if (hasItemChanged(item, allReleases)) { - return 'changed'; + return "changed"; } - return 'default'; + return "default"; }; diff --git a/scripts/paths.ts b/scripts/paths.ts new file mode 100644 index 0000000..eaea8e2 --- /dev/null +++ b/scripts/paths.ts @@ -0,0 +1,15 @@ +import { resolve } from "path"; +import { realpathSync } from "fs"; + +export const radarJson = "rd.json"; +const appDirectory = realpathSync(process.cwd()); +const resolveApp = (relativePath = "") => resolve(appDirectory, relativePath); +const templateDirectory = realpathSync(__dirname); +const resolveTemplate = (relativePath = "") => + resolve(templateDirectory, "..", relativePath); + +export const template = resolveTemplate(); +export const templateBuild = resolveTemplate("build"); +export const appRdJson = resolveApp(`build/${radarJson}`); +export const appBuild = resolveApp("build"); +export const appYarnLock = resolveApp("yarn.lock"); diff --git a/tasks/create-static.js b/tasks/create-static.js deleted file mode 100644 index 7748f61..0000000 --- a/tasks/create-static.js +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env node -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -import { createRadar } from "./radar"; -import { copyFileSync, mkdirSync } from "fs"; -import { quadrants } from "../src/config"; -(function () { return __awaiter(void 0, void 0, void 0, function () { - var radar, e_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - console.log('starting static'); - return [4 /*yield*/, createRadar()]; - case 1: - radar = _a.sent(); - copyFileSync('build/index.html', 'build/overview.html'); - copyFileSync('build/index.html', 'build/help-and-about-tech-radar.html'); - quadrants.forEach(function (quadrant) { - copyFileSync('build/index.html', 'build/' + quadrant + '.html'); - mkdirSync('build/' + quadrant); - }); - radar.items.forEach(function (item) { - copyFileSync('build/index.html', 'build/' + item.quadrant + '/' + item.name + '.html'); - }); - console.log('created static'); - return [3 /*break*/, 3]; - case 2: - e_1 = _a.sent(); - console.error('error:', e_1); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); })(); diff --git a/tasks/file.js b/tasks/file.js deleted file mode 100644 index e0e0fbd..0000000 --- a/tasks/file.js +++ /dev/null @@ -1,86 +0,0 @@ -var __spreadArray = (this && this.__spreadArray) || function (to, from) { - for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) - to[j] = from[i]; - return to; -}; -import { outputFile } from 'fs-extra'; -import path from 'path'; -import { walk } from 'walk'; -export var relativePath = function () { - var relativePath = []; - for (var _i = 0; _i < arguments.length; _i++) { - relativePath[_i] = arguments[_i]; - } - return ( - // path.resolve(__dirname, '..', ...relativePath) - path.resolve.apply( - // path.resolve(__dirname, '..', ...relativePath) - path, relativePath)); -}; -export var radarPath = function () { - var pathInSrc = []; - for (var _i = 0; _i < arguments.length; _i++) { - pathInSrc[_i] = arguments[_i]; - } - return (relativePath.apply(void 0, __spreadArray(['radar'], pathInSrc))); -}; -export var stylesPath = function () { - var pathInSrc = []; - for (var _i = 0; _i < arguments.length; _i++) { - pathInSrc[_i] = arguments[_i]; - } - return (relativePath.apply(void 0, __spreadArray(['styles'], pathInSrc))); -}; -export var assetsPath = function () { - var pathInSrc = []; - for (var _i = 0; _i < arguments.length; _i++) { - pathInSrc[_i] = arguments[_i]; - } - return (relativePath.apply(void 0, __spreadArray(['assets'], pathInSrc))); -}; -export var faviconPath = function () { - var pathInSrc = []; - for (var _i = 0; _i < arguments.length; _i++) { - pathInSrc[_i] = arguments[_i]; - } - return (relativePath.apply(void 0, __spreadArray(['assets/favicon.ico'], pathInSrc))); -}; -export var jsPath = function () { - var pathInSrc = []; - for (var _i = 0; _i < arguments.length; _i++) { - pathInSrc[_i] = arguments[_i]; - } - return (relativePath.apply(void 0, __spreadArray(['js'], pathInSrc))); -}; -export var distPath = function () { - var pathInDist = []; - for (var _i = 0; _i < arguments.length; _i++) { - pathInDist[_i] = arguments[_i]; - } - return (relativePath.apply(void 0, __spreadArray(['src'], pathInDist))); -}; -export var getAllMarkdownFiles = function (folder) { return (getAllFiles(folder, isMarkdownFile)); }; -var getAllFiles = function (folder, predicate) { return (new Promise(function (resolve, reject) { - var walker = walk(folder, { followLinks: false }); - var files = []; - walker.on("file", function (root, fileStat, next) { - if (predicate(fileStat.name)) { - files.push(path.resolve(root, fileStat.name)); - } - next(); - }); - walker.on("errors", function (root, nodeStatsArray, next) { - nodeStatsArray.forEach(function (n) { - console.error("[ERROR] " + n.name); - if (n.error) { - console.error(n.error.message || (n.error.code + ": " + n.error.path)); - } - }); - next(); - }); - walker.on("end", function () { - resolve(files.sort()); - }); -})); }; -var isMarkdownFile = function (name) { return name.match(/\.md$/) !== null; }; -export var save = function (data, fileName) { return outputFile(distPath(fileName), data); }; diff --git a/tasks/radar.js b/tasks/radar.js deleted file mode 100644 index 311b6b6..0000000 --- a/tasks/radar.js +++ /dev/null @@ -1,186 +0,0 @@ -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var __spreadArray = (this && this.__spreadArray) || function (to, from) { - for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) - to[j] = from[i]; - return to; -}; -import { readFile } from 'fs-extra'; -import path from 'path'; -import frontmatter from 'front-matter'; -import marked from 'marked'; -import hljs from 'highlight.js'; -import { quadrants, rings } from '../src/config'; -import { radarPath, getAllMarkdownFiles } from './file'; -marked.setOptions({ - highlight: function (code) { return hljs.highlightAuto(code).value; }, -}); -export var createRadar = function () { return __awaiter(void 0, void 0, void 0, function () { - var fileNames, revisions, allReleases, items, flaggedItems; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, getAllMarkdownFiles(radarPath())]; - case 1: - fileNames = _a.sent(); - return [4 /*yield*/, createRevisionsFromFiles(fileNames)]; - case 2: - revisions = _a.sent(); - allReleases = getAllReleases(revisions); - items = createItems(revisions); - flaggedItems = flagItem(items, allReleases); - return [2 /*return*/, { - items: flaggedItems, - releases: allReleases, - }]; - } - }); -}); }; -var checkAttributes = function (fileName, attributes) { - if (attributes.ring && !rings.includes(attributes.ring)) { - throw new Error("Error: " + fileName + " has an illegal value for 'ring' - must be one of " + rings); - } - if (attributes.quadrant && !quadrants.includes(attributes.quadrant)) { - throw new Error("Error: " + fileName + " has an illegal value for 'quadrant' - must be one of " + quadrants); - } - return attributes; -}; -var createRevisionsFromFiles = function (fileNames) { - return Promise.all(fileNames.map(function (fileName) { - return new Promise(function (resolve, reject) { - readFile(fileName, 'utf8', function (err, data) { - if (err) { - reject(err); - } - else { - var fm = frontmatter(data); - // add target attribute to external links - // todo: check path - var html = marked(fm.body.replace(/\]\(\//g, '](/techradar/')); - html = html.replace(/a href="http/g, 'a target="_blank" rel="noopener noreferrer" href="http'); - resolve(__assign(__assign(__assign({}, itemInfoFromFilename(fileName)), checkAttributes(fileName, fm.attributes)), { fileName: fileName, body: html })); - } - }); - }); - })); -}; -var itemInfoFromFilename = function (fileName) { - var _a = fileName.split(path.sep).slice(-2), release = _a[0], name = _a[1]; - return { - name: path.basename(name, '.md'), - release: release, - }; -}; -var getAllReleases = function (revisions) { - return revisions - .reduce(function (allReleases, _a) { - var release = _a.release; - if (!allReleases.includes(release)) { - return __spreadArray(__spreadArray([], allReleases), [release]); - } - return allReleases; - }, []) - .sort(); -}; -var createItems = function (revisions) { - var itemMap = revisions.reduce(function (items, revision) { - var _a; - return __assign(__assign({}, items), (_a = {}, _a[revision.name] = addRevisionToItem(items[revision.name], revision), _a)); - }, {}); - return Object.values(itemMap).map(function (item) { - var _a; - return (__assign(__assign({}, item), (_a = {}, _a['title'] = item.title || item.name, _a))); - }).sort(function (x, y) { return (x.name > y.name ? 1 : -1); }); -}; -var ignoreEmptyRevisionBody = function (revision, item) { - if (!revision.body || revision.body.trim() === '') { - return item.body; - } - return revision.body; -}; -var addRevisionToItem = function (item, revision) { - if (item === void 0) { item = { - flag: 'default', - featured: true, - revisions: [], - name: '', - title: '', - ring: 'trial', - quadrant: '', - body: '', - info: '', - }; } - var newItem = __assign(__assign(__assign({}, item), revision), { body: ignoreEmptyRevisionBody(revision, item) }); - if (revisionCreatesNewHistoryEntry(revision)) { - newItem = __assign(__assign({}, newItem), { revisions: __spreadArray([revision], newItem.revisions) }); - } - return newItem; -}; -var revisionCreatesNewHistoryEntry = function (revision) { - return revision.body.trim() !== '' || typeof revision.ring !== 'undefined'; -}; -var flagItem = function (items, allReleases) { - return items.map(function (item) { return (__assign(__assign({}, item), { flag: getItemFlag(item, allReleases) })); }, []); -}; -var isInLastRelease = function (item, allReleases) { - return item.revisions[0].release === allReleases[allReleases.length - 1]; -}; -var isNewItem = function (item, allReleases) { - return item.revisions.length === 1 && isInLastRelease(item, allReleases); -}; -var hasItemChanged = function (item, allReleases) { - return item.revisions.length > 1 && isInLastRelease(item, allReleases); -}; -var getItemFlag = function (item, allReleases) { - if (isNewItem(item, allReleases)) { - return 'new'; - } - if (hasItemChanged(item, allReleases)) { - return 'changed'; - } - return 'default'; -}; diff --git a/tasks/radarjson.js b/tasks/radarjson.js deleted file mode 100644 index 255c883..0000000 --- a/tasks/radarjson.js +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env node -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -import { createRadar } from "./radar"; -import { save } from "./file"; -export var radarJsonGenerator = function () { return __awaiter(void 0, void 0, void 0, function () { - var radar, e_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - console.log("start"); - return [4 /*yield*/, createRadar()]; - case 1: - radar = _a.sent(); - save(JSON.stringify(radar), "rd.json"); - save("import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from 'aoe_technology_radar/src/components/App';\nimport 'aoe_technology_radar/src/index.scss';\nimport radardata from './rd.json';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n", "index.tsx"); - console.log("Built radar"); - return [3 /*break*/, 3]; - case 2: - e_1 = _a.sent(); - console.error("error:", e_1); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); }; diff --git a/tasks/radarjson.ts b/tasks/radarjson.ts deleted file mode 100644 index a21e08a..0000000 --- a/tasks/radarjson.ts +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env node - -import { createRadar } from "./radar"; -import { save } from "./file"; - -export const radarJsonGenerator = async () => { - try { - const radar = await createRadar(); - - await save(JSON.stringify(radar), "rd.json"); - } catch (e) { - console.error("error:", e); - } -}; diff --git a/tsconfig.tasks.json b/tsconfig.scripts.json similarity index 85% rename from tsconfig.tasks.json rename to tsconfig.scripts.json index 712e1e6..8776443 100644 --- a/tsconfig.tasks.json +++ b/tsconfig.scripts.json @@ -14,8 +14,8 @@ "resolveJsonModule": true, "isolatedModules": true, "jsx": "react-jsx", - "outDir": "bin", + "outDir": "dist_scripts", "noEmit": false }, - "files": ["tasks/radarjson.ts", "tasks/create-static.ts"] + "include": ["scripts"] }