devextreme-cli 1.4.1 → 1.5.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devextreme-cli",
3
- "version": "1.4.1",
3
+ "version": "1.5.0",
4
4
  "description": "DevExtreme CLI",
5
5
  "keywords": [
6
6
  "devexpress",
@@ -52,20 +52,20 @@
52
52
  "@typescript-eslint/eslint-plugin": "^4.15.1",
53
53
  "@typescript-eslint/parser": "^4.0.1",
54
54
  "babel-eslint": "^10.1.0",
55
- "cross-env": "^5.2.0",
56
- "eslint": "^7.8.0",
55
+ "cross-env": "^5.2.1",
56
+ "eslint": "^7.32.0",
57
57
  "eslint-config-angular": "^0.5.0",
58
58
  "eslint-config-prettier": "^8.5.0",
59
- "eslint-plugin-angular": "^4.0.1",
60
- "eslint-plugin-jest": "^22.5.1",
59
+ "eslint-plugin-angular": "^4.1.0",
60
+ "eslint-plugin-jest": "^22.21.0",
61
61
  "eslint-plugin-prettier": "^4.0.0",
62
- "eslint-plugin-react": "^7.20.6",
63
- "eslint-plugin-react-hooks": "^4.1.0",
62
+ "eslint-plugin-react": "^7.30.1",
63
+ "eslint-plugin-react-hooks": "^4.6.0",
64
64
  "eslint-plugin-unused-imports": "^1.1.5",
65
65
  "eslint-plugin-vue": "^7.0.0-beta.2",
66
66
  "eslint-stylish": "^0.2.0",
67
67
  "jest": "^27.3.1",
68
- "jest-image-snapshot": "^4.5.0",
68
+ "jest-image-snapshot": "^5.1.1",
69
69
  "prettier": "^2.6.2",
70
70
  "puppeteer": "^2.1.1",
71
71
  "rimraf": "^2.6.3",
@@ -74,5 +74,5 @@
74
74
  "typescript": "^4.0.2",
75
75
  "typescript-eslint-parser": "^22.0.0"
76
76
  },
77
- "gitHead": "aacf3c58c9b7996c6a19467ef1eeb4d9be949128"
77
+ "gitHead": "60feb5c896aefd4f7b717b844547cd30f86b313e"
78
78
  }
@@ -7,6 +7,7 @@ const fs = require('fs');
7
7
  const dasherize = require('../utility/string').dasherize;
8
8
  const ngVersion = require('../utility/ng-version');
9
9
  const latestVersions = require('../utility/latest-versions');
10
+ const { extractToolingVersion, toolingVersionOptionName } = require('../utility/extract-tooling-version');
10
11
  const schematicsVersion = latestVersions['devextreme-schematics'] || 'latest';
11
12
 
12
13
  const minNgCliVersion = new semver('12.0.0');
@@ -21,26 +22,29 @@ async function runSchematicCommand(schematicCommand, options, evaluatingOptions)
21
22
  }
22
23
 
23
24
  if(!localPackageExists(collectionName)) {
24
- await runNgCommand(['add', collectionPath, '--skip-confirmation=true'], evaluatingOptions);
25
+ await runNgCommand(['add', collectionPath, '--skip-confirmation=true'], options, evaluatingOptions);
25
26
  }
26
27
 
27
28
  const commandArguments = ['g', `${collectionName}:${schematicCommand}`];
28
- for(let option in options) {
29
+
30
+ const { [toolingVersionOptionName]: _, ...optionsToArguments } = options; // eslint-disable-line no-unused-vars
31
+ for(let option in optionsToArguments) {
29
32
  commandArguments.push(`--${dasherize(option)}=${options[option]}`);
30
33
  }
31
34
 
32
- runNgCommand(commandArguments, evaluatingOptions);
35
+ runNgCommand(commandArguments, options, evaluatingOptions);
33
36
  }
34
37
 
