@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/.rush/temp/package-deps_build.json +11 -6
- package/.rush/temp/package-deps_lint.json +15 -0
- package/.rush/temp/shrinkwrap-deps.json +13 -13
- package/CHANGELOG.json +48 -0
- package/CHANGELOG.md +29 -1
- package/lib/extra/index.mjs +6 -5
- package/misc/html-types.js +121 -0
- package/misc/react-core-components.js +1424 -0
- package/package.json +6 -5
- package/scripts/generate-react-core.mjs +174 -0
- package/scripts/pin-dependencies-versions.mjs +24 -0
- package/scripts/publish.mjs +1 -1
- package/scripts/verify-and-update-local-package-versions.mjs +29 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@digigov/cli-lab",
|
|
3
|
-
"version": "1.
|
|
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": "
|
|
16
|
-
"zx-extra": "
|
|
17
|
-
"inquirer": "
|
|
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
|
+
});
|
package/scripts/publish.mjs
CHANGED
|
@@ -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.
|
|
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
|
+
});
|