diff --git a/cli/package-lock.json b/cli/package-lock.json index aca883c..35c0d15 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -1,403 +1,5 @@ { "name": "elm-spa", "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "elm": { - "version": "0.19.1-3", - "resolved": "https://registry.npmjs.org/elm/-/elm-0.19.1-3.tgz", - "integrity": "sha512-6y36ewCcVmTOx8lj7cKJs3bhI5qMfoVEigePZ9PhEUNKpwjjML/pU2u2YSpHVAznuCcojoF6KIsrS1Ci7GtVaQ==", - "dev": true, - "requires": { - "request": "^2.88.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "mime-db": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", - "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", - "dev": true, - "requires": { - "mime-db": "1.42.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - } - } + "lockfileVersion": 1 } diff --git a/cli/src/elm/File.elm b/cli/src/elm/File.elm index b248c34..bf4190f 100644 --- a/cli/src/elm/File.elm +++ b/cli/src/elm/File.elm @@ -321,7 +321,7 @@ module {{pagesModuleName}} exposing ) import App.Page -import Layout as Layout +import {{layoutModuleName}} as Layout import Utils.Spa as Spa import {{paramsModuleName}} as Params import {{routeModuleName}} as Route exposing (Route) @@ -381,7 +381,7 @@ init route_ = update : Msg -> Model -> Spa.Update Model Msg update bigMsg bigModel = {{pagesUpdateFunction}} - +{{defaultUpdateCase}} -- BUNDLE @@ -392,6 +392,7 @@ bundle bigModel = {{pagesBundleFunction}} """ |> String.replace "{{pagesModuleName}}" (pagesModuleName details.moduleName) + |> String.replace "{{layoutModuleName}}" (pagesLayoutModuleName details.moduleName) |> String.replace "{{paramsModuleName}}" (paramsModuleName details.moduleName) |> String.replace "{{routeModuleName}}" (routeModuleName details.moduleName) |> String.replace "{{pagesPageImports}}" (pagesPageImports details.files) @@ -404,9 +405,26 @@ bundle bigModel = |> String.replace "{{pagesInitFunction}}" (pagesInitFunction details) |> String.replace "{{pagesUpdateFunction}}" (pagesUpdateFunction details) |> String.replace "{{pagesBundleFunction}}" (pagesBundleFunction details) + |> String.replace "{{defaultUpdateCase}}" + (if List.length (details.files ++ details.folders) < 2 then + "" + + else + "_ ->\n App.Page.keep bigModel" |> indent 2 + ) |> String.trim +pagesLayoutModuleName : String -> String +pagesLayoutModuleName str = + case str of + "" -> + "Layout" + + _ -> + "Layouts." ++ str + + pagesModuleName : String -> String pagesModuleName = moduleNameFor "Pages" @@ -421,7 +439,8 @@ pagesPageImports files = pagesPageModule : Filepath -> String pagesPageModule path = - last path + path + |> String.join "." |> String.append "Pages." @@ -452,7 +471,7 @@ pagesCustomTypes type_ { files, folders } = last path in ( name ++ "_Folder_" ++ type_ - , pagesModuleName name ++ "." ++ type_ + , pagesModuleName (String.join "." path) ++ "." ++ type_ ) in List.concat @@ -590,7 +609,7 @@ pagesUpdateFunction : Details -> String pagesUpdateFunction details = toItems details |> List.map pagesToUpdate - |> asCaseExpression "route_" + |> asCaseExpression "( bigMsg, bigModel )" |> indent 1 @@ -618,7 +637,7 @@ pagesBundleFunction : Details -> String pagesBundleFunction details = toItems details |> List.map pagesToBundle - |> asCaseExpression "route_" + |> asCaseExpression "bigModel" |> indent 1 @@ -631,7 +650,7 @@ pagesToBundle item = |> String.replace "{{uncapitalized}}" (uncapitalize (last path)) DynamicFile path -> - "Dynamic model ->\n recipes.dynamic.bundle model" + "DynamicModel model ->\n recipes.dynamic.bundle model" StaticFolder path -> "{{name}}_Folder_Model model ->\n recipes.{{uncapitalized}}_folder.bundle model" @@ -639,7 +658,7 @@ pagesToBundle item = |> String.replace "{{uncapitalized}}" (uncapitalize (last path)) DynamicFolder path -> - "Dynamic_Folder model ->\n recipes.dynamic_folder.bundle model" + "Dynamic_Folder_Model model ->\n recipes.dynamic_folder.bundle model" diff --git a/cli/src/elm/Main.elm b/cli/src/elm/Main.elm index fde4cc3..d4d595b 100644 --- a/cli/src/elm/Main.elm +++ b/cli/src/elm/Main.elm @@ -8,7 +8,9 @@ import Set exposing (Set) type alias Flags = - List Filepath + { command : String + , paths : List Filepath + } type alias Filepath = @@ -18,14 +20,24 @@ type alias Filepath = main : Program Flags () Never main = Platform.worker - { init = \json -> ( (), parse json ) + { init = \flags -> ( (), handle flags ) , update = \_ model -> ( model, Cmd.none ) , subscriptions = always Sub.none } -parse : List Filepath -> Cmd msg -parse files = +handle : Flags -> Cmd msg +handle flags = + case flags.command of + "build" -> + build flags.paths + + _ -> + Cmd.none + + +build : List Filepath -> Cmd msg +build files = List.concat [ [ File [ "Routes" ] (File.routes files) ] , files @@ -37,7 +49,7 @@ parse files = , File.pages ] ] - |> Ports.sendFiles + |> Ports.generate diff --git a/cli/src/elm/Ports.elm b/cli/src/elm/Ports.elm index a58d1bc..56bd2be 100644 --- a/cli/src/elm/Ports.elm +++ b/cli/src/elm/Ports.elm @@ -1,4 +1,4 @@ -port module Ports exposing (sendFiles) +port module Ports exposing (generate) import File exposing (File) import Json.Encode as Json @@ -11,9 +11,9 @@ port outgoing : -> Cmd msg -sendFiles : List File -> Cmd msg -sendFiles files = +generate : List File -> Cmd msg +generate files = outgoing - { message = "sendFiles" + { message = "generate" , data = Json.list File.encode files } diff --git a/cli/src/index.js b/cli/src/index.js old mode 100644 new mode 100755 index a1a95e9..4626431 --- a/cli/src/index.js +++ b/cli/src/index.js @@ -1,11 +1,61 @@ const path = require('path') const cwd = process.cwd() -const { File, Elm } = require('./utils.js') +const { File, Elm, bold } = require('./utils.js') -const start = () => - File.paths(path.join(cwd, '..', 'examples', 'complex', 'src', 'Pages')) - .then(Elm.run) +const start = ([ command, ...args ] = []) => + commands[command] + ? commands[command](args) + : commands.help(args) + +// elm-spa build +const build = ([ relative = '.' ]) => + File.paths(path.join(cwd, relative, 'src', 'Pages')) + .then(Elm.run('build', { relative })) .then(console.info) .catch(console.error) +const help = () => console.info(` +usage: ${bold('elm-spa')} [...] + +commands: + + ${bold('init')} [options] create a new project at + + options: + ${bold('--ui=')} the module your \`view\` uses (default: Html) + + examples: + ${bold('elm-spa init your-project')} + ${bold('elm-spa init --ui=Element your-project')} + + + ${bold('build')} generate pages and routes + + examples: + ${bold('elm-spa build .')} + + + ${bold('add')} static create a new static page + sandbox create a new sandbox page + element create a new element page + component create a new component page + + examples: + ${bold('elm-spa add static AboutUs')} + ${bold('elm-spa add element Settings.Index')} + + + ${bold('help')} print this help screen + + examples: + ${bold('elm-spa help')} + ${bold('elm-spa wat')} + ${bold('elm-spa huh?')} +`) + +const commands = { + build, + help +} + start(process.argv.slice(2)) \ No newline at end of file diff --git a/cli/src/utils.js b/cli/src/utils.js index 7f73222..e9af6a6 100644 --- a/cli/src/utils.js +++ b/cli/src/utils.js @@ -1,6 +1,8 @@ +const path = require('path') +const fs = require('fs') +const cwd = process.cwd() + const File = (_ => { - const path = require('path') - const fs = require('fs') const mkdir = (filepath) => new Promise((resolve, reject) => @@ -8,6 +10,9 @@ const File = (_ => { ) const create = (filepath, contents) => { + // this will surely break windows, im tired and sorry i wrote this line. + const folderOf = (path) => path.split('/').slice(0, -1).join('/') + const write = (filepath, contents) => new Promise((resolve, reject) => fs.writeFile(filepath, contents, { encoding: 'utf8' }, (err) => @@ -61,20 +66,24 @@ const Elm = (_ => { const { Elm } = require('../dist/elm.compiled.js') const handlers = { - sendFiles: (data) => - data.forEach(a => - console.log() || - console.log(bold(a.filepath.join('/') + '.elm')) || - console.log('\n' + a.contents + '\n')) + generate: ({ relative }, files) => + Promise.all( + files + .map(item => ({ + ...item, + filepath: path.join(cwd, relative, 'elm-stuff', '.elm-spa', 'Generated', ...item.filepath) + '.elm' + })) + .map(item => File.create(item.filepath, item.contents)) + ) } - const run = paths => + const run = (command, args) => (paths) => new Promise((resolve, reject) => { - const app = Elm.Main.init({ flags: paths }) + const app = Elm.Main.init({ flags: { command, paths } }) app.ports.outgoing.subscribe(({ message, data }) => handlers[message] - ? Promise.resolve(handlers[message](data)).then(resolve).catch(reject) + ? Promise.resolve(handlers[message](args, data)).then(resolve).catch(reject) : reject(`Didn't recognize message "${message}"– Yell at @ryannhg on the internet!\n`) ) }) @@ -86,5 +95,6 @@ const bold = str => '\033[1m' + str + '\033[0m' module.exports = { Elm, - File + File, + bold } \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Pages.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Pages.elm index 582910d..4453af2 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Pages.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Pages.elm @@ -5,12 +5,14 @@ module Generated.Docs.Pages exposing ) import App.Page +import Layouts.Docs as Layout +import Utils.Spa as Spa import Generated.Docs.Params as Params import Generated.Docs.Route as Route exposing (Route) -import Layouts.Docs as Layout import Pages.Docs.Dynamic import Pages.Docs.Static -import Utils.Spa as Spa exposing (Page) + + type Model @@ -23,7 +25,7 @@ type Msg | StaticMsg Pages.Docs.Static.Msg -page : Page Route Model Msg layoutModel layoutMsg appMsg +page : Spa.Page Route Model Msg layoutModel layoutMsg appMsg page = Spa.layout { view = Layout.view @@ -71,13 +73,13 @@ recipes = init : Route -> Spa.Init Model Msg -init route = - case route of - Route.Dynamic _ flags -> - recipes.dynamic.init flags - - Route.Static flags -> - recipes.static.init flags +init route_ = + case route_ of + Route.Static params -> + recipes.static.init params + + Route.Dynamic _ params -> + recipes.dynamic.init params @@ -87,25 +89,23 @@ init route = update : Msg -> Model -> Spa.Update Model Msg update bigMsg bigModel = case ( bigMsg, bigModel ) of - ( DynamicMsg msg, DynamicModel model ) -> - recipes.dynamic.update msg model - ( StaticMsg msg, StaticModel model ) -> recipes.static.update msg model - + + ( DynamicMsg msg, DynamicModel model ) -> + recipes.dynamic.update msg model _ -> App.Page.keep bigModel - -- BUNDLE bundle : Model -> Spa.Bundle Msg msg bundle bigModel = case bigModel of - DynamicModel model -> - recipes.dynamic.bundle model - StaticModel model -> recipes.static.bundle model + + DynamicModel model -> + recipes.dynamic.bundle model \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Params.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Params.elm index bb3a7a2..75afd06 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Params.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Params.elm @@ -1,13 +1,10 @@ -module Generated.Docs.Params exposing - ( Dynamic - , Static - ) - - -type alias Static = - {} +module Generated.Docs.Params exposing (..) type alias Dynamic = { param1 : String } + + +type alias Static = + {} \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Route.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Route.elm index 9e99e47..30fd2f0 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Route.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Docs/Route.elm @@ -7,8 +7,8 @@ import Generated.Docs.Params as Params type Route - = Static Params.Static - | Dynamic String Params.Dynamic + = Dynamic String Params.Dynamic + | Static Params.Static toPath : Route -> String @@ -16,6 +16,7 @@ toPath route = case route of Static _ -> "/static" - + + Dynamic value _ -> - "/" ++ value + "/" ++ value \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Pages.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Pages.elm index f3af745..adc036c 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Pages.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Pages.elm @@ -5,11 +5,13 @@ module Generated.Guide.Dynamic.Dynamic.Pages exposing ) import App.Page +import Layouts.Guide.Dynamic.Dynamic as Layout +import Utils.Spa as Spa import Generated.Guide.Dynamic.Dynamic.Params as Params import Generated.Guide.Dynamic.Dynamic.Route as Route exposing (Route) -import Layouts.Guide.Dynamic.Dynamic as Layout import Pages.Guide.Dynamic.Dynamic.Top -import Utils.Spa as Spa exposing (Page) + + type Model @@ -20,7 +22,7 @@ type Msg = TopMsg Pages.Guide.Dynamic.Dynamic.Top.Msg -page : Page Route Model Msg layoutModel layoutMsg appMsg +page : Spa.Page Route Model Msg layoutModel layoutMsg appMsg page = Spa.layout { view = Layout.view @@ -61,10 +63,10 @@ recipes = init : Route -> Spa.Init Model Msg -init route = - case route of - Route.Top flags -> - recipes.top.init flags +init route_ = + case route_ of + Route.Top params -> + recipes.top.init params @@ -86,4 +88,4 @@ bundle : Model -> Spa.Bundle Msg msg bundle bigModel = case bigModel of TopModel model -> - recipes.top.bundle model + recipes.top.bundle model \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Params.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Params.elm index 0c14dc9..300704b 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Params.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Params.elm @@ -1,7 +1,7 @@ -module Generated.Guide.Dynamic.Dynamic.Params exposing (Top) +module Generated.Guide.Dynamic.Dynamic.Params exposing (..) type alias Top = { param1 : String , param2 : String - } + } \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Route.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Route.elm index e3fa3c4..415a33a 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Route.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Dynamic/Route.elm @@ -14,4 +14,4 @@ toPath : Route -> String toPath route = case route of Top _ -> - "/" + "/top" \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Pages.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Pages.elm index 695e7fa..69bf591 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Pages.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Pages.elm @@ -5,11 +5,13 @@ module Generated.Guide.Dynamic.Faq.Pages exposing ) import App.Page +import Layouts.Guide.Dynamic.Faq as Layout +import Utils.Spa as Spa import Generated.Guide.Dynamic.Faq.Params as Params import Generated.Guide.Dynamic.Faq.Route as Route exposing (Route) -import Layouts.Guide.Dynamic.Faq as Layout import Pages.Guide.Dynamic.Faq.Top -import Utils.Spa as Spa exposing (Page) + + type Model @@ -20,7 +22,7 @@ type Msg = TopMsg Pages.Guide.Dynamic.Faq.Top.Msg -page : Page Route Model Msg layoutModel layoutMsg appMsg +page : Spa.Page Route Model Msg layoutModel layoutMsg appMsg page = Spa.layout { view = Layout.view @@ -61,10 +63,10 @@ recipes = init : Route -> Spa.Init Model Msg -init route = - case route of - Route.Top flags -> - recipes.top.init flags +init route_ = + case route_ of + Route.Top params -> + recipes.top.init params @@ -86,4 +88,4 @@ bundle : Model -> Spa.Bundle Msg msg bundle bigModel = case bigModel of TopModel model -> - recipes.top.bundle model + recipes.top.bundle model \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Params.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Params.elm index 48af88d..0e08d33 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Params.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Params.elm @@ -1,6 +1,6 @@ -module Generated.Guide.Dynamic.Faq.Params exposing (Top) +module Generated.Guide.Dynamic.Faq.Params exposing (..) type alias Top = { param1 : String - } + } \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Route.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Route.elm index 80bb8b9..dd7e72c 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Route.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Faq/Route.elm @@ -14,4 +14,4 @@ toPath : Route -> String toPath route = case route of Top _ -> - "/" + "/top" \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Pages.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Pages.elm index 594545e..3552756 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Pages.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Pages.elm @@ -5,36 +5,33 @@ module Generated.Guide.Dynamic.Pages exposing ) import App.Page -import Generated.Guide.Dynamic.Dynamic.Pages -import Generated.Guide.Dynamic.Dynamic.Route -import Generated.Guide.Dynamic.Faq.Pages -import Generated.Guide.Dynamic.Faq.Route +import Layouts.Guide.Dynamic as Layout +import Utils.Spa as Spa import Generated.Guide.Dynamic.Params as Params import Generated.Guide.Dynamic.Route as Route exposing (Route) -import Layouts.Guide.Dynamic as Layout -import Pages.Guide.Dynamic.Dynamic import Pages.Guide.Dynamic.Intro import Pages.Guide.Dynamic.Other -import Utils.Spa as Spa exposing (Page) +import Generated.Guide.Dynamic.Dynamic.Route +import Generated.Guide.Dynamic.Faq.Route +import Generated.Guide.Dynamic.Dynamic.Pages +import Generated.Guide.Dynamic.Faq.Pages type Model = IntroModel Pages.Guide.Dynamic.Intro.Model | OtherModel Pages.Guide.Dynamic.Other.Model - | DynamicModel Pages.Guide.Dynamic.Dynamic.Model - | Faq_FolderModel Generated.Guide.Dynamic.Faq.Pages.Model - | Dynamic_FolderModel Generated.Guide.Dynamic.Dynamic.Pages.Model + | Dynamic_Folder_Model Generated.Guide.Dynamic.Dynamic.Pages.Model + | Faq_Folder_Model Generated.Guide.Dynamic.Faq.Pages.Model type Msg = IntroMsg Pages.Guide.Dynamic.Intro.Msg | OtherMsg Pages.Guide.Dynamic.Other.Msg - | DynamicMsg Pages.Guide.Dynamic.Dynamic.Msg - | Faq_FolderMsg Generated.Guide.Dynamic.Faq.Pages.Msg - | Dynamic_FolderMsg Generated.Guide.Dynamic.Dynamic.Pages.Msg + | Dynamic_Folder_Msg Generated.Guide.Dynamic.Dynamic.Pages.Msg + | Faq_Folder_Msg Generated.Guide.Dynamic.Faq.Pages.Msg -page : Page Route Model Msg layoutModel layoutMsg appMsg +page : Spa.Page Route Model Msg layoutModel layoutMsg appMsg page = Spa.layout { view = Layout.view @@ -57,9 +54,8 @@ type alias Recipe flags model msg appMsg = type alias Recipes msg = { intro : Recipe Params.Intro Pages.Guide.Dynamic.Intro.Model Pages.Guide.Dynamic.Intro.Msg msg , other : Recipe Params.Other Pages.Guide.Dynamic.Other.Model Pages.Guide.Dynamic.Other.Msg msg - , dynamic : Recipe Params.Dynamic Pages.Guide.Dynamic.Dynamic.Model Pages.Guide.Dynamic.Dynamic.Msg msg - , faq_folder : Recipe Generated.Guide.Dynamic.Faq.Route.Route Generated.Guide.Dynamic.Faq.Pages.Model Generated.Guide.Dynamic.Faq.Pages.Msg msg , dynamic_folder : Recipe Generated.Guide.Dynamic.Dynamic.Route.Route Generated.Guide.Dynamic.Dynamic.Pages.Model Generated.Guide.Dynamic.Dynamic.Pages.Msg msg + , faq_folder : Recipe Generated.Guide.Dynamic.Faq.Route.Route Generated.Guide.Dynamic.Faq.Pages.Model Generated.Guide.Dynamic.Faq.Pages.Msg msg } @@ -77,23 +73,17 @@ recipes = , toModel = OtherModel , toMsg = OtherMsg } - , dynamic = + , dynamic_folder = Spa.recipe - { page = Pages.Guide.Dynamic.Dynamic.page - , toModel = DynamicModel - , toMsg = DynamicMsg + { page = Generated.Guide.Dynamic.Dynamic.Pages.page + , toModel = Dynamic_Folder_Model + , toMsg = Dynamic_Folder_Msg } , faq_folder = Spa.recipe { page = Generated.Guide.Dynamic.Faq.Pages.page - , toModel = Faq_FolderModel - , toMsg = Faq_FolderMsg - } - , dynamic_folder = - Spa.recipe - { page = Generated.Guide.Dynamic.Dynamic.Pages.page - , toModel = Dynamic_FolderModel - , toMsg = Dynamic_FolderMsg + , toModel = Faq_Folder_Model + , toMsg = Faq_Folder_Msg } } @@ -103,22 +93,19 @@ recipes = init : Route -> Spa.Init Model Msg -init route = - case route of - Route.Intro flags -> - recipes.intro.init flags - - Route.Other flags -> - recipes.other.init flags - - Route.Dynamic _ flags -> - recipes.dynamic.init flags - - Route.Faq_Folder flags -> - recipes.faq_folder.init flags - - Route.Dynamic_Folder _ flags -> - recipes.dynamic_folder.init flags +init route_ = + case route_ of + Route.Intro params -> + recipes.intro.init params + + Route.Other params -> + recipes.other.init params + + Route.Faq_Folder route -> + recipes.faq_folder.init route + + Route.Dynamic_Folder _ route -> + recipes.dynamic_folder.init route @@ -130,24 +117,19 @@ update bigMsg bigModel = case ( bigMsg, bigModel ) of ( IntroMsg msg, IntroModel model ) -> recipes.intro.update msg model - + ( OtherMsg msg, OtherModel model ) -> recipes.other.update msg model - - ( DynamicMsg msg, DynamicModel model ) -> - recipes.dynamic.update msg model - - ( Faq_FolderMsg msg, Faq_FolderModel model ) -> + + ( Faq_Folder_Msg msg, Faq_Folder_Model model ) -> recipes.faq_folder.update msg model - - ( Dynamic_FolderMsg msg, Dynamic_FolderModel model ) -> + + ( Dynamic_Folder_Msg msg, Dynamic_Folder_Model model ) -> recipes.dynamic_folder.update msg model - _ -> App.Page.keep bigModel - -- BUNDLE @@ -156,15 +138,12 @@ bundle bigModel = case bigModel of IntroModel model -> recipes.intro.bundle model - + OtherModel model -> recipes.other.bundle model - - DynamicModel model -> - recipes.dynamic.bundle model - - Faq_FolderModel model -> + + Faq_Folder_Model model -> recipes.faq_folder.bundle model - - Dynamic_FolderModel model -> - recipes.dynamic_folder.bundle model + + Dynamic_Folder_Model model -> + recipes.dynamic_folder.bundle model \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Params.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Params.elm index 38b14fd..faa334b 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Params.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Params.elm @@ -1,8 +1,4 @@ -module Generated.Guide.Dynamic.Params exposing - ( Dynamic - , Intro - , Other - ) +module Generated.Guide.Dynamic.Params exposing (..) type alias Intro = @@ -12,10 +8,4 @@ type alias Intro = type alias Other = { param1 : String - } - - -type alias Dynamic = - { param1 : String - , param2 : String - } + } \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Route.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Route.elm index 9a87b39..83c8fe4 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Route.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Dynamic/Route.elm @@ -3,17 +3,16 @@ module Generated.Guide.Dynamic.Route exposing , toPath ) +import Generated.Guide.Dynamic.Params as Params import Generated.Guide.Dynamic.Dynamic.Route import Generated.Guide.Dynamic.Faq.Route -import Generated.Guide.Dynamic.Params as Params type Route = Intro Params.Intro | Other Params.Other - | Dynamic String Params.Dynamic - | Faq_Folder Generated.Guide.Dynamic.Faq.Route.Route | Dynamic_Folder String Generated.Guide.Dynamic.Dynamic.Route.Route + | Faq_Folder Generated.Guide.Dynamic.Faq.Route.Route toPath : Route -> String @@ -21,15 +20,15 @@ toPath route = case route of Intro _ -> "/intro" - + + Other _ -> "/other" - - Dynamic value _ -> - "/" ++ value - + + Faq_Folder subRoute -> "/faq" ++ Generated.Guide.Dynamic.Faq.Route.toPath subRoute - + + Dynamic_Folder value subRoute -> - "/" ++ value ++ Generated.Guide.Dynamic.Dynamic.Route.toPath subRoute + "/" ++ value ++ Generated.Guide.Dynamic.Dynamic.Route.toPath subRoute \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Pages.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Pages.elm index 3ca9ac0..5dad47f 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Pages.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Pages.elm @@ -5,15 +5,15 @@ module Generated.Guide.Pages exposing ) import App.Page -import Generated.Guide.Dynamic.Pages -import Generated.Guide.Dynamic.Route +import Layouts.Guide as Layout +import Utils.Spa as Spa import Generated.Guide.Params as Params import Generated.Guide.Route as Route exposing (Route) -import Layouts.Guide as Layout import Pages.Guide.Elm import Pages.Guide.ElmSpa import Pages.Guide.Programming -import Utils.Spa as Spa exposing (Page) +import Generated.Guide.Dynamic.Route +import Generated.Guide.Dynamic.Pages type Model @@ -30,7 +30,7 @@ type Msg | Dynamic_Folder_Msg Generated.Guide.Dynamic.Pages.Msg -page : Page Route Model Msg layoutModel layoutMsg appMsg +page : Spa.Page Route Model Msg layoutModel layoutMsg appMsg page = Spa.layout { view = Layout.view @@ -52,7 +52,7 @@ type alias Recipe flags model msg appMsg = type alias Recipes msg = { elm : Recipe Params.Elm Pages.Guide.Elm.Model Pages.Guide.Elm.Msg msg - , elmApp : Recipe Params.ElmSpa Pages.Guide.ElmSpa.Model Pages.Guide.ElmSpa.Msg msg + , elmSpa : Recipe Params.ElmSpa Pages.Guide.ElmSpa.Model Pages.Guide.ElmSpa.Msg msg , programming : Recipe Params.Programming Pages.Guide.Programming.Model Pages.Guide.Programming.Msg msg , dynamic_folder : Recipe Generated.Guide.Dynamic.Route.Route Generated.Guide.Dynamic.Pages.Model Generated.Guide.Dynamic.Pages.Msg msg } @@ -66,7 +66,7 @@ recipes = , toModel = ElmModel , toMsg = ElmMsg } - , elmApp = + , elmSpa = Spa.recipe { page = Pages.Guide.ElmSpa.page , toModel = ElmSpaModel @@ -92,19 +92,19 @@ recipes = init : Route -> Spa.Init Model Msg -init route = - case route of - Route.Elm flags -> - recipes.elm.init flags - - Route.ElmSpa flags -> - recipes.elmApp.init flags - - Route.Programming flags -> - recipes.programming.init flags - - Route.Dynamic_Folder flags route_ -> - recipes.dynamic_folder.init route_ +init route_ = + case route_ of + Route.Elm params -> + recipes.elm.init params + + Route.ElmSpa params -> + recipes.elmSpa.init params + + Route.Programming params -> + recipes.programming.init params + + Route.Dynamic_Folder _ route -> + recipes.dynamic_folder.init route @@ -116,21 +116,19 @@ update bigMsg bigModel = case ( bigMsg, bigModel ) of ( ElmMsg msg, ElmModel model ) -> recipes.elm.update msg model - + ( ElmSpaMsg msg, ElmSpaModel model ) -> - recipes.elmApp.update msg model - + recipes.elmSpa.update msg model + ( ProgrammingMsg msg, ProgrammingModel model ) -> recipes.programming.update msg model - + ( Dynamic_Folder_Msg msg, Dynamic_Folder_Model model ) -> recipes.dynamic_folder.update msg model - _ -> App.Page.keep bigModel - -- BUNDLE @@ -139,12 +137,12 @@ bundle bigModel = case bigModel of ElmModel model -> recipes.elm.bundle model - + ElmSpaModel model -> - recipes.elmApp.bundle model - + recipes.elmSpa.bundle model + ProgrammingModel model -> recipes.programming.bundle model - + Dynamic_Folder_Model model -> - recipes.dynamic_folder.bundle model + recipes.dynamic_folder.bundle model \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Params.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Params.elm index 7431fbe..4bb6284 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Params.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Params.elm @@ -1,8 +1,4 @@ -module Generated.Guide.Params exposing - ( Elm - , ElmSpa - , Programming - ) +module Generated.Guide.Params exposing (..) type alias Elm = @@ -14,4 +10,4 @@ type alias ElmSpa = type alias Programming = - {} + {} \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Route.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Route.elm index ccb311a..4b8ca58 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Route.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Guide/Route.elm @@ -3,15 +3,15 @@ module Generated.Guide.Route exposing , toPath ) -import Generated.Guide.Dynamic.Route as Dynamic_Routes import Generated.Guide.Params as Params +import Generated.Guide.Dynamic.Route type Route = Elm Params.Elm | ElmSpa Params.ElmSpa | Programming Params.Programming - | Dynamic_Folder String Dynamic_Routes.Route + | Dynamic_Folder String Generated.Guide.Dynamic.Route.Route toPath : Route -> String @@ -19,12 +19,15 @@ toPath route = case route of Elm _ -> "/elm" - + + ElmSpa _ -> "/elm-spa" - + + Programming _ -> "/programming" - + + Dynamic_Folder value subRoute -> - "/" ++ value ++ Dynamic_Routes.toPath subRoute + "/" ++ value ++ Generated.Guide.Dynamic.Route.toPath subRoute \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Pages.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Pages.elm index 38eb31b..0aa67e2 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Pages.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Pages.elm @@ -5,39 +5,39 @@ module Generated.Pages exposing ) import App.Page -import Generated.Docs.Pages -import Generated.Docs.Route -import Generated.Guide.Pages -import Generated.Guide.Route +import Layout as Layout +import Utils.Spa as Spa import Generated.Params as Params import Generated.Route as Route exposing (Route) -import Layout as Layout import Pages.Docs import Pages.Guide import Pages.NotFound import Pages.SignIn import Pages.Top -import Utils.Spa as Spa +import Generated.Docs.Route +import Generated.Guide.Route +import Generated.Docs.Pages +import Generated.Guide.Pages type Model - = TopModel Pages.Top.Model - | DocsModel Pages.Docs.Model + = DocsModel Pages.Docs.Model + | GuideModel Pages.Guide.Model | NotFoundModel Pages.NotFound.Model | SignInModel Pages.SignIn.Model - | GuideModel Pages.Guide.Model - | Guide_Folder_Model Generated.Guide.Pages.Model + | TopModel Pages.Top.Model | Docs_Folder_Model Generated.Docs.Pages.Model + | Guide_Folder_Model Generated.Guide.Pages.Model type Msg - = TopMsg Pages.Top.Msg - | DocsMsg Pages.Docs.Msg + = DocsMsg Pages.Docs.Msg + | GuideMsg Pages.Guide.Msg | NotFoundMsg Pages.NotFound.Msg | SignInMsg Pages.SignIn.Msg - | GuideMsg Pages.Guide.Msg - | Guide_Folder_Msg Generated.Guide.Pages.Msg + | TopMsg Pages.Top.Msg | Docs_Folder_Msg Generated.Docs.Pages.Msg + | Guide_Folder_Msg Generated.Guide.Pages.Msg page : Spa.Page Route Model Msg layoutModel layoutMsg appMsg @@ -61,30 +61,30 @@ type alias Recipe flags model msg appMsg = type alias Recipes msg = - { top : Recipe Params.Top Pages.Top.Model Pages.Top.Msg msg - , docs : Recipe Params.Docs Pages.Docs.Model Pages.Docs.Msg msg + { docs : Recipe Params.Docs Pages.Docs.Model Pages.Docs.Msg msg + , guide : Recipe Params.Guide Pages.Guide.Model Pages.Guide.Msg msg , notFound : Recipe Params.NotFound Pages.NotFound.Model Pages.NotFound.Msg msg , signIn : Recipe Params.SignIn Pages.SignIn.Model Pages.SignIn.Msg msg - , guide : Recipe Params.Guide Pages.Guide.Model Pages.Guide.Msg msg - , guide_folder : Recipe Generated.Guide.Route.Route Generated.Guide.Pages.Model Generated.Guide.Pages.Msg msg + , top : Recipe Params.Top Pages.Top.Model Pages.Top.Msg msg , docs_folder : Recipe Generated.Docs.Route.Route Generated.Docs.Pages.Model Generated.Docs.Pages.Msg msg + , guide_folder : Recipe Generated.Guide.Route.Route Generated.Guide.Pages.Model Generated.Guide.Pages.Msg msg } recipes : Recipes msg recipes = - { top = - Spa.recipe - { page = Pages.Top.page - , toModel = TopModel - , toMsg = TopMsg - } - , docs = + { docs = Spa.recipe { page = Pages.Docs.page , toModel = DocsModel , toMsg = DocsMsg } + , guide = + Spa.recipe + { page = Pages.Guide.page + , toModel = GuideModel + , toMsg = GuideMsg + } , notFound = Spa.recipe { page = Pages.NotFound.page @@ -97,17 +97,11 @@ recipes = , toModel = SignInModel , toMsg = SignInMsg } - , guide = + , top = Spa.recipe - { page = Pages.Guide.page - , toModel = GuideModel - , toMsg = GuideMsg - } - , guide_folder = - Spa.recipe - { page = Generated.Guide.Pages.page - , toModel = Guide_Folder_Model - , toMsg = Guide_Folder_Msg + { page = Pages.Top.page + , toModel = TopModel + , toMsg = TopMsg } , docs_folder = Spa.recipe @@ -115,6 +109,12 @@ recipes = , toModel = Docs_Folder_Model , toMsg = Docs_Folder_Msg } + , guide_folder = + Spa.recipe + { page = Generated.Guide.Pages.page + , toModel = Guide_Folder_Model + , toMsg = Guide_Folder_Msg + } } @@ -125,26 +125,26 @@ recipes = init : Route -> Spa.Init Model Msg init route_ = case route_ of - Route.Top flags -> - recipes.top.init flags - - Route.Docs flags -> - recipes.docs.init flags - - Route.NotFound flags -> - recipes.notFound.init flags - - Route.SignIn flags -> - recipes.signIn.init flags - - Route.Guide flags -> - recipes.guide.init flags - - Route.Guide_Folder route -> - recipes.guide_folder.init route - + Route.Docs params -> + recipes.docs.init params + + Route.Guide params -> + recipes.guide.init params + + Route.NotFound params -> + recipes.notFound.init params + + Route.SignIn params -> + recipes.signIn.init params + + Route.Top params -> + recipes.top.init params + Route.Docs_Folder route -> recipes.docs_folder.init route + + Route.Guide_Folder route -> + recipes.guide_folder.init route @@ -154,55 +154,53 @@ init route_ = update : Msg -> Model -> Spa.Update Model Msg update bigMsg bigModel = case ( bigMsg, bigModel ) of - ( TopMsg msg, TopModel model ) -> - recipes.top.update msg model - ( DocsMsg msg, DocsModel model ) -> recipes.docs.update msg model - - ( NotFoundMsg msg, NotFoundModel model ) -> - recipes.notFound.update msg model - - ( SignInMsg msg, SignInModel model ) -> - recipes.signIn.update msg model - + ( GuideMsg msg, GuideModel model ) -> recipes.guide.update msg model - - ( Guide_Folder_Msg msg, Guide_Folder_Model model ) -> - recipes.guide_folder.update msg model - + + ( NotFoundMsg msg, NotFoundModel model ) -> + recipes.notFound.update msg model + + ( SignInMsg msg, SignInModel model ) -> + recipes.signIn.update msg model + + ( TopMsg msg, TopModel model ) -> + recipes.top.update msg model + ( Docs_Folder_Msg msg, Docs_Folder_Model model ) -> recipes.docs_folder.update msg model - + + ( Guide_Folder_Msg msg, Guide_Folder_Model model ) -> + recipes.guide_folder.update msg model _ -> App.Page.keep bigModel - -- BUNDLE bundle : Model -> Spa.Bundle Msg msg bundle bigModel = case bigModel of - TopModel model -> - recipes.top.bundle model - DocsModel model -> recipes.docs.bundle model - - NotFoundModel model -> - recipes.notFound.bundle model - - SignInModel model -> - recipes.signIn.bundle model - + GuideModel model -> recipes.guide.bundle model - - Guide_Folder_Model model -> - recipes.guide_folder.bundle model - + + NotFoundModel model -> + recipes.notFound.bundle model + + SignInModel model -> + recipes.signIn.bundle model + + TopModel model -> + recipes.top.bundle model + Docs_Folder_Model model -> recipes.docs_folder.bundle model + + Guide_Folder_Model model -> + recipes.guide_folder.bundle model \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Params.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Params.elm index 7cbf831..35c5a77 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Params.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Params.elm @@ -1,20 +1,14 @@ -module Generated.Params exposing - ( Docs - , Guide - , NotFound - , SignIn - , Top - ) - - -type alias Top = - {} +module Generated.Params exposing (..) type alias Docs = {} +type alias Guide = + {} + + type alias NotFound = {} @@ -23,5 +17,5 @@ type alias SignIn = {} -type alias Guide = - {} +type alias Top = + {} \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Route.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Route.elm index 5829d93..caac38c 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Route.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Route.elm @@ -3,41 +3,47 @@ module Generated.Route exposing , toPath ) +import Generated.Params as Params import Generated.Docs.Route import Generated.Guide.Route -import Generated.Params type Route - = Top Generated.Params.Top - | Docs Generated.Params.Docs - | NotFound Generated.Params.NotFound - | SignIn Generated.Params.SignIn - | Guide Generated.Params.Guide - | Guide_Folder Generated.Guide.Route.Route + = Docs Params.Docs + | Guide Params.Guide + | NotFound Params.NotFound + | SignIn Params.SignIn + | Top Params.Top | Docs_Folder Generated.Docs.Route.Route + | Guide_Folder Generated.Guide.Route.Route toPath : Route -> String toPath route = case route of - Top _ -> - "/" - Docs _ -> "/docs" - - NotFound _ -> - "/not-found" - - SignIn _ -> - "/sign-in" - + + Guide _ -> "/guide" - - Guide_Folder subRoute -> - "/guide" ++ Generated.Guide.Route.toPath subRoute - + + + NotFound _ -> + "/not-found" + + + SignIn _ -> + "/sign-in" + + + Top _ -> + "/top" + + Docs_Folder subRoute -> "/docs" ++ Generated.Docs.Route.toPath subRoute + + + Guide_Folder subRoute -> + "/guide" ++ Generated.Guide.Route.toPath subRoute \ No newline at end of file diff --git a/examples/complex/elm-stuff/.elm-spa/Generated/Routes.elm b/examples/complex/elm-stuff/.elm-spa/Generated/Routes.elm index 30df4dc..9446c53 100644 --- a/examples/complex/elm-stuff/.elm-spa/Generated/Routes.elm +++ b/examples/complex/elm-stuff/.elm-spa/Generated/Routes.elm @@ -5,12 +5,12 @@ module Generated.Routes exposing , toPath ) +import Generated.Route import Generated.Docs.Route +import Generated.Guide.Route +import Generated.Guide.Dynamic.Route import Generated.Guide.Dynamic.Dynamic.Route import Generated.Guide.Dynamic.Faq.Route -import Generated.Guide.Dynamic.Route -import Generated.Guide.Route -import Generated.Route import Url.Parser as Parser exposing ((), Parser, map, s, string, top) @@ -34,18 +34,18 @@ toPath = type alias Routes = { top : Route , docs : Route - , guide : Route - , notFound : Route , signIn : Route + , notFound : Route + , guide : Route , guide_elm : Route - , guide_elmSpa : Route , guide_programming : Route - , guide_dynamic_intro : String -> Route + , docs_static : Route + , guide_elmSpa : Route + , docs_dynamic : String -> Route , guide_dynamic_other : String -> Route + , guide_dynamic_intro : String -> Route , guide_dynamic_faq_top : String -> Route , guide_dynamic_dynamic_top : String -> String -> Route - , docs_static : Route - , docs_dynamic : String -> Route } @@ -55,31 +55,38 @@ routes = Generated.Route.Top {} , docs = Generated.Route.Docs {} - , guide = - Generated.Route.Guide {} - , notFound = - Generated.Route.NotFound {} , signIn = Generated.Route.SignIn {} + , notFound = + Generated.Route.NotFound {} + , guide = + Generated.Route.Guide {} , guide_elm = Generated.Route.Guide_Folder <| Generated.Guide.Route.Elm {} - , guide_elmSpa = - Generated.Route.Guide_Folder <| - Generated.Guide.Route.ElmSpa {} , guide_programming = Generated.Route.Guide_Folder <| Generated.Guide.Route.Programming {} - , guide_dynamic_intro = + , docs_static = + Generated.Route.Docs_Folder <| + Generated.Docs.Route.Static {} + , guide_elmSpa = + Generated.Route.Guide_Folder <| + Generated.Guide.Route.ElmSpa {} + , docs_dynamic = \param1 -> - Generated.Route.Guide_Folder <| - Generated.Guide.Route.Dynamic_Folder param1 <| - Generated.Guide.Dynamic.Route.Intro { param1 = param1 } + Generated.Route.Docs_Folder <| + Generated.Docs.Route.Dynamic param1 { param1 = param1 } , guide_dynamic_other = \param1 -> Generated.Route.Guide_Folder <| Generated.Guide.Route.Dynamic_Folder param1 <| Generated.Guide.Dynamic.Route.Other { param1 = param1 } + , guide_dynamic_intro = + \param1 -> + Generated.Route.Guide_Folder <| + Generated.Guide.Route.Dynamic_Folder param1 <| + Generated.Guide.Dynamic.Route.Intro { param1 = param1 } , guide_dynamic_faq_top = \param1 -> Generated.Route.Guide_Folder <| @@ -92,44 +99,37 @@ routes = Generated.Guide.Route.Dynamic_Folder param1 <| Generated.Guide.Dynamic.Route.Dynamic_Folder param2 <| Generated.Guide.Dynamic.Dynamic.Route.Top { param1 = param1, param2 = param2 } - , docs_static = - Generated.Route.Docs_Folder <| - Generated.Docs.Route.Static {} - , docs_dynamic = - \param1 -> - Generated.Route.Docs_Folder <| - Generated.Docs.Route.Dynamic param1 { param1 = param1 } } - + parsers : List (Parser (Route -> a) a) parsers = [ map routes.top - top + (top) , map routes.docs (s "docs") - , map routes.guide - (s "guide") - , map routes.notFound - (s "not-found") , map routes.signIn (s "sign-in") + , map routes.notFound + (s "not-found") + , map routes.guide + (s "guide") , map routes.guide_elm (s "guide" s "elm") - , map routes.guide_elmSpa - (s "guide" s "elm-spa") , map routes.guide_programming (s "guide" s "programming") - , map routes.guide_dynamic_intro - (s "guide" string s "intro") + , map routes.docs_static + (s "docs" s "static") + , map routes.guide_elmSpa + (s "guide" s "elm-spa") + , map routes.docs_dynamic + (s "docs" string) , map routes.guide_dynamic_other (s "guide" string s "other") + , map routes.guide_dynamic_intro + (s "guide" string s "intro") , map routes.guide_dynamic_faq_top (s "guide" string s "faq" top) , map routes.guide_dynamic_dynamic_top (s "guide" string string top) - , map routes.docs_static - (s "docs" s "static") - , map routes.docs_dynamic - (s "docs" string) - ] + ] \ No newline at end of file diff --git a/examples/complex/elm.json b/examples/complex/elm.json index 97ed1ab..9442704 100644 --- a/examples/complex/elm.json +++ b/examples/complex/elm.json @@ -3,7 +3,7 @@ "source-directories": [ "src", "../../src", - "elm-stuff/.elm-spa" + "elm-stuff/.generated" ], "elm-version": "0.19.1", "dependencies": { diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..35c0d15 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "elm-spa", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/package.json b/package.json index ffb7023..fa2d622 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "1.0.0", "description": "", "main": "cli/src/index.js", + "bin": "./cli/src/index.js", "scripts": { "start": "npm run dev", "build": "(cd cli && npm run build)",