packages/create-youtrack-app/_templates/extension-property/add/index.js (74 lines of code) (raw):

const { injectJSCallback } = require("../../injectJsCallback"); const fs = require("node:fs"); const path = require("node:path"); module.exports = { prompt: injectJSCallback(injectEntity, ({ prompter, args }) => prompter.prompt([ { type: "input", name: "name", message: "What is the name of the extension property", }, { type: "select", name: "type", message: "What is the type of the extension property", choices: [ { name: "string", message: "String", }, { name: "integer", message: "Integer" }, { name: "boolean", message: "Boolean" }, { name: "Issue", message: "Issue", }, ], }, { type: "confirm", name: "isSet", message: "Is it a set of values?", }, { type: "select", name: "target", message: "What is the target extending entity?", choices: [ { name: "Issue", message: "Issue" }, { name: "Comment", message: "Comment" }, { name: "User", message: "User" }, { name: "AppGlobalStorage", message: "Global Storage" }, ], }, ]), ), }; function injectEntity(payload) { const fileName = "entity-extensions.json"; const filePath = path.join(process.cwd(), "src", fileName); const entityExtensions = fs.existsSync(filePath) ? JSON.parse(fs.readFileSync(filePath)) : { entityTypeExtensions: [] }; const extendingEntity = entityExtensions.entityTypeExtensions.find( (e) => e.entityType === payload.target, ); if (!extendingEntity) { entityExtensions.entityTypeExtensions.push({ entityType: payload.target, properties: { [payload.name]: { type: payload.type, multi: payload.isSet, }, }, }); } else { extendingEntity.properties[payload.name] = { type: payload.type, multi: payload.isSet, }; } fs.writeFileSync(filePath, JSON.stringify(entityExtensions, null, 2)); }