react-on-rails-rsc
Version:
React Server Components support for react_on_rails Ruby gem
58 lines • 2.61 kB
JavaScript
/**
* @license React
* react-server-dom-webpack-node-register.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
;
const acorn = require("acorn-loose"), url = require("url"), Module = require("module");
module.exports = function () {
const Server = require("react-on-rails-rsc/server"), registerServerReference = Server.registerServerReference, createClientModuleProxy = Server.createClientModuleProxy, originalCompile = Module.prototype._compile;
Module.prototype._compile = function (content, filename) {
if (-1 === content.indexOf("use client") &&
-1 === content.indexOf("use server"))
return originalCompile.apply(this, arguments);
try {
var body = acorn.parse(content, {
ecmaVersion: "2024",
sourceType: "source"
}).body;
}
catch (x) {
return (console.error("Error parsing %s %s", url, x.message),
originalCompile.apply(this, arguments));
}
var useClient = !1, useServer = !1;
for (var i = 0; i < body.length; i++) {
var node = body[i];
if ("ExpressionStatement" !== node.type || !node.directive)
break;
"use client" === node.directive && (useClient = !0);
"use server" === node.directive && (useServer = !0);
}
if (!useClient && !useServer)
return originalCompile.apply(this, arguments);
if (useClient && useServer)
throw Error('Cannot have both "use client" and "use server" directives in the same file.');
useClient &&
((body = url.pathToFileURL(filename).href),
(this.exports = createClientModuleProxy(body)));
if (useServer)
if ((originalCompile.apply(this, arguments),
(useServer = url.pathToFileURL(filename).href),
(body = this.exports),
"function" === typeof body))
registerServerReference(body, useServer, null);
else
for (useClient = Object.keys(body), i = 0; i < useClient.length; i++) {
node = useClient[i];
const value = body[useClient[i]];
"function" === typeof value &&
registerServerReference(value, useServer, node);
}
};
};
//# sourceMappingURL=react-server-dom-webpack-node-register.js.map