From fc83c21bb6d7049555ea0b908d2b4afc348b8924 Mon Sep 17 00:00:00 2001 From: cha0s Date: Thu, 4 Jan 2024 18:39:21 -0600 Subject: [PATCH] chore: dox++ --- TODO.md | 4 +- packages/create-app/src/cli.js | 15 ++-- packages/web/package.json | 2 +- website/docs/adding-a-fleck.mdx | 41 ----------- website/docs/adding-flecks.mdx | 115 ++++++++++++++++++++++++++++++ website/docs/configuration.mdx | 22 +++--- website/docs/creating-a-fleck.mdx | 89 +++++++++-------------- website/docs/environment.mdx | 16 ++--- website/docs/flecks-web.png | Bin 0 -> 17527 bytes website/sidebars.js | 2 +- 10 files changed, 179 insertions(+), 127 deletions(-) delete mode 100644 website/docs/adding-a-fleck.mdx create mode 100644 website/docs/adding-flecks.mdx create mode 100644 website/docs/flecks-web.png diff --git a/TODO.md b/TODO.md index ed7184f..8ee6098 100644 --- a/TODO.md +++ b/TODO.md @@ -21,7 +21,7 @@ - [x] Rename all hooks to dot-first notation; rewrite `lookupFlecks()`. - [x] ensureUniqueReduction moved into invokeMerge - [x] `bootstrap({without: ['badplatform']})` should be handled by passing `{platforms: ['!badplatform']}` -- [ ] static documentation site generator +- [x] documentation site generator - [ ] config validation - [ ] hints for hook types - [ ] user redux server hydrate fails if no user in req @@ -31,7 +31,7 @@ - [ ] @babel/register@7.18.x has a bug - [ ] `$flecks/db/sequelize` should be `$flecks/db.sequelize` - [x] `url()` in styles breaks HMR -- [ ] 2 underscores for `FLECKS_ENV` variables +- [x] 2 underscores for `FLECKS_ENV` variables - [x] flecks add # Next diff --git a/packages/create-app/src/cli.js b/packages/create-app/src/cli.js index be3323b..dd7e452 100644 --- a/packages/create-app/src/cli.js +++ b/packages/create-app/src/cli.js @@ -39,9 +39,7 @@ const { throw new Error(`@flecks/create-app: invalid app name: ${errors.join(', ')}`); } const destination = join(FLECKS_CORE_ROOT, app); - if (!app.startsWith('@')) { - app = `@${app}/monorepo`; - } + const name = app.startsWith('@') ? app : `@${app}/monorepo`; if (!await testDestination(destination)) { const error = new Error( `@flecks/create-app: destination '${destination} already exists: aborting`, @@ -49,13 +47,16 @@ const { error.code = 129; throw error; } - const fileTree = await move(app, join(__dirname, 'template'), 'app', flecks); + const fileTree = await move(name, join(__dirname, 'template'), 'app', flecks); fileTree.pipe( 'build/flecks.yml', transform((chunk, encoding, done, stream) => { const yml = loadYml(chunk); - yml['@flecks/core/server'] = {packageManager}; - stream.push(dumpYml(yml, {sortKeys: true})); + if ('npm' !== packageManager) { + yml['@flecks/core/server'] = {packageManager}; + } + yml['@flecks/core'] = {id: app}; + stream.push(dumpYml(yml, {forceQuotes: true, sortKeys: true})); done(); }), ); @@ -67,6 +68,6 @@ const { // eslint-disable-next-line no-console console.error(error); } - }); + }); await program.parseAsync(process.argv); })(); diff --git a/packages/web/package.json b/packages/web/package.json index fb0f3ab..5adb243 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -45,7 +45,7 @@ "@babel/types": "^7.17.0", "@flecks/core": "^2.0.3", "@webpack-cli/serve": "^2.0.5", - "add-asset-html-webpack-plugin": "^6.0.0", + "add-asset-html-webpack-plugin": "^3.2.2", "assert": "^2.1.0", "autoprefixer": "^9.8.6", "before-build-webpack": "^0.2.13", diff --git a/website/docs/adding-a-fleck.mdx b/website/docs/adding-a-fleck.mdx deleted file mode 100644 index 667902c..0000000 --- a/website/docs/adding-a-fleck.mdx +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Adding a fleck -description: Add a fleck to your application to extend its functionality. ---- - -# Adding a fleck - -`@flecks/web` is a fleck that builds and serves a webpage. You can add it to your application -using flecks: - -```bash -npx flecks add @flecks/web -``` - -Now, if you run `npm start`, you'll see a line in the output: - -``` - @flecks/web/server/http HTTP server up @ 0.0.0.0:32340! -``` - -## Finally... a white page? - -If you visit `localhost:32340` in your browser, you should now see... a blank white page! Don't fret -though; if you open the devtools in your browser, you will see a little messaging from your -application that will look something like: - -``` -[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled. -[HMR] Waiting for update signal from WDS... -flecks client v2.0.3 loading runtime... -``` - -This is a good sign! This means we successfully added a web server with HMR enabled by default. -Oh, the possibilities... - -## Proceed with the hooking - -How does flecks know to start the web server when the application starts? Great question! This is -accomplished through the use of hooks. You'll see how to configure that hook in the next section. - -For now, we'll learn how to create our own fleck and do a little hooking of our own. Take that, dad! diff --git a/website/docs/adding-flecks.mdx b/website/docs/adding-flecks.mdx new file mode 100644 index 0000000..7bce271 --- /dev/null +++ b/website/docs/adding-flecks.mdx @@ -0,0 +1,115 @@ +--- +title: Adding flecks +description: Add flecks to your application to extend its functionality. +--- + +# Adding flecks + +`@flecks/web` is a fleck that builds and serves a webpage. You can add it to your application +using the CLI: + +```bash +npx flecks add @flecks/web +``` + +Now, if you run `npm start`, you'll see a line in the output: + +``` + @flecks/web/server/http HTTP server up @ 0.0.0.0:32340! +``` + +## Finally... a white page? + +If you visit `localhost:32340` in your browser, you should now see... a blank white page! Don't fret +though; if you open the devtools in your browser, you will see a little messaging from your +application that will look something like: + +``` +[webpack-dev-server] Server started: Hot Module Replacement enabled, Live Reloading enabled, Progress disabled, Overlay enabled. +[HMR] Waiting for update signal from WDS... +flecks client v2.0.3 loading runtime... +``` + +This is a good sign! This means we successfully added a web server with HMR enabled by default. +Oh, the possibilities... + +## Proceed with the hooking + +Let's make our fleck `say-hello` hook into `@flecks/web` client to do something when the client +comes up (e.g. the browser loads the page). + +```javascript title="packages/say-hello/src/index.js" +export const hooks = { + // highlight-start + '@flecks/web/client.up': async () => { + window.document.body.append('hello world'); + }, + // highlight-end + '@flecks/server.up': async (flecks) => { + const {id} = flecks.get('@flecks/core'); + process.stdout.write(` hello server: ID ${id}\n`); + }, +}; +``` + +Now, restart your application and refresh your website. Glorious, isn't it? + +![An image of our simple hello world application running inside a Chromium browser window](./flecks-web.png) + +## Everything so far... plus Electron! + +Let's add another core fleck. flecks ships with a core fleck `@flecks/electron`. This runs your +application inside of an instance of [Electron](https://www.electronjs.org/). You'll add the fleck: + +```bash +npx flecks add @flecks/electron +``` + +Then you'll update your `build/flecks.yml` like so: + +```yml +'@flecks/core': + id: 'hello-world' +'@flecks/electron': {} +// highlight-start +'@flecks/server': + up: + - '...' + - '@flecks/web' + - '@flecks/electron' +// highlight-end +'@flecks/web': {} +'@hello-world/say-hello:./packages/say-hello/src': {} +``` + +### ~~flecking~~ pecking order + +We added some configuration to `@flecks/server`. The `up` key configures the order in which flecks +are initialized when the server comes up. We make sure `@flecks/web` serves a webpage before +`@flecks/electron` tries to visit it. + +:::tip + +`'...'` just means "everything else": if any other flecks implement that hook then they will run +here in an **undefined** order. It is valid to provide entries both before and after `'...'`, but +`'...'` must only appear one time per list. + +The default configuration of +`@flecks/server.up` is simply: + +```yml +'@flecks/server': + up: + - '...' +``` + +However in this case the order of hook execution is undefined. That's why we configure it +explicitly. + +::: + +Finally `npm start` and you will see something like this: + +![An image of our simple hello world application running inside an Electron window](./flecks-electron.png) + +Isn't it beautiful? :relieved: diff --git a/website/docs/configuration.mdx b/website/docs/configuration.mdx index a251d33..7bd8e7a 100644 --- a/website/docs/configuration.mdx +++ b/website/docs/configuration.mdx @@ -5,8 +5,8 @@ description: Configure `build/flecks.yml` and your application. # Configuration -You have a flecks application! ...but it doesn't do much. This is because a flecks application is -composed of individual flecks and by default, your application will have only two flecks: +You have a flecks application! ...but it doesn't do much. By default, your application will have +only two flecks: `@flecks/core` and `@flecks/server`. Your `build/flecks.yml` file will look like this: ```yml title="build/flecks.yml" @@ -20,24 +20,22 @@ For a deep dive of configurable core flecks, see ## `build/flecks.yml` -A good first configuration step is to set the ID of your application. +Your flecks application stores its build configuration in a directory located at `build`. By +default, there is a single file located there: `flecks.yml`. This is where all the individual +flecks are configured. -Your application's ID is configured at the `id` key of `@flecks/core`'s configuration. To set your -application's ID to `hello_world`, update your `build/flecks.yml` to look like this: +Your application's ID is configured at the `id` key of `@flecks/core`'s configuration: ```yml title="build/flecks.yml" // highlight-start '@flecks/core': - id: 'hello_world' + id: 'hello-world' // highlight-end '@flecks/server': {} ``` -## Adding more +Notice that the ID was set automatically by the app creation utility. -If you were studious enough to take a peek at [the generated configuration page](/docs/flecks/@flecks/dox/config) -above, you may have noticed that there were a lot more flecks there than just the two in our -application. +## Moving forward -For instance, there is a `@flecks/web` fleck that turns your little old server application into one -that can build and serve a webpage. We'll see how to add it in the next section. +In the next section, we'll look at how to create a fleck. diff --git a/website/docs/creating-a-fleck.mdx b/website/docs/creating-a-fleck.mdx index 93248c8..774faca 100644 --- a/website/docs/creating-a-fleck.mdx +++ b/website/docs/creating-a-fleck.mdx @@ -4,30 +4,27 @@ description: A fleck is a module but also so much more. --- If you are following along from the previous getting started -[configuration page](./configuration), you have an application with 3 flecks: +[configuration page](./configuration), you have an application with 2 flecks: - `@flecks/core` - `@flecks/server` -- `@flecks/web`
- About that "3 flecks" thing... + About that "2 flecks" thing... - Actually, your server application has 6 flecks at this point: + Actually, your server application has **4 flecks** at this point: - `@flecks/core` - `@flecks/core/server` - `@flecks/server` - `@flecks/server/server` - - `@flecks/web` - - `@flecks/web/server` flecks will load the `[...]/server` fleck under any fleck that is loaded on the server. This is also the case when using `@flecks/web` which will automatically load `[...]/client` flecks which are only loaded in the browser. We'll be exploring this specifically in the next section. If you're intersted in diving deeper, see [the platforms concept page](#todo). - Some frameworks make it a little cheesier to work with isomorphic code, but the flecks + Some frameworks make it a little more opaque to work with isomorphic code, but the flecks philosophy is that visibility is believability: you'll have to be explicit about which code runs where.
@@ -63,7 +60,6 @@ After some output, you'll find your new fleck at `packages/say-hello`. Let's ins '@flecks/core': id: 'hello_world' '@flecks/server': {} -'@flecks/web': {} // highlight-next-line '@hello-world/say-hello:./packages/say-hello/src': {} ``` @@ -107,68 +103,53 @@ There is a source file at `packages/say-hello/src/index.js` but for now it's emp out a bit: ```javascript title="packages/say-hello/src/index.js" -exports.hooks = { - '@flecks/web/client.up': async () => { - window.document.body.append('hello world'); +export const hooks = { + '@flecks/server.up': async () => { + process.stdout.write(' hello server\n'); }, }; ``` -Now, restart your application and visit your website. Glorious, isn't it? - -## Everything so far... plus Electron! - -Let's add another core fleck. flecks ships with a core fleck `@flecks/electron`. This runs your -application inside of an instance of [Electron](https://www.electronjs.org/). You'll add the fleck: +Now, restart your application: ```bash -npx flecks add @flecks/electron +npm run start ``` -Then you'll update your `build/flecks.yml` like so: +You will be greeted by a line in the output: -```yml -'@flecks/core': - id: 'hello_world' -'@flecks/electron': {} -// highlight-start -'@flecks/server': - up: - - '...' - - '@flecks/web' - - '@flecks/electron' -// highlight-end -'@flecks/web': {} -'@hello-world/say-hello:./packages/say-hello/src': {} +```terminal + hello server ``` -### ~~flecking~~ pecking order +### flecks injection -We added some configuration to `@flecks/server`. The `up` key configures the order in which flecks -are initialized when the server comes up. We make sure `@flecks/web` serves a webpage before -`@flecks/electron` tries to visit it. +Hook implementations may receive arguments. After any arguments, the `flecks` instance is always +passed. -:::tip +`@flecks/server.up` doesn't pass any arguments, so the `flecks` instance is the first argument. +Let's see how to use the instance to read some configuration: -`'...'` just means "everything else": if any other flecks implement that hook then they will run -here. It is valid to provide entries both before and after `'...'`. - -The default configuration of -`@flecks/server.up` is simply: - -```yml -'@flecks/server': - up: - - '...' +```javascript title="packages/say-hello/src/index.js" +export const hooks = { + '@flecks/server.up': async (flecks) => { + const {id} = flecks.get('@flecks/core'); + process.stdout.write(` hello server: ID ${id}\n`); + }, +}; ``` -However in this case the order of hook execution is undefined. That's why we configure it -explicitly. +This time, you will see: + +```terminal + hello server: ID hello-world +``` + +:::note + +...or whatever your application's ID is. We're assuming you're following along from +[the configuration page](./configuration). ::: -Finally `npm start` and you will see something like this: - -![An image of our simple hello world application running inside an Electron window](./flecks-electron.png) - -Isn't it beautiful? :relieved: +Next, we'll add and interact with some of the flecks shipped by default. diff --git a/website/docs/environment.mdx b/website/docs/environment.mdx index af29e0a..53b75bb 100644 --- a/website/docs/environment.mdx +++ b/website/docs/environment.mdx @@ -18,37 +18,35 @@ so: ``` When running your application in different execution environments (say, production) you may want to -override configuration such as this. This is done by using the a prefix followed by the -fleck name and the key. The template literal for such a transformation would look like: +override configuration such as this. This is done by like so: ### Syntax ```javascript -`FLECKS_ENV__${Flecks.environmentalize(path)}__${key}` +`FLECKS_ENV__${Flecks.environmentalize(fleck)}__${key}` ``` -:::note +:::tip -Notice the `environmentalize` transformation: `@flecks/core`'s `id` key is set using the -following variable: +As an example, `@flecks/core`'s `id` key is set using the following variable: ```bash FLECKS_ENV__flecks_core__id=foobar ```
- `Flecks.environmentalize` + `Flecks.environmentalize` implementation ```javascript static environmentalize(path) { return path - // - `@flecks/core` -> `FLECKS_CORE` + // - `@flecks/core` -> `flecks_core` .replace(/[^a-zA-Z0-9]/g, '_') .replace(/_*(.*)_*/, '$1'); } ```
-Also note that the fleck path and key are still case-sensitive. This is because they are +Note that the fleck path and key are still case-sensitive. This is because they are user-defined. ::: diff --git a/website/docs/flecks-web.png b/website/docs/flecks-web.png new file mode 100644 index 0000000000000000000000000000000000000000..e5da34cd16a90ce4239e439e79da88613a1d00cc GIT binary patch literal 17527 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 F{{TFr$(H~C literal 0 HcmV?d00001 diff --git a/website/sidebars.js b/website/sidebars.js index 08d6e61..e0b3434 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -11,8 +11,8 @@ export default { items: [ 'installation', 'configuration', - 'adding-a-fleck', 'creating-a-fleck', + 'adding-flecks', ], }, {