@digigov/cli-lab 1.1.0 → 1.2.2

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": "@digigov/cli-lab",
3
- "version": "1.1.0",
3
+ "version": "1.2.2",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "directories": {
@@ -12,9 +12,10 @@
12
12
  "author": "",
13
13
  "license": "ISC",
14
14
  "dependencies": {
15
- "zx": "~1.15.2",
16
- "zx-extra": "~0.0.4",
17
- "inquirer": "~8.1.2",
18
- "glob": "7.1.6"
15
+ "zx": "1.15.2",
16
+ "zx-extra": "0.0.4",
17
+ "inquirer": "8.1.2",
18
+ "glob": "7.1.6",
19
+ "fs-extra": "10.0.0"
19
20
  }
20
21
  }
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env zx
2
+
3
+ import '../lib/extra/index.mjs';
4
+
5
+ const components = require('../misc/react-core-components')
6
+ const htmlTypes = require('../misc/html-types')
7
+ // uppercase the first letter of a word
8
+ const ucFirst = (str) => str.charAt(0).toUpperCase() + str.slice(1);
9
+ function findRefInChildren(children){
10
+ for(const child of children){
11
+ if(child.props && child.props.ref){
12
+ return child.element
13
+ }
14
+ }
15
+ }
16
+ for(const componentName in components){
17
+ const component = components[componentName]
18
+ if(component.element){
19
+ let mainElement = component.element
20
+ if(component.children){
21
+ mainElement = findRefInChildren(component.children) || mainElement
22
+ }
23
+ const componentPath = `libs-ui/react-core/src/${componentName}/index.tsx`
24
+ const componentTestPath = `libs-ui/react-core/src/${componentName}/index.test.tsx`
25
+ const componentCode = `
26
+ import React from 'react';
27
+ import clsx from 'clsx';
28
+
29
+ type ${ucFirst(mainElement)}ElementAttributes = JSX.IntrinsicElements['${mainElement}']
30
+ export interface ${componentName}Props extends ${ucFirst(mainElement)}ElementAttributes {
31
+ ${
32
+ component.props && Object.keys(component.props).map(propName => {
33
+ const prop = component.props[propName]
34
+ return `
35
+ /**
36
+ * ${propName} is optional.
37
+ */
38
+ ${propName}?: ${prop.type ? prop.type:
39
+ prop.values? Object.keys(prop.values).map(value=>`'${value}'`).join('|'): 'string'}`
40
+ }).join(';\n')
41
+ }
42
+ }
43
+ /**
44
+ * Details for the ${componentName}.
45
+ */
46
+ export const ${componentName} = React.forwardRef<${htmlTypes[mainElement]}, ${componentName}Props>(
47
+ function ${componentName}({
48
+ ${
49
+ component.props && Object.keys(component.props).map(propName => {
50
+ const prop = component.props[propName]
51
+ return `${propName}${prop.default && (prop.type === 'boolean' || prop.type === 'number')? `=${prop.default},`:
52
+ prop.default? `='${prop.default}',`: ','}`
53
+ }).join('\n')
54
+ }
55
+ className,
56
+ children,
57
+ ...props
58
+ }, ref) {
59
+ return (
60
+ ${renderJsonToJsx(component, mainElement)}
61
+ );
62
+ });
63
+
64
+ export default ${componentName};
65
+ `
66
+ const componentTestCode = `
67
+ import React from 'react';
68
+ import { mount } from 'enzyme';
69
+
70
+ import ${componentName} from '@digigov/react-core/${componentName}';
71
+
72
+ it('renders the ${componentName} with no props', () => {
73
+ expect(mount(<${componentName}${component.nochildren?`/>`:`>hello</${componentName}>`})).toMatchSnapshot();
74
+ });
75
+ ${component.props && Object.keys(component.props).map(propName => {
76
+ const prop = component.props[propName]
77
+ if(prop.values && prop.type !== 'boolean'){
78
+ return Object.keys(prop.values).map(value=>{
79
+ return `
80
+ it('renders the ${componentName} with ${propName}=${value}', () => {
81
+ expect(mount(<${componentName} ${propName}={${prop.type === 'number'? value: `'${value}'`}}${component.nochildren?`/>`:`>hello</${componentName}>`})).toMatchSnapshot();
82
+ })`
83
+ }).join('\n')
84
+ }
85
+ if(prop.type === 'boolean'){
86
+ return `
87
+ it('renders the ${componentName} with ${propName}=true', () => {
88
+ expect(mount(<${componentName} ${propName}={true}${component.nochildren?`/>`:`>hello</${componentName}>`})).toMatchSnapshot();
89
+ })
90
+
91
+ it('renders the ${componentName} with ${propName}=false', () => {
92
+ expect(mount(<${componentName} ${propName}={false}${component.nochildren?`/>`:`>hello</${componentName}>`})).toMatchSnapshot();
93
+ })
94
+
95
+ `
96
+ }
97
+ return ''
98
+ }).join('\n')}
99
+
100
+ `
101
+ writeFile(componentPath, componentCode)
102
+ writeFile(componentTestPath, componentTestCode)
103
+ console.log(componentCode)
104
+ }
105
+ }
106
+
107
+
108
+
109
+ // render json to jsx
110
+ function renderJsonToJsx (json, mainElement) {
111
+ let topLevel = false
112
+ if(!Array.isArray(json)){
113
+ if(!json.children){
114
+ json.children = [{element: 'children'}]
115
+ }
116
+ json = [json]
117
+ topLevel = true
118
+
119
+ }
120
+ return json.map(component => {
121
+ if(mainElement === component.element){
122
+ component.props.ref = {
123
+ pass: true
124
+ }
125
+ }
126
+ if(component.element && component.element !== 'children'){
127
+ const elementCode = `<${component.element}
128
+ ${component.props ? Object.keys(component.props).map(propName => {
129
+ const prop = component.props[propName]
130
+ if(prop.pass){
131
+ return `${propName}={${propName}}`
132
+ }
133
+ return ''
134
+ }).filter(p=>p).join('\n'): ''}
135
+ className={clsx(${topLevel?'className,':''} {
136
+ ${component.classes ? component.classes.map(cl=>`'${cl}': true,`).filter(cl=>cl).join('\n'):''}
137
+ ${component.props ? Object.keys(component.props).map(propName => {
138
+ const prop = component.props[propName]
139
+ let classes = ''
140
+ if(prop.values && prop.type !== 'boolean' && prop.type!=='number'){
141
+ return Object.keys(prop.values).map(value=>{
142
+ const className = prop.values[value]
143
+ return `'${className}': ${propName} === '${value}',`
144
+ }).filter(t=>t).join('\n')
145
+ }
146
+ if(prop.values && prop.type === 'boolean'){
147
+ return Object.keys(prop.values).map(value=>{
148
+ const className = prop.values[value]
149
+ return `'${className}': ${propName} === ${value},`
150
+ }).filter(t=>t).join('\n')
151
+ }
152
+ if(prop.values && prop.type === 'number'){
153
+ return Object.keys(prop.values).map(value=>{
154
+ const className = prop.values[value]
155
+ return `'${className}': ${propName} === ${value},`
156
+ }).filter(t=>t).join('\n')
157
+ }
158
+ return ''
159
+ }).filter(t=>t).join(''): ''}
160
+ })}
161
+ ${mainElement === component.element? `{...props}`: ''}
162
+ >${
163
+ component.children? renderJsonToJsx(component.children, mainElement): ''
164
+ }</${component.element}>`
165
+ return elementCode
166
+ }else if(component.element === 'children'){
167
+ return `{children}`
168
+ }else if(component.text){
169
+ return `${component.text}`
170
+ }
171
+
172
+ }).join('').replace(
173
+ /className=\{clsx\( \{\s*\}\)\}/g,'')
174
+ }
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env zx
2
+ import "zx-extra";
3
+ import "../lib/extra/index.mjs";
4
+
5
+ const rushLib = require('@microsoft/rush-lib');
6
+ const rushConfiguration = rushLib.RushConfiguration.loadFromDefaultLocation({
7
+ startingFolder: process.cwd()
8
+ });
9
+
10
+ rushConfiguration.projects.forEach(project => {
11
+ for (const dependencyType of ['dependencies', 'devDependencies', 'peerDependencies']) {
12
+ const dependencies = project.packageJson[dependencyType];
13
+ if (dependencies) {
14
+ for (const dependencyName in dependencies) {
15
+ const dependencyVersion = dependencies[dependencyName];
16
+ if (!dependencyVersion.match(/^[0-9]/)) {
17
+ console.log(`${project.packageJson.name} ${dependencyType} ${dependencyName} ${dependencyVersion}`);
18
+ project.packageJsonEditor.addOrUpdateDependency(dependencyName, dependencyVersion.replace(/^./,''), dependencyType);
19
+ }
20
+ }
21
+ }
22
+ }
23
+ project.packageJsonEditor.saveIfModified();
24
+ });
@@ -26,7 +26,7 @@ await requireEnv('NPM_AUTH_TOKEN', true);
26
26
 
