create-powerapps-project 0.22.0 → 0.24.0
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/README.md +2 -1
- package/lib/nuget.js +14 -29
- package/lib/packageManager.js +8 -42
- package/lib/plopActions.js +108 -0
- package/lib/plopfile.js +178 -110
- package/package.json +1 -1
- package/plop-templates/assembly/.vscode/tasks.json.hbs +36 -0
- package/plop-templates/assembly/assembly.csproj.hbs +5 -3
- package/plop-templates/assembly/dataverse.package.config.json.hbs +17 -0
- package/plop-templates/assembly/package.csproj.hbs +30 -0
- package/plop-templates/assembly/.vscode/tasks.json +0 -31
package/README.md
CHANGED
|
@@ -14,6 +14,7 @@ Project generator for Dataverse development
|
|
|
14
14
|
* Unit tests using [xrm-mock](https://github.com/camelCaseDave/xrm-mock) and [Jest](https://jestjs.io/)
|
|
15
15
|
* Deploy web resources
|
|
16
16
|
* Plugin project scaffolding
|
|
17
|
+
* Support for [plugin packages](https://docs.microsoft.com/en-us/power-apps/developer/data-platform/dependent-assembly-plugins) (dependent assemblies)
|
|
17
18
|
* Base plugin classes
|
|
18
19
|
* No ILMerge needed
|
|
19
20
|
* Deploy plugin assemblies and types
|
|
@@ -33,4 +34,4 @@ npm init powerapps-project
|
|
|
33
34
|
|
|
34
35
|
```sh
|
|
35
36
|
npm run gen
|
|
36
|
-
```
|
|
37
|
+
```
|
package/lib/nuget.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.nugetRestore = exports.getNugetPackageVersions = void 0;
|
|
7
7
|
const https_1 = __importDefault(require("https"));
|
|
8
8
|
const child_process_1 = require("child_process");
|
|
9
9
|
const getNugetPackageVersions = (name) => {
|
|
@@ -14,11 +14,16 @@ const getNugetPackageVersions = (name) => {
|
|
|
14
14
|
body += d;
|
|
15
15
|
});
|
|
16
16
|
response.on('end', () => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
const result = JSON.parse(body);
|
|
18
|
+
if (result.data.length > 0) {
|
|
19
|
+
const versions = result.data[0].versions.map((v) => {
|
|
20
|
+
return v.version;
|
|
21
|
+
}).reverse();
|
|
22
|
+
resolve(versions);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
reject(`package ${name} not found`);
|
|
26
|
+
}
|
|
22
27
|
});
|
|
23
28
|
}).on('error', (e) => {
|
|
24
29
|
reject(e);
|
|
@@ -26,31 +31,11 @@ const getNugetPackageVersions = (name) => {
|
|
|
26
31
|
});
|
|
27
32
|
};
|
|
28
33
|
exports.getNugetPackageVersions = getNugetPackageVersions;
|
|
29
|
-
const
|
|
30
|
-
// Add solution
|
|
31
|
-
(0, child_process_1.spawnSync)('dotnet', ['new', 'sln', '-n', project], {
|
|
32
|
-
cwd: process.cwd(),
|
|
33
|
-
stdio: 'inherit'
|
|
34
|
-
});
|
|
35
|
-
(0, child_process_1.spawnSync)('dotnet', ['sln', 'add', `${project}.csproj`], {
|
|
36
|
-
cwd: process.cwd(),
|
|
37
|
-
stdio: 'inherit'
|
|
38
|
-
});
|
|
34
|
+
const nugetRestore = async () => {
|
|
39
35
|
// Install nuget packages
|
|
40
|
-
(0, child_process_1.spawnSync)('dotnet', ['add', 'package', 'Microsoft.CrmSdk.Workflow', '-v', sdkVersion, '-n'], {
|
|
41
|
-
cwd: process.cwd(),
|
|
42
|
-
stdio: 'inherit'
|
|
43
|
-
});
|
|
44
|
-
(0, child_process_1.spawnSync)('dotnet', ['add', 'package', 'JourneyTeam.Xrm', '-v', xrmVersion, '-n'], {
|
|
45
|
-
cwd: process.cwd(),
|
|
46
|
-
stdio: 'inherit'
|
|
47
|
-
});
|
|
48
36
|
if (process.env.JEST_WORKER_ID !== undefined) {
|
|
49
37
|
return;
|
|
50
38
|
}
|
|
51
|
-
(0, child_process_1.spawnSync)('dotnet', ['restore'], {
|
|
52
|
-
cwd: process.cwd(),
|
|
53
|
-
stdio: 'inherit'
|
|
54
|
-
});
|
|
39
|
+
(0, child_process_1.spawnSync)('dotnet', ['restore'], { cwd: process.cwd(), stdio: 'inherit' });
|
|
55
40
|
};
|
|
56
|
-
exports.
|
|
41
|
+
exports.nugetRestore = nugetRestore;
|
package/lib/packageManager.js
CHANGED
|
@@ -3,54 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.install = void 0;
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
5
|
const child_process_1 = require("child_process");
|
|
6
|
-
const install = (
|
|
6
|
+
const install = async (packageManager, packages) => {
|
|
7
7
|
if (process.env.JEST_WORKER_ID != undefined) {
|
|
8
8
|
return;
|
|
9
9
|
}
|
|
10
|
-
if (
|
|
11
|
-
(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const packages = getPackages(type);
|
|
15
|
-
(0, child_process_1.spawnSync)(packageManager, ['add', ...packages.devDependencies], { stdio: 'inherit', shell: true });
|
|
10
|
+
if (packages) {
|
|
11
|
+
if (packages.devDependencies) {
|
|
12
|
+
(0, child_process_1.spawnSync)(packageManager, ['add', ...packages.devDependencies], { stdio: 'inherit', shell: true });
|
|
13
|
+
}
|
|
16
14
|
if (packages.dependencies) {
|
|
17
15
|
(0, child_process_1.spawnSync)(packageManager, ['add', ...packages.dependencies], { stdio: 'inherit', shell: true });
|
|
18
16
|
}
|
|
19
17
|
}
|
|
18
|
+
else {
|
|
19
|
+
(0, child_process_1.spawnSync)(packageManager, ['install'], { stdio: 'inherit', shell: true });
|
|
20
|
+
}
|
|
20
21
|
};
|
|
21
22
|
exports.install = install;
|
|
22
|
-
function getPackages(type) {
|
|
23
|
-
const packages = {
|
|
24
|
-
devDependencies: [
|
|
25
|
-
`powerapps-project-${type}`,
|
|
26
|
-
'dataverse-utils'
|
|
27
|
-
]
|
|
28
|
-
};
|
|
29
|
-
if (type === 'webresource') {
|
|
30
|
-
packages.devDependencies = [
|
|
31
|
-
...packages.devDependencies,
|
|
32
|
-
'@types/xrm',
|
|
33
|
-
'typescript',
|
|
34
|
-
'eslint',
|
|
35
|
-
'@typescript-eslint/eslint-plugin',
|
|
36
|
-
'@typescript-eslint/parser',
|
|
37
|
-
'webpack-event-plugin',
|
|
38
|
-
'clean-webpack-plugin',
|
|
39
|
-
'source-map-loader',
|
|
40
|
-
'babel-loader',
|
|
41
|
-
'ts-loader',
|
|
42
|
-
'@babel/core',
|
|
43
|
-
'@babel/preset-env',
|
|
44
|
-
'@babel/preset-typescript',
|
|
45
|
-
'xrm-mock',
|
|
46
|
-
'webpack',
|
|
47
|
-
'webpack-cli',
|
|
48
|
-
'cross-spawn',
|
|
49
|
-
'ts-node',
|
|
50
|
-
'@microsoft/eslint-plugin-power-apps',
|
|
51
|
-
'-D'
|
|
52
|
-
];
|
|
53
|
-
packages.dependencies = ['core-js', 'regenerator-runtime', 'powerapps-common', 'dataverse-webapi'];
|
|
54
|
-
}
|
|
55
|
-
return packages;
|
|
56
|
-
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const path_1 = __importDefault(require("path"));
|
|
30
|
+
const child_process_1 = require("child_process");
|
|
31
|
+
const fs_1 = __importDefault(require("fs"));
|
|
32
|
+
const nuget = __importStar(require("./nuget"));
|
|
33
|
+
const pkg = __importStar(require("./packageManager"));
|
|
34
|
+
const didSucceed = (code) => `${code}` === '0';
|
|
35
|
+
exports.default = (plop) => {
|
|
36
|
+
plop.setDefaultInclude({ actionTypes: true });
|
|
37
|
+
plop.setActionType('addSolution', async (answers) => {
|
|
38
|
+
// Add solution
|
|
39
|
+
(0, child_process_1.spawnSync)('dotnet', ['new', 'sln', '-n', answers.name], { cwd: process.cwd(), stdio: 'inherit' });
|
|
40
|
+
(0, child_process_1.spawnSync)('dotnet', ['sln', 'add', `${answers.name}.csproj`], { cwd: process.cwd(), stdio: 'inherit' });
|
|
41
|
+
return 'added dotnet solution';
|
|
42
|
+
});
|
|
43
|
+
plop.setActionType('addScript', async (answers) => {
|
|
44
|
+
const packagePath = path_1.default.resolve(process.cwd(), 'package.json');
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
46
|
+
const packageJson = require(packagePath);
|
|
47
|
+
packageJson.scripts[answers.scriptKey] = answers.scriptValue;
|
|
48
|
+
await fs_1.default.promises.writeFile(packagePath, JSON.stringify(packageJson, null, 4), 'utf8');
|
|
49
|
+
return `added ${answers.scriptKey} script to package.json`;
|
|
50
|
+
});
|
|
51
|
+
plop.setActionType('npmInstall', async (answers) => {
|
|
52
|
+
await pkg.install(answers.package, answers.packages);
|
|
53
|
+
return 'installed npm packages';
|
|
54
|
+
});
|
|
55
|
+
plop.setActionType('nugetRestore', async () => {
|
|
56
|
+
await nuget.nugetRestore();
|
|
57
|
+
return 'restored nuget packages';
|
|
58
|
+
});
|
|
59
|
+
plop.setActionType('signAssembly', async (answers) => {
|
|
60
|
+
const keyPath = path_1.default.resolve(process.cwd(), `${answers.name}.snk`);
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
if (process.env.JEST_WORKER_ID !== undefined) {
|
|
63
|
+
resolve('Testing so no need to sign');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const sign = (0, child_process_1.spawn)(path_1.default.resolve(__dirname, '..', 'bin', 'sn.exe'), ['-q', '-k', keyPath], { stdio: 'inherit' });
|
|
67
|
+
sign.on('close', (code) => {
|
|
68
|
+
if (didSucceed(code)) {
|
|
69
|
+
resolve('signed assembly');
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
reject('failed to sign assembly');
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
sign.on('error', () => {
|
|
76
|
+
reject('failed to sign assembly');
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
plop.setActionType('runPcf', async (answers) => {
|
|
82
|
+
const args = ['pcf', 'init', '-ns', answers.namespace, '-n', answers.name, '-t', answers.template];
|
|
83
|
+
// Set framework to React if selected
|
|
84
|
+
if (answers.react) {
|
|
85
|
+
args.push('-fw', 'react');
|
|
86
|
+
}
|
|
87
|
+
if (process.env.JEST_WORKER_ID !== undefined || answers.package !== 'npm') {
|
|
88
|
+
args.push('-npm', 'false');
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
args.push('-npm', 'true');
|
|
92
|
+
}
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
const pac = (0, child_process_1.spawn)('pac', args, { stdio: 'inherit' });
|
|
95
|
+
pac.on('close', (code) => {
|
|
96
|
+
if (didSucceed(code)) {
|
|
97
|
+
resolve('pcf project created');
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
reject('Ensure the Power Platform CLI is installed. Command must be run from within Visual Studio Code if using the Power Platform Extension');
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
pac.on('error', () => {
|
|
104
|
+
reject('Ensure the Power Platform CLI is installed. Command must be run from within Visual Studio Code if using the Power Platform Extension');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
};
|
package/lib/plopfile.js
CHANGED
|
@@ -1,42 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
4
|
};
|
|
28
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
6
|
const path_1 = __importDefault(require("path"));
|
|
30
|
-
const child_process_1 = require("child_process");
|
|
31
7
|
const fs_1 = __importDefault(require("fs"));
|
|
32
|
-
const
|
|
33
|
-
const pkg = __importStar(require("./packageManager"));
|
|
34
|
-
const didSucceed = (code) => `${code}` === '0';
|
|
8
|
+
const nuget_1 = require("./nuget");
|
|
35
9
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
36
10
|
const version = require('../package').version;
|
|
37
11
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
38
12
|
exports.default = (plop) => {
|
|
39
13
|
plop.setWelcomeMessage(`Creating new Dataverse project using create-powerapps-project v${version}. Please choose type of project to create.`);
|
|
14
|
+
plop.load('./plopActions');
|
|
40
15
|
const packageQuestion = {
|
|
41
16
|
type: 'list',
|
|
42
17
|
name: 'package',
|
|
@@ -52,7 +27,19 @@ exports.default = (plop) => {
|
|
|
52
27
|
{
|
|
53
28
|
type: 'input',
|
|
54
29
|
name: 'server',
|
|
55
|
-
message: 'enter dataverse url (https://org.crm.dynamics.com):'
|
|
30
|
+
message: 'enter dataverse url (https://org.crm.dynamics.com):',
|
|
31
|
+
validate: (server) => {
|
|
32
|
+
try {
|
|
33
|
+
const url = new URL(server);
|
|
34
|
+
if (url.protocol !== 'https:') {
|
|
35
|
+
return 'server should begin with https';
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch (ex) {
|
|
40
|
+
return 'enter a valid URL';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
56
43
|
},
|
|
57
44
|
{
|
|
58
45
|
type: 'input',
|
|
@@ -66,28 +53,49 @@ exports.default = (plop) => {
|
|
|
66
53
|
message: 'dataverse solution unique name:'
|
|
67
54
|
}
|
|
68
55
|
];
|
|
69
|
-
plop.setActionType('addScript', async (answers) => {
|
|
70
|
-
const packagePath = path_1.default.resolve(process.cwd(), 'package.json');
|
|
71
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
72
|
-
const packageJson = require(packagePath);
|
|
73
|
-
packageJson.scripts[answers.scriptKey] = answers.scriptValue;
|
|
74
|
-
await fs_1.default.promises.writeFile(packagePath, JSON.stringify(packageJson, null, 4), 'utf8');
|
|
75
|
-
return `added ${answers.scriptKey} script to package.json`;
|
|
76
|
-
});
|
|
77
|
-
plop.setActionType('npmInstall', (answers) => {
|
|
78
|
-
pkg.install(process.cwd(), answers.projectType, answers.package);
|
|
79
|
-
return 'installed npm packages';
|
|
80
|
-
});
|
|
81
56
|
plop.setGenerator('assembly', {
|
|
82
|
-
description: 'generate dataverse
|
|
57
|
+
description: 'generate dataverse plugin or workflow activity project',
|
|
83
58
|
prompts: [
|
|
59
|
+
{
|
|
60
|
+
type: 'confirm',
|
|
61
|
+
name: 'pluginPackage',
|
|
62
|
+
message: 'use plugin package (preview)?'
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
type: 'input',
|
|
66
|
+
name: 'prefix',
|
|
67
|
+
message: 'publisher prefix (no underscore):',
|
|
68
|
+
validate: (prefix) => {
|
|
69
|
+
if (prefix.slice(-1) === '_') {
|
|
70
|
+
return 'enter publisher prefix without the underscore';
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
},
|
|
74
|
+
when: (answers) => answers.pluginPackage
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
type: 'input',
|
|
78
|
+
name: 'author',
|
|
79
|
+
message: 'package author:',
|
|
80
|
+
when: (answers) => answers.pluginPackage
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
type: 'input',
|
|
84
|
+
name: 'company',
|
|
85
|
+
message: 'package company:',
|
|
86
|
+
when: (answers) => answers.pluginPackage
|
|
87
|
+
},
|
|
84
88
|
{
|
|
85
89
|
type: 'list',
|
|
86
90
|
name: 'sdkVersion',
|
|
87
|
-
message:
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
+
message: (answers) => {
|
|
92
|
+
const crmPackage = answers.pluginPackage ? 'Microsoft.CrmSdk.CoreAssemblies' : 'Microsoft.CrmSdk.Workflow';
|
|
93
|
+
return `select ${crmPackage} version`;
|
|
94
|
+
},
|
|
95
|
+
choices: async (answers) => {
|
|
96
|
+
const crmPackage = answers.pluginPackage ? 'Microsoft.CrmSdk.CoreAssemblies' : 'Microsoft.CrmSdk.Workflow';
|
|
97
|
+
const versions = await (0, nuget_1.getNugetPackageVersions)(crmPackage);
|
|
98
|
+
return versions;
|
|
91
99
|
}
|
|
92
100
|
},
|
|
93
101
|
{
|
|
@@ -95,14 +103,15 @@ exports.default = (plop) => {
|
|
|
95
103
|
name: 'name',
|
|
96
104
|
message: 'default C# namespace (Company.Crm.Plugins):',
|
|
97
105
|
validate: (name) => {
|
|
98
|
-
const
|
|
99
|
-
if (
|
|
100
|
-
return
|
|
106
|
+
const validNamespace = name.replace(/[^a-zA-Z.]+/g, '');
|
|
107
|
+
if (validNamespace !== name) {
|
|
108
|
+
return 'namespace must contain only alpha characters and periods';
|
|
101
109
|
}
|
|
110
|
+
const namespace = name.split('.');
|
|
102
111
|
for (const item of namespace) {
|
|
103
112
|
const title = plop.renderString('{{titleCase name}}', { name: item });
|
|
104
113
|
if (title !== item) {
|
|
105
|
-
return `enter namespace using
|
|
114
|
+
return `enter namespace using PascalCase`;
|
|
106
115
|
}
|
|
107
116
|
}
|
|
108
117
|
return true;
|
|
@@ -128,58 +137,99 @@ exports.default = (plop) => {
|
|
|
128
137
|
...sharedQuestions,
|
|
129
138
|
],
|
|
130
139
|
actions: [
|
|
140
|
+
async (answers) => {
|
|
141
|
+
const xrmVersions = await (0, nuget_1.getNugetPackageVersions)('JourneyTeam.Xrm');
|
|
142
|
+
answers.xrmVersion = xrmVersions.shift();
|
|
143
|
+
return `retrieved latest JourneyTeam.Xrm version ${answers.xrmVersion}`;
|
|
144
|
+
},
|
|
131
145
|
{
|
|
132
146
|
type: 'add',
|
|
133
147
|
templateFile: '../plop-templates/assembly/assembly.csproj.hbs',
|
|
134
148
|
path: path_1.default.resolve(process.cwd(), '{{name}}.csproj'),
|
|
149
|
+
skip: (answers) => {
|
|
150
|
+
if (answers.pluginPackage) {
|
|
151
|
+
return 'generating plugin package';
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
type: 'add',
|
|
160
|
+
templateFile: '../plop-templates/assembly/package.csproj.hbs',
|
|
161
|
+
path: path_1.default.resolve(process.cwd(), '{{name}}.csproj'),
|
|
162
|
+
skip: (answers) => {
|
|
163
|
+
if (!answers.pluginPackage) {
|
|
164
|
+
return 'generating regular assembly';
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
type: 'add',
|
|
173
|
+
templateFile: '../plop-templates/assembly/dataverse.config.json.hbs',
|
|
174
|
+
path: path_1.default.resolve(process.cwd(), 'dataverse.config.json'),
|
|
175
|
+
skip: (answers) => {
|
|
176
|
+
if (answers.pluginPackage) {
|
|
177
|
+
return 'generating plugin package';
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
type: 'add',
|
|
186
|
+
templateFile: '../plop-templates/assembly/dataverse.package.config.json.hbs',
|
|
187
|
+
path: path_1.default.resolve(process.cwd(), 'dataverse.config.json'),
|
|
188
|
+
skip: (answers) => {
|
|
189
|
+
if (!answers.pluginPackage) {
|
|
190
|
+
return 'generating regular assembly';
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
135
196
|
},
|
|
136
197
|
{
|
|
137
198
|
type: 'addMany',
|
|
138
199
|
templateFiles: [
|
|
139
|
-
'../plop-templates/assembly
|
|
140
|
-
'../plop-templates/assembly
|
|
141
|
-
'../plop-templates/assembly/*.ts.hbs',
|
|
200
|
+
'../plop-templates/assembly/package.json.hbs',
|
|
201
|
+
'../plop-templates/assembly/plopfile.js',
|
|
142
202
|
'../plop-templates/assembly/.gitignore',
|
|
143
203
|
'../plop-templates/assembly/Entities/EarlyBoundGenerator.xml',
|
|
144
|
-
'../plop-templates/assembly/.vscode/tasks.json',
|
|
204
|
+
'../plop-templates/assembly/.vscode/tasks.json.hbs',
|
|
145
205
|
'../plop-templates/assembly/.editorconfig'
|
|
146
206
|
],
|
|
147
207
|
base: '../plop-templates/assembly',
|
|
148
208
|
destination: process.cwd(),
|
|
149
209
|
force: true
|
|
150
210
|
},
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
else {
|
|
158
|
-
const sign = (0, child_process_1.spawn)(path_1.default.resolve(__dirname, '..', 'bin', 'sn.exe'), ['-q', '-k', keyPath], { stdio: 'inherit' });
|
|
159
|
-
sign.on('close', (code) => {
|
|
160
|
-
if (didSucceed(code)) {
|
|
161
|
-
resolve('signed assembly');
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
reject('failed to sign assembly');
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
sign.on('error', () => {
|
|
168
|
-
reject('failed to sign assembly');
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
});
|
|
211
|
+
{
|
|
212
|
+
type: 'addScript',
|
|
213
|
+
data: {
|
|
214
|
+
scriptKey: 'preinstall',
|
|
215
|
+
scriptValue: 'npx only-allow {{ package }}'
|
|
216
|
+
}
|
|
172
217
|
},
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
218
|
+
{
|
|
219
|
+
type: 'signAssembly'
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
type: 'nugetRestore'
|
|
178
223
|
},
|
|
179
224
|
{
|
|
180
225
|
type: 'npmInstall',
|
|
181
226
|
data: {
|
|
182
|
-
|
|
227
|
+
packages: {
|
|
228
|
+
devDependencies: [
|
|
229
|
+
'powerapps-project-assembly',
|
|
230
|
+
'dataverse-utils'
|
|
231
|
+
]
|
|
232
|
+
}
|
|
183
233
|
}
|
|
184
234
|
}
|
|
185
235
|
]
|
|
@@ -214,32 +264,8 @@ exports.default = (plop) => {
|
|
|
214
264
|
packageQuestion
|
|
215
265
|
],
|
|
216
266
|
actions: [
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
// Set framework to React if selected
|
|
220
|
-
if (answers.react) {
|
|
221
|
-
args.push('-fw', 'react');
|
|
222
|
-
}
|
|
223
|
-
if (process.env.JEST_WORKER_ID !== undefined || answers.package !== 'npm') {
|
|
224
|
-
args.push('-npm', 'false');
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
args.push('-npm', 'true');
|
|
228
|
-
}
|
|
229
|
-
return new Promise((resolve, reject) => {
|
|
230
|
-
const pac = (0, child_process_1.spawn)('pac', args, { stdio: 'inherit' });
|
|
231
|
-
pac.on('close', (code) => {
|
|
232
|
-
if (didSucceed(code)) {
|
|
233
|
-
resolve('pcf project created');
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
reject('Ensure the Power Platform CLI is installed. Command must be run from within Visual Studio Code if using the Power Platform Extension');
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
pac.on('error', () => {
|
|
240
|
-
reject('Ensure the Power Platform CLI is installed. Command must be run from within Visual Studio Code if using the Power Platform Extension');
|
|
241
|
-
});
|
|
242
|
-
});
|
|
267
|
+
{
|
|
268
|
+
type: 'runPcf'
|
|
243
269
|
},
|
|
244
270
|
{
|
|
245
271
|
type: 'add',
|
|
@@ -287,15 +313,19 @@ exports.default = (plop) => {
|
|
|
287
313
|
scriptValue: 'pcf-scripts build --buildMode production'
|
|
288
314
|
}
|
|
289
315
|
},
|
|
316
|
+
{
|
|
317
|
+
type: 'addScript',
|
|
318
|
+
data: {
|
|
319
|
+
scriptKey: 'preinstall',
|
|
320
|
+
scriptValue: 'npx only-allow {{ package }}'
|
|
321
|
+
}
|
|
322
|
+
},
|
|
290
323
|
async (answers) => {
|
|
291
324
|
await fs_1.default.promises.rm(path_1.default.resolve(process.cwd(), answers.name, 'HelloWorld.tsx'));
|
|
292
325
|
return 'removed HelloWorld component';
|
|
293
326
|
},
|
|
294
327
|
{
|
|
295
328
|
type: 'npmInstall',
|
|
296
|
-
data: {
|
|
297
|
-
projectType: 'pcf'
|
|
298
|
-
},
|
|
299
329
|
skip: (answers) => {
|
|
300
330
|
if (answers.package === 'npm') {
|
|
301
331
|
return 'npm packages already installed';
|
|
@@ -329,10 +359,48 @@ exports.default = (plop) => {
|
|
|
329
359
|
destination: process.cwd(),
|
|
330
360
|
force: true
|
|
331
361
|
},
|
|
362
|
+
{
|
|
363
|
+
type: 'addScript',
|
|
364
|
+
data: {
|
|
365
|
+
scriptKey: 'preinstall',
|
|
366
|
+
scriptValue: 'npx only-allow {{ package }}'
|
|
367
|
+
}
|
|
368
|
+
},
|
|
332
369
|
{
|
|
333
370
|
type: 'npmInstall',
|
|
334
371
|
data: {
|
|
335
|
-
|
|
372
|
+
packages: {
|
|
373
|
+
devDependencies: [
|
|
374
|
+
'powerapps-project-webresource',
|
|
375
|
+
'dataverse-utils',
|
|
376
|
+
'@types/xrm',
|
|
377
|
+
'typescript',
|
|
378
|
+
'eslint',
|
|
379
|
+
'@typescript-eslint/eslint-plugin',
|
|
380
|
+
'@typescript-eslint/parser',
|
|
381
|
+
'webpack-event-plugin',
|
|
382
|
+
'clean-webpack-plugin',
|
|
383
|
+
'source-map-loader',
|
|
384
|
+
'babel-loader',
|
|
385
|
+
'ts-loader',
|
|
386
|
+
'@babel/core',
|
|
387
|
+
'@babel/preset-env',
|
|
388
|
+
'@babel/preset-typescript',
|
|
389
|
+
'xrm-mock',
|
|
390
|
+
'webpack',
|
|
391
|
+
'webpack-cli',
|
|
392
|
+
'cross-spawn',
|
|
393
|
+
'ts-node',
|
|
394
|
+
'@microsoft/eslint-plugin-power-apps',
|
|
395
|
+
'-D'
|
|
396
|
+
],
|
|
397
|
+
dependencies: [
|
|
398
|
+
'core-js',
|
|
399
|
+
'regenerator-runtime',
|
|
400
|
+
'powerapps-common',
|
|
401
|
+
'dataverse-webapi'
|
|
402
|
+
]
|
|
403
|
+
}
|
|
336
404
|
}
|
|
337
405
|
}
|
|
338
406
|
]
|
package/package.json
CHANGED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"tasks": [
|
|
4
|
+
{
|
|
5
|
+
"label": "build",
|
|
6
|
+
"command": "dotnet",
|
|
7
|
+
"type": "process",
|
|
8
|
+
"args": [
|
|
9
|
+
"build",
|
|
10
|
+
"${workspaceFolder}/{{name}}.csproj",
|
|
11
|
+
"/property:GenerateFullPaths=true",
|
|
12
|
+
"/consoleloggerparameters:NoSummary"
|
|
13
|
+
],
|
|
14
|
+
"problemMatcher": "$msCompile"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"label": "watch",
|
|
18
|
+
"command": "dotnet",
|
|
19
|
+
"type": "process",
|
|
20
|
+
"args": [
|
|
21
|
+
"watch",
|
|
22
|
+
"run",
|
|
23
|
+
"${workspaceFolder}/{{name}}.csproj",
|
|
24
|
+
"/property:GenerateFullPaths=true",
|
|
25
|
+
"/consoleloggerparameters:NoSummary"
|
|
26
|
+
],
|
|
27
|
+
"problemMatcher": "$msCompile"
|
|
28
|
+
}
|
|
29
|
+
{
|
|
30
|
+
"label": "deploy",
|
|
31
|
+
"type":"npm",
|
|
32
|
+
"script": "deploy",
|
|
33
|
+
"dependsOn": ["build"]
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
<Project Sdk="Microsoft.NET.Sdk">
|
|
2
2
|
<PropertyGroup>
|
|
3
3
|
<TargetFramework>net462</TargetFramework>
|
|
4
|
-
</PropertyGroup>
|
|
5
|
-
|
|
6
|
-
<PropertyGroup>
|
|
7
4
|
<SignAssembly>true</SignAssembly>
|
|
8
5
|
<AssemblyOriginatorKeyFile>{{name}}.snk</AssemblyOriginatorKeyFile>
|
|
9
6
|
</PropertyGroup>
|
|
7
|
+
|
|
8
|
+
<ItemGroup>
|
|
9
|
+
<PackageReference Include="JourneyTeam.Xrm" Version="{{xrmVersion}}" />
|
|
10
|
+
<PackageReference Include="Microsoft.CrmSdk.Workflow" Version="{{sdkVersion}}" />
|
|
11
|
+
</ItemGroup>
|
|
10
12
|
</Project>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"connection": {
|
|
3
|
+
"server": "{{server}}",
|
|
4
|
+
"solution": "{{solution}}",
|
|
5
|
+
"tenant": "{{tenant}}"
|
|
6
|
+
},
|
|
7
|
+
"name": "{{name}}",
|
|
8
|
+
"prefix": "{{prefix}}",
|
|
9
|
+
"version": "1.0.0.0",
|
|
10
|
+
"assembly": {
|
|
11
|
+
"name": "{{name}}",
|
|
12
|
+
"isolationmode": "{{isolation}}",
|
|
13
|
+
"version": "1.0.0.0",
|
|
14
|
+
"publickeytoken": "{{name}}.snk",
|
|
15
|
+
"types": []
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
2
|
+
<PropertyGroup>
|
|
3
|
+
<TargetFramework>net462</TargetFramework>
|
|
4
|
+
<PowerAppsTargetsPath>$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\PowerApps</PowerAppsTargetsPath>
|
|
5
|
+
<SignAssembly>true</SignAssembly>
|
|
6
|
+
<AssemblyOriginatorKeyFile>{{name}}.snk</AssemblyOriginatorKeyFile>
|
|
7
|
+
<AssemblyVersion>1.0.0.0</AssemblyVersion>
|
|
8
|
+
<FileVersion>1.0.0.0</FileVersion>
|
|
9
|
+
<ProjectTypeGuids>{4C25E9B5-9FA6-436c-8E19-B395D2A65FAF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
|
10
|
+
</PropertyGroup>
|
|
11
|
+
|
|
12
|
+
<Import Project="$(PowerAppsTargetsPath)\Microsoft.PowerApps.VisualStudio.Plugin.props" Condition="Exists('$(PowerAppsTargetsPath)\Microsoft.PowerApps.VisualStudio.Plugin.props')" />
|
|
13
|
+
|
|
14
|
+
<PropertyGroup>
|
|
15
|
+
<PackageId>{{name}}</PackageId>
|
|
16
|
+
<Version>$(FileVersion)</Version>
|
|
17
|
+
<Authors>{{author}}</Authors>
|
|
18
|
+
<Company>{{company}}</Company>
|
|
19
|
+
<Description></Description>
|
|
20
|
+
</PropertyGroup>
|
|
21
|
+
|
|
22
|
+
<ItemGroup>
|
|
23
|
+
<PackageReference Include="JourneyTeam.Xrm" Version="{{xrmVersion}}" PrivateAssets="All" />
|
|
24
|
+
<PackageReference Include="Microsoft.CrmSdk.CoreAssemblies" Version="{{sdkVersion}}" PrivateAssets="All" />
|
|
25
|
+
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="*" PrivateAssets="All" />
|
|
26
|
+
<PackageReference Include="Microsoft.PowerApps.MSBuild.Plugin" Version="*" PrivateAssets="All" />
|
|
27
|
+
</ItemGroup>
|
|
28
|
+
|
|
29
|
+
<Import Project="$(PowerAppsTargetsPath)\Microsoft.PowerApps.VisualStudio.Plugin.targets" Condition="Exists('$(PowerAppsTargetsPath)\Microsoft.PowerApps.VisualStudio.Plugin.targets')" />
|
|
30
|
+
</Project>
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
|
3
|
-
// for the documentation about the tasks.json format
|
|
4
|
-
"version": "2.0.0",
|
|
5
|
-
"tasks": [
|
|
6
|
-
{
|
|
7
|
-
"label": "build",
|
|
8
|
-
"command": "dotnet",
|
|
9
|
-
"type": "shell",
|
|
10
|
-
"args": [
|
|
11
|
-
"build",
|
|
12
|
-
"/property:GenerateFullPaths=true",
|
|
13
|
-
"/consoleloggerparameters:NoSummary"
|
|
14
|
-
],
|
|
15
|
-
"group": {
|
|
16
|
-
"kind": "build",
|
|
17
|
-
"isDefault": true
|
|
18
|
-
},
|
|
19
|
-
"presentation": {
|
|
20
|
-
"reveal": "silent"
|
|
21
|
-
},
|
|
22
|
-
"problemMatcher": "$msCompile"
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"label": "deploy",
|
|
26
|
-
"type":"npm",
|
|
27
|
-
"script": "deploy",
|
|
28
|
-
"dependsOn": ["build"]
|
|
29
|
-
}
|
|
30
|
-
]
|
|
31
|
-
}
|