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 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.install = exports.getNugetPackageVersions = void 0;
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
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
- const versions = JSON.parse(body).data[0].versions.map((v) => {
19
- return v.version;
20
- }).reverse();
21
- resolve(versions);
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 install = (project, sdkVersion, xrmVersion) => {
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.install = install;
41
+ exports.nugetRestore = nugetRestore;
@@ -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 = (cwd, type, packageManager) => {
6
+ const install = async (packageManager, packages) => {
7
7
  if (process.env.JEST_WORKER_ID != undefined) {
8
8
  return;
9
9
  }
10
- if (type === 'pcf') {
11
- (0, child_process_1.spawnSync)(packageManager, ['install'], { stdio: 'inherit', shell: true });
12
- }
13
- else {
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 nuget = __importStar(require("./nuget"));
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 assembly project',
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: 'select sdk version',
88
- choices: async () => {
89
- const versions = await nuget.getNugetPackageVersions('Microsoft.CrmSdk.Workflow');
90
- return versions.map(v => ({ name: v, value: v }));
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 namespace = name.split('.');
99
- if (namespace.length !== 3) {
100
- return `enter namespace using 'Company.Crm.Plugins' convention`;
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 pascal case (Company.Crm.Plugins)`;
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/*.json.hbs',
140
- '../plop-templates/assembly/*.js',
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
- (answers) => {
152
- const keyPath = path_1.default.resolve(process.cwd(), `${answers.name}.snk`);
153
- return new Promise((resolve, reject) => {
154
- if (process.env.JEST_WORKER_ID !== undefined) {
155
- resolve('Testing so no need to sign');
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
- async (answers) => {
174
- const xrmVersions = await nuget.getNugetPackageVersions('JourneyTeam.Xrm');
175
- const xrmVersion = xrmVersions.shift();
176
- nuget.install(answers.name, answers.sdkVersion, xrmVersion);
177
- return 'installed nuget packages';
218
+ {
219
+ type: 'signAssembly'
220
+ },
221
+ {
222
+ type: 'nugetRestore'
178
223
  },
179
224
  {
180
225
  type: 'npmInstall',
181
226
  data: {
182
- projectType: 'assembly'
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
- (answers) => {
218
- const args = ['pcf', 'init', '-ns', answers.namespace, '-n', answers.name, '-t', answers.template];
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
- projectType: 'webresource'
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-powerapps-project",
3
3
  "description": "💧 plop generator for Dataverse development",
4
- "version": "0.22.0",
4
+ "version": "0.24.0",
5
5
  "license": "MIT",
6
6
  "main": "lib/index.js",
7
7
  "bin": {
@@ -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
- }