create-powerapps-project 0.16.4 → 0.17.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/CHANGELOG.json +76 -1
- package/CHANGELOG.md +44 -4
- package/bin/sn.exe +0 -0
- package/bin/sn.exe.config +6 -0
- package/lib/getEnvInfo.js +0 -1
- package/lib/index.js +11 -16
- package/lib/nuget.js +0 -2
- package/lib/packageManager.js +4 -2
- package/lib/plopfile.js +167 -2
- package/package.json +4 -7
- package/plop-templates/assembly/package.json.hbs +1 -0
- package/plop-templates/pcf/{index.ts → index.ts.hbs} +9 -6
- package/plop-templates/pcf/tsconfig.json +7 -0
- package/plop-templates/webresource/package.json.hbs +1 -0
- package/lib/createDataverseProject.js +0 -220
- package/lib/logger.js +0 -36
- package/lib/plop.js +0 -37
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,82 @@
|
|
|
2
2
|
"name": "create-powerapps-project",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "
|
|
5
|
+
"date": "Thu, 17 Feb 2022 15:18:18 GMT",
|
|
6
|
+
"tag": "create-powerapps-project_v0.17.1",
|
|
7
|
+
"version": "0.17.1",
|
|
8
|
+
"comments": {
|
|
9
|
+
"patch": [
|
|
10
|
+
{
|
|
11
|
+
"author": "derek.finlinson@journeyteam.com",
|
|
12
|
+
"package": "create-powerapps-project",
|
|
13
|
+
"commit": "939644135518711560c4a61b57da71aca02cf15f",
|
|
14
|
+
"comment": "Import from plop instead of node-plop"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"date": "Thu, 17 Feb 2022 01:03:11 GMT",
|
|
21
|
+
"tag": "create-powerapps-project_v0.17.0",
|
|
22
|
+
"version": "0.17.0",
|
|
23
|
+
"comments": {
|
|
24
|
+
"minor": [
|
|
25
|
+
{
|
|
26
|
+
"author": "derek.finlinson@journeyteam.com",
|
|
27
|
+
"package": "create-powerapps-project",
|
|
28
|
+
"commit": "not available",
|
|
29
|
+
"comment": "Switch to wrapping plop"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"date": "Thu, 17 Feb 2022 01:02:44 GMT",
|
|
36
|
+
"tag": "create-powerapps-project_v0.17.0",
|
|
37
|
+
"version": "0.17.0",
|
|
38
|
+
"comments": {
|
|
39
|
+
"minor": [
|
|
40
|
+
{
|
|
41
|
+
"author": "derek.finlinson@journeyteam.com",
|
|
42
|
+
"package": "create-powerapps-project",
|
|
43
|
+
"commit": "205f5973d29c92d19c7e2f5154e01a784c2fe58b",
|
|
44
|
+
"comment": "Switch to wrapping plop"
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"date": "Wed, 16 Feb 2022 00:36:25 GMT",
|
|
51
|
+
"tag": "create-powerapps-project_v0.16.6",
|
|
52
|
+
"version": "0.16.6",
|
|
53
|
+
"comments": {
|
|
54
|
+
"patch": [
|
|
55
|
+
{
|
|
56
|
+
"author": "derek.finlinson@journeyteam.com",
|
|
57
|
+
"package": "create-powerapps-project",
|
|
58
|
+
"commit": "96abb993cc017edf436a612281ef7a5d3346023b",
|
|
59
|
+
"comment": "Re-add sn.exe; React PCF updates"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"date": "Mon, 14 Feb 2022 23:29:54 GMT",
|
|
66
|
+
"tag": "create-powerapps-project_v0.16.5",
|
|
67
|
+
"version": "0.16.5",
|
|
68
|
+
"comments": {
|
|
69
|
+
"patch": [
|
|
70
|
+
{
|
|
71
|
+
"author": "derek.finlinson@journeyteam.com",
|
|
72
|
+
"package": "create-powerapps-project",
|
|
73
|
+
"commit": "361a315823b5558a96c191850c2fcf8863653e5b",
|
|
74
|
+
"comment": "Set class name from prompts"
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"date": "Fri, 11 Feb 2022 16:59:23 GMT",
|
|
6
81
|
"tag": "create-powerapps-project_v0.16.4",
|
|
7
82
|
"version": "0.16.4",
|
|
8
83
|
"comments": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,17 +1,57 @@
|
|
|
1
1
|
# Change Log - create-powerapps-project
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Thu, 17 Feb 2022 15:18:18 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
-
## 0.
|
|
7
|
+
## 0.17.1
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Thu, 17 Feb 2022 15:18:18 GMT
|
|
10
10
|
|
|
11
11
|
### Patches
|
|
12
12
|
|
|
13
|
-
-
|
|
13
|
+
- Import from plop instead of node-plop (derek.finlinson@journeyteam.com)
|
|
14
14
|
|
|
15
|
+
## 0.17.0
|
|
16
|
+
|
|
17
|
+
Thu, 17 Feb 2022 01:03:11 GMT
|
|
18
|
+
|
|
19
|
+
### Minor changes
|
|
20
|
+
|
|
21
|
+
- Switch to wrapping plop (derek.finlinson@journeyteam.com)
|
|
22
|
+
|
|
23
|
+
## 0.17.0
|
|
24
|
+
|
|
25
|
+
Thu, 17 Feb 2022 01:02:44 GMT
|
|
26
|
+
|
|
27
|
+
### Minor changes
|
|
28
|
+
|
|
29
|
+
- Switch to wrapping plop (derek.finlinson@journeyteam.com)
|
|
30
|
+
|
|
31
|
+
## 0.16.6
|
|
32
|
+
|
|
33
|
+
Wed, 16 Feb 2022 00:36:25 GMT
|
|
34
|
+
|
|
35
|
+
### Patches
|
|
36
|
+
|
|
37
|
+
- Re-add sn.exe; React PCF updates (derek.finlinson@journeyteam.com)
|
|
38
|
+
|
|
39
|
+
## 0.16.5
|
|
40
|
+
|
|
41
|
+
Mon, 14 Feb 2022 23:29:54 GMT
|
|
42
|
+
|
|
43
|
+
### Patches
|
|
44
|
+
|
|
45
|
+
- Set class name from prompts (derek.finlinson@journeyteam.com)
|
|
46
|
+
|
|
47
|
+
## 0.16.4
|
|
48
|
+
|
|
49
|
+
Fri, 11 Feb 2022 16:59:23 GMT
|
|
50
|
+
|
|
51
|
+
### Patches
|
|
52
|
+
|
|
53
|
+
- Comment out pcf plop for now (derek.finlinson@journeyteam.com)
|
|
54
|
+
|
|
15
55
|
## 0.16.3
|
|
16
56
|
|
|
17
57
|
Wed, 09 Feb 2022 16:19:05 GMT
|
package/bin/sn.exe
ADDED
|
Binary file
|
package/lib/getEnvInfo.js
CHANGED
package/lib/index.js
CHANGED
|
@@ -4,20 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
5
|
};
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
.
|
|
18
|
-
(0, createDataverseProject_1.default)(type);
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const plop_1 = require("plop");
|
|
9
|
+
plop_1.Plop.launch({
|
|
10
|
+
cwd: process.cwd(),
|
|
11
|
+
configPath: node_path_1.default.join(__dirname, 'plopfile.js')
|
|
12
|
+
}, env => {
|
|
13
|
+
const options = {
|
|
14
|
+
...env,
|
|
15
|
+
dest: process.cwd() // this will make the destination path to be based on the cwd when calling the wrapper
|
|
16
|
+
};
|
|
17
|
+
return (0, plop_1.run)(options, undefined, true);
|
|
19
18
|
});
|
|
20
|
-
program.parse(process.argv);
|
|
21
|
-
if (!process.argv.slice(1).length) {
|
|
22
|
-
program.outputHelp();
|
|
23
|
-
}
|
package/lib/nuget.js
CHANGED
|
@@ -37,12 +37,10 @@ const install = (project, sdkVersion, xrmVersion) => {
|
|
|
37
37
|
stdio: 'inherit'
|
|
38
38
|
});
|
|
39
39
|
// Install nuget packages
|
|
40
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
41
40
|
(0, child_process_1.spawnSync)('dotnet', ['add', 'package', 'Microsoft.CrmSdk.Workflow', '-v', sdkVersion, '-n'], {
|
|
42
41
|
cwd: process.cwd(),
|
|
43
42
|
stdio: 'inherit'
|
|
44
43
|
});
|
|
45
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
46
44
|
(0, child_process_1.spawnSync)('dotnet', ['add', 'package', 'JourneyTeam.Xrm', '-v', xrmVersion, '-n'], {
|
|
47
45
|
cwd: process.cwd(),
|
|
48
46
|
stdio: 'inherit'
|
package/lib/packageManager.js
CHANGED
|
@@ -38,12 +38,14 @@ function getPackages(type) {
|
|
|
38
38
|
dependencies: [
|
|
39
39
|
'react',
|
|
40
40
|
'react-dom',
|
|
41
|
-
'@fluentui/react'
|
|
41
|
+
'@fluentui/react',
|
|
42
|
+
'@fluentui/font-icons-mdl2'
|
|
42
43
|
],
|
|
43
44
|
devDependencies: [
|
|
44
45
|
//`powerapps-project-${type}`,
|
|
45
46
|
'@types/react',
|
|
46
|
-
'@types/react-dom'
|
|
47
|
+
'@types/react-dom',
|
|
48
|
+
'@types/xrm'
|
|
47
49
|
]
|
|
48
50
|
};
|
|
49
51
|
}
|
package/lib/plopfile.js
CHANGED
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
2
21
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
22
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
23
|
};
|
|
@@ -6,10 +25,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
25
|
const path_1 = __importDefault(require("path"));
|
|
7
26
|
const child_process_1 = require("child_process");
|
|
8
27
|
const fs_1 = __importDefault(require("fs"));
|
|
28
|
+
const nuget = __importStar(require("./nuget"));
|
|
29
|
+
const pkg = __importStar(require("./packageManager"));
|
|
30
|
+
const getEnvInfo_1 = require("./getEnvInfo");
|
|
9
31
|
const didSucceed = (code) => `${code}` === '0';
|
|
10
32
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
11
33
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
12
34
|
exports.default = (plop) => {
|
|
35
|
+
void (0, getEnvInfo_1.initialize)();
|
|
13
36
|
plop.setActionType('signAssembly', (answers) => {
|
|
14
37
|
const keyPath = path_1.default.resolve(process.cwd(), `${answers.name}.snk`);
|
|
15
38
|
return new Promise((resolve, reject) => {
|
|
@@ -22,9 +45,12 @@ exports.default = (plop) => {
|
|
|
22
45
|
resolve('signed assembly');
|
|
23
46
|
}
|
|
24
47
|
else {
|
|
25
|
-
reject('
|
|
48
|
+
reject('failed to sign assembly');
|
|
26
49
|
}
|
|
27
50
|
});
|
|
51
|
+
sign.on('error', () => {
|
|
52
|
+
reject('failed to sign assembly');
|
|
53
|
+
});
|
|
28
54
|
});
|
|
29
55
|
});
|
|
30
56
|
plop.setActionType('runPcf', (answers) => {
|
|
@@ -46,6 +72,9 @@ exports.default = (plop) => {
|
|
|
46
72
|
reject('Ensure the Power Platform CLI is installed. Command must be run from within VS Code if using the Power Platform Extension');
|
|
47
73
|
}
|
|
48
74
|
});
|
|
75
|
+
pac.on('error', () => {
|
|
76
|
+
reject('Ensure the Power Platform CLI is installed. Command must be run from within VS Code if using the Power Platform Extension');
|
|
77
|
+
});
|
|
49
78
|
});
|
|
50
79
|
});
|
|
51
80
|
plop.setActionType('addGenScript', async () => {
|
|
@@ -56,7 +85,52 @@ exports.default = (plop) => {
|
|
|
56
85
|
await fs_1.default.promises.writeFile(packagePath, JSON.stringify(packageJson, null, 4), 'utf8');
|
|
57
86
|
return 'added plop script to package.json';
|
|
58
87
|
});
|
|
88
|
+
plop.setActionType('nugetInstall', async (answers) => {
|
|
89
|
+
const xrmVersions = await nuget.getNugetPackageVersions('JourneyTeam.Xrm');
|
|
90
|
+
const xrmVersion = xrmVersions.shift();
|
|
91
|
+
nuget.install(answers.name, answers.sdkVersion, xrmVersion);
|
|
92
|
+
return 'installed nuget packages';
|
|
93
|
+
});
|
|
94
|
+
plop.setActionType('npmInstall', (_answers, config) => {
|
|
95
|
+
if (config?.projectType) {
|
|
96
|
+
pkg.install(process.cwd(), config.projectType);
|
|
97
|
+
}
|
|
98
|
+
return 'installed npm packages';
|
|
99
|
+
});
|
|
100
|
+
const connectionQuestions = [
|
|
101
|
+
{
|
|
102
|
+
type: 'input',
|
|
103
|
+
name: 'server',
|
|
104
|
+
message: 'enter dataverse url (https://org.crm.dynamics.com):'
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: 'input',
|
|
108
|
+
name: 'tenant',
|
|
109
|
+
message: 'enter azure ad tenant (org.onmicrosoft.com):',
|
|
110
|
+
default: 'common'
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: 'input',
|
|
114
|
+
name: 'solution',
|
|
115
|
+
message: 'dataverse solution unique name:'
|
|
116
|
+
}
|
|
117
|
+
];
|
|
59
118
|
plop.setGenerator('webresource', {
|
|
119
|
+
description: 'generate dataverse web resource project',
|
|
120
|
+
prompts: [
|
|
121
|
+
{
|
|
122
|
+
type: 'input',
|
|
123
|
+
name: 'name',
|
|
124
|
+
message: 'project name',
|
|
125
|
+
default: path_1.default.basename(process.cwd())
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
type: 'input',
|
|
129
|
+
name: 'namespace',
|
|
130
|
+
message: 'namespace for form and ribbon scripts:'
|
|
131
|
+
},
|
|
132
|
+
...connectionQuestions
|
|
133
|
+
],
|
|
60
134
|
actions: [
|
|
61
135
|
{
|
|
62
136
|
type: 'addMany',
|
|
@@ -64,10 +138,44 @@ exports.default = (plop) => {
|
|
|
64
138
|
base: '../plop-templates/webresource',
|
|
65
139
|
destination: process.cwd(),
|
|
66
140
|
force: true
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'npmInstall',
|
|
144
|
+
projectType: 'webresource',
|
|
145
|
+
skip: (answers) => {
|
|
146
|
+
return !answers.react;
|
|
147
|
+
}
|
|
67
148
|
}
|
|
68
149
|
]
|
|
69
150
|
});
|
|
70
151
|
plop.setGenerator('pcf', {
|
|
152
|
+
description: 'generate dataverse pcf project',
|
|
153
|
+
prompts: [
|
|
154
|
+
{
|
|
155
|
+
type: 'list',
|
|
156
|
+
name: 'template',
|
|
157
|
+
message: 'template',
|
|
158
|
+
choices: [
|
|
159
|
+
{ name: 'field', value: 'field' },
|
|
160
|
+
{ name: 'dataset', value: 'dataset' }
|
|
161
|
+
]
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
type: 'input',
|
|
165
|
+
name: 'namespace',
|
|
166
|
+
message: 'namespace'
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
type: 'input',
|
|
170
|
+
name: 'name',
|
|
171
|
+
message: 'name'
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
type: 'confirm',
|
|
175
|
+
name: 'react',
|
|
176
|
+
message: 'use react?'
|
|
177
|
+
}
|
|
178
|
+
],
|
|
71
179
|
actions: [
|
|
72
180
|
{
|
|
73
181
|
type: 'runPcf'
|
|
@@ -76,7 +184,7 @@ exports.default = (plop) => {
|
|
|
76
184
|
type: 'addMany',
|
|
77
185
|
templateFiles: [
|
|
78
186
|
'../plop-templates/pcf/App.tsx',
|
|
79
|
-
'../plop-templates/pcf/index.ts'
|
|
187
|
+
'../plop-templates/pcf/index.ts.hbs'
|
|
80
188
|
],
|
|
81
189
|
base: '../plop-templates/pcf',
|
|
82
190
|
destination: `${process.cwd()}/{{ name }}`,
|
|
@@ -85,15 +193,65 @@ exports.default = (plop) => {
|
|
|
85
193
|
return !answers.react;
|
|
86
194
|
}
|
|
87
195
|
},
|
|
196
|
+
{
|
|
197
|
+
type: 'add',
|
|
198
|
+
templateFile: '../plop-templates/pcf/tsconfig.json',
|
|
199
|
+
path: path_1.default.resolve(process.cwd(), 'tsconfig.json'),
|
|
200
|
+
force: true,
|
|
201
|
+
skip: (answers) => {
|
|
202
|
+
return !answers.react;
|
|
203
|
+
}
|
|
204
|
+
},
|
|
88
205
|
{
|
|
89
206
|
type: 'addGenScript',
|
|
90
207
|
skip: (answers) => {
|
|
91
208
|
return !answers.react;
|
|
92
209
|
}
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
type: 'npmInstall',
|
|
213
|
+
projectType: 'pcf',
|
|
214
|
+
skip: (answers) => {
|
|
215
|
+
return !answers.react;
|
|
216
|
+
}
|
|
93
217
|
}
|
|
94
218
|
]
|
|
95
219
|
});
|
|
96
220
|
plop.setGenerator('assembly', {
|
|
221
|
+
description: 'generate dataverse assembly project',
|
|
222
|
+
prompts: [
|
|
223
|
+
{
|
|
224
|
+
type: 'list',
|
|
225
|
+
name: 'sdkVersion',
|
|
226
|
+
message: 'select sdk version',
|
|
227
|
+
choices: async () => {
|
|
228
|
+
const versions = await nuget.getNugetPackageVersions('Microsoft.CrmSdk.Workflow');
|
|
229
|
+
return versions.map(v => ({ name: v, value: v }));
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
type: 'input',
|
|
234
|
+
name: 'name',
|
|
235
|
+
message: 'default C# namespace (Company.Crm.Plugins):'
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
type: 'list',
|
|
239
|
+
name: 'isolation',
|
|
240
|
+
message: 'select isolation mode',
|
|
241
|
+
default: 2,
|
|
242
|
+
choices: [
|
|
243
|
+
{
|
|
244
|
+
name: 'sandbox',
|
|
245
|
+
value: 2
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
name: 'none',
|
|
249
|
+
value: 1
|
|
250
|
+
}
|
|
251
|
+
]
|
|
252
|
+
},
|
|
253
|
+
...connectionQuestions,
|
|
254
|
+
],
|
|
97
255
|
actions: [
|
|
98
256
|
{
|
|
99
257
|
type: 'add',
|
|
@@ -117,6 +275,13 @@ exports.default = (plop) => {
|
|
|
117
275
|
},
|
|
118
276
|
{
|
|
119
277
|
type: 'signAssembly'
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
type: 'nugetInstall'
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
type: 'npmInstall',
|
|
284
|
+
projectType: 'assembly'
|
|
120
285
|
}
|
|
121
286
|
]
|
|
122
287
|
});
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-powerapps-project",
|
|
3
3
|
"description": "💧 plop generator for Dataverse development",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.17.1",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"type": "commonjs",
|
|
6
7
|
"main": "lib/index.js",
|
|
7
8
|
"bin": {
|
|
8
9
|
"create-powerapps-project": "lib/index.js"
|
|
@@ -22,15 +23,11 @@
|
|
|
22
23
|
"clean": "rimraf lib"
|
|
23
24
|
},
|
|
24
25
|
"dependencies": {
|
|
25
|
-
"commander": "^8.3.0",
|
|
26
26
|
"envinfo": "^7.8.1",
|
|
27
|
-
"
|
|
28
|
-
"node-plop": "^0.26.3",
|
|
29
|
-
"prompts": "^2.4.2"
|
|
27
|
+
"plop": "^2.7.6"
|
|
30
28
|
},
|
|
31
29
|
"devDependencies": {
|
|
32
30
|
"@types/envinfo": "^7.8.1",
|
|
33
|
-
"@types/node": "^14.14.21"
|
|
34
|
-
"@types/prompts": "^2.0.14"
|
|
31
|
+
"@types/node": "^14.14.21"
|
|
35
32
|
}
|
|
36
33
|
}
|
|
@@ -3,12 +3,13 @@ import React from 'react';
|
|
|
3
3
|
import ReactDOM from 'react-dom';
|
|
4
4
|
import { initializeIcons } from '@fluentui/font-icons-mdl2';
|
|
5
5
|
|
|
6
|
-
import { App } from './App';
|
|
6
|
+
import { App, AppProps } from './App';
|
|
7
7
|
|
|
8
|
-
export class
|
|
8
|
+
export class {{name}} implements ComponentFramework.StandardControl<IInputs, IOutputs> {
|
|
9
9
|
container: HTMLDivElement;
|
|
10
10
|
context: ComponentFramework.Context<IInputs>;
|
|
11
11
|
isTestHarness: boolean;
|
|
12
|
+
props: AppProps;
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Empty constructor.
|
|
@@ -39,10 +40,12 @@ export class ReportDashboard implements ComponentFramework.StandardControl<IInpu
|
|
|
39
40
|
* @param context The entire property bag available to control via Context Object; It contains values as set up by the customizer mapped to names defined in the manifest, as well as utility functions
|
|
40
41
|
*/
|
|
41
42
|
public updateView(context: ComponentFramework.Context<IInputs>): void {
|
|
43
|
+
this.props = {
|
|
44
|
+
isTestHarness: this.isTestHarness
|
|
45
|
+
};
|
|
46
|
+
|
|
42
47
|
ReactDOM.render(
|
|
43
|
-
React.createElement(App,
|
|
44
|
-
isTestHarness: this.isTestHarness
|
|
45
|
-
}),
|
|
48
|
+
React.createElement(App, this.props),
|
|
46
49
|
this.container
|
|
47
50
|
);
|
|
48
51
|
}
|
|
@@ -60,7 +63,7 @@ export class ReportDashboard implements ComponentFramework.StandardControl<IInpu
|
|
|
60
63
|
* i.e. cancelling any pending remote calls, removing listeners, etc.
|
|
61
64
|
*/
|
|
62
65
|
public destroy(): void {
|
|
63
|
-
|
|
66
|
+
ReactDOM.unmountComponentAtNode(this.container);
|
|
64
67
|
}
|
|
65
68
|
|
|
66
69
|
}
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.done = void 0;
|
|
26
|
-
const prompts_1 = __importDefault(require("prompts"));
|
|
27
|
-
const nuget_1 = require("./nuget");
|
|
28
|
-
const path_1 = __importDefault(require("path"));
|
|
29
|
-
const plop_1 = require("./plop");
|
|
30
|
-
const pkg = __importStar(require("./packageManager"));
|
|
31
|
-
const getEnvInfo_1 = require("./getEnvInfo");
|
|
32
|
-
const logger_1 = require("./logger");
|
|
33
|
-
exports.default = async (type) => {
|
|
34
|
-
await (0, getEnvInfo_1.initialize)();
|
|
35
|
-
const name = path_1.default.basename(process.cwd());
|
|
36
|
-
if (!type || (type !== 'webresource' && type !== 'assembly' && type !== 'pcf')) {
|
|
37
|
-
const invalid = type !== undefined && type !== 'webresource' && type !== 'assembly' && type !== 'pcf';
|
|
38
|
-
const invalidMessage = invalid ? `${type} is not a valid project type.` : '';
|
|
39
|
-
const { promptType } = await (0, prompts_1.default)({
|
|
40
|
-
type: 'select',
|
|
41
|
-
name: 'promptType',
|
|
42
|
-
message: `${invalidMessage} Select dataverse project to create?`,
|
|
43
|
-
choices: [
|
|
44
|
-
{ title: 'web resource', value: 'webresource' },
|
|
45
|
-
{ title: 'plugin or workflow activity', value: 'assembly' },
|
|
46
|
-
{ title: 'powerapps component framework control', value: 'pcf' }
|
|
47
|
-
]
|
|
48
|
-
});
|
|
49
|
-
type = promptType;
|
|
50
|
-
}
|
|
51
|
-
const questions = await getAnswers(type);
|
|
52
|
-
const config = (await (0, prompts_1.default)(questions));
|
|
53
|
-
if (type === 'assembly') {
|
|
54
|
-
const xrmVersions = await (0, nuget_1.getNugetPackageVersions)('JourneyTeam.Xrm');
|
|
55
|
-
config.xrmVersion = xrmVersions.shift();
|
|
56
|
-
}
|
|
57
|
-
else if (type === 'webresource') {
|
|
58
|
-
config.name = name;
|
|
59
|
-
}
|
|
60
|
-
const generator = await (0, plop_1.getGenerator)(type, name);
|
|
61
|
-
logger_1.logger.info(`run powerapps-project-${type} code generator`);
|
|
62
|
-
try {
|
|
63
|
-
await (0, plop_1.runGenerator)(generator, config);
|
|
64
|
-
}
|
|
65
|
-
catch (ex) {
|
|
66
|
-
logger_1.logger.error(ex.message);
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
logger_1.logger.info('initialize project');
|
|
70
|
-
if (type !== 'pcf' || config.react) {
|
|
71
|
-
pkg.install(process.cwd(), type);
|
|
72
|
-
}
|
|
73
|
-
if (type === 'assembly') {
|
|
74
|
-
logger_1.logger.info('add nuget packages');
|
|
75
|
-
(0, nuget_1.install)(config.name, config.sdkVersion, config.xrmVersion);
|
|
76
|
-
}
|
|
77
|
-
(0, exports.done)(type);
|
|
78
|
-
};
|
|
79
|
-
const getAnswers = async (type) => {
|
|
80
|
-
let questions = [];
|
|
81
|
-
if (type === 'pcf') {
|
|
82
|
-
questions = [
|
|
83
|
-
{
|
|
84
|
-
type: 'select',
|
|
85
|
-
name: 'template',
|
|
86
|
-
message: 'template',
|
|
87
|
-
choices: [
|
|
88
|
-
{ title: 'field', value: 'field' },
|
|
89
|
-
{ title: 'dataset', value: 'dataset' }
|
|
90
|
-
]
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
type: 'text',
|
|
94
|
-
name: 'namespace',
|
|
95
|
-
message: 'namespace'
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
type: 'text',
|
|
99
|
-
name: 'name',
|
|
100
|
-
message: 'name'
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
type: 'confirm',
|
|
104
|
-
name: 'react',
|
|
105
|
-
message: 'install react?'
|
|
106
|
-
}
|
|
107
|
-
];
|
|
108
|
-
return questions;
|
|
109
|
-
}
|
|
110
|
-
if (type === 'webresource') {
|
|
111
|
-
questions.push({
|
|
112
|
-
type: 'text',
|
|
113
|
-
name: 'namespace',
|
|
114
|
-
message: 'namespace for form and ribbon scripts:'
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
const versions = await (0, nuget_1.getNugetPackageVersions)('Microsoft.CrmSdk.Workflow');
|
|
119
|
-
questions = [
|
|
120
|
-
{
|
|
121
|
-
type: 'select',
|
|
122
|
-
name: 'sdkVersion',
|
|
123
|
-
message: 'select sdk version',
|
|
124
|
-
choices: versions.map(v => ({ title: v, value: v }))
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
type: 'text',
|
|
128
|
-
name: 'name',
|
|
129
|
-
message: 'default namespace'
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
type: 'select',
|
|
133
|
-
name: 'isolation',
|
|
134
|
-
message: 'select isolation mode',
|
|
135
|
-
initial: 0,
|
|
136
|
-
choices: [
|
|
137
|
-
{
|
|
138
|
-
title: 'sandbox',
|
|
139
|
-
value: 2
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
title: 'none',
|
|
143
|
-
value: 1
|
|
144
|
-
}
|
|
145
|
-
]
|
|
146
|
-
}
|
|
147
|
-
];
|
|
148
|
-
}
|
|
149
|
-
questions = [
|
|
150
|
-
...questions,
|
|
151
|
-
{
|
|
152
|
-
type: 'text',
|
|
153
|
-
name: 'server',
|
|
154
|
-
message: 'enter dataverse url (https://org.crm.dynamics.com):'
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
type: 'text',
|
|
158
|
-
name: 'tenant',
|
|
159
|
-
message: 'enter azure ad tenant (org.onmicrosoft.com):'
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
type: 'text',
|
|
163
|
-
name: 'solution',
|
|
164
|
-
message: 'dataverse solution unique name:'
|
|
165
|
-
}
|
|
166
|
-
];
|
|
167
|
-
return questions;
|
|
168
|
-
};
|
|
169
|
-
const done = (type) => {
|
|
170
|
-
if (process.env.JEST_WORKER_ID !== undefined) {
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
let message;
|
|
174
|
-
if (type === 'pcf') {
|
|
175
|
-
message = `
|
|
176
|
-
|
|
177
|
-
${logger_1.icons.done} ${type} project created!
|
|
178
|
-
|
|
179
|
-
keep your build tools up-to-date by updating these two devDependencies:
|
|
180
|
-
${logger_1.icons.info} powerapps-project-${type}
|
|
181
|
-
|
|
182
|
-
build your project in watch mode with this command:
|
|
183
|
-
${logger_1.icons.info} npm start watch
|
|
184
|
-
build your project in production mode with this command:
|
|
185
|
-
${logger_1.icons.info} npm run build
|
|
186
|
-
|
|
187
|
-
run code generator with this command:
|
|
188
|
-
${logger_1.icons.info} npm run gen
|
|
189
|
-
|
|
190
|
-
`;
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
message = `
|
|
194
|
-
|
|
195
|
-
${logger_1.icons.done} ${type} project created!
|
|
196
|
-
|
|
197
|
-
keep your build tools up-to-date by updating these two devDependencies:
|
|
198
|
-
${logger_1.icons.info} dataverse-utils
|
|
199
|
-
${logger_1.icons.info} powerapps-project-${type}
|
|
200
|
-
|
|
201
|
-
${type === 'webresource' ?
|
|
202
|
-
`build your project in watch mode with this command:
|
|
203
|
-
${logger_1.icons.info} ${pkg.getYarn() ? 'yarn' : 'npm run'} start
|
|
204
|
-
build your project in production mode with this command:
|
|
205
|
-
${logger_1.icons.info} ${pkg.getYarn() ? 'yarn' : 'npm run'} build
|
|
206
|
-
generate table definition files with this command:
|
|
207
|
-
${logger_1.icons.info} ${pkg.getYarn() ? 'yarn' : 'npm run'} generate` :
|
|
208
|
-
`build your project with this command:
|
|
209
|
-
dotnet build
|
|
210
|
-
deploy your project with this command:
|
|
211
|
-
${logger_1.icons.info} ${pkg.getYarn() ? 'yarn' : 'npm run'} deploy`}
|
|
212
|
-
|
|
213
|
-
run code generator with this command:
|
|
214
|
-
${logger_1.icons.info} ${pkg.getYarn() ? 'yarn' : 'npm run'} gen
|
|
215
|
-
|
|
216
|
-
`;
|
|
217
|
-
}
|
|
218
|
-
console.info(message);
|
|
219
|
-
};
|
|
220
|
-
exports.done = done;
|
package/lib/logger.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.logger = exports.icons = void 0;
|
|
7
|
-
const kleur_1 = __importDefault(require("kleur"));
|
|
8
|
-
const isTest = process.env.JEST_WORKER_ID !== undefined;
|
|
9
|
-
exports.icons = {
|
|
10
|
-
done: kleur_1.default.green('◉'),
|
|
11
|
-
info: kleur_1.default.cyan('◎'),
|
|
12
|
-
error: kleur_1.default.red('⨂'),
|
|
13
|
-
warn: kleur_1.default.yellow('⨁')
|
|
14
|
-
};
|
|
15
|
-
exports.logger = {
|
|
16
|
-
info(...args) {
|
|
17
|
-
if (!isTest) {
|
|
18
|
-
console.info(exports.icons.info, ...args);
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
warn(...args) {
|
|
22
|
-
if (!isTest) {
|
|
23
|
-
console.warn(exports.icons.warn, ...args);
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
error(...args) {
|
|
27
|
-
if (!isTest) {
|
|
28
|
-
console.error(exports.icons.error, ...args);
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
|
-
done(...args) {
|
|
32
|
-
if (!isTest) {
|
|
33
|
-
console.info(exports.icons.done, ...args);
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
};
|
package/lib/plop.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.runGenerator = exports.getGenerator = void 0;
|
|
7
|
-
const node_plop_1 = __importDefault(require("node-plop"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const logger_1 = require("./logger");
|
|
10
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
-
const getGenerator = async (type, name) => {
|
|
12
|
-
let plopFile = path_1.default.resolve(__dirname, 'plopfile.js');
|
|
13
|
-
if (process.env.JEST_WORKER_ID !== undefined) {
|
|
14
|
-
plopFile = path_1.default.resolve(__dirname, 'plopfile.ts');
|
|
15
|
-
}
|
|
16
|
-
const plop = (0, node_plop_1.default)(plopFile, { destBasePath: name, force: false });
|
|
17
|
-
const generator = plop.getGenerator(type);
|
|
18
|
-
return generator;
|
|
19
|
-
};
|
|
20
|
-
exports.getGenerator = getGenerator;
|
|
21
|
-
const runGenerator = async (generator, args) => {
|
|
22
|
-
const results = await generator.runActions(args, {
|
|
23
|
-
onComment: (comment) => {
|
|
24
|
-
logger_1.logger.info(comment);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
if (results.failures && results.failures.length > 0) {
|
|
28
|
-
throw new Error(results.failures[0].error);
|
|
29
|
-
}
|
|
30
|
-
// do something after the actions have run
|
|
31
|
-
for (const change of results.changes) {
|
|
32
|
-
if (change.path) {
|
|
33
|
-
logger_1.logger.done(change.path);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
exports.runGenerator = runGenerator;
|