arcanajs 2.6.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +7 -22
  2. package/bin/arcanajs.js +1 -1
  3. package/dist/arcanajs.client.js +2 -0
  4. package/dist/arcanajs.client.js.map +1 -0
  5. package/dist/arcanajs.js +2 -0
  6. package/dist/arcanajs.js.map +1 -0
  7. package/dist/cli/index.js +2 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/{framework → dist}/lib/client/index.d.ts +6 -26
  10. package/{framework → dist}/lib/global.d.ts +6 -10
  11. package/dist/lib/index.client.d.ts +11 -0
  12. package/dist/lib/index.d.ts +38 -0
  13. package/{framework → dist}/lib/server/ArcanaJSServer.d.ts +4 -4
  14. package/dist/lib/server/DefaultTemplate.d.ts +1 -0
  15. package/{framework → dist}/lib/shared/components/Body.d.ts +2 -2
  16. package/{framework → dist}/lib/shared/components/Head.d.ts +2 -1
  17. package/{framework → dist}/lib/shared/components/Link.d.ts +2 -2
  18. package/{framework → dist}/lib/shared/components/NavLink.d.ts +2 -2
  19. package/{framework → dist}/lib/shared/components/Page.d.ts +2 -1
  20. package/{framework → dist}/lib/shared/hooks/useLocation.d.ts +2 -1
  21. package/dist/lib/shared/hooks/usePage.d.ts +2 -0
  22. package/dist/lib/shared/hooks/useParams.d.ts +2 -0
  23. package/dist/lib/shared/hooks/useQuery.d.ts +2 -0
  24. package/dist/lib/shared/hooks/useRouter.d.ts +2 -0
  25. package/package.json +26 -23
  26. package/framework/cli/index.js +0 -204
  27. package/framework/cli/templates.d.ts +0 -6
  28. package/framework/cli/templates.js +0 -62
  29. package/framework/cli/webpack.config.js +0 -310
  30. package/framework/lib/client/index.js +0 -97
  31. package/framework/lib/config/index.d.ts +0 -46
  32. package/framework/lib/config/index.js +0 -115
  33. package/framework/lib/index.d.ts +0 -19
  34. package/framework/lib/index.js +0 -59
  35. package/framework/lib/server/ArcanaJSMiddleware.js +0 -114
  36. package/framework/lib/server/ArcanaJSServer.js +0 -441
  37. package/framework/lib/server/ControllerBinder.js +0 -32
  38. package/framework/lib/server/CsrfMiddleware.js +0 -34
  39. package/framework/lib/server/DynamicRouter.js +0 -50
  40. package/framework/lib/server/ResponseHandlerMiddleware.js +0 -30
  41. package/framework/lib/server/Router.js +0 -203
  42. package/framework/lib/server/default-index.html +0 -12
  43. package/framework/lib/server.d.ts +0 -33
  44. package/framework/lib/server.js +0 -69
  45. package/framework/lib/shared/components/Body.js +0 -8
  46. package/framework/lib/shared/components/Head.js +0 -125
  47. package/framework/lib/shared/components/Link.js +0 -30
  48. package/framework/lib/shared/components/NavLink.js +0 -13
  49. package/framework/lib/shared/components/Page.js +0 -10
  50. package/framework/lib/shared/context/HeadContext.js +0 -5
  51. package/framework/lib/shared/context/PageContext.js +0 -6
  52. package/framework/lib/shared/context/RouterContext.js +0 -10
  53. package/framework/lib/shared/core/ArcanaJSApp.js +0 -194
  54. package/framework/lib/shared/hooks/useHead.js +0 -7
  55. package/framework/lib/shared/hooks/useLocation.js +0 -13
  56. package/framework/lib/shared/hooks/usePage.d.ts +0 -1
  57. package/framework/lib/shared/hooks/usePage.js +0 -7
  58. package/framework/lib/shared/hooks/useParams.d.ts +0 -1
  59. package/framework/lib/shared/hooks/useParams.js +0 -13
  60. package/framework/lib/shared/hooks/useQuery.d.ts +0 -1
  61. package/framework/lib/shared/hooks/useQuery.js +0 -9
  62. package/framework/lib/shared/hooks/useRouter.d.ts +0 -1
  63. package/framework/lib/shared/hooks/useRouter.js +0 -13
  64. package/framework/lib/shared/utils/createSingletonContext.js +0 -21
  65. package/framework/lib/shared/views/ErrorPage.js +0 -12
  66. package/framework/lib/shared/views/NotFoundPage.js +0 -11
  67. package/framework/lib/types.d.ts +0 -174
  68. package/framework/lib/types.js +0 -8
  69. package/framework/templates/arcanajs.config.ts +0 -44
  70. package/framework/templates/package.json +0 -15
  71. package/framework/templates/postcss.config.js +0 -6
  72. package/framework/templates/public/arcanajs.png +0 -0
  73. package/framework/templates/public/arcanajs.svg +0 -12
  74. package/framework/templates/public/favicon.ico +0 -0
  75. package/framework/templates/src/arcanajs.d.ts +0 -8
  76. package/framework/templates/src/client/globals.css +0 -199
  77. package/framework/templates/src/client/index.tsx +0 -7
  78. package/framework/templates/src/db/mongo.ts +0 -10
  79. package/framework/templates/src/db/mongoose.ts +0 -12
  80. package/framework/templates/src/db/mysql.ts +0 -15
  81. package/framework/templates/src/db/postgres.ts +0 -8
  82. package/framework/templates/src/server/controllers/HomeController.ts +0 -19
  83. package/framework/templates/src/server/controllers/UsersController.ts +0 -37
  84. package/framework/templates/src/server/index.ts +0 -38
  85. package/framework/templates/src/server/routes/api.ts +0 -6
  86. package/framework/templates/src/server/routes/web.ts +0 -7
  87. package/framework/templates/src/types/HomePageData.ts +0 -11
  88. package/framework/templates/src/views/ErrorPage.tsx +0 -136
  89. package/framework/templates/src/views/HomePage.tsx +0 -369
  90. package/framework/templates/src/views/NotFoundPage.tsx +0 -108
  91. package/framework/templates/tsconfig.json +0 -27
  92. /package/{framework → dist}/cli/index.d.ts +0 -0
  93. /package/{framework → dist}/cli/webpack.config.d.ts +0 -0
  94. /package/{framework → dist}/lib/server/ArcanaJSMiddleware.d.ts +0 -0
  95. /package/{framework → dist}/lib/server/ControllerBinder.d.ts +0 -0
  96. /package/{framework → dist}/lib/server/CsrfMiddleware.d.ts +0 -0
  97. /package/{framework → dist}/lib/server/DynamicRouter.d.ts +0 -0
  98. /package/{framework → dist}/lib/server/ResponseHandlerMiddleware.d.ts +0 -0
  99. /package/{framework → dist}/lib/server/Router.d.ts +0 -0
  100. /package/{framework → dist}/lib/shared/context/HeadContext.d.ts +0 -0
  101. /package/{framework → dist}/lib/shared/context/PageContext.d.ts +0 -0
  102. /package/{framework → dist}/lib/shared/context/RouterContext.d.ts +0 -0
  103. /package/{framework → dist}/lib/shared/core/ArcanaJSApp.d.ts +0 -0
  104. /package/{framework → dist}/lib/shared/hooks/useHead.d.ts +0 -0
  105. /package/{framework → dist}/lib/shared/utils/createSingletonContext.d.ts +0 -0
  106. /package/{framework → dist}/lib/shared/views/ErrorPage.d.ts +0 -0
  107. /package/{framework → dist}/lib/shared/views/NotFoundPage.d.ts +0 -0
