create-powerapps-project 0.21.3 → 0.23.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/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/index.js CHANGED
@@ -6,13 +6,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const node_path_1 = __importDefault(require("node:path"));
8
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);
18
- });
9
+ const minimist_1 = __importDefault(require("minimist"));
10
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
11
+ const packageJson = require('../package.json');
12
+ const argv = (0, minimist_1.default)(process.argv.slice(2));
13
+ if (argv.version || argv.v) {
14
+ console.log(`${packageJson.version}`);
15
+ }
16
+ else {
17
+ plop_1.Plop.launch({
18
+ cwd: process.cwd(),
19
+ configPath: node_path_1.default.join(__dirname, 'plopfile.js')
20
+ }, env => {
21
+ const options = {
22
+ ...env,
23
+ dest: process.cwd()
24
+ };
25
+ return (0, plop_1.run)(options, undefined, true);
26
+ });
27
+ }
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,92 @@ 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: 'signAssembly'
172
213
  },
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';
214
+ {
215
+ type: 'nugetRestore'
178
216
  },
179
217
  {
180
218
  type: 'npmInstall',
181
219
  data: {
182
- projectType: 'assembly'
220
+ packages: {
221
+ devDependencies: [
222
+ 'powerapps-project-assembly',
223
+ 'dataverse-utils'
224
+ ]
225
+ }
183
226
  }
184
227
  }
185
228
  ]
@@ -214,32 +257,8 @@ exports.default = (plop) => {
214
257
  packageQuestion
215
258
  ],
216
259
  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
- });
260
+ {
261
+ type: 'runPcf'
243
262
  },
244
263
  {
245
264
  type: 'add',
@@ -293,9 +312,6 @@ exports.default = (plop) => {
293
312
  },
294
313
  {
295
314
  type: 'npmInstall',
296
- data: {
297
- projectType: 'pcf'
298
- },
299
315
  skip: (answers) => {
300
316
  if (answers.package === 'npm') {
301
317
  return 'npm packages already installed';
@@ -332,7 +348,38 @@ exports.default = (plop) => {
332
348
  {
333
349
  type: 'npmInstall',
334
350
  data: {
335
- projectType: 'webresource'
351
+ packages: {
352
+ devDependencies: [
353
+ 'powerapps-project-webresource',
354
+ 'dataverse-utils',
355
+ '@types/xrm',
356
+ 'typescript',
357
+ 'eslint',
358
+ '@typescript-eslint/eslint-plugin',
359
+ '@typescript-eslint/parser',
360
+ 'webpack-event-plugin',
361
+ 'clean-webpack-plugin',
362
+ 'source-map-loader',
363
+ 'babel-loader',
364
+ 'ts-loader',
365
+ '@babel/core',
366
+ '@babel/preset-env',
367
+ '@babel/preset-typescript',
368
+ 'xrm-mock',
369
+ 'webpack',
370
+ 'webpack-cli',
371
+ 'cross-spawn',
372
+ 'ts-node',
373
+ '@microsoft/eslint-plugin-power-apps',
374
+ '-D'
375
+ ],
376
+ dependencies: [
377
+ 'core-js',
378
+ 'regenerator-runtime',
379
+ 'powerapps-common',
380
+ 'dataverse-webapi'
381
+ ]
382
+ }
336
383
  }
337
384
  }
338
385
  ]
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.21.3",
4
+ "version": "0.23.1",
5
5
  "license": "MIT",
6
6
  "main": "lib/index.js",
7
7
  "bin": {
@@ -22,9 +22,11 @@
22
22
  "clean": "rimraf lib"
23
23
  },
24
24
  "dependencies": {
25
- "plop": "^2.7.6"
25
+ "plop": "^2.7.6",
26
+ "minimist": "^1.2.6"
26
27
  },
27
28
  "devDependencies": {
29
+ "@types/minimist": "^1.2.2",
28
30
  "@types/node": "^14.14.21"
29
31
  }
30
32
  }
@@ -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
- }