Skip to content

Commit

Permalink
fix: remove webpack-inject-plugin dependency
Browse files Browse the repository at this point in the history
As mentioned in FriendsOfSymfony#454
  • Loading branch information
Andrew Richardson committed Aug 11, 2023
1 parent f527f75 commit e2c2c7e
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 86 deletions.
5 changes: 1 addition & 4 deletions Resources/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
"google-closure-library": "^20220104.0.0",
"gulp": "^4.0.2",
"gulp-rename": "^2.0.0",
"gulp-uglify": "^3.0.2",
"gulp-typescript": "^6.0.0-alpha.1",
"gulp-uglify": "^3.0.2",
"gulp-wrap": "^0.15.0",
"jasmine": "^4.0.2",
"tsd": "^0.19.1",
Expand All @@ -47,8 +47,5 @@
"test": "npm run build && npm run test:types && phantomjs js/run_jsunit.js js/router_test.html",
"test:types": "tsd",
"prepublish": "npm run build"
},
"dependencies": {
"webpack-inject-plugin": "^1.5.5"
}
}
2 changes: 1 addition & 1 deletion Resources/public/js/router.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

185 changes: 104 additions & 81 deletions Resources/webpack/FosRouting.js
Original file line number Diff line number Diff line change
@@ -1,101 +1,124 @@
/**
* @author Adrien Foulon <tofandel@tukan.hu>
*/
const fs = require('fs');
const path = require('path');
const util = require('util');
const fs = require("fs");
const path = require("path");
const util = require("util");
const webpack = require("webpack");

const InjectPlugin = require('webpack-inject-plugin').default;

const execFile = util.promisify(require('child_process').execFile);
const execFile = util.promisify(require("child_process").execFile);
const readFile = util.promisify(fs.readFile);
const rmFile = util.promisify(fs.rm);
const writeFile = util.promisify(fs.writeFile);
const makeDir = util.promisify(fs.mkdir)
const makeDir = util.promisify(fs.mkdir);

class FosRouting {
default = {
locale: '',
prettyPrint: false,
domain: [],
php: 'php',
};
default = {
locale: "",
prettyPrint: false,
domain: [],
php: "php",
};

constructor(options = {}) {
this.options = Object.assign({target: 'var/cache/fosRoutes.json'}, this.default, options, {format: 'json'});
this.finalTarget = path.resolve(process.cwd(), this.options.target);
this.options.target = path.resolve(process.cwd(), this.options.target.replace(/\.json$/, '.tmp.json'));
constructor(options = {}) {
this.options = Object.assign(
{ target: "var/cache/fosRoutes.json" },
this.default,
options,
{ format: "json" }
);
this.finalTarget = path.resolve(process.cwd(), this.options.target);
this.options.target = path.resolve(
process.cwd(),
this.options.target.replace(/\.json$/, ".tmp.json")
);

if (this.options.target === this.finalTarget) {
this.options.target += '.tmp';
}
if (this.options.target === this.finalTarget) {
this.options.target += ".tmp";
}
}

// Values don't need to be escaped because node already does that
shellArg(key, value) {
key = this.kebabize(key);
return typeof value === 'boolean' ? (value ? '--' + key : '') : '--' + key + '=' + value;
}
// Values don't need to be escaped because node already does that
shellArg(key, value) {
key = this.kebabize(key);
return typeof value === "boolean"
? value
? "--" + key
: ""
: "--" + key + "=" + value;
}

kebabize(str) {
return str.split('').map((letter, idx) => {
return letter.toUpperCase() === letter
? `${idx !== 0 ? '-' : ''}${letter.toLowerCase()}`
: letter;
}).join('');
}
kebabize(str) {
return str
.split("")
.map((letter, idx) => {
return letter.toUpperCase() === letter
? `${idx !== 0 ? "-" : ""}${letter.toLowerCase()}`
: letter;
})
.join("");
}

apply(compiler) {
let prevContent = null;
try {
fs.readFileSync(this.finalTarget);
} catch (e) {
apply(compiler) {
let prevContent = null;
try {
fs.readFileSync(this.finalTarget);
} catch (e) {}
const compile = async (comp, callback) => {
const args = Object.keys(this.options).reduce((pass, key) => {
const val = this.options[key];
if (val !== this.default[key]) {
if (Array.isArray(val)) {
pass.push(...val.map((v) => this.shellArg(key, v)));
} else {
pass.push(this.shellArg(key, val));
}
}
return pass;
}, []);
await execFile(this.options.php, [
"bin/console",
"fos:js-routing:dump",
...args,
]);
try {
const content = await readFile(this.options.target);
await rmFile(this.options.target);
if (!prevContent || content.compare(prevContent) !== 0) {
await makeDir(path.dirname(this.finalTarget), { recursive: true });
await writeFile(this.finalTarget, content);
prevContent = content;
if (comp.modifiedFiles && !comp.modifiedFiles.has(this.finalTarget)) {
comp.modifiedFiles.add(this.finalTarget);
}
}
const compile = async (comp, callback) => {
const args = Object.keys(this.options).reduce((pass, key) => {
const val = this.options[key];
if (val !== this.default[key]) {
if (Array.isArray(val)) {
pass.push(...val.map((v) => this.shellArg(key, v)));
} else {
pass.push(this.shellArg(key, val));
}
}
return pass;
}, []);
await execFile(this.options.php, ['bin/console', 'fos:js-routing:dump', ...args]);
try {
const content = await readFile(this.options.target);
await rmFile(this.options.target);
if (!prevContent || content.compare(prevContent) !== 0) {
await makeDir(path.dirname(this.finalTarget), {recursive: true});
await writeFile(this.finalTarget, content);
prevContent = content;
if (comp.modifiedFiles && !comp.modifiedFiles.has(this.finalTarget)) {
comp.modifiedFiles.add(this.finalTarget);
}
}
} catch (e) {
const logger = compiler.getInfrastructureLogger('FosRouting');
logger.error(e.toString());
}
callback();
};
compiler.hooks.beforeRun.tapAsync('RouteDump', compile);
compiler.hooks.watchRun.tapAsync('RouteDump_Watch', (comp, callback) => {
if (!comp.modifiedFiles || !comp.modifiedFiles.has(this.finalTarget)) {
compile(comp, callback);
} else {
callback();
}
});
} catch (e) {
const logger = compiler.getInfrastructureLogger("FosRouting");
logger.error(e.toString());
}
callback();
};
compiler.hooks.beforeRun.tapAsync("RouteDump", compile);
compiler.hooks.watchRun.tapAsync("RouteDump_Watch", (comp, callback) => {
if (!comp.modifiedFiles || !comp.modifiedFiles.has(this.finalTarget)) {
compile(comp, callback);
} else {
callback();
}
});

new InjectPlugin(() => {
return 'import Routing from "fos-router";' +
'import routes from '+JSON.stringify(this.finalTarget)+';' +
'Routing.setRoutingData(routes);';
}).apply(compiler);
}
new webpack.BannerPlugin({
entryOnly: true,
include: this.finalTarget ? this.finalTarget + ".js" : /\.js$/,
raw: true,
banner:
'import Routing from "fos-router";' +
"import routes from " +
JSON.stringify(this.finalTarget) +
";" +
"Routing.setRoutingData(routes);",
}).apply(compiler);
}
}

module.exports = FosRouting;
Expand Down

0 comments on commit e2c2c7e

Please # to comment.