@@ -0,0 +1,2 @@
1
+ (()=>{"use strict";var e={n:s=>{var o=s&&s.__esModule?()=>s.default:()=>s;return e.d(o,{a:o}),o},d:(s,o)=>{for(var r in o)e.o(o,r)&&!e.o(s,r)&&Object.defineProperty(s,r,{enumerable:!0,get:o[r]})},o:(e,s)=>Object.prototype.hasOwnProperty.call(e,s)},s={};const o=require("child_process"),r=require("path");var t=e.n(r);const n=require("webpack");var l=e.n(n);const i=require("clean-webpack-plugin"),a=require("html-webpack-plugin");var c=e.n(a);const d=require("mini-css-extract-plugin");var u=e.n(d);const p=require("webpack-node-externals");var m=e.n(p);const v=require("fs");var x=e.n(v);const g=process.cwd(),h=e=>require.resolve(e),b=e=>{const s=[".ts",".tsx",".js",".jsx"];for(const o of e)for(const e of s){const s=t().resolve(g,o+e);if(x().existsSync(s))return s;const r=t().resolve(g,o,"index"+e);if(x().existsSync(r))return r}const o=t().resolve(g,"src/example/client/index.tsx"),r=t().resolve(g,"src/example/server/index.ts");if(e.some(e=>e.includes("client"))&&x().existsSync(o))return o;if(e.some(e=>e.includes("server"))&&x().existsSync(r))return r;throw new Error(`Could not find entry point. Searched in: ${e.join(", ")}`)},f=()=>{const e=t().resolve(g,"src/views"),s=x().existsSync(e),o=t().resolve(__dirname,"../../node_modules/.cache/arcanajs/views-loader.js"),r=t().dirname(o);x().existsSync(r)||x().mkdirSync(r,{recursive:!0});const n=s?`module.exports = require.context('${e}', true, /\\.(tsx|jsx)$/);`:"module.exports = null;";return x().writeFileSync(o,n),o},y=()=>{const e="production"===process.env.NODE_ENV,s=f();return{mode:e?"production":"development",target:"web",entry:{client:b(["src/client","src/client/index","src/index","src/main"])},output:{path:t().resolve(g,"dist/public"),filename:e?"[name].[contenthash].bundle.js":"[name].bundle.js",publicPath:"/",assetModuleFilename:"assets/[hash][ext][query]"},resolve:{extensions:[".ts",".tsx",".js",".jsx"],alias:{"arcana-views":s}},resolveLoader:{modules:["node_modules",t().resolve(__dirname,"../../node_modules")]},module:{rules:[{test:/\.(ts|tsx|js|jsx)$/,exclude:/node_modules/,use:{loader:h("babel-loader"),options:{presets:[h("@babel/preset-env"),[h("@babel/preset-react"),{runtime:"automatic"}],h("@babel/preset-typescript")]}}},{test:/\.module\.css$/,use:[e?u().loader:h("style-loader"),{loader:h("css-loader"),options:{importLoaders:1,modules:{localIdentName:e?"[hash:base64:8]":"[path][name]__[local]--[hash:base64:5]",exportLocalsConvention:"camelCaseOnly"}}},{loader:h("postcss-loader"),options:{postcssOptions:{config:t().resolve(g,"postcss.config.js")}}}]},{test:/\.css$/,exclude:/\.module\.css$/,use:[e?u().loader:h("style-loader"),{loader:h("css-loader"),options:{importLoaders:1}},{loader:h("postcss-loader"),options:{postcssOptions:{config:t().resolve(g,"postcss.config.js")}}}]},{test:/\.(png|jpg|jpeg|gif|svg|woff|woff2|eot|ttf|otf)$/i,type:"asset/resource"}]},plugins:[new i.CleanWebpackPlugin,new(c())({templateContent:'<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n \x3c!--HEAD_CONTENT--\x3e\n </head>\n <body>\n <div id="root">\x3c!--APP_CONTENT--\x3e</div>\n \x3c!--ARCANAJS_DATA_SCRIPT--\x3e\n </body>\n</html>',filename:"index.html",inject:"body",minify:!!e&&{removeComments:!1,collapseWhitespace:!0,removeRedundantAttributes:!0,useShortDoctype:!0,removeEmptyAttributes:!0,removeStyleLinkTypeAttributes:!0,keepClosingSlash:!0,minifyJS:!0,minifyCSS:!0,minifyURLs:!0}}),new(u())({filename:e?"[name].[contenthash].css":"[name].css"})],optimization:{splitChunks:{chunks:"all",cacheGroups:{defaultVendors:{test:/[\\/]node_modules[\\/]/,priority:-10,reuseExistingChunk:!0},default:{minChunks:2,priority:-20,reuseExistingChunk:!0},react:{test:/[\\/]node_modules[\\/](react|react-dom|scheduler)[\\/]/,name:"react-vendor",chunks:"all",priority:10}}}},performance:{maxEntrypointSize:512e3,maxAssetSize:512e3,hints:!!e&&"warning"},devtool:e?"source-map":"eval-source-map"}},w=()=>{const e="production"===process.env.NODE_ENV,s=b(["src/server","src/server/index","src/server/main"]),o=f();return{mode:e?"production":"development",target:"node",entry:s,output:{path:t().resolve(g,"dist"),filename:"server.js"},externals:[m()({allowlist:[/^arcanajs/]})],resolve:{extensions:[".ts",".tsx",".js",".jsx"],alias:{"arcana-views":o}},resolveLoader:{modules:["node_modules",t().resolve(__dirname,"../../node_modules")]},module:{rules:[{test:/\.(ts|tsx|js|jsx)$/,exclude:/node_modules/,use:{loader:h("babel-loader"),options:{presets:[h("@babel/preset-env"),[h("@babel/preset-react"),{runtime:"automatic"}],h("@babel/preset-typescript")]}}},{test:/\.module\.css$/,use:{loader:h("css-loader"),options:{modules:{localIdentName:e?"[hash:base64:8]":"[path][name]__[local]--[hash:base64:5]",exportLocalsConvention:"camelCaseOnly",exportOnlyLocals:!0}}}},{test:/\.css$/,exclude:/\.module\.css$/,use:h("null-loader")},{test:/\.(png|jpg|jpeg|gif|svg|woff|woff2|eot|ttf|otf)$/i,type:"asset/resource",generator:{emit:!1}}]},devtool:e?"source-map":"eval-source-map"}},_=require("ws"),S=process.argv.slice(2)[0];S||(console.error("Please specify a command: init, dev, build, start"),process.exit(1));const j=e=>new Promise((s,o)=>{e.run((e,r)=>e?(console.error(e),o(e)):r&&r.hasErrors()?(console.error(r.toString({colors:!0})),o(new Error("Webpack build failed"))):(console.log(null==r?void 0:r.toString({colors:!0})),void s()))});let E=null;const k=(e,s)=>{e.watch({},(e,o)=>{e?console.error(e):(console.log(null==o?void 0:o.toString({colors:!0})),o&&!o.hasErrors()&&s&&s())})};switch(S){case"build":(async()=>{process.env.NODE_ENV="production",console.log("Building for production...");const e=y(),s=w();try{await j(l()(e)),await j(l()(s)),console.log("Build complete.")}catch(e){console.error("Build failed:",e),process.exit(1)}})();break;case"dev":(async()=>{process.env.NODE_ENV="development",console.log("Starting development server...");const e=new _.WebSocketServer({port:3001});console.log("HMR Server running on port 3001");const s=()=>{e.clients.forEach(e=>{1===e.readyState&&e.send(JSON.stringify({type:"reload"}))})},r=y(),n=w();let i=!1,a=!1;const c=l()(n);c.hooks.invalid.tap("ArcanaJS",()=>{i=!0}),k(l()(r),()=>{console.log("Client build complete."),i?(console.log("Server is building. Waiting to reload..."),a=!0):(console.log("Reloading browsers..."),s())}),k(c,async()=>{var e;console.log("Server build complete. Restarting server..."),await(e=3001,new Promise(s=>{var r;E&&E.kill();const n=t().resolve(process.cwd(),"dist/server.js");E=(0,o.spawn)("node",[n],{stdio:["inherit","pipe","inherit"],env:{...process.env,ARCANA_HMR_PORT:e.toString()}}),null===(r=E.stdout)||void 0===r||r.on("data",e=>{process.stdout.write(e),e.toString().includes("Server is running")&&s()}),E.on("close",e=>{0!==e&&null!==e&&console.error(`Dev server exited with code ${e}`)})})),i=!1,a&&(console.log("Pending reload found. Reloading browsers..."),s(),a=!1)})})();break;case"start":(()=>{process.env.NODE_ENV="production";const e=t().resolve(process.cwd(),"dist/server.js");console.log(`Starting server at ${e}...`),(0,o.spawn)("node",[e],{stdio:"inherit"}).on("close",e=>{process.exit(e||0)})})();break;default:console.error(`Unknown command: ${S}`),process.exit(1)}var C=exports;for(var N in s)C[N]=s[N];s.__esModule&&Object.defineProperty(C,"__esModule",{value:!0})})();
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli/index.js","mappings":"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","sources":["webpack://arcanajs/webpack/bootstrap","webpack://arcanajs/webpack/runtime/compat get default export","webpack://arcanajs/webpack/runtime/define property getters","webpack://arcanajs/webpack/runtime/hasOwnProperty shorthand","webpack://arcanajs/external node-commonjs \"child_process\"","webpack://arcanajs/external node-commonjs \"path\"","webpack://arcanajs/external commonjs \"webpack\"","webpack://arcanajs/external commonjs \"clean-webpack-plugin\"","webpack://arcanajs/external commonjs \"html-webpack-plugin\"","webpack://arcanajs/external commonjs \"mini-css-extract-plugin\"","webpack://arcanajs/external commonjs \"webpack-node-externals\"","webpack://arcanajs/external node-commonjs \"fs\"","webpack://arcanajs/./src/cli/webpack.config.ts","webpack://arcanajs/external commonjs \"ws\"","webpack://arcanajs/./src/cli/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"child_process\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"path\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"webpack\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"clean-webpack-plugin\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"html-webpack-plugin\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"mini-css-extract-plugin\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"webpack-node-externals\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"fs\");","import { CleanWebpackPlugin } from \"clean-webpack-plugin\";\nimport HtmlWebpackPlugin from \"html-webpack-plugin\";\nimport MiniCssExtractPlugin from \"mini-css-extract-plugin\";\nimport path from \"path\";\nimport webpack from \"webpack\";\nimport nodeExternals from \"webpack-node-externals\";\n\nconst cwd = process.cwd();\n\n// Helper to resolve loaders from the framework's node_modules\nconst resolveLoader = (loader: string) =>\n __non_webpack_require__.resolve(loader);\n\nimport fs from \"fs\";\n\n// Helper to find entry file with supported extensions\nconst findEntry = (searchPaths: string[]): string => {\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\"];\n\n for (const basePath of searchPaths) {\n for (const ext of extensions) {\n const fullPath = path.resolve(cwd, basePath + ext);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n // Also check for index files in directories\n const indexPath = path.resolve(cwd, basePath, \"index\" + ext);\n if (fs.existsSync(indexPath)) {\n return indexPath;\n }\n }\n }\n\n // Fallback to example if not found (for internal framework dev) or throw error\n // For now, we'll try the example paths as a last resort before failing\n const exampleClient = path.resolve(cwd, \"src/example/client/index.tsx\");\n const exampleServer = path.resolve(cwd, \"src/example/server/index.ts\");\n\n if (\n searchPaths.some((p) => p.includes(\"client\")) &&\n fs.existsSync(exampleClient)\n )\n return exampleClient;\n if (\n searchPaths.some((p) => p.includes(\"server\")) &&\n fs.existsSync(exampleServer)\n )\n return exampleServer;\n\n throw new Error(\n `Could not find entry point. Searched in: ${searchPaths.join(\", \")}`\n );\n};\n\nconst getViewsLoaderPath = () => {\n const viewsDir = path.resolve(cwd, \"src/views\");\n const hasViews = fs.existsSync(viewsDir);\n const viewsLoaderPath = path.resolve(\n __dirname,\n \"../../node_modules/.cache/arcanajs/views-loader.js\"\n );\n\n // Ensure cache directory exists\n const cacheDir = path.dirname(viewsLoaderPath);\n if (!fs.existsSync(cacheDir)) {\n fs.mkdirSync(cacheDir, { recursive: true });\n }\n\n // Generate the loader file\n const loaderContent = hasViews\n ? `module.exports = require.context('${viewsDir}', true, /\\\\.(tsx|jsx)$/);`\n : `module.exports = null;`;\n\n fs.writeFileSync(viewsLoaderPath, loaderContent);\n return viewsLoaderPath;\n};\n\nexport const createClientConfig = (): webpack.Configuration => {\n const isProduction = process.env.NODE_ENV === \"production\";\n const viewsLoaderPath = getViewsLoaderPath();\n const clientEntry = findEntry([\n \"src/client\",\n \"src/client/index\",\n \"src/index\",\n \"src/main\",\n ]);\n\n return {\n mode: isProduction ? \"production\" : \"development\",\n target: \"web\",\n entry: {\n client: clientEntry,\n },\n output: {\n path: path.resolve(cwd, \"dist/public\"),\n filename: isProduction\n ? \"[name].[contenthash].bundle.js\"\n : \"[name].bundle.js\",\n publicPath: \"/\",\n assetModuleFilename: \"assets/[hash][ext][query]\",\n },\n resolve: {\n extensions: [\".ts\", \".tsx\", \".js\", \".jsx\"],\n alias: {\n \"arcana-views\": viewsLoaderPath,\n },\n },\n resolveLoader: {\n modules: [\"node_modules\", path.resolve(__dirname, \"../../node_modules\")],\n },\n module: {\n rules: [\n {\n test: /\\.(ts|tsx|js|jsx)$/,\n exclude: /node_modules/,\n use: {\n loader: resolveLoader(\"babel-loader\"),\n options: {\n presets: [\n resolveLoader(\"@babel/preset-env\"),\n [\n resolveLoader(\"@babel/preset-react\"),\n { runtime: \"automatic\" },\n ],\n resolveLoader(\"@babel/preset-typescript\"),\n ],\n },\n },\n },\n // CSS Modules rule for .module.css files\n {\n test: /\\.module\\.css$/,\n use: [\n isProduction\n ? MiniCssExtractPlugin.loader\n : resolveLoader(\"style-loader\"),\n {\n loader: resolveLoader(\"css-loader\"),\n options: {\n importLoaders: 1,\n modules: {\n localIdentName: isProduction\n ? \"[hash:base64:8]\"\n : \"[path][name]__[local]--[hash:base64:5]\",\n exportLocalsConvention: \"camelCaseOnly\",\n },\n },\n },\n {\n loader: resolveLoader(\"postcss-loader\"),\n options: {\n postcssOptions: {\n config: path.resolve(cwd, \"postcss.config.js\"),\n },\n },\n },\n ],\n },\n // Global CSS rule for regular .css files\n {\n test: /\\.css$/,\n exclude: /\\.module\\.css$/,\n use: [\n isProduction\n ? MiniCssExtractPlugin.loader\n : resolveLoader(\"style-loader\"),\n {\n loader: resolveLoader(\"css-loader\"),\n options: {\n importLoaders: 1,\n },\n },\n {\n loader: resolveLoader(\"postcss-loader\"),\n options: {\n postcssOptions: {\n config: path.resolve(cwd, \"postcss.config.js\"),\n },\n },\n },\n ],\n },\n {\n test: /\\.(png|jpg|jpeg|gif|svg|woff|woff2|eot|ttf|otf)$/i,\n type: \"asset/resource\",\n },\n ],\n },\n plugins: [\n new CleanWebpackPlugin(),\n new HtmlWebpackPlugin({\n templateContent: `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--HEAD_CONTENT-->\n </head>\n <body>\n <div id=\"root\"><!--APP_CONTENT--></div>\n <!--ARCANAJS_DATA_SCRIPT-->\n </body>\n</html>`,\n filename: \"index.html\",\n inject: \"body\",\n minify: isProduction\n ? {\n removeComments: false,\n collapseWhitespace: true,\n removeRedundantAttributes: true,\n useShortDoctype: true,\n removeEmptyAttributes: true,\n removeStyleLinkTypeAttributes: true,\n keepClosingSlash: true,\n minifyJS: true,\n minifyCSS: true,\n minifyURLs: true,\n }\n : false,\n }),\n new MiniCssExtractPlugin({\n filename: isProduction ? \"[name].[contenthash].css\" : \"[name].css\",\n }),\n ],\n optimization: {\n splitChunks: {\n chunks: \"all\",\n cacheGroups: {\n defaultVendors: {\n test: /[\\\\/]node_modules[\\\\/]/,\n priority: -10,\n reuseExistingChunk: true,\n },\n default: {\n minChunks: 2,\n priority: -20,\n reuseExistingChunk: true,\n },\n react: {\n test: /[\\\\/]node_modules[\\\\/](react|react-dom|scheduler)[\\\\/]/,\n name: \"react-vendor\",\n chunks: \"all\",\n priority: 10,\n },\n },\n },\n },\n performance: {\n maxEntrypointSize: 512000,\n maxAssetSize: 512000,\n hints: isProduction ? \"warning\" : false,\n },\n devtool: isProduction ? \"source-map\" : \"eval-source-map\",\n };\n};\n\nexport const createServerConfig = (): webpack.Configuration => {\n const isProduction = process.env.NODE_ENV === \"production\";\n const serverEntry = findEntry([\n \"src/server\",\n \"src/server/index\",\n \"src/server/main\",\n ]);\n\n const viewsLoaderPath = getViewsLoaderPath();\n\n return {\n mode: isProduction ? \"production\" : \"development\",\n target: \"node\",\n entry: serverEntry,\n output: {\n path: path.resolve(cwd, \"dist\"),\n filename: \"server.js\",\n },\n externals: [\n nodeExternals({\n allowlist: [/^arcanajs/],\n }),\n ],\n resolve: {\n extensions: [\".ts\", \".tsx\", \".js\", \".jsx\"],\n alias: {\n \"arcana-views\": viewsLoaderPath,\n },\n },\n resolveLoader: {\n modules: [\"node_modules\", path.resolve(__dirname, \"../../node_modules\")],\n },\n module: {\n rules: [\n {\n test: /\\.(ts|tsx|js|jsx)$/,\n exclude: /node_modules/,\n use: {\n loader: resolveLoader(\"babel-loader\"),\n options: {\n presets: [\n resolveLoader(\"@babel/preset-env\"),\n [\n resolveLoader(\"@babel/preset-react\"),\n { runtime: \"automatic\" },\n ],\n resolveLoader(\"@babel/preset-typescript\"),\n ],\n },\n },\n },\n // CSS Modules rule for .module.css files on server (for SSR)\n {\n test: /\\.module\\.css$/,\n use: {\n loader: resolveLoader(\"css-loader\"),\n options: {\n modules: {\n localIdentName: isProduction\n ? \"[hash:base64:8]\"\n : \"[path][name]__[local]--[hash:base64:5]\",\n exportLocalsConvention: \"camelCaseOnly\",\n exportOnlyLocals: true, // Only export class names, not CSS\n },\n },\n },\n },\n // Regular CSS files - ignore on server side\n {\n test: /\\.css$/,\n exclude: /\\.module\\.css$/,\n use: resolveLoader(\"null-loader\"),\n },\n {\n test: /\\.(png|jpg|jpeg|gif|svg|woff|woff2|eot|ttf|otf)$/i,\n type: \"asset/resource\",\n generator: {\n emit: false,\n },\n },\n ],\n },\n devtool: isProduction ? \"source-map\" : \"eval-source-map\",\n };\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"ws\");","import { spawn } from \"child_process\";\nimport path from \"path\";\nimport webpack from \"webpack\";\nimport { createClientConfig, createServerConfig } from \"./webpack.config\";\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nif (!command) {\n console.error(\"Please specify a command: init, dev, build, start\");\n process.exit(1);\n}\n\nconst runCompiler = (compiler: webpack.Compiler) => {\n return new Promise<void>((resolve, reject) => {\n compiler.run((err, stats) => {\n if (err) {\n console.error(err);\n return reject(err);\n }\n if (stats && stats.hasErrors()) {\n console.error(stats.toString({ colors: true }));\n return reject(new Error(\"Webpack build failed\"));\n }\n console.log(stats?.toString({ colors: true }));\n resolve();\n });\n });\n};\n\nlet serverProcess: ReturnType<typeof spawn> | null = null;\n\nimport { WebSocketServer } from \"ws\";\n\nconst startDevServer = (hmrPort: number): Promise<void> => {\n return new Promise((resolve) => {\n if (serverProcess) {\n serverProcess.kill();\n }\n\n const serverPath = path.resolve(process.cwd(), \"dist/server.js\");\n serverProcess = spawn(\"node\", [serverPath], {\n stdio: [\"inherit\", \"pipe\", \"inherit\"],\n env: { ...process.env, ARCANA_HMR_PORT: hmrPort.toString() },\n });\n\n serverProcess.stdout?.on(\"data\", (data) => {\n process.stdout.write(data);\n if (data.toString().includes(\"Server is running\")) {\n resolve();\n }\n });\n\n serverProcess.on(\"close\", (code) => {\n if (code !== 0 && code !== null) {\n console.error(`Dev server exited with code ${code}`);\n }\n });\n });\n};\n\nconst watchCompiler = (\n compiler: webpack.Compiler,\n onBuildComplete?: () => void\n) => {\n compiler.watch({}, (err, stats) => {\n if (err) {\n console.error(err);\n return;\n }\n console.log(stats?.toString({ colors: true }));\n\n if (stats && !stats.hasErrors() && onBuildComplete) {\n onBuildComplete();\n }\n });\n};\n\nconst build = async () => {\n process.env.NODE_ENV = \"production\";\n console.log(\"Building for production...\");\n\n const clientConfig = createClientConfig();\n const serverConfig = createServerConfig();\n\n try {\n await runCompiler(webpack(clientConfig));\n await runCompiler(webpack(serverConfig));\n console.log(\"Build complete.\");\n } catch (error) {\n console.error(\"Build failed:\", error);\n process.exit(1);\n }\n};\n\nconst dev = async () => {\n process.env.NODE_ENV = \"development\";\n console.log(\"Starting development server...\");\n\n // Start HMR WebSocket Server\n const HMR_PORT = 3001;\n const wss = new WebSocketServer({ port: HMR_PORT });\n console.log(`HMR Server running on port ${HMR_PORT}`);\n\n const broadcastReload = () => {\n wss.clients.forEach((client) => {\n if (client.readyState === 1) {\n client.send(JSON.stringify({ type: \"reload\" }));\n }\n });\n };\n\n const clientConfig = createClientConfig();\n const serverConfig = createServerConfig();\n\n let isServerBuilding = false;\n let pendingReload = false;\n\n const serverCompiler = webpack(serverConfig);\n serverCompiler.hooks.invalid.tap(\"ArcanaJS\", () => {\n isServerBuilding = true;\n });\n\n // Watch client\n watchCompiler(webpack(clientConfig), () => {\n console.log(\"Client build complete.\");\n if (isServerBuilding) {\n console.log(\"Server is building. Waiting to reload...\");\n pendingReload = true;\n } else {\n console.log(\"Reloading browsers...\");\n broadcastReload();\n }\n });\n\n // Watch server and restart on build\n watchCompiler(serverCompiler, async () => {\n console.log(\"Server build complete. Restarting server...\");\n await startDevServer(HMR_PORT);\n isServerBuilding = false;\n if (pendingReload) {\n console.log(\"Pending reload found. Reloading browsers...\");\n broadcastReload();\n pendingReload = false;\n }\n });\n};\n\nconst start = () => {\n process.env.NODE_ENV = \"production\";\n const serverPath = path.resolve(process.cwd(), \"dist/server.js\");\n console.log(`Starting server at ${serverPath}...`);\n\n const child = spawn(\"node\", [serverPath], { stdio: \"inherit\" });\n\n child.on(\"close\", (code) => {\n process.exit(code || 0);\n });\n};\n\nswitch (command) {\n case \"build\":\n build();\n break;\n case \"dev\":\n dev();\n break;\n case \"start\":\n start();\n break;\n default:\n console.error(`Unknown command: ${command}`);\n process.exit(1);\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","require","cwd","process","resolveLoader","loader","__non_webpack_require__","resolve","findEntry","searchPaths","extensions","basePath","ext","fullPath","path","fs","indexPath","exampleClient","exampleServer","some","p","includes","Error","join","getViewsLoaderPath","viewsDir","hasViews","viewsLoaderPath","__dirname","cacheDir","recursive","loaderContent","createClientConfig","isProduction","env","NODE_ENV","mode","target","entry","client","output","filename","publicPath","assetModuleFilename","alias","modules","rules","test","exclude","use","options","presets","runtime","MiniCssExtractPlugin","importLoaders","localIdentName","exportLocalsConvention","postcssOptions","config","type","plugins","CleanWebpackPlugin","HtmlWebpackPlugin","templateContent","inject","minify","removeComments","collapseWhitespace","removeRedundantAttributes","useShortDoctype","removeEmptyAttributes","removeStyleLinkTypeAttributes","keepClosingSlash","minifyJS","minifyCSS","minifyURLs","optimization","splitChunks","chunks","cacheGroups","defaultVendors","priority","reuseExistingChunk","default","minChunks","react","name","performance","maxEntrypointSize","maxAssetSize","hints","devtool","createServerConfig","serverEntry","externals","nodeExternals","allowlist","exportOnlyLocals","generator","emit","command","argv","slice","console","error","exit","runCompiler","compiler","Promise","reject","run","err","stats","hasErrors","toString","colors","log","serverProcess","watchCompiler","onBuildComplete","watch","async","clientConfig","serverConfig","webpack","build","wss","WebSocketServer","port","broadcastReload","clients","forEach","readyState","send","JSON","stringify","isServerBuilding","pendingReload","serverCompiler","hooks","invalid","tap","hmrPort","_serverProcess$stdout","kill","serverPath","spawn","stdio","ARCANA_HMR_PORT","stdout","on","data","write","code","dev","start"],"ignoreList":[],"sourceRoot":""}
@@ -1,9 +1,8 @@
1
1
  import React from "react";
