Skip to content

Commit

Permalink
#2215 make crafty ide files commit-able
Browse files Browse the repository at this point in the history
  • Loading branch information
onigoetz committed Nov 5, 2023
1 parent 98416c6 commit a6c9a6f
Show file tree
Hide file tree
Showing 21 changed files with 257 additions and 269 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ target
coverage
packages/integration/fixtures/**/dist
packages/integration/fixtures/**/.gitignore
packages/integration/fixtures/**/stylelint.config.mjs
packages/integration/fixtures/**/prettier.config.mjs
packages/integration/fixtures/**/jest.config.mjs

# Caches
.rpt2_cache
Expand Down
5 changes: 3 additions & 2 deletions packages/crafty-preset-eslint/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,9 @@ module.exports = {

return {
".eslintrc.js": {
content: configurationBuilder(process.argv).configuration,
serializer: stringifyConfiguration
content: stringifyConfiguration(
configurationBuilder(process.argv).configuration
)
}
};
},
Expand Down
71 changes: 71 additions & 0 deletions packages/crafty-preset-jest/src/configuration.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
const path = require("path");
const fs = require("fs");

function isModuleMode() {
const packageJson = path.join(process.cwd(), "package.json");

if (fs.existsSync(packageJson)) {
return require(packageJson).type === "module";
}

return false;
}

function normalizeJestOptions(crafty, args) {
const moduleDirectories = new Set(["node_modules"]);

let idx;
while ((idx = args.indexOf("--moduleDirectories")) > -1) {
const [, moduleDir] = args.splice(idx, 2);
moduleDir.split(",").forEach(module => moduleDirectories.add(module));
}

const moduleFileExtensions = new Set(["js", "json", "mjs", "cjs"]);
while ((idx = args.indexOf("--moduleFileExtensions")) > -1) {
const [, moduleExtension] = args.splice(idx, 2);
moduleExtension
.split(",")
.forEach(extension => moduleFileExtensions.add(extension));
}

const options = {
moduleDirectories: [...moduleDirectories],
moduleFileExtensions: [...moduleFileExtensions],
testPathIgnorePatterns: ["/node_modules/", crafty.config.destination],
moduleNameMapper: {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": require.resolve(
"./file-mock"
),
"\\.(css|less|sass|scss)$": require.resolve("./style-mock")
},
bail: true,
roots: [process.cwd()],
transform: {},
resolver: require.resolve("./resolver.js"),
globals: {}
};

const esmMode = isModuleMode();
if (!esmMode) {
// Add custom transformer to ES import/export in node_modules
options.transformIgnorePatterns = [];
options.transform["[/\\\\]node_modules[/\\\\].+\\.m?js$"] = require.resolve(
"./esm-transformer"
);
}

crafty.runAllSync("jest", crafty, options, esmMode);

// Support all extensions that can be transformed for test files extensions, except for json
const extensions = options.moduleFileExtensions
.filter(extension => extension !== "json")
.join("|");
options.testRegex = `(/__tests__/.*|(\\.|/)(test|spec))\\.(${extensions})$`;

return options;
}

module.exports = {
normalizeJestOptions,
isModuleMode
};
98 changes: 18 additions & 80 deletions packages/crafty-preset-jest/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,67 +2,7 @@ const path = require("path");
const fs = require("fs");
const childProcess = require("child_process");

function normalizeJestOptions(crafty, cli, esmMode, args) {
const moduleDirectories = new Set(["node_modules"]);

if (cli.flags.moduleDirectories) {
let idx;
while ((idx = args.indexOf("--moduleDirectories")) > -1) {
args.splice(idx, 2);
}

cli.flags.moduleDirectories
.split(",")
.forEach(module => moduleDirectories.add(module));
}

const moduleFileExtensions = new Set(["js", "json", "mjs", "cjs"]);
if (cli.flags.moduleFileExtensions) {
let idx;
while ((idx = args.indexOf("--moduleFileExtensions")) > -1) {
args.splice(idx, 2);
}

cli.flags.moduleFileExtensions
.split(",")
.forEach(extension => moduleFileExtensions.add(extension));
}

const options = {
moduleDirectories: [...moduleDirectories],
moduleFileExtensions: [...moduleFileExtensions],
testPathIgnorePatterns: ["/node_modules/", crafty.config.destination],
moduleNameMapper: {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": require.resolve(
"./file-mock"
),
"\\.(css|less|sass|scss)$": require.resolve("./style-mock")
},
bail: true,
roots: [process.cwd()],
transform: {},
resolver: require.resolve("./resolver.js"),
globals: {}
};

