StringLiteral(path) {
        // $FlowFixMe[object-this-reference] Babel transforms run with the plugin context by default
        const {fbtSentinel, reactNativeMode} = getPluginOptions(this);
        if (fbtSentinel == null || fbtSentinel.trim() == '') {
          // eslint-disable-next-line fb-www/no-new-error
          throw new Error(`fbtSentinel must be a non-empty string. `
            + `Current value is ${String(fbtSentinel)} (${typeof fbtSentinel})`);
        }
        const sentinelLength = fbtSentinel.length;
        let phrase = path.node.value;
        if (
          !phrase.startsWith(fbtSentinel) ||
          !phrase.endsWith(fbtSentinel) ||
          phrase.length <= sentinelLength * 2
        ) {
          return;
        }

        phrase = (JSON.parse(
          phrase.slice(sentinelLength, phrase.length - sentinelLength),
          // $FlowFixMe[incompatible-type]
        ) /*: SentinelPayload */);

        const runtimeInput = mapLeaves(
          phrase.jsfbt.t,
          convertJSFBTLeafToRuntimeInputText,
        );
        // $FlowFixMe[prop-missing] replaceWithSourceString's type is not defined yet
        path.replaceWithSourceString(JSON.stringify(runtimeInput));

        const parentNode = path.parentPath && path.parentPath.node;
        invariant(isCallExpression(parentNode),
          'Expected parent node to be a BabelNodeCallExpression');

        // Append runtime options - key for runtime dictionary lookup
        if (parentNode.arguments.length === 1) {
          // Second param 'args' could be omitted sometimes. Use null here
          // $FlowFixMe[prop-missing]
          parentNode.arguments.push(t.nullLiteral());
        }

        // Append hash key to the options argument
        const optionsNode = parentNode.arguments[2];
        invariant(
          optionsNode == null || isObjectExpression(optionsNode),
          'Expect options node to be either null or an object expression but got %s (%s)',
          varDump(optionsNode),
          typeof optionsNode,
        );
        // $FlowFixMe[cannot-write]
        parentNode.arguments[2] = _appendHashKeyOption(
          optionsNode,
          phrase.jsfbt,
          reactNativeMode,
        );
      }
Transform the following:
fbt._(
  fbtSentinel +
  JSON.strinfigy({
    type: "text",
    jsfbt: "jsfbt test" | {
      "t": {... jsfbt table}
       ...
    },
    desc: "desc",
    project: "project",
  }) +
  fbtSentinel
);
to:
fbt._("jsfbt test") or fbt._({... jsfbt table})