@joystick.js/cli-canary 0.0.0-canary.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 (231) hide show
  1. package/.build/getFilesToBuild.js +38 -0
  2. package/.build/index.js +69 -0
  3. package/HMRNOTES.txt +23 -0
  4. package/README.md +7 -0
  5. package/_package.json +55 -0
  6. package/canary.js +12 -0
  7. package/dist/cli.js +69 -0
  8. package/dist/functions/build/getTarIgnoreList.js +25 -0
  9. package/dist/functions/build/index.js +54 -0
  10. package/dist/functions/create/buildPackageJSON.js +20 -0
  11. package/dist/functions/create/index.js +193 -0
  12. package/dist/functions/create/templates/api/index.js +4 -0
  13. package/dist/functions/create/templates/i18n/en-US.js +4 -0
  14. package/dist/functions/create/templates/index.client.js +7 -0
  15. package/dist/functions/create/templates/index.css +20 -0
  16. package/dist/functions/create/templates/index.html +23 -0
  17. package/dist/functions/create/templates/index.server.js +21 -0
  18. package/dist/functions/create/templates/public/apple-touch-icon-152x152.png +0 -0
  19. package/dist/functions/create/templates/public/favicon.ico +0 -0
  20. package/dist/functions/create/templates/public/manifest.json +25 -0
  21. package/dist/functions/create/templates/public/service-worker.js +32 -0
  22. package/dist/functions/create/templates/public/splash-screen-1024x1024.png +0 -0
  23. package/dist/functions/create/templates/settings.development.json +27 -0
  24. package/dist/functions/create/templates/ui/components/button/index.js +50 -0
  25. package/dist/functions/create/templates/ui/layouts/app/index.js +13 -0
  26. package/dist/functions/create/templates/ui/pages/error/index.js +31 -0
  27. package/dist/functions/create/templates/ui/pages/index/index.js +94 -0
  28. package/dist/functions/index.js +243 -0
  29. package/dist/functions/logout/index.js +20 -0
  30. package/dist/functions/push/checkIfProvisionAvailable.js +19 -0
  31. package/dist/functions/push/deploy/index.js +173 -0
  32. package/dist/functions/push/deploy/initial.js +100 -0
  33. package/dist/functions/push/deploy/version.js +100 -0
  34. package/dist/functions/push/domains.js +23 -0
  35. package/dist/functions/push/getAvailableCDN.js +23 -0
  36. package/dist/functions/push/getDeployment.js +41 -0
  37. package/dist/functions/push/getDeploymentSummary.js +38 -0
  38. package/dist/functions/push/getInstanceSizeRegions.js +37 -0
  39. package/dist/functions/push/getInstanceSizesForRegion.js +34 -0
  40. package/dist/functions/push/getProviderInstanceSizes.js +34 -0
  41. package/dist/functions/push/getProviderRegions.js +36 -0
  42. package/dist/functions/push/getProvidersWithConnectionStatus.js +20 -0
  43. package/dist/functions/push/getSessionToken.js +23 -0
  44. package/dist/functions/push/getUserFromSessionToken.js +37 -0
  45. package/dist/functions/push/index.js +210 -0
  46. package/dist/functions/push/loginToCheatCode.js +33 -0
  47. package/dist/functions/push/pingProvisionAPI.js +31 -0
  48. package/dist/functions/push/prompts.js +332 -0
  49. package/dist/functions/push/providerMap.js +11 -0
  50. package/dist/functions/push/providers.js +9 -0
  51. package/dist/functions/reset/index.js +0 -0
  52. package/dist/functions/reset/reset.js +127 -0
  53. package/dist/functions/start/bootstrapLayoutComponent.js +54 -0
  54. package/dist/functions/start/bootstrapPageComponent.js +51 -0
  55. package/dist/functions/start/buildFile.js +85 -0
  56. package/dist/functions/start/buildFiles.js +76 -0
  57. package/dist/functions/start/buildPlugins.js +183 -0
  58. package/dist/functions/start/checkIfPortAvailable.js +18 -0
  59. package/dist/functions/start/cleanup/index.js +18 -0
  60. package/dist/functions/start/databases/mongodb/availableQueryParameters.js +42 -0
  61. package/dist/functions/start/databases/mongodb/buildConnectionString.js +22 -0
  62. package/dist/functions/start/databases/mongodb/buildQueryParameters.js +14 -0
  63. package/dist/functions/start/databases/mongodb/checkConnection.js +38 -0
  64. package/dist/functions/start/databases/mongodb/connect.js +25 -0
  65. package/dist/functions/start/databases/mongodb/index.js +93 -0
  66. package/dist/functions/start/databases/postgresql/checkConnection.js +41 -0
  67. package/dist/functions/start/databases/postgresql/connect.js +27 -0
  68. package/dist/functions/start/databases/postgresql/index.js +106 -0
  69. package/dist/functions/start/databases/redis.js +0 -0
  70. package/dist/functions/start/databases/startProvider.js +16 -0
  71. package/dist/functions/start/fileDependencyMapper.js +22 -0
  72. package/dist/functions/start/filesToCopy.js +18 -0
  73. package/dist/functions/start/generateId.js +74 -0
  74. package/dist/functions/start/getCodependenciesForFile.js +64 -0
  75. package/dist/functions/start/getFilesToBuild.js +39 -0
  76. package/dist/functions/start/getProcessIdFromPort.js +60 -0
  77. package/dist/functions/start/hmrServer.js +66 -0
  78. package/dist/functions/start/index.js +535 -0
  79. package/dist/functions/start/isWindows.js +5 -0
  80. package/dist/functions/start/minifyFile.js +12 -0
  81. package/dist/functions/start/onWarn.js +63 -0
  82. package/dist/functions/start/readFileDependencyMap.js +16 -0
  83. package/dist/functions/start/removeDeletedDependenciesFromMap.js +18 -0
  84. package/dist/functions/start/setComponentId.js +46 -0
  85. package/dist/functions/start/updateFileMap.js +67 -0
  86. package/dist/functions/update/index.js +21 -0
  87. package/dist/functions/use/index.js +61 -0
  88. package/dist/index.js +8 -0
  89. package/dist/lib/CLILog.js +49 -0
  90. package/dist/lib/buildResolvePlugin.js +21 -0
  91. package/dist/lib/checkIfValidJSON.js +11 -0
  92. package/dist/lib/colorLog.js +7 -0
  93. package/dist/lib/getArgs.js +14 -0
  94. package/dist/lib/getCodeFrame.js +10 -0
  95. package/dist/lib/getOptions.js +15 -0
  96. package/dist/lib/getPlatformSafePath.js +7 -0
  97. package/dist/lib/getProvider.js +8 -0
  98. package/dist/lib/help.js +56 -0
  99. package/dist/lib/isObject.js +6 -0
  100. package/dist/lib/isValidJSONString.js +11 -0
  101. package/dist/lib/isWindows.js +5 -0
  102. package/dist/lib/killProcesses.js +0 -0
  103. package/dist/lib/loadSettings.js +33 -0
  104. package/dist/lib/loader.js +82 -0
  105. package/dist/lib/masterIgnoreList.js +16 -0
  106. package/dist/lib/nodeEnvironment.js +9 -0
  107. package/dist/lib/nodeEnvironments.js +8 -0
  108. package/dist/lib/parseCookiesFromLogin.js +18 -0
  109. package/dist/lib/rainbowRoad.js +7 -0
  110. package/dist/lib/readDirectorySync.js +14 -0
  111. package/dist/lib/regexes.js +12 -0
  112. package/dist/lib/replaceBackslashesWithForwardSlashes.js +8 -0
  113. package/dist/lib/replaceFileProtocol.js +8 -0
  114. package/dist/lib/serializeQueryParameters.js +8 -0
  115. package/dist/lib/settings.js +4 -0
  116. package/dist/lib/validateDatabasesFromSettings.js +34 -0
  117. package/dist/lib/wait.js +8 -0
  118. package/package.json +54 -0
  119. package/release.js +40 -0
  120. package/src/cli.js +88 -0
  121. package/src/functions/build/getTarIgnoreList.js +30 -0
  122. package/src/functions/build/index.js +63 -0
  123. package/src/functions/create/buildPackageJSON.js +18 -0
  124. package/src/functions/create/index.js +209 -0
  125. package/src/functions/create/templates/api/index.js +4 -0
  126. package/src/functions/create/templates/i18n/en-US.js +4 -0
  127. package/src/functions/create/templates/index.client.js +7 -0
  128. package/src/functions/create/templates/index.css +20 -0
  129. package/src/functions/create/templates/index.html +23 -0
  130. package/src/functions/create/templates/index.server.js +21 -0
  131. package/src/functions/create/templates/public/apple-touch-icon-152x152.png +0 -0
  132. package/src/functions/create/templates/public/favicon.ico +0 -0
  133. package/src/functions/create/templates/public/manifest.json +25 -0
  134. package/src/functions/create/templates/public/service-worker.js +32 -0
  135. package/src/functions/create/templates/public/splash-screen-1024x1024.png +0 -0
  136. package/src/functions/create/templates/settings.development.json +27 -0
  137. package/src/functions/create/templates/ui/components/button/index.js +50 -0
  138. package/src/functions/create/templates/ui/layouts/app/index.js +13 -0
  139. package/src/functions/create/templates/ui/pages/error/index.js +31 -0
  140. package/src/functions/create/templates/ui/pages/index/index.js +94 -0
  141. package/src/functions/index.js +243 -0
  142. package/src/functions/logout/index.js +20 -0
  143. package/src/functions/push/checkIfProvisionAvailable.js +20 -0
  144. package/src/functions/push/deploy/index.js +199 -0
  145. package/src/functions/push/deploy/initial.js +108 -0
  146. package/src/functions/push/deploy/version.js +108 -0
  147. package/src/functions/push/domains.js +23 -0
  148. package/src/functions/push/getAvailableCDN.js +27 -0
  149. package/src/functions/push/getDeployment.js +43 -0
  150. package/src/functions/push/getDeploymentSummary.js +39 -0
  151. package/src/functions/push/getInstanceSizeRegions.js +40 -0
  152. package/src/functions/push/getInstanceSizesForRegion.js +35 -0
  153. package/src/functions/push/getProviderInstanceSizes.js +35 -0
  154. package/src/functions/push/getProviderRegions.js +39 -0
  155. package/src/functions/push/getProvidersWithConnectionStatus.js +25 -0
  156. package/src/functions/push/getSessionToken.js +26 -0
  157. package/src/functions/push/getUserFromSessionToken.js +39 -0
  158. package/src/functions/push/index.js +245 -0
  159. package/src/functions/push/loginToCheatCode.js +34 -0
  160. package/src/functions/push/pingProvisionAPI.js +33 -0
  161. package/src/functions/push/prompts.js +276 -0
  162. package/src/functions/push/providerMap.js +8 -0
  163. package/src/functions/push/providers.js +6 -0
  164. package/src/functions/reset/index.js +0 -0
  165. package/src/functions/reset/reset.js +163 -0
  166. package/src/functions/start/bootstrapLayoutComponent.js +57 -0
  167. package/src/functions/start/bootstrapPageComponent.js +54 -0
  168. package/src/functions/start/buildFile.js +97 -0
  169. package/src/functions/start/buildFiles.js +101 -0
  170. package/src/functions/start/buildPlugins.js +215 -0
  171. package/src/functions/start/checkIfPortAvailable.js +21 -0
  172. package/src/functions/start/cleanup/index.js +23 -0
  173. package/src/functions/start/databases/mongodb/availableQueryParameters.js +39 -0
  174. package/src/functions/start/databases/mongodb/buildConnectionString.js +28 -0
  175. package/src/functions/start/databases/mongodb/buildQueryParameters.js +15 -0
  176. package/src/functions/start/databases/mongodb/checkConnection.js +40 -0
  177. package/src/functions/start/databases/mongodb/connect.js +25 -0
  178. package/src/functions/start/databases/mongodb/index.js +108 -0
  179. package/src/functions/start/databases/postgresql/checkConnection.js +43 -0
  180. package/src/functions/start/databases/postgresql/connect.js +27 -0
  181. package/src/functions/start/databases/postgresql/index.js +127 -0
  182. package/src/functions/start/databases/redis.js +0 -0
  183. package/src/functions/start/databases/startProvider.js +15 -0
  184. package/src/functions/start/fileDependencyMapper.js +24 -0
  185. package/src/functions/start/filesToCopy.js +15 -0
  186. package/src/functions/start/generateId.js +73 -0
  187. package/src/functions/start/getCodependenciesForFile.js +84 -0
  188. package/src/functions/start/getFilesToBuild.js +49 -0
  189. package/src/functions/start/getProcessIdFromPort.js +92 -0
  190. package/src/functions/start/hmrServer.js +78 -0
  191. package/src/functions/start/index.js +688 -0
  192. package/src/functions/start/isWindows.js +3 -0
  193. package/src/functions/start/minifyFile.js +10 -0
  194. package/src/functions/start/onWarn.js +68 -0
  195. package/src/functions/start/readFileDependencyMap.js +19 -0
  196. package/src/functions/start/removeDeletedDependenciesFromMap.js +19 -0
  197. package/src/functions/start/setComponentId.js +58 -0
  198. package/src/functions/start/updateFileMap.js +100 -0
  199. package/src/functions/update/index.js +20 -0
  200. package/src/functions/use/index.js +62 -0
  201. package/src/index.js +13 -0
  202. package/src/lib/CLILog.js +40 -0
  203. package/src/lib/buildResolvePlugin.js +32 -0
  204. package/src/lib/checkIfValidJSON.js +8 -0
  205. package/src/lib/colorLog.js +5 -0
  206. package/src/lib/getArgs.js +14 -0
  207. package/src/lib/getCodeFrame.js +8 -0
  208. package/src/lib/getOptions.js +12 -0
  209. package/src/lib/getPlatformSafePath.js +6 -0
  210. package/src/lib/getProvider.js +5 -0
  211. package/src/lib/help.js +56 -0
  212. package/src/lib/isObject.js +3 -0
  213. package/src/lib/isValidJSONString.js +8 -0
  214. package/src/lib/isWindows.js +3 -0
  215. package/src/lib/killProcesses.js +5 -0
  216. package/src/lib/loadSettings.js +40 -0
  217. package/src/lib/loader.js +94 -0
  218. package/src/lib/masterIgnoreList.js +13 -0
  219. package/src/lib/nodeEnvironment.js +6 -0
  220. package/src/lib/nodeEnvironments.js +8 -0
  221. package/src/lib/parseCookiesFromLogin.js +21 -0
  222. package/src/lib/rainbowRoad.js +5 -0
  223. package/src/lib/readDirectorySync.js +13 -0
  224. package/src/lib/regexes.js +5 -0
  225. package/src/lib/replaceBackslashesWithForwardSlashes.js +8 -0
  226. package/src/lib/replaceFileProtocol.js +8 -0
  227. package/src/lib/serializeQueryParameters.js +5 -0
  228. package/src/lib/settings.js +1 -0
  229. package/src/lib/validateDatabasesFromSettings.js +37 -0
  230. package/src/lib/wait.js +5 -0
  231. package/storage/.verdaccio-db.json +1 -0
