UNPKG

albxrmtypesgen

Version:

A TypeScript Declaration Generator for Dynamics 365 Forms

185 lines (183 loc) 8.5 kB
#!/usr/bin/env node "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const adal_node_1 = require("adal-node"); const commander_1 = require("commander"); const fs_1 = require("fs"); const node_localstorage_1 = require("node-localstorage"); const terms_1 = require("./terms"); // eslint-disable-next-line object-curly-newline const queries_1 = require("./queries"); const renderer_1 = require("./renderer"); const renderer_optionSet_1 = require("./renderer-optionSet"); const mylocalStorage = new node_localstorage_1.LocalStorage('./scratch'); commander_1.program.version(require('../package.json').version).name('xrmtypesgen'); commander_1.program .requiredOption('-u, --url <url>', `${terms_1.terms.d365} Url. e.g. https://myorg.crm11.dynamics.com/`) .option('-n, --username <username>', `Username for ${terms_1.terms.d365}`) .option('-p, --password <password>', `Password for ${terms_1.terms.d365}`) .option('--secret <secret>', 'OAuth Client Secret') .requiredOption('-t, --tenent <tenent>', `${terms_1.terms.AAD} authority. e.g. https://login.windows.net/myorg.onmicrosoft.com`) .option('-c, --clientid <clientid>', 'OAuth Client Id', '51f81489-12ee-4a9e-aaae-a2591f45987d') .option('-s, --solution <solution>', `Unique ${terms_1.terms.d365} Solution Name`) .option('-e, --entities <entities>', 'Comma seperated list of entities') .option('-o, --output <output>', 'Output path', 'types') .option('-b, --earlybound', 'Generate Early-Bound format', false) .option('-ch, --choices', 'Generate Choices format', false) .option('-gch, --globalChoices', 'Generate Global Choices', false) .option('-ls, --localStorage', 'Do not clear Local Storage', false) .option('_lch, --localChoices', 'Generate Local Choices of Entities', false); commander_1.program.addHelpText('afterAll', ` e.g. XrmTypesGen --url https://myorg.crm11.dynamics.com/ --username username@myorg.onmicrosoft.com --password password123 --tenent https://login.windows.net/myorg.onmicrosoft.com --solution solutionname --output ./types e.g. XrmTypesGen --url https://myorg.crm11.dynamics.com/ --username username@myorg.onmicrosoft.com --password password123 --tenent https://login.windows.net/myorg.onmicrosoft.com --entities account,contact,lead --output ./types e.g. XrmTypesGen --url https://myorg.crm11.dynamics.com/ --tenent https://login.windows.net/myorg.onmicrosoft.com --entities "account,contact,lead" --output types --clientid myclientid --secret mysecret `); commander_1.program.parse(); const options = commander_1.program.opts(); const Main = async (authToken) => { if (!options.localStorage) { mylocalStorage.clear(); } console.log('getting form metadata'); let formsResponse; if (options.solution) { formsResponse = await queries_1.getFormsBySolution(authToken, options.url, options.solution); } else if (options.entities) { formsResponse = await queries_1.getFormsForEntities(authToken, options.url, options.entities); } else { formsResponse = await queries_1.getForms(authToken, options.url); } if (formsResponse.error) { console.error(formsResponse.error); return; } const forms = formsResponse.value; const entities = {}; const localChoices = {}; forms .filter((form) => form.objecttypecode !== null && form.objecttypecode !== '') .forEach((form) => { entities[form.objecttypecode] = {}; }); console.log('pre-cache attribute metatdata'); const entityNames = Object.getOwnPropertyNames(entities); for (let i = 0; i < entityNames.length; i += 1) { const value = entityNames[i]; // eslint-disable-next-line no-await-in-loop entities[value] = await queries_1.getAttributeMeta(value, authToken, options.url); localChoices[value] = options.localChoices ? // eslint-disable-next-line no-await-in-loop await queries_1.getLocalChoices(value, authToken, options.url) : undefined; console.log(value); } console.log(options); if (options.choices) { let optionsets; if (options.solution) { optionsets = await queries_1.getChoicesBySolution(authToken, options.url, options.solution); } else { optionsets = []; } const choicestd = { content: renderer_optionSet_1.renderOptionSet(optionsets), }; console.log('saving type definition files'); fs_1.mkdirSync(`${options.output}/`, { recursive: true }); fs_1.writeFile(`${options.output}/choices.d.ts`, choicestd.content, () => { }); } if (options.globalChoices) { let optionsets; // eslint-disable-next-line prefer-const optionsets = await queries_1.getChoicesByEnvironment(authToken, options.url); const choicestd = { content: renderer_optionSet_1.renderOptionSet(optionsets), }; console.log('saving type definition files'); fs_1.mkdirSync(`${options.output}/`, { recursive: true }); fs_1.writeFile(`${options.output}/globalchoices.d.ts`, choicestd.content, () => { }); } if (options.earlybound) { const entitiestd = Object.getOwnPropertyNames(entities).map((entityName) => { const meta = entities[entityName]; const localChoice = localChoices[entityName]; return { entity: entityName, content: renderer_1.render(meta, meta, 'template-earlybound-entity', localChoice), }; }); console.log('saving type definition files'); entitiestd.forEach((element) => { fs_1.mkdirSync(`${options.output}/${element.entity}/`, { recursive: true, }); fs_1.writeFile(`${options.output}/${element.entity}/${element.entity}.d.ts`, element.content, () => { }); }); const formstd = forms.map((data) => { const meta = entities[data.objecttypecode]; return { entity: data.objecttypecode, formtype: data.type === 2 ? 'main' : 'quickcreate', formname: data.name.replace(/ */g, ''), content: renderer_1.render(data, meta, 'template-earlybound-form'), }; }); console.log('saving type definition files'); formstd.forEach((element) => { fs_1.mkdirSync(`${options.output}/${element.entity}/Forms/${element.formtype}`, { recursive: true, }); fs_1.writeFile(`${options.output}/${element.entity}/Forms/${element.formtype}/${element.formname}.d.ts`, element.content, () => { }); }); } else { const formstd = forms.map((data) => { const meta = entities[data.objecttypecode]; return { entity: data.objecttypecode, formtype: data.type === 2 ? 'main' : 'quickcreate', formname: data.name.replace(/ */g, ''), content: renderer_1.render(data, meta, 'template'), }; }); console.log('saving type definition files'); formstd.forEach((element) => { fs_1.mkdirSync(`${options.output}/Xrm/Forms/${element.entity}/${element.formtype}`, { recursive: true, }); fs_1.writeFile(`${options.output}/Xrm/Forms/${element.entity}/${element.formtype}/${element.formname}.d.ts`, element.content, () => { }); }); } if (!options.localStorage) { mylocalStorage.clear(); } console.log('Finished!'); }; // #region Login console.log('authenticating'); const authContext = new adal_node_1.AuthenticationContext(options.tenent); if (options.password) { authContext.acquireTokenWithUsernamePassword(options.url, options.username, options.password, options.clientid, (error, response) => { if (error) { console.error(`Error: ${error.message}`); } if (response.accessToken) { Main(response); } }); } else if (options.secret) { authContext.acquireTokenWithClientCredentials(options.url, options.clientid, options.secret, (error, response) => { if (error) { console.error(`Error: ${error.message}`); } if (response.accessToken) { Main(response); } }); } // #endregion //# sourceMappingURL=index.js.map