27
27
  if(shouldPublishAll && !featureVersion) {
28
28
  await cli.rush.change();
29
- await cli.rush.version('--bump');
29
+ await cli.rush.publish('-a');
30
30
  await cli.rush.build();
31
31
  await cli.rush.publish(`-p --include-all --target-branch ${targetBranch} --set-access-level public`);
32
32
  } else if(shouldPublishAll && featureVersion) {
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env zx
2
+ import "zx-extra";
3
+ import "../lib/extra/index.mjs";
4
+
5
+ const rushLib = require('@microsoft/rush-lib');
6
+ const rushConfiguration = rushLib.RushConfiguration.loadFromDefaultLocation({
7
+ startingFolder: process.cwd()
8
+ });
9
+
10
+ const localPackageVersions = rushConfiguration.projects.reduce((versions, project) => {
11
+ return { ...versions, [project.packageJson.name]: project.packageJson.version };
12
+ }, {});
13
+
14
+ console.log(localPackageVersions);
15
+ rushConfiguration.projects.forEach(project => {
16
+ for (const dependencyType of ['dependencies', 'devDependencies', 'peerDependencies']) {
17
+ const dependencies = project.packageJson[dependencyType];
18
+ if (dependencies) {
19
+ for (const dependencyName in dependencies) {
20
+ const dependencyVersion = dependencies[dependencyName];
21
+ if (localPackageVersions[dependencyName] && localPackageVersions[dependencyName] !== dependencyVersion) {
22
+ console.log(`${project.packageJson.name} ${dependencyType} ${dependencyName} ${dependencyVersion}`);
23
+ project.packageJsonEditor.addOrUpdateDependency(dependencyName, localPackageVersions[dependencyName], dependencyType);
24
+ }
25
+ }
26
+ }
27
+ }
28
+ project.packageJsonEditor.saveIfModified();
29
+ });