| #!/usr/bin/env node |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| const fs = require('fs-extra'); |
| |
| if (!(process.argv.length === 3 || process.argv.length === 4)) { |
| console.log('Usage: mkcomp <where?> <component-name>'); |
| process.exit(); |
| } |
| |
| let name; |
| let where; |
| if (process.argv.length === 4) { |
| where = process.argv[2]; |
| name = process.argv[3]; |
| } else { |
| where = 'components'; |
| name = process.argv[2]; |
| } |
| |
| if (!/^([a-z-])+$/.test(name)) { |
| console.log('must be a hyphen case name'); |
| process.exit(); |
| } |
| |
| const path = `./src/${where}/${name}/`; |
| fs.ensureDirSync(path); |
| console.log('Making path:', path); |
| |
| const camelName = name.replace(/(^|-)[a-z]/g, s => s.replace('-', '').toUpperCase()); |
| const snakeName = camelName[0].toLowerCase() + camelName.substr(1); |
| |
| function writeFile(path, data) { |
| try { |
| return fs.writeFileSync(path, data, { |
| flag: 'wx', // x = fail if file exists |
| encoding: 'utf8', |
| }); |
| } catch (error) { |
| return console.log(`Skipping ${path}`); |
| } |
| } |
| |
| // Make the TypeScript file |
| writeFile( |
| path + name + '.tsx', |
| `/* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| import React from 'react'; |
| |
| import './${name}.scss'; |
| |
| export interface ${camelName}Props { |
| } |
| |
| export const ${camelName} = React.memo(function ${camelName}(props: ${camelName}Props) { |
| return ( |
| <div className="${name}"> |
| Stuff... |
| </div> |
| ); |
| }); |
| `, |
| ); |
| |
| // Make the SASS file |
| writeFile( |
| path + name + '.scss', |
| `/* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| .${name} { |
| |
| } |
| `, |
| ); |
| |
| // Make the spec test file |
| writeFile( |
| path + name + '.spec.tsx', |
| `/* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| import { shallow } from 'enzyme'; |
| import React from 'react'; |
| |
| import { ${camelName} } from './${name}'; |
| |
| describe('${camelName}', () => { |
| it('matches snapshot', () => { |
| const ${snakeName} = shallow( |
| <${camelName}/> |
| ); |
| |
| expect(${snakeName}).toMatchSnapshot(); |
| }); |
| }); |
| `, |
| ); |