2
- export type { LayoutComponent, ViewsRegistry } from "../types";
3
2
  /**
4
3
  * Navigation options for configuring ArcanaJS behavior
5
4
  */
6
- export interface NavigationOptions {
5
+ interface NavigationOptions {
7
6
  /**
8
7
  * Callback function called after each successful navigation
9
8
  * Useful for analytics, logging, or custom scroll behavior
@@ -22,32 +21,12 @@ export interface NavigationOptions {
22
21
  *
23
22
  * @example
24
23
  * ```typescript
25
- * // Using webpack require.context (recommended)
26
- * import { hydrateArcanaJS } from 'arcanajs/client';
27
- *
28
- * const views = require.context('./views', false, /\.tsx$/);
29
- * hydrateArcanaJS(views);
30
- * ```
31
- *
32
- * @example
33
- * ```typescript
34
- * // Using manual views registry
35
- * import { hydrateArcanaJS } from 'arcanajs/client';
36
- * import HomePage from './views/HomePage';
37
- * import AboutPage from './views/AboutPage';
38
- *
39
- * hydrateArcanaJS({
40
- * HomePage,
41
- * AboutPage,
42
- * });
43
- * ```
44
- *
45
- * @example
46
- * ```typescript
47
24
  * // With navigation options
48
25
  * import { hydrateArcanaJS } from 'arcanajs/client';
49
26
  *
50
- * const views = require.context('./views', false, /\.tsx$/);
27
+ * // @ts-ignore
28
+ * const views = require("arcana-views");
29
+ *
51
30
  * hydrateArcanaJS(views, undefined, {
52
31
  * onNavigate: (url) => {
53
32
  * // Track page views
@@ -56,4 +35,5 @@ export interface NavigationOptions {
56
35
  * });
57
36
  * ```
58
37
  */
59
- export declare const hydrateArcanaJS: (viewsOrContext: Record<string, React.FC<any>> | any, layout?: React.FC<any>, options?: NavigationOptions) => void;
38
+ declare const hydrateArcanaJS: (viewsOrContext: Record<string, React.FC<any>> | any, layout?: React.FC<any>, options?: NavigationOptions) => void;
39
+ export default hydrateArcanaJS;
@@ -1,19 +1,11 @@
1
1
  // ============================================================================
2
- // CSS Module Declarations
2
+ // Express Augmentation
3
3
  // ============================================================================
4
-
5
- // Global CSS files
6
- declare module "*.css";
7
-
8
- // CSS Modules
9
4
  declare module "*.module.css" {
10
5
  const classes: { readonly [key: string]: string };
11
6
  export default classes;
12
7
  }
13
-
14
- // ============================================================================
15
- // Express Augmentation
16
- // ============================================================================
8
+ declare module "*.css";
17
9
 
18
10
  declare global {
19
11
  var __non_webpack_require__: NodeJS.Require;
@@ -60,6 +52,10 @@ declare global {
60
52
  ): Response;
61
53
  }
62
54
  }
55
+
56
+ // ============================================================================
57
+ // CSS Module Declarations
58
+ // ============================================================================
63
59
  }
