const fs = require("fs");
const { htmlProps, svgProps, voids, types, typesByElement, reserved } = require("./consts");
const changeCase = require('change-case')
const htmlGenFile = "../src/React/Basic/DOM/Generated.purs";
const htmlSimplifiedGenFile = "../src/React/Basic/DOM/Simplified/Generated.purs";
const svgGenFile = "../src/React/Basic/DOM/SVG.purs";
const warningHeader = `-- | ------------------------------------------------------------
-- | THIS FILE IS GENERATED -- DO NOT EDIT IT
-- | Instead edit files under 'codegen/' dir and regenerate with:
-- | npm install
-- | node ./index.js
-- | ------------------------------------------------------------
`;
const htmlHeader = `${warningHeader}
module React.Basic.DOM.Generated where
import Data.Nullable (Nullable)
import Effect.Unsafe (unsafePerformEffect)
import Foreign.Object (Object)
import Prim.Row (class Union)
import React.Basic (JSX, ReactComponent, Ref, element)
import React.Basic.DOM.Internal (CSS, unsafeCreateDOMComponent)
import React.Basic.Events (EventHandler)
import Unsafe.Coerce (unsafeCoerce)
import Web.DOM (Node)
`;
const simplifiedHtmlHeader = `${warningHeader}
module React.Basic.DOM.Simplified.Generated where
import Data.Nullable (Nullable)
import Effect.Unsafe (unsafePerformEffect)
import Foreign.Object (Object)
import Prim.Row (class Nub, class Union)
import React.Basic (JSX, ReactComponent, Ref, element)
import React.Basic.DOM.Internal (CSS, unsafeCreateDOMComponent)
import React.Basic.DOM.Simplified.ToJSX (class ToJSX, toJSX)
import React.Basic.Events (EventHandler)
import Record as Record
import Unsafe.Coerce (unsafeCoerce)
import Web.DOM (Node)
`;
const propType = (e, p) => {
const elPropTypes = typesByElement[p];
if (elPropTypes) {
if (types[p]) {
throw new TypeError(`${p} appears in both types and typesByElement`);
}
return elPropTypes[e] || elPropTypes["*"] || "String";
} else {
return types[p] || "String";
}
}
const svgHeader = `${warningHeader}
module React.Basic.DOM.SVG where
import Data.Nullable (Nullable)
import Effect.Unsafe (unsafePerformEffect)
import Foreign.Object (Object)
import Prim.Row (class Union)
import React.Basic (JSX, ReactComponent, Ref, element)
import React.Basic.DOM.Internal (SharedSVGProps, unsafeCreateDOMComponent)
import Unsafe.Coerce (unsafeCoerce)
import Web.DOM (Node)
`;
const ignoredSvgPropKeys = [
'*', 'elements',
// These are all deprecated according to MDN, and I'm not sure what the
// React representation should be for the hyphenated ones if they are
// supported all, so let's exclude them
"font", "glyph", "hkern", "missing-glyph", "vkern",
"font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri",
"altGlyph", "altGlyphDef", "altGlyphItem", "glyphRef",
"tref", "color-profile", "cursor",
]
const camelCaseSvgProps = {}
Object.keys(svgProps).forEach(elName => {
if (!ignoredSvgPropKeys.includes(elName)) {
const elAttrs = svgProps[elName].map(changeCase.camelCase);
// style is already included in SharedSVGProps
delete elAttrs['style'];
camelCaseSvgProps[elName] = elAttrs;
}
});
// The attribute list for