Skip to content

tajo/swc-plugin-fusion

Repository files navigation

swc-plugin-fusion

This is a fork of swc-project/plugins. It provides a few transformations that we use for our internal React framework Fusion. Basic overview (see the fixtures for more):

asseturl

import { assetUrl } from "fusion-core";

const Test = assetUrl("./foo.jpg");

into

import $_asseturl___foo_jpg0 from "./foo.jpg";
import { assetUrl } from "fusion-core";
const Test = $_asseturl___foo_jpg0;

dirname

console.log(__dirname); // __dirname
console.log(__filename); // __filename

into

console.log("/path/to"); // __dirname
console.log("/path/to/file.js"); // __filename

gql

import { gql } from "fusion-plugin-apollo";

const Test = gql("./test.gql");

into

import $_gql___test_gql0 from "./test.gql";
import { gql } from "fusion-plugin-apollo";

const Test = $_gql___test_gql0;

i18n

Translate Component

import { Translate } from "fusion-plugin-i18n-react";
export default function () {
  return (
    <>
      <span id="dont-include" />
      <Translate random={"test"} id="test" />
      <Translate id="test2" />
    </>
  );
}

into

import _fusionPluginI18nChunkTranslationMap from "virtual:fusion-vite-i18n-map";
import { Translate } from "fusion-plugin-i18n-react";
export default function () {
  return (
    <>
      <span id="dont-include" />
      <Translate random={"test"} id="test" />
      <Translate id="test2" />
    </>
  );
}
_fusionPluginI18nChunkTranslationMap.add(
  "/path/to/file.js",
  ["vite-i18n-chunk"],
  ["test", "test2"]
);

useTranslations hook

import { useTranslations } from "fusion-plugin-i18n-react";

export default function () {
  const translate = useTranslations();
  translate("static");
  translate(`prefix.${"foo"}.mid.${"baz"}`);
}

into

import _fusionPluginI18nChunkTranslationMap from "virtual:fusion-vite-i18n-map";
import { useTranslations } from "fusion-plugin-i18n-react";
export default function () {
  const translate = useTranslations();
  translate("static");
  translate(`prefix.${"foo"}.mid.${"baz"}`);
}
_fusionPluginI18nChunkTranslationMap.add(
  "/path/to/file.js",
  ["vite-i18n-chunk"],
  ["static", ["prefix.", ".mid.", ""]]
);

withTranslations HOC

import { withTranslations } from "fusion-plugin-i18n-react";

export default withTranslations(["test", "foo"])(
  ({ translate }) => {
    return (
      <input
        placeholder={translate("test", { name: "world" })}
      />
    );
  }
);

into

import _fusionPluginI18nChunkTranslationMap from "virtual:fusion-vite-i18n-map";
import { withTranslations } from "fusion-plugin-i18n-react";
export default withTranslations(["test", "foo"])(
  ({ translate }) => {
    return (
      <input
        placeholder={translate("test", {
          name: "world",
        })}
      />
    );
  }
);
_fusionPluginI18nChunkTranslationMap.add(
  "/path/to/file.js",
  ["vite-i18n-chunk"],
  ["foo", "test"]
);

split dynamic imports

import("./foo/baz");

into

Object.defineProperties(import("./foo/baz"), {
  __CHUNK_IDS: {
    value: [],
  },
  __MODULE_ID: {
    value:
      "virtual:fusion-vite-split-loader?importer=file.js&specifier=%2E%2Ffoo%2Fbaz",
  },
  __FUSION_DYNAMIC_IMPORT_METADATA__: {
    value: {
      version: 0,
      moduleId:
        "virtual:fusion-vite-split-loader?importer=file.js&specifier=%2E%2Ffoo%2Fbaz",
    },
  },
});

Contributing

cargo build
cargo test