blob: 1f159603781ce6700406adf343ce5d096003260a [file] [log] [blame]
#!/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();
});
});
`,
);