35
- async function runNgCommand(commandArguments, evaluatingOptions) {
38
+ async function runNgCommand(commandArguments, commandOptions, commandConfig) {
36
39
  const hasNg = await hasSutableNgCli();
37
- const npmCommandName = hasNg ? 'ng' : 'npx';
38
- const ngCommandArguments = hasNg
40
+ const toolingVersion = extractToolingVersion(commandOptions);
41
+ const npmCommandName = hasNg && !toolingVersion ? 'ng' : 'npx';
42
+ const ngCommandArguments = hasNg && !toolingVersion
39
43
  ? []
40
- : ['-p', '@angular/cli', 'ng'];
44
+ : ['-p', `@angular/cli${toolingVersion}`, 'ng'];
41
45
 
42
46
  ngCommandArguments.push(...commandArguments);
43
- return runCommand(npmCommandName, ngCommandArguments, evaluatingOptions);
47
+ return runCommand(npmCommandName, ngCommandArguments, commandConfig);
44
48
  }
45
49
 
46
50
  function localPackageExists(packageName) {
@@ -81,7 +85,7 @@ const create = async(appName, options) => {
81
85
  '--skip-install=true',
82
86
  ];
83
87
 
84
- await runNgCommand(commandArguments);
88
+ await runNgCommand(commandArguments, options);
85
89
 
86
90
  const appPath = path.join(process.cwd(), appName);
87
91
 
@@ -13,9 +13,9 @@ const stringUtils = require('../utility/string');
13
13
  const typescriptUtils = require('../utility/typescript-extension');
14
14
  const removeFile = require('../utility/file-operations').remove;
15
15
  const latestVersions = require('../utility/latest-versions');
16
+ const { extractToolingVersion } = require('../utility/extract-tooling-version');
16
17
  const defaultStyles = [
17
- 'devextreme/dist/css/dx.light.css',
18
- 'devextreme/dist/css/dx.common.css'
18
+ 'devextreme/dist/css/dx.light.css'
19
19
  ];
20
20
 
21
21
  const getExtension = (appPath) => {
@@ -60,8 +60,9 @@ const create = async(appName, options) => {
60
60
  layout: stringUtils.classify(layoutType),
61
61
  isTypeScript: typescriptUtils.isTypeScript(templateType)
62
62
  });
63
+ const toolingVersion = extractToolingVersion(options);
64
+ const commandArguments = [`-p=create-react-app${toolingVersion}`, 'create-react-app', appName];
63
65
 
64
- const commandArguments = ['-p=create-react-app', 'create-react-app', appName];
65
66
  if(templateOptions.isTypeScript) {
66
67
  commandArguments.push('--template typescript');
67
68
  }
@@ -2,7 +2,6 @@ const path = require('path');
2
2
  const fs = require('fs');
3
3
  const getLayoutInfo = require('../utility/prompts/layout');
4
4
  const getVersionInfo = require('../utility/prompts/vue-version');
5
- const getTemplateTypeInfo = require('../utility/prompts/typescript');
6
5
  const templateCreator = require('../utility/template-creator');
7
6
  const packageManager = require('../utility/package-manager');
8
7
  const packageJsonUtils = require('../utility/package-json-utils');
@@ -10,11 +9,10 @@ const runCommand = require('../utility/run-command');
10
9
  const insertItemToArray = require('../utility/file-content').insertItemToArray;
11
10
  const moduleUtils = require('../utility/module');
12
11
  const stringUtils = require('../utility/string');
13
- const typescriptUtils = require('../utility/typescript-extension');
14
12
  const latestVersions = require('../utility/latest-versions');
13
+ const { toolingVersionOptionName, extractToolingVersion } = require('../utility/extract-tooling-version');
15
14
  const defaultStyles = [
16
- 'devextreme/dist/css/dx.light.css',
17
- 'devextreme/dist/css/dx.common.css'
15
+ 'devextreme/dist/css/dx.light.css'
18
16
  ];
19
17
  const defaultVueVersion = 'v3';
20
18
 
@@ -56,19 +54,14 @@ const preparePackageJsonForTemplate = (appPath, appName, version) => {
56
54
  };
57
55
 
58
56
  async function createVueApp(name, templateOptions) {
59
- const { version, isTypeScript } = templateOptions;
60
- const argList = ['-p', '@vue/cli', 'vue', 'create', name];
57
+ const { version } = templateOptions;
58
+ const toolingVersion = extractToolingVersion(templateOptions);
59
+ const argList = ['-p', `@vue/cli${toolingVersion}`, 'vue', 'create', name];
61
60
 
62
- if(isTypeScript) {
63
- const presetPath = path.join(__dirname, '..', 'templates-ts', `vue-${version}`);
64
-
65
- argList.push(`-p "${presetPath}"`);
61
+ if(version === 'v2') {
62
+ argList.push('-p "Default (Vue 2)"');
66
63
  } else {
67
- if(version === 'v2') {
68
- argList.push('-p "Default (Vue 2)"');
69
- } else {
70
- argList.push('-p "Default (Vue 3)"');
71
- }
64
+ argList.push('-p "Default (Vue 3)"');
72
65
  }
73
66
 
74
67
  return runCommand('npx', argList);
@@ -76,14 +69,13 @@ async function createVueApp(name, templateOptions) {
76
69
 
77
70
  const create = async(appName, options) => {
78
71
  const version = await getVersionInfo(options.version);
79
- const templateType = await getTemplateTypeInfo(options.template);
80
72
  const layout = await getLayoutInfo(options.layout);
81
73
 
82
74
  const templateOptions = {
83
75
  project: stringUtils.humanize(appName),
84
76
  layout: layout,
85
77
  version: version,
86
- isTypeScript: typescriptUtils.isTypeScript(templateType)
78
+ [toolingVersionOptionName]: options[toolingVersionOptionName]
87
79
  };
88
80
 
89
81
  await createVueApp(appName, templateOptions);
@@ -107,16 +99,13 @@ const getCorrectPath = (extension, pathToApp) => {
107
99
  };
108
100
 
109
101
  const addTemplate = (appPath, appName, templateOptions) => {
110
- const { version, isTypeScript } = templateOptions;
102
+ let { version } = templateOptions;
111
103
 
112
104
  if(!version) {
113
105
  version = getVueVersion();
114
106
  }
115
107
 
116
- const applicationTemplatePath = path.join(
117
- templateCreator.getTempaltePath(`vue-${version}`, isTypeScript),
118
- 'application'
119
- );
108
+ const applicationTemplatePath = path.join(templateCreator.getTempaltePath(`vue-${version}`), 'application');
120
109
  const styles = [
121
110
  './themes/generated/theme.additional.css',
122
111
  './themes/generated/theme.base.css',
@@ -140,12 +129,7 @@ const install = (options, appPath, styles) => {
140
129
  };
141
130
 
142
131
  const addStylesToApp = (appPath, styles) => {
143
- const isTypeScript = typescriptUtils.isTypeScript(typescriptUtils.getTemplateType('vue'));
144
-
145
- const mainModulePath = typescriptUtils.setFileExtension(
146
- path.join(appPath, 'src', 'main.js'),
147
- isTypeScript
148
- );
132
+ const mainModulePath = path.join(appPath, 'src', 'main.js');
149
133
 
150
134
  styles.forEach(style => {
151
135
  moduleUtils.insertImport(mainModulePath, style);
@@ -153,16 +137,13 @@ const addStylesToApp = (appPath, styles) => {
153
137
  };
154
138
 
155
139
  const addSamplePages = (appPath, templateOptions) => {
156
- const { version, isTypeScript } = templateOptions;
140
+ let { version } = templateOptions;
157
141
 
158
142
  if(!version) {
159
143
  version = getVueVersion();
160
144
  }
161
145
 
162
- const samplePageTemplatePath = path.join(
163
- templateCreator.getTempaltePath(`vue-${version}`, isTypeScript),
164
- 'sample-pages'
165
- );
146
+ const samplePageTemplatePath = path.join(templateCreator.getTempaltePath(`vue-${version}`), 'sample-pages');
166
147
  const pagesPath = createPathToPage(appPath);
167
148
  templateCreator.moveTemplateFilesToProject(samplePageTemplatePath, pagesPath, {}, getCorrectPath);
168
149
  };
@@ -216,23 +197,13 @@ const createPathToPage = (appPath) => {
216
197
 
217
198
  const addView = (pageName, options) => {
218
199
  const version = getVueVersion();
219
- const isTypeScript = typescriptUtils.isTypeScript(typescriptUtils.getTemplateType('vue'));
220
200
 
221
- const pageTemplatePath = path.join(
222
- templateCreator.getTempaltePath(`vue-${version}`, isTypeScript),
223
- 'page'
224
- );
201
+ const pageTemplatePath = path.join(templateCreator.getTempaltePath(`vue-${version}`), 'page');
225
202
 
226
203
  const componentName = getComponentPageName(pageName);
227
204
  const pathToPage = createPathToPage(process.cwd());
228
- const routingModulePath = typescriptUtils.setFileExtension(
229
- path.join(process.cwd(), 'src', 'router.js'),
230
- isTypeScript
231
- );
232
- const navigationModulePath = typescriptUtils.setFileExtension(
233
- path.join(process.cwd(), 'src', 'app-navigation.js'),
234
- isTypeScript
235
- );
205
+ const routingModulePath = path.join(process.cwd(), 'src', 'router.js');
206
+ const navigationModulePath = path.join(process.cwd(), 'src', 'app-navigation.js');
236
207
  const navigationData = getNavigationData(pageName, componentName, options && options.icon || 'folder', version);
237
208
  const getCorrectExtension = (fileExtension) => fileExtension;
238
209
  templateCreator.addPageToApp(pageName, pathToPage, pageTemplatePath, getCorrectExtension);
@@ -0,0 +1,12 @@
1
+ import './matchMediaMock';
2
+ import { render, screen } from '@testing-library/react';
3
+ import App from './App';
4
+ import { act } from 'react-dom/test-utils';
5
+
6
+ describe("App", () => {
7
+ test('renders learn react link', async () => {
8
+ await act( async () => { render(<App/>) });
9
+ const linkElement = screen.getByText(/create react app/i);
10
+ expect(linkElement).toBeInTheDocument();
11
+ });
12
+ })
@@ -45,7 +45,7 @@ export default function SideNavInnerToolbar({ title, children }<%=#isTypeScript%
45
45
  ? MenuStatus.Closed
46
46
  : prevMenuStatus
47
47
  );
48
- return true;
48
+ return menuStatus === MenuStatus.Closed ? true : false;
49
49
  }, [isLarge]);
50
50
 
51
51
  const onNavigationChanged = useCallback(({ itemData, event, node }<%=#isTypeScript%>: ItemClickEvent<%=/isTypeScript%>) => {
@@ -43,7 +43,7 @@ export default function SideNavOuterToolbar({ title, children }<%=#isTypeScript%
43
43
  ? MenuStatus.Closed
44
44
  : prevMenuStatus
45
45
  );
46
- return true;
46
+ return menuStatus === MenuStatus.Closed ? true : false;
47
47
  }, [isLarge]);
48
48
 
49
49
  const onNavigationChanged = useCallback(({ itemData, event, node }<%=#isTypeScript%>: ItemClickEvent<%=/isTypeScript%>) => {
@@ -0,0 +1,14 @@
1
+ Object.defineProperty(window, 'matchMedia', {
2
+ writable: true,
3
+ value: jest.fn().mockImplementation(query => ({
4
+ matches: false,
5
+ media: query,
6
+ onchange: null,
7
+ addListener: jest.fn(), // deprecated
8
+ removeListener: jest.fn(), // deprecated
9
+ addEventListener: jest.fn(),
10
+ removeEventListener: jest.fn(),
11
+ dispatchEvent: jest.fn(),
12
+ })),
13
+ });
14
+ export {};
@@ -1,4 +1,5 @@
1
1
  import Vue from "vue";
2
+ import themes from "devextreme/ui/themes";
2
3
 
3
4
  import App from "./App";
4
5
  import router from "./router";
@@ -7,7 +8,9 @@ import appInfo from "./app-info";
7
8
  Vue.config.productionTip = false;
8
9
  Vue.prototype.$appInfo = appInfo;
9
10
 
10
- new Vue({
11
- router,
12
- render: h => h(App)
13
- }).$mount("#app");
11
+ themes.initialized(() => {
12
+ new Vue({
13
+ router,
14
+ render: h => h(App)
15
+ }).$mount("#app");
16
+ });
@@ -1,3 +1 @@
1
- module.exports = {
2
- publicPath: "/devextreme-vue-template"
3
- };
1
+ module.exports = {};
@@ -1,10 +1,13 @@
1
1
  import { createApp } from "vue";
2
2
  import router from "./router";
3
+ import themes from "devextreme/ui/themes";
3
4
 
4
5
  import App from "./App";
5
6
  import appInfo from "./app-info";
6
7
 
7
- const app = createApp(App);
8
- app.use(router);
9
- app.config.globalProperties.$appInfo = appInfo;
10
- app.mount('#app');
8
+ themes.initialized(() => {
9
+ const app = createApp(App);
10
+ app.use(router);
11
+ app.config.globalProperties.$appInfo = appInfo;
12
+ app.mount('#app');
13
+ });
@@ -1,3 +1 @@
1
- module.exports = {
2
- publicPath: "/devextreme-vue-template"
3
- };
1
+ module.exports = {};
@@ -0,0 +1,13 @@
1
+ const toolingVersionOptionName = 'tooling-version';
2
+
3
+ const extractToolingVersion = (commandOptions) => {
4
+ if(commandOptions && commandOptions[toolingVersionOptionName]) {
5
+ return `@${commandOptions[toolingVersionOptionName]}`;
6
+ }
7
+ return '';
8
+ };
9
+
10
+ module.exports = {
11
+ toolingVersionOptionName,
12
+ extractToolingVersion,
13
+ };
@@ -1,8 +1,8 @@
1
1
  const packageJson = require('../../package.json');
2
2
  module.exports = {
3
- 'devextreme': '^22.1.3',
4
- 'devextreme-react': '^22.1.3',
5
- 'devextreme-vue': '^22.1.3',
3
+ 'devextreme': '^22.2.3',
4
+ 'devextreme-react': '^22.2.3',
5
+ 'devextreme-vue': '^22.2.3',
6
6
  'devextreme-cli': packageJson.version,
7
7
  'devextreme-schematics': 'latest'
8
8
  };
@@ -11,7 +11,6 @@ const question = {
11
11
  };
12
12
 
13
13
  const getTemplateTypeInfo = async(defaultValue) => {
14
- if(defaultValue === undefined) return 'javascript';
15
14
  return await prompts(question, choices, defaultValue);
16
15
  };
17
16