64
60
 
65
61
  export {};
@@ -0,0 +1,11 @@
1
+ export { default as Body } from "./shared/components/Body";
2
+ export { default as Head } from "./shared/components/Head";
3
+ export { default as Link } from "./shared/components/Link";
4
+ export { default as NavLink } from "./shared/components/NavLink";
5
+ export { default as Page } from "./shared/components/Page";
6
+ export { default as hydrateArcanaJS } from "./client/index";
7
+ export { default as useLocation } from "./shared/hooks/useLocation";
8
+ export { default as usePage } from "./shared/hooks/usePage";
9
+ export { default as useParams } from "./shared/hooks/useParams";
10
+ export { default as useQuery } from "./shared/hooks/useQuery";
11
+ export { default as useRouter } from "./shared/hooks/useRouter";
@@ -0,0 +1,38 @@
1
+ import { Express } from "express";
2
+ import ArcanaJSServer, { ArcanaJSConfig } from "./server/ArcanaJSServer";
3
+ export { default as Body } from "./shared/components/Body";
4
+ export { default as Head } from "./shared/components/Head";
5
+ export { default as Link } from "./shared/components/Link";
6
+ export { default as NavLink } from "./shared/components/NavLink";
7
+ export { default as Page } from "./shared/components/Page";
8
+ export { default as hydrateArcanaJS } from "./client/index";
9
+ export { default as useLocation } from "./shared/hooks/useLocation";
10
+ export { default as usePage } from "./shared/hooks/usePage";
11
+ export { default as useParams } from "./shared/hooks/useParams";
12
+ export { default as useQuery } from "./shared/hooks/useQuery";
13
+ export { default as useRouter } from "./shared/hooks/useRouter";
14
+ export { default as ArcanaJSServer } from "./server/ArcanaJSServer";
15
+ export { Express, NextFunction, Request, Response } from "express";
16
+ export { default as Route } from "./server/Router";
17
+ /**
18
+ * Create an ArcanaJS server with the given Express app
19
+ *
20
+ * @param app - Express application instance
21
+ * @param config - Optional ArcanaJS configuration
22
+ * @returns ArcanaJSServer instance
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import express from 'express';
27
+ * import { createArcanaServer } from 'arcanajs/server';
28
+ *
29
+ * const app = express();
30
+ * const server = createArcanaServer(app, {
31
+ * port: 3000,
32
+ * viewsDir: 'src/views',
33
+ * });
34
+ *
35
+ * server.start();
36
+ * ```
37
+ */
38
+ export declare function createArcanaServer(app: Express, config?: Partial<ArcanaJSConfig>): ArcanaJSServer;
@@ -1,14 +1,13 @@
1
1
  import { Express, RequestHandler } from "express";
2
2
  import React from "react";
3
- import { Router as ArcanaRouter } from "./Router";
4
3
  export interface ArcanaJSConfig<TDb = any> {
5
4
  port?: number | string;
6
5
  views?: Record<string, React.FC<any>>;
7
6
  viewsDir?: string;
8
7
  viewsContext?: any;
9
- routes?: RequestHandler | RequestHandler[] | ArcanaRouter | ArcanaRouter[];
8
+ routes?: RequestHandler | RequestHandler[];
10
9
  /** API routes can be provided separately from web routes */
11
- apiRoutes?: RequestHandler | RequestHandler[] | ArcanaRouter | ArcanaRouter[];
10
+ apiRoutes?: RequestHandler | RequestHandler[];
12
11
  /** Base path under which API routes will be mounted (default: '/api') */
13
12
  apiBase?: string;
14
13
  staticDir?: string;
@@ -31,7 +30,7 @@ declare global {
31
30
  }
32
31
  }
33
32
  }
34
- export declare class ArcanaJSServer<TDb = any> {
33
+ declare class ArcanaJSServer<TDb = any> {
35
34
  app: Express;
36
35
  private config;
37
36
  private serverInstance?;
@@ -53,3 +52,4 @@ export declare class ArcanaJSServer<TDb = any> {
53
52
  */
54
53
  stop(): Promise<void>;
55
54
  }
55
+ export default ArcanaJSServer;
@@ -0,0 +1 @@
1
+ export declare const defaultHtmlTemplate = "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <!--HEAD_CONTENT-->\n </head>\n <body>\n <div id=\"root\"><!--APP_CONTENT--></div>\n <!--ARCANAJS_DATA_SCRIPT-->\n </body>\n</html>";
@@ -2,5 +2,5 @@ import React from "react";
2
2
  interface BodyProps {
3
3
  children: React.ReactNode;
4
4
  }
5
- export declare const Body: React.FC<BodyProps>;
6
- export {};
5
+ declare const Body: React.FC<BodyProps>;
6
+ export default Body;
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
- export declare const Head: React.FC<{
2
+ declare const Head: React.FC<{
3
3
  children: React.ReactNode;
4
4
  }>;
5
+ export default Head;
@@ -3,5 +3,5 @@ interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
3
3
  href: string;
4
4
  prefetch?: boolean;
5
5
  }
6
- export declare const Link: React.FC<LinkProps>;
7
- export {};
6
+ declare const Link: React.FC<LinkProps>;
7
+ export default Link;
@@ -5,5 +5,5 @@ interface NavLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
5
5
  exact?: boolean;
6
6
  prefetch?: boolean;
7
7
  }
8
- export declare const NavLink: React.FC<NavLinkProps>;
9
- export {};
8
+ declare const NavLink: React.FC<NavLinkProps>;
9
+ export default NavLink;
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
- export declare const Page: <T>({ data, title, children, }: {
2
+ declare const Page: <T>({ data, title, children, }: {
3
3
  data?: T;
4
4
  title?: string;
5
5
  children: React.ReactNode;
6
6
  }) => import("react/jsx-runtime").JSX.Element;
7
+ export default Page;
@@ -1,5 +1,6 @@
1
- export declare const useLocation: () => {
1
+ declare const useLocation: () => {
2
2
  pathname: string;
3
3
  search: string;
4
4
  hash: string;
5
5
  };
6
+ export default useLocation;
@@ -0,0 +1,2 @@
1
+ declare const usePage: <T = any>() => T;
2
+ export default usePage;
@@ -0,0 +1,2 @@
1
+ declare const useParams: () => Record<string, string>;
2
+ export default useParams;
@@ -0,0 +1,2 @@
1
+ declare const useQuery: () => URLSearchParams;
2
+ export default useQuery;
@@ -0,0 +1,2 @@
1
+ declare const useRouter: () => import("../context/RouterContext").RouterContextType;
2
+ export default useRouter;
package/package.json CHANGED
@@ -5,42 +5,44 @@
5
5
  "email": "mohammed.bencheikh.dev@gmail.com",
6
6
  "url": "https://mohammedbencheikh.com/"
7
7
  },
8
- "version": "2.6.0",
8
+ "version": "3.0.1",
9
9
  "description": "ArcanaJS Framework",
10
- "main": "framework/lib/index.js",
11
- "types": "framework/lib/index.d.ts",
10
+ "main": "./dist/arcanajs.js",
11
+ "types": "./dist/lib/index.d.ts",
12
+ "scripts": {
13
+ "build": "tsc -p tsconfig.json --emitDeclarationOnly && webpack --config webpack.config.ts && cp src/lib/global.d.ts dist/lib/"
14
+ },
12
15
  "exports": {
13
16
  ".": {
14
- "types": "./framework/lib/index.d.ts",
15
- "default": "./framework/lib/index.js"
16
- },
17
- "./server": {
18
- "types": "./framework/lib/server.d.ts",
19
- "default": "./framework/lib/server.js"
17
+ "browser": {
18
+ "types": "./dist/lib/index.client.d.ts",
19
+ "default": "./dist/arcanajs.client.js"
20
+ },
21
+ "node": {
22
+ "types": "./dist/lib/index.d.ts",
23
+ "default": "./dist/arcanajs.js"
24
+ },
25
+ "default": "./dist/arcanajs.js"
20
26
  },
21
27
  "./client": {
22
- "types": "./framework/lib/client/index.d.ts",
23
- "default": "./framework/lib/client/index.js"
24
- },
25
- "./types": {
26
- "types": "./framework/lib/types.d.ts",
27
- "default": "./framework/lib/types.js"
28
+ "types": "./dist/lib/index.client.d.ts",
29
+ "default": "./dist/arcanajs.client.js"
28
30
  },
29
- "./config": {
30
- "types": "./framework/lib/config/index.d.ts",
31
- "default": "./framework/lib/config/index.js"
32
- },
33
- "./package.json": "./package.json"
31
+ "./server": {
32
+ "types": "./dist/lib/index.d.ts",
33
+ "default": "./dist/arcanajs.js"
34
+ }
34
35
  },
35
36
  "bin": {
36
37
  "arcanajs": "./bin/arcanajs.js"
37
38
  },
38
39
  "files": [
39
- "framework",
40
+ "dist",
40
41
  "bin"
41
42
  ],
42
- "scripts": {
43
- "build": "tsc -p tsconfig.json && cp src/lib/server/default-index.html framework/lib/server/ && cp src/lib/global.d.ts framework/lib/ && cp -r src/templates framework/ && cp src/templates/arcanajs.config.ts framework/templates/ && echo '/// <reference path=\"./global.d.ts\" />' | cat - framework/lib/index.d.ts > temp && mv temp framework/lib/index.d.ts"
43
+ "peerDependencies": {
44
+ "react": "^19.0.0",
45
+ "react-dom": "^19.0.0"
44
46
  },
45
47
  "dependencies": {
46
48
  "@babel/core": "^7.23.0",
@@ -80,6 +82,7 @@
80
82
  "ws": "^8.18.3"
81
83
  },
82
84
  "devDependencies": {
85
+ "@types/webpack-node-externals": "^3.0.4",
83
86
  "react": "^19.2.0",
84
87
  "react-dom": "^19.2.0"
85
88
  },
@@ -1,204 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const child_process_1 = require("child_process");
7
- const fs_1 = __importDefault(require("fs"));
8
- const path_1 = __importDefault(require("path"));
9
- const webpack_1 = __importDefault(require("webpack"));
10
- const templates_1 = require("./templates");
11
- const webpack_config_1 = require("./webpack.config");
12
- const args = process.argv.slice(2);
13
- const command = args[0];
14
- if (!command) {
15
- console.error("Please specify a command: init, dev, build, start");
16
- process.exit(1);
17
- }
18
- const runCompiler = (compiler) => {
19
- return new Promise((resolve, reject) => {
20
- compiler.run((err, stats) => {
21
- if (err) {
22
- console.error(err);
23
- return reject(err);
24
- }
25
- if (stats && stats.hasErrors()) {
26
- console.error(stats.toString({ colors: true }));
27
- return reject(new Error("Webpack build failed"));
28
- }
29
- console.log(stats?.toString({ colors: true }));
30
- resolve();
31
- });
32
- });
33
- };
34
- let serverProcess = null;
35
- const ws_1 = require("ws");
36
- const startDevServer = (hmrPort) => {
37
- return new Promise((resolve) => {
38
- if (serverProcess) {
39
- serverProcess.kill();
40
- }
41
- const serverPath = path_1.default.resolve(process.cwd(), "dist/server.js");
42
- serverProcess = (0, child_process_1.spawn)("node", [serverPath], {
43
- stdio: ["inherit", "pipe", "inherit"],
44
- env: { ...process.env, ARCANA_HMR_PORT: hmrPort.toString() },
45
- });
46
- serverProcess.stdout?.on("data", (data) => {
47
- process.stdout.write(data);
48
- if (data.toString().includes("Server is running")) {
49
- resolve();
50
- }
51
- });
52
- serverProcess.on("close", (code) => {
53
- if (code !== 0 && code !== null) {
54
- console.error(`Dev server exited with code ${code}`);
55
- }
56
- });
57
- });
58
- };
59
- const watchCompiler = (compiler, onBuildComplete) => {
60
- compiler.watch({}, (err, stats) => {
61
- if (err) {
62
- console.error(err);
63
- return;
64
- }
65
- console.log(stats?.toString({ colors: true }));
66
- if (stats && !stats.hasErrors() && onBuildComplete) {
67
- onBuildComplete();
68
- }
69
- });
70
- };
71
- const build = async () => {
72
- process.env.NODE_ENV = "production";
73
- console.log("Building for production...");
74
- const clientConfig = (0, webpack_config_1.createClientConfig)();
75
- const serverConfig = (0, webpack_config_1.createServerConfig)();
76
- try {
77
- await runCompiler((0, webpack_1.default)(clientConfig));
78
- await runCompiler((0, webpack_1.default)(serverConfig));
79
- console.log("Build complete.");
80
- }
81
- catch (error) {
82
- console.error("Build failed:", error);
83
- process.exit(1);
84
- }
85
- };
86
- const dev = async () => {
87
- process.env.NODE_ENV = "development";
88
- console.log("Starting development server...");
89
- // Start HMR WebSocket Server
90
- const HMR_PORT = 3001;
91
- const wss = new ws_1.WebSocketServer({ port: HMR_PORT });
92
- console.log(`HMR Server running on port ${HMR_PORT}`);
93
- const broadcastReload = () => {
94
- wss.clients.forEach((client) => {
95
- if (client.readyState === 1) {
96
- client.send(JSON.stringify({ type: "reload" }));
97
- }
98
- });
99
- };
100
- const clientConfig = (0, webpack_config_1.createClientConfig)();
101
- const serverConfig = (0, webpack_config_1.createServerConfig)();
102
- let isServerBuilding = false;
103
- let pendingReload = false;
104
- const serverCompiler = (0, webpack_1.default)(serverConfig);
105
- serverCompiler.hooks.invalid.tap("ArcanaJS", () => {
106
- isServerBuilding = true;
107
- });
108
- // Watch client
109
- watchCompiler((0, webpack_1.default)(clientConfig), () => {
110
- console.log("Client build complete.");
111
- if (isServerBuilding) {
112
- console.log("Server is building. Waiting to reload...");
113
- pendingReload = true;
114
- }
115
- else {
116
- console.log("Reloading browsers...");
117
- broadcastReload();
118
- }
119
- });
120
- // Watch server and restart on build
121
- watchCompiler(serverCompiler, async () => {
122
- console.log("Server build complete. Restarting server...");
123
- await startDevServer(HMR_PORT);
124
- isServerBuilding = false;
125
- if (pendingReload) {
126
- console.log("Pending reload found. Reloading browsers...");
127
- broadcastReload();
128
- pendingReload = false;
129
- }
130
- });
131
- };
132
- const init = () => {
133
- console.log("Initializing ArcanaJS project with Tailwind CSS...");
134
- const cwd = process.cwd();
135
- const templatesDir = path_1.default.resolve(__dirname, "../templates");
136
- // Create necessary directories
137
- templates_1.requiredDirs.forEach((dir) => {
138
- const fullPath = path_1.default.resolve(cwd, dir);
139
- if (!fs_1.default.existsSync(fullPath)) {
140
- fs_1.default.mkdirSync(fullPath, { recursive: true });
141
- console.log(`Created directory: ${dir}`);
142
- }
143
- });
144
- // Copy configuration files
145
- templates_1.configFiles.forEach(({ src, dest }) => {
146
- const srcPath = path_1.default.resolve(templatesDir, src);
147
- const destPath = path_1.default.resolve(cwd, dest);
148
- if (!fs_1.default.existsSync(destPath)) {
149
- if (fs_1.default.existsSync(srcPath)) {
150
- fs_1.default.copyFileSync(srcPath, destPath);
151
- console.log(`Created: ${dest}`);
152
- }
153
- else {
154
- console.warn(`Template not found: ${src}`);
155
- }
156
- }
157
- else {
158
- console.log(`Skipped: ${dest} (already exists)`);
159
- }
160
- });
161
- // Create default error pages
162
- templates_1.errorPages.forEach((page) => {
163
- const viewPath = path_1.default.resolve(cwd, `src/views/${page}`);
164
- const templatePath = path_1.default.resolve(templatesDir, page);
165
- if (!fs_1.default.existsSync(viewPath) && fs_1.default.existsSync(templatePath)) {
166
- fs_1.default.copyFileSync(templatePath, viewPath);
167
- console.log(`Created: src/views/${page}`);
168
- }
169
- });
170
- console.log("\n✅ ArcanaJS project initialized successfully!");
171
- console.log("\nNext steps:");
172
- console.log("1. Run 'npm install' to install dependencies");
173
- console.log("2. Run 'npm run dev' to start development");
174
- console.log("3. Visit http://localhost:3000 to see your app");
175
- console.log("4. Edit src/views/HomePage.tsx to customize your homepage");
176
- console.log("5. Customize your theme in src/client/globals.css");
177
- console.log("6. Add your Tailwind classes and enjoy!");
178
- };
179
- const start = () => {
180
- process.env.NODE_ENV = "production";
181
- const serverPath = path_1.default.resolve(process.cwd(), "dist/server.js");
182
- console.log(`Starting server at ${serverPath}...`);
183
- const child = (0, child_process_1.spawn)("node", [serverPath], { stdio: "inherit" });
184
- child.on("close", (code) => {
185
- process.exit(code || 0);
186
- });
187
- };
188
- switch (command) {
189
- case "init":
190
- init();
191
- break;
192
- case "build":
193
- build();
194
- break;
195
- case "dev":
196
- dev();
197
- break;
198
- case "start":
199
- start();
200
- break;
201
- default:
202
- console.error(`Unknown command: ${command}`);
203
- process.exit(1);
204
- }
@@ -1,6 +0,0 @@
1
- export declare const configFiles: {
2
- src: string;
3
- dest: string;
4
- }[];
5
- export declare const errorPages: string[];
6
- export declare const requiredDirs: string[];