if (!esmMode) {
// Add custom transformer to ES import/export in node_modules
options.transformIgnorePatterns = [];
options.transform["[/\\\\]node_modules[/\\\\].+\\.m?js$"] = require.resolve(
"./esm-transformer"
);
}

crafty.runAllSync("jest", crafty, options, esmMode);

// Support all extensions that can be transformed for test files extensions, except for json
const extensions = options.moduleFileExtensions
.filter(extension => extension !== "json")
.join("|");
options.testRegex = `(/__tests__/.*|(\\.|/)(test|spec))\\.(${extensions})$`;

return options;
}
const { normalizeJestOptions, isModuleMode } = require("./configuration");

function deleteOnExit(file) {
process.addListener("exit", () => {
Expand All @@ -76,27 +16,25 @@ function deleteOnExit(file) {
});
}

function isModuleMode() {
const packageJson = path.join(process.cwd(), "package.json");

if (fs.existsSync(packageJson)) {
return require(packageJson).type === "module";
}

return false;
}

module.exports = {
ide(crafty, input, cli) {
const esmMode = isModuleMode();
normalizeJestOptions,
ide() {
return {
"jest.config.js": {
content: normalizeJestOptions(crafty, cli, esmMode, []),
serializer: content => `// This configuration was generated by Crafty
// This file is generated to improve IDE Integration
// You don't need to commit this file, nor need it to run \`crafty test\`
"jest.config.mjs": {
shouldIgnore: false,
alternativeFiles: ["jest.config.js"],
content: `// AUTOGENERATED BY CRAFTY - DO NOT EDIT
// This file helps IDEs autoconfigure themselves
// any change here will only be used by your IDE, not by Crafty
/* global process */
import { initialize } from "@swissquote/crafty";
import { normalizeJestOptions } from "@swissquote/crafty-preset-jest";
const crafty = await initialize(process.argv);
module.exports = ${JSON.stringify(content, null, 4)};
const config = normalizeJestOptions(crafty, process.argv);
export default config;
`
}
};
Expand All @@ -119,7 +57,7 @@ module.exports = ${JSON.stringify(content, null, 4)};
argv.unshift("--experimental-vm-modules");
}

const options = normalizeJestOptions(crafty, cli, esmMode, argv);
const options = normalizeJestOptions(crafty, argv);

// Write options to file and set config file option
fs.writeFileSync(configFile, `${JSON.stringify(options, null, 2)}\n`);
Expand Down
23 changes: 15 additions & 8 deletions packages/crafty-preset-prettier/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,23 @@ module.exports = {
prettier: {}
};
},
ide(crafty) {
ide() {
return {
"prettier.config.js": {
content: crafty.config.prettier,
serializer: content => `// This configuration was generated by Crafty
// This file is generated to improve IDE Integration
// You don't need to commit this file
"prettier.config.mjs": {
shouldIgnore: false,
alternativeFiles: ["prettier.config.js"],
content: `// AUTOGENERATED BY CRAFTY - DO NOT EDIT
// This file helps IDEs autoconfigure themselves
// any change here will only be used by your IDE, not by Crafty
module.exports = ${JSON.stringify(content, null, 4)};
`
/* global process */
import { initialize } from "@swissquote/crafty";
const crafty = await initialize(process.argv);
const config = crafty.config.prettier;
export default config;
`
}
};
}
Expand Down
27 changes: 17 additions & 10 deletions packages/crafty-preset-stylelint/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -119,17 +119,24 @@ module.exports = {
gulpTasks.createLinter(gulp, crafty, lintTaskName);
crafty.addDefaultTask(lintTaskName);
},
ide(crafty) {
ide() {
return {
"stylelint.config.js": {
content: crafty.config.legacy_css
? crafty.config.stylelint_legacy
: crafty.config.stylelint,
serializer: content => `// This configuration was generated by Crafty
// This file is generated to improve IDE Integration
// You don't need to commit this file, nor need it to run \`crafty build\`
module.exports = ${JSON.stringify(content, null, 4)};
"stylelint.config.mjs": {
shouldIgnore: false,
alternativeFiles: ["stylelint.config.js"],
content: `// AUTOGENERATED BY CRAFTY - DO NOT EDIT
// This file helps IDEs autoconfigure themselves
// any change here will only be used by your IDE, not by Crafty
/* global process */
import { initialize } from "@swissquote/crafty";
const crafty = await initialize(process.argv);
const config = crafty.config.legacy_css
? crafty.config.stylelint_legacy
: crafty.config.stylelint;
export default config;
`
}
};
Expand Down
33 changes: 23 additions & 10 deletions packages/crafty/src/commands/ide.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ exports.command = async function run(crafty, input, cli) {
.getImplementations("ide")
.sort((a, b) => a.name.localeCompare(b.name))
.forEach(preset => {
debug(`${preset.presetName}.ide(crafty, input, cli)`);
files = Object.assign(files, preset.run("ide", crafty, input, cli));
debug(`${preset.presetName}.ide(crafty)`);
files = Object.assign(files, preset.run("ide", crafty));
});

if (Object.keys(files).length === 0) {
Expand All @@ -34,21 +34,34 @@ exports.command = async function run(crafty, input, cli) {
.split(/\r?\n/);
}

Object.keys(files).forEach(file => {
const { content, serializer = obj => JSON.stringify(obj, null, 4) } = files[
file
];
const destination = path.join(process.cwd(), file);
const cwd = process.cwd();

fs.writeFileSync(destination, serializer(content));
for (const [file, options] of Object.entries(files)) {
const { content, shouldIgnore, alternativeFiles } = options;
const destination = path.join(cwd, file);

if (ignoreFile.indexOf(`/${file}`) === -1) {
if (alternativeFiles) {
for (const alternativeFile of alternativeFiles) {
const oldFile = path.join(cwd, alternativeFile);
if (fs.existsSync(oldFile)) {
console.log(`Removing old config ${file}`);
fs.rmSync(oldFile);
}
}
}

fs.writeFileSync(destination, content);

if (
(shouldIgnore === undefined || shouldIgnore) &&
ignoreFile.indexOf(`/${file}`) === -1
) {
gitignoreModified = true;
ignoreFile.push(`/${file}`);
}

console.log(`Written ${file}`);
});
}

if (gitignoreModified) {
fs.writeFileSync(gitignore, `${ignoreFile.join("\n")}\n`);
Expand Down
20 changes: 20 additions & 0 deletions packages/crafty/src/configuration.js
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,23 @@ async function getOverrides() {
return {};
}
exports.getOverrides = getOverrides;

/**
* Initialize Crafty, its configuration and presets
*
* @param {string[]} argv
*/
async function initialize(argv) {
let readConfig = true;

if (argv.indexOf("--ignore-crafty-config") > -1) {
argv.splice(argv.indexOf("--ignore-crafty-config"), 1);
readConfig = false;
}

const presets = extractPresets(argv);
const config = readConfig ? getOverrides() : {};

return getCrafty(presets, config);
}
exports.initialize = initialize;
4 changes: 4 additions & 0 deletions packages/crafty/src/index.js
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
module.exports = require("./Crafty");

const { initialize } = require("./configuration");

module.exports.initialize = initialize;

0 comments on commit a6c9a6f

Please sign in to comment.