albxrmtypesgen
Version:
A TypeScript Declaration Generator for Dynamics 365 Forms
185 lines (183 loc) • 8.5 kB
JavaScript
;
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