@@ -0,0 +1,6 @@
1
+ export default [
2
+ // { name: 'AWS', value: 'aws' },
3
+ { name: 'Digital Ocean', value: 'digitalOcean' },
4
+ { name: 'Linode', value: 'linode' },
5
+ { name: 'Vultr', value: 'vultr' },
6
+ ];
File without changes
@@ -0,0 +1,163 @@
1
+ import fs from "fs";
2
+ import util from "util";
3
+ import child_process from "child_process";
4
+ import commandExists from "command-exists";
5
+ import chalk from "chalk";
6
+ import Mongo from "mongodb";
7
+ import ps from "ps-node";
8
+ import mongoUri from "mongo-uri-tool";
9
+ import Loader from "../../lib/loader.js";
10
+ import settings from "../../lib/settings.js";
11
+
12
+ const exec = util.promisify(child_process.exec);
13
+
14
+ const resetDatabase = async (mongodb) => {
15
+ const collections =
16
+ mongodb && mongodb.db && (await mongodb.db.listCollections().toArray());
17
+
18
+ for (let i = 0; i < collections.length; i += 1) {
19
+ const collectionFromList = collections[i];
20
+ const collectionName = collectionFromList && collectionFromList.name;
21
+ const collection = collectionName && mongodb.db.collection(collectionName);
22
+
23
+ if (collection) {
24
+ await collection.deleteMany();
25
+ }
26
+ }
27
+
28
+ return true;
29
+ };
30
+
31
+ const handleCleanup = (processIds = []) => {
32
+ process.loader.stop();
33
+
34
+ processIds.forEach((processId) => {
35
+ ps.kill(processId);
36
+ });
37
+
38
+ process.exit();
39
+ };
40
+
41
+ const handleSignalEvents = (processIds = []) => {
42
+ process.on("SIGINT", () => handleCleanup(processIds));
43
+ process.on("SIGTERM", () => handleCleanup(processIds));
44
+ };
45
+
46
+ const getMongoProcessId = (stdout = null) => {
47
+ const forkedProcessId = stdout && stdout.match(/forked process:+\s[0-9]+/gi);
48
+ const processId =
49
+ forkedProcessId &&
50
+ forkedProcessId[0] &&
51
+ forkedProcessId[0].replace("forked process: ", "");
52
+
53
+ return processId && parseInt(processId, 10);
54
+ };
55
+
56
+ const getConnectionOptions = () => {
57
+ const mongodbSettings =
58
+ settings && settings.databases && settings.databases.mongodb;
59
+ const uri = mongodbSettings && mongodbSettings.uri;
60
+
61
+ if (!mongodbSettings || (mongodbSettings && !uri)) {
62
+ throw new Error(
63
+ chalk.redBright(
64
+ "Must have a valid databases.mongodb.uri value in your settings-<env>.json file to connect to MongoDB."
65
+ )
66
+ );
67
+ }
68
+
69
+ return {
70
+ uri,
71
+ parsedUri: mongoUri.parseUri(uri),
72
+ options: Object.assign({}, mongodbSettings.options),
73
+ };
74
+ };
75
+
76
+ const connectToMongoDB = async () => {
77
+ const connectionOptions = getConnectionOptions();
78
+
79
+ if (!process.mongodb && connectionOptions) {
80
+ const mongodb = await Mongo.MongoClient.connect(connectionOptions.uri, {
81
+ poolSize: process.env.NODE_ENV === "development" ? 10 : 100,
82
+ useNewUrlParser: true,
83
+ useUnifiedTopology: true,
84
+ authSource: "admin",
85
+ ssl: process.env.NODE_ENV !== "development",
86
+ ...connectionOptions.options,
87
+ });
88
+
89
+ const db = mongodb.db(connectionOptions.parsedUri.db);
90
+
91
+ return {
92
+ db,
93
+ Collection: db.collection.bind(db),
94
+ connection: mongodb,
95
+ };
96
+ }
97
+
98
+ return null;
99
+ };
100
+
101
+ const startMongoDB = async () => {
102
+ const dataDirectoryExists = fs.existsSync(".data/mongodb");
103
+
104
+ if (!dataDirectoryExists) {
105
+ fs.mkdirSync(".data/mongodb", { recursive: true });
106
+ }
107
+
108
+ const { stdout } = await exec(
109
+ "mongod --port 27017 --dbpath ./.data/mongodb --quiet --fork --logpath ./.data/mongodb/log"
110
+ );
111
+
112
+ const mongoProcessId = getMongoProcessId(stdout);
113
+ process.mongoProcessId = mongoProcessId;
114
+
115
+ return mongoProcessId;
116
+ };
117
+
118
+ const warnMongoDBMissing = () => {
119
+ console.warn(`
120
+ ${chalk.red("MongoDB not installed.")}\n
121
+ ${chalk.green(
122
+ "Download MongoDB at https://www.mongodb.com/try/download/community"
123
+ )}
124
+
125
+ After installation, try to run this command again to start MongoDB alongside your app.\n
126
+ `);
127
+ };
128
+
129
+ const reset = async () => {
130
+ if (process.env.NODE_ENV !== "development") {
131
+ console.log(
132
+ chalk.redBright(
133
+ "To prevent catastrophic data loss, reset is disabled outside of your development environment."
134
+ )
135
+ );
136
+ process.exit(1);
137
+ }
138
+
139
+ process.isReset = true; // NOTE: Set this so we can signal context to dependencies.
140
+ process.loader = new Loader();
141
+ process.loader.start("Resetting database...");
142
+
143
+ const mongodbExists = commandExists.sync("mongod");
144
+
145
+ if (mongodbExists) {
146
+ const mongoProcessId = await startMongoDB();
147
+ handleSignalEvents([mongoProcessId]);
148
+
149
+ const mongodb = await connectToMongoDB();
150
+ await resetDatabase(mongodb);
151
+
152
+ ps.kill(mongoProcessId);
153
+
154
+ process.loader.stable("Database reset!\n\n");
155
+ process.exit();
156
+ } else {
157
+ process.loader.stop();
158
+ warnMongoDBMissing();
159
+ process.exit(1);
160
+ }
161
+ };
162
+
163
+ (async () => reset())();
@@ -0,0 +1,57 @@
1
+ import chalk from "chalk";
2
+ import { EXPORT_DEFAULT_REGEX } from "../../lib/regexes.js";
3
+
4
+ export default () => {
5
+ return {
6
+ transform(code, id) {
7
+ const shouldBootstrap = ["layouts"].some((bootstrapTarget) => {
8
+ return id.includes(bootstrapTarget);
9
+ });
10
+
11
+ if (shouldBootstrap) {
12
+ const matches = code.match(EXPORT_DEFAULT_REGEX) || [];
13
+ const match = matches && matches[0];
14
+
15
+ if (!match) {
16
+ console.log(" ");
17
+ console.warn(
18
+ chalk.yellowBright(
19
+ `All components in the ui/layouts directory must have an export default statement (e.g., export default MyLayout). Please check the file at ${id}.`
20
+ )
21
+ );
22
+ console.log(" ");
23
+ return null;
24
+ }
25
+
26
+ const matchParts = (match && match.split(" ")) || [];
27
+ const componentName = matchParts.pop();
28
+
29
+ if (componentName) {
30
+ return {
31
+ code: code.replace(
32
+ `${match};`,
33
+ `if (
34
+ typeof window !== 'undefined' &&
35
+ window.__joystick_ssr__ === true &&
36
+ window.__joystick_layout_page__ &&
37
+ ui &&
38
+ ui.mount
39
+ ) {
40
+ fetch(window.__joystick_layout_page_url__).then(async (response) => {
41
+ const file = await response.text();
42
+ const component = eval(file);
43
+ ui.mount(${componentName}, Object.assign({ ...window.__joystick_ssr_props__ }, { page: window[window.__joystick_layout_page__].js }), document.getElementById('app'));
44
+ });
45
+ }
46
+
47
+ export default ${componentName};
48
+ `
49
+ ),
50
+ };
51
+ }
52
+ }
53
+
54
+ return null;
55
+ },
56
+ };
57
+ };
@@ -0,0 +1,54 @@
1
+ import chalk from "chalk";
2
+ import { EXPORT_DEFAULT_REGEX } from "../../lib/regexes.js";
3
+
4
+ export default () => {
5
+ return {
6
+ transform(code, id) {
7
+ const shouldBootstrap = ["pages"].some((bootstrapTarget) => {
8
+ return id.includes(bootstrapTarget);
9
+ });
10
+
11
+ if (shouldBootstrap) {
12
+ const matches = code.match(EXPORT_DEFAULT_REGEX) || [];
13
+ const match = matches && matches[0];
14
+
15
+ if (!match) {
16
+ console.log(" ");
17
+ console.warn(
18
+ chalk.yellowBright(
19
+ `All components in the ui/pages directory must have an export default statement (e.g., export default MyPage). Please check the file at ${id}.`
20
+ )
21
+ );
22
+ console.log(" ");
23
+ return null;
24
+ }
25
+
26
+ const matchParts = (match && match.split(" ")) || [];
27
+ const componentName = matchParts.pop();
28
+
29
+ if (componentName) {
30
+ return {
31
+ code: code.replace(
32
+ `${match};`,
33
+ `
34
+ if (
35
+ typeof window !== 'undefined' &&
36
+ window.__joystick_ssr__ === true &&
37
+ !window.__joystick_layout_page__ &&
38
+ ui &&
39
+ ui.mount
40
+ ) {
41
+ ui.mount(${componentName}, window.__joystick_ssr_props__ || {}, document.getElementById('app'));
42
+ }
43
+
44
+ export default ${componentName};
45
+ `
46
+ ),
47
+ };
48
+ }
49
+ }
50
+
51
+ return null;
52
+ },
53
+ };
54
+ };
@@ -0,0 +1,97 @@
1
+ import esbuild from "esbuild";
2
+ import svg from "esbuild-plugin-svg";
3
+ import fs from "fs";
4
+ import plugins from "./buildPlugins.js";
5
+ import onWarn from "./onWarn.js";
6
+ import getCodeFrame from "../../lib/getCodeFrame.js";
7
+
8
+ const configs = {
9
+ node: (inputPath, outputPath = null, environment = "development") => ({
10
+ entryPoints: [inputPath],
11
+ bundle: false,
12
+ outfile: `${outputPath || "./.joystick/build"}/${inputPath}`,
13
+ platform: "node",
14
+ format: "esm",
15
+ define: {
16
+ "process.env.NODE_ENV": `'${environment}'`,
17
+ },
18
+ // minify: environment !== "development",
19
+ logLevel: "silent",
20
+ plugins: [plugins.warnNodeEnvironment, plugins.generateFileDependencyMap],
21
+ }),
22
+ browser: (inputPath, outputPath = null, environment = "development") => {
23
+ return {
24
+ target: "es2020",
25
+ entryPoints: [inputPath],
26
+ bundle: true,
27
+ outfile: `${outputPath || "./.joystick/build"}/${inputPath}`,
28
+ platform: "browser",
29
+ format: "esm",
30
+ define: {
31
+ "process.env.NODE_ENV": `'${environment}'`,
32
+ },
33
+ // minify: environment !== "development",
34
+ logLevel: "silent",
35
+ plugins: [
36
+ plugins.warnNodeEnvironment,
37
+ plugins.generateFileDependencyMap,
38
+ plugins.bootstrapComponent,
39
+ svg(),
40
+ ],
41
+ };
42
+ },
43
+ };
44
+
45
+ export default async (
46
+ file = "",
47
+ platform = "",
48
+ outputPath = "",
49
+ environment = "development"
50
+ ) => {
51
+ return new Promise(async (resolve) => {
52
+ const config =
53
+ configs[platform] && configs[platform](file, outputPath, environment);
54
+
55
+ if (config) {
56
+ try {
57
+ await esbuild.build(config);
58
+ return resolve({
59
+ success: true,
60
+ });
61
+ } catch (exception) {
62
+ console.warn(exception);
63
+ const error = exception?.errors && exception?.errors[0];
64
+
65
+ const snippet = fs.existsSync(file)
66
+ ? getCodeFrame(file, {
67
+ line: error?.location?.line,
68
+ column: error?.location?.column,
69
+ })
70
+ : null;
71
+
72
+ onWarn({
73
+ file,
74
+ stack: exception?.stack,
75
+ line: error?.location?.line,
76
+ column: error?.location?.column,
77
+ snippet,
78
+ lineWithError: error?.location?.lineText?.trim(),
79
+ message: error?.text,
80
+ });
81
+
82
+ return resolve({
83
+ success: false,
84
+ path: file,
85
+ error: {
86
+ stack: exception?.stack,
87
+ snippet,
88
+ },
89
+ });
90
+ }
91
+ }
92
+
93
+ return resolve({
94
+ success: true,
95
+ });
96
+ });
97
+ };
@@ -0,0 +1,101 @@
1
+ import fs from "fs-extra";
2
+ import esbuild from "esbuild";
3
+ import filesToCopy from "./filesToCopy.js";
4
+ import buildFile from "./buildFile.js";
5
+ import minifyFile from "./minifyFile.js";
6
+ import getPlatformSafePath from "../../lib/getPlatformSafePath.js";
7
+
8
+ const getFilePlatform = (path = "") => {
9
+ let platform = "copy";
10
+
11
+ const browserPaths = [
12
+ getPlatformSafePath("email/"),
13
+ getPlatformSafePath("lib/"),
14
+ getPlatformSafePath("lib/browser"),
15
+ getPlatformSafePath("ui/"),
16
+ "index.client.js",
17
+ ];
18
+
19
+ const browserExclusions = [getPlatformSafePath("lib/node")];
20
+
21
+ const nodePaths = [
22
+ getPlatformSafePath("api/"),
23
+ getPlatformSafePath("routes/"),
24
+ getPlatformSafePath("fixtures/"),
25
+ getPlatformSafePath("lib/node"),
26
+ "index.server.js",
27
+ ];
28
+
29
+ const nodeExclusions = [getPlatformSafePath("lib/browser")];
30
+
31
+ const isBrowser =
32
+ browserPaths.some((browserPath) => {
33
+ return path.includes(browserPath);
34
+ }) &&
35
+ !browserExclusions.some((browserExclusionPath) => {
36
+ return path.includes(browserExclusionPath);
37
+ });
38
+
39
+ const isNode =
40
+ nodePaths.some((nodePath) => {
41
+ return path.includes(nodePath);
42
+ }) &&
43
+ !nodeExclusions.some((nodeExclusionPath) => {
44
+ return path.includes(nodeExclusionPath);
45
+ });
46
+
47
+ if (isBrowser) {
48
+ platform = "browser";
49
+ }
50
+
51
+ if (isNode) {
52
+ platform = "node";
53
+ }
54
+
55
+ return platform;
56
+ };
57
+
58
+ const isNotJavaScript = (path = "") => {
59
+ const extension = path.split(".").pop();
60
+ return extension && !extension.match(/\js$/);
61
+ };
62
+
63
+ export default async (
64
+ filesToBuild = [],
65
+ outputPath = null,
66
+ environment = "development"
67
+ ) => {
68
+ return Promise.all(
69
+ filesToBuild.map(async (fileToBuild) => {
70
+ const platform = getFilePlatform(fileToBuild);
71
+ const isFileToCopy =
72
+ platform === "copy" ||
73
+ isNotJavaScript(fileToBuild) ||
74
+ filesToCopy.some((fileToCopy) => {
75
+ return fileToCopy.regex.test(fileToBuild);
76
+ });
77
+
78
+ if (isFileToCopy) {
79
+ fs.outputFileSync(
80
+ `${outputPath || "./.joystick/build"}/${fileToBuild}`,
81
+ fs.readFileSync(fileToBuild)
82
+ );
83
+
84
+ return fileToBuild;
85
+ }
86
+
87
+ const build = await buildFile(
88
+ fileToBuild,
89
+ platform,
90
+ outputPath,
91
+ environment
92
+ );
93
+
94
+ if (environment !== 'development') {
95
+ await minifyFile(`${outputPath || "./.joystick/build"}/${fileToBuild}`);
96
+ }
97
+
98
+ return build;
99
+ })
100
+ );
101
+ };
@@ -0,0 +1,215 @@
1
+ import fs from "fs";
2
+ import chalk from "chalk";
3
+ import updateFileMap from "./updateFileMap.js";
4
+ import {
5
+ JOYSTICK_UI_REGEX,
6
+ EXPORT_DEFAULT_REGEX,
7
+ JOYSTICK_COMPONENT_REGEX,
8
+ JOYSTICK_COMMENT_REGEX,
9
+ } from "../../lib/regexes.js";
10
+ import generateId from "./generateId.js";
11
+ import getPlatformSafePath from "../../lib/getPlatformSafePath.js";
12
+ import setComponentId from "./setComponentId.js";
13
+
14
+ export default {
15
+ bootstrapComponent: {
16
+ name: "bootstrapComponent",
17
+ setup(build) {
18
+ // NOTE: Generate SSR ID and then replace the necessary markup. Make contents a let so we can perform
19
+ // additional modifications below.
20
+ const ssrId = generateId();
21
+
22
+ build.onLoad({ filter: /\.js$/ }, (args = {}) => {
23
+ try {
24
+ const shouldSetSSRId = [getPlatformSafePath("ui/")].some(
25
+ (bootstrapTarget) => {
26
+ return args.path.includes(bootstrapTarget);
27
+ }
28
+ );
29
+ const isLayoutComponent = [getPlatformSafePath("ui/layouts")].some(
30
+ (bootstrapTarget) => {
31
+ return args.path.includes(bootstrapTarget);
32
+ }
33
+ );
34
+ const isPageComponent = [getPlatformSafePath("ui/pages")].some(
35
+ (bootstrapTarget) => {
36
+ return args.path.includes(bootstrapTarget);
37
+ }
38
+ );
39
+ const isEmailComponent = [getPlatformSafePath("email/")].some(
40
+ (bootstrapTarget) => {
41
+ return args.path.includes(bootstrapTarget);
42
+ }
43
+ );
44
+
45
+ if (
46
+ shouldSetSSRId ||
47
+ isLayoutComponent ||
48
+ isPageComponent ||
49
+ isEmailComponent
50
+ ) {
51
+ const code = fs.readFileSync(
52
+ getPlatformSafePath(args.path),
53
+ "utf-8"
54
+ );
55
+
56
+ // NOTE: Check to see if we have a valid component file.
57
+ const joystickUIMatches = code.match(JOYSTICK_UI_REGEX) || [];
58
+ const joystickUIMatch = joystickUIMatches && joystickUIMatches[0];
59
+ const exportDefaultMatches = code.match(EXPORT_DEFAULT_REGEX) || [];
60
+ const exportDefaultMatch =
61
+ exportDefaultMatches && exportDefaultMatches[0];
62
+
63
+ if (joystickUIMatch && !exportDefaultMatch) {
64
+ console.log(" ");
65
+ console.warn(
66
+ chalk.yellowBright(
67
+ `All Joystick components in the ui directory must have an export default statement (e.g., export default MyComponent, export default MyLayout, or export default MyPage). Please check the file at ${args.path}.`
68
+ )
69
+ );
70
+ console.log(" ");
71
+ return;
72
+ }
73
+
74
+ let contents = setComponentId(code)?.replace(
75
+ /\.component\(\/\*\*\//g,
76
+ ".component("
77
+ );
78
+
79
+ // contents = contents.replace(
80
+ // "ui.component({",
81
+ // `ui.component({\n _ssrId: '${ssrId}',`
82
+ // );
83
+
84
+ // NOTE: Remove any commented code inside of render() so it doesn't get rendered during SSR
85
+ // or in the browser.
86
+ contents = contents.replace(JOYSTICK_COMMENT_REGEX, "");
87
+
88
+ const exportDefaultMatchParts =
89
+ (exportDefaultMatch && exportDefaultMatch.split(" ")) || [];
90
+ const componentName = exportDefaultMatchParts.pop();
91
+
92
+ if (componentName && isLayoutComponent) {
93
+ contents = contents.replace(
94
+ `${exportDefaultMatch};`,
95
+ `if (
96
+ typeof window !== 'undefined' &&
97
+ window.__joystick_ssr__ === true &&
98
+ window.__joystick_layout_page__ &&
99
+ ui &&
100
+ ui.mount
101
+ ) {
102
+ (async () => {
103
+ const layoutComponentFile = await import(window.__joystick_layout__);
104
+ const pageComponentFile = await import(window.window.__joystick_layout_page_url__);
105
+ const layout = layoutComponentFile.default;
106
+ const page = pageComponentFile.default;
107
+ ui.mount(layout, Object.assign({ ...window.__joystick_ssr_props__ }, { page }), document.getElementById('app'));
108
+ })();
109
+ }
110
+
111
+ export default ${componentName};
112
+ `
113
+ );
114
+ }
115
+
116
+ if (componentName && isPageComponent) {
117
+ contents = contents.replace(
118
+ `${exportDefaultMatch};`,
119
+ `if (
120
+ typeof window !== 'undefined' &&
121
+ window.__joystick_ssr__ === true &&
122
+ !window.__joystick_layout_page__ &&
123
+ ui &&
124
+ ui.mount
125
+ ) {
126
+ ui.mount(${componentName}, window.__joystick_ssr_props__ || {}, document.getElementById('app'));
127
+ }
128
+
129
+ export default ${componentName};
130
+ `
131
+ );
132
+ }
133
+
134
+ return {
135
+ contents,
136
+ loader: "js",
137
+ };
138
+ }
139
+ } catch (exception) {
140
+ console.warn(exception);
141
+ }
142
+ });
143
+
144
+ build.onEnd(() => {
145
+ return new Promise((resolve) => {
146
+ const shouldSetComponentId = [
147
+ getPlatformSafePath("ui/"),
148
+ getPlatformSafePath("email/"),
149
+ ].some((bootstrapTarget) => {
150
+ return build.initialOptions.outfile.includes(bootstrapTarget);
151
+ });
152
+
153
+ if (shouldSetComponentId) {
154
+ const file = fs.readFileSync(build.initialOptions.outfile, "utf-8");
155
+ const joystickUIMatches =
156
+ file?.match(JOYSTICK_COMPONENT_REGEX) || [];
157
+
158
+ if (joystickUIMatches?.length > 0) {
159
+ let contents = setComponentId(file)?.replace(
160
+ /\.component\(\/\*\*\//g,
161
+ ".component("
162
+ );
163
+ fs.writeFileSync(build.initialOptions.outfile, contents);
164
+ }
165
+ }
166
+
167
+ resolve();
168
+ });
169
+ });
170
+ },
171
+ },
172
+ generateFileDependencyMap: {
173
+ name: "generateFileDependencyMap",
174
+ setup(build) {
175
+ build.onLoad({ filter: /\.js$/ }, (args) => {
176
+ try {
177
+ const canAddToMap = ![
178
+ "node_modules",
179
+ ".joystick",
180
+ "?",
181
+ "commonjsHelpers.js",
182
+ ].some((excludedPath) => {
183
+ return getPlatformSafePath(args.path).includes(excludedPath);
184
+ });
185
+
186
+ if (canAddToMap) {
187
+ const code = fs.readFileSync(
188
+ getPlatformSafePath(args.path),
189
+ "utf-8"
190
+ );
191
+ updateFileMap(getPlatformSafePath(args.path), code);
192
+ }
193
+ } catch (exception) {
194
+ console.warn(exception);
195
+ }
196
+ });
197
+ },
198
+ },
199
+ warnNodeEnvironment: {
200
+ name: "warnNodeEnvironment",
201
+ setup(build) {
202
+ build.onLoad({ filter: /\.js$/ }, (args = {}) => {
203
+ const code = fs.readFileSync(args.path, "utf-8");
204
+
205
+ if (code?.match(/process.env.NODE_ENV\s+=\s/gi)?.length) {
206
+ console.warn(
207
+ chalk.yellowBright(
208
+ "\n[WARNING] process.env.NODE_ENV should only be set via a CLI flag in development or via external environment variables in production.\n"
209
+ )
210
+ );
211
+ }
212
+ });
213
+ },
214
+ },
215
+ };