retold 1.0.6 → 4.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 (71) hide show
  1. package/.claude/settings.local.json +58 -0
  2. package/CLAUDE.md +52 -0
  3. package/docs/.nojekyll +0 -0
  4. package/docs/README.md +161 -0
  5. package/docs/_sidebar.md +65 -0
  6. package/docs/_topbar.md +6 -0
  7. package/docs/architecture.md +312 -0
  8. package/docs/cover.md +15 -0
  9. package/docs/css/docuserve.css +73 -0
  10. package/docs/fable.md +198 -0
  11. package/docs/getting-started.md +272 -0
  12. package/docs/index.html +39 -0
  13. package/docs/js/pict.min.js +12 -0
  14. package/docs/js/pict.min.js.map +1 -0
  15. package/docs/meadow.md +211 -0
  16. package/docs/modules.md +96 -0
  17. package/docs/orator.md +164 -0
  18. package/docs/pict-docuserve.min.js +58 -0
  19. package/docs/pict-docuserve.min.js.map +1 -0
  20. package/docs/pict.md +213 -0
  21. package/docs/retold-building-documentation.md +33 -0
  22. package/docs/retold-catalog.json +2826 -0
  23. package/docs/retold-keyword-index.json +161289 -0
  24. package/docs/utility.md +63 -0
  25. package/examples/quickstart/README.md +47 -0
  26. package/examples/quickstart/layer1/README.md +21 -0
  27. package/examples/quickstart/layer1/index.js +49 -0
  28. package/examples/quickstart/layer1/package-lock.json +344 -0
  29. package/examples/quickstart/layer1/package.json +12 -0
  30. package/examples/quickstart/layer2/README.md +34 -0
  31. package/examples/quickstart/layer2/index.js +251 -0
  32. package/examples/quickstart/layer2/package-lock.json +4468 -0
  33. package/examples/quickstart/layer2/package.json +17 -0
  34. package/examples/quickstart/layer2/setup-database.js +61 -0
  35. package/examples/quickstart/layer3/README.md +39 -0
  36. package/examples/quickstart/layer3/index.js +91 -0
  37. package/examples/quickstart/layer3/package-lock.json +1936 -0
  38. package/examples/quickstart/layer3/package.json +14 -0
  39. package/examples/quickstart/layer4/README.md +47 -0
  40. package/examples/quickstart/layer4/generate-build-config.js +18 -0
  41. package/examples/quickstart/layer4/html/index.html +17 -0
  42. package/examples/quickstart/layer4/package-lock.json +13206 -0
  43. package/examples/quickstart/layer4/package.json +38 -0
  44. package/examples/quickstart/layer4/server.js +28 -0
  45. package/examples/quickstart/layer4/source/BookStore-Application-Config.json +15 -0
  46. package/examples/quickstart/layer4/source/BookStore-Application.js +54 -0
  47. package/examples/quickstart/layer4/source/providers/Router-Config.json +18 -0
  48. package/examples/quickstart/layer4/source/views/View-About.js +38 -0
  49. package/examples/quickstart/layer4/source/views/View-Home.js +50 -0
  50. package/examples/quickstart/layer4/source/views/View-Layout.js +60 -0
  51. package/examples/quickstart/layer5/README.md +26 -0
  52. package/examples/quickstart/layer5/index.js +121 -0
  53. package/examples/quickstart/layer5/package-lock.json +345 -0
  54. package/examples/quickstart/layer5/package.json +13 -0
  55. package/modules/.claude/settings.local.json +52 -0
  56. package/modules/CLAUDE.md +60 -0
  57. package/modules/Checkout.sh +42 -0
  58. package/modules/Include-Retold-Module-List.sh +15 -0
  59. package/modules/Retold-Modules.md +24 -0
  60. package/modules/Status.sh +59 -0
  61. package/modules/Update.sh +45 -0
  62. package/modules/fable/Fable.md +2 -0
  63. package/modules/meadow/Meadow.md +1 -0
  64. package/modules/orator/Orator.md +1 -0
  65. package/modules/pict/Pict.md +1 -0
  66. package/package.json +30 -35
  67. package/source/Retold.cjs +2 -0
  68. package/test/Retold_tests.js +23 -41
  69. package/.travis.yml +0 -13
  70. package/source/Retold-Meadow-Macros.js +0 -269
  71. package/source/Retold.js +0 -48
@@ -0,0 +1,63 @@
1
+ # Utility — Build & Documentation Tools
2
+
3
+ The utility group provides supporting tools for building, documenting, testing, and supervising Retold applications.
4
+
5
+ ## Modules
6
+
7
+ ### [Indoctrinate](/utility/indoctrinate/)
8
+
9
+ Documentation scaffolding and generation. Scans source trees, catalogs content with automatic label-based metadata, and generates structured output in multiple formats. Powers the Retold documentation hub by generating cross-module catalogs and keyword search indexes.
10
+
11
+ **Key features:** Content cataloging with label-based filtering, multi-format output (HTML, LaTeX, text), Retold catalog generation for cross-repo documentation, lunr-based keyword index for cross-module search.
12
+
13
+ **npm:** `indoctrinate` · **Version:** 1.0.x
14
+
15
+ ---
16
+
17
+ ### [Manyfest](/utility/manyfest/)
18
+
19
+ JSON manifest for consistent data description and parsing across all application layers — database, API, frontend, and UI. Provides address-based access patterns for reading and writing nested object properties with validation and type coercion.
20
+
21
+ **Key features:** Address-based data access (dot notation and array indexing), type validation and coercion, manifest-driven form generation, schema description for data layers.
22
+
23
+ **npm:** `manyfest` · **Version:** 1.0.x
24
+
25
+ ---
26
+
27
+ ### [Quackage](/utility/quackage/)
28
+
29
+ Standardized build tool for Retold modules. Handles browser bundling (Browserify), transpilation, unit testing, file management, JSON view assembly, and documentation generation from a single CLI.
30
+
31
+ ```bash
32
+ npx quack build # Build browser bundle
33
+ npx quack test # Run Mocha tests
34
+ npx quack coverage # Generate coverage report
35
+ ```
36
+
37
+ **npm:** `quackage` · **Version:** 1.0.x
38
+
39
+ ---
40
+
41
+ ### [Choreographic](/utility/choreographic/)
42
+
43
+ Scaffolding for single-run data processing scripts. Provides pre-packaged application services — file reading/writing, logging, and organized output folders — for tasks like data migration, report generation, and batch processing.
44
+
45
+ **npm:** `choreographic` · **Version:** 1.0.x
46
+
47
+ ---
48
+
49
+ ### [Ultravisor](/utility/ultravisor/)
50
+
51
+ Process supervision tool for running commands on schedule with LLM integration. Supports distributed nodes, global state, and flexible task types (shell, browser, HTTP, database).
52
+
53
+ **npm:** `ultravisor` · **Version:** 1.0.x
54
+
55
+ ## All Utility Modules
56
+
57
+ | Module | Description |
58
+ |--------|-------------|
59
+ | [indoctrinate](/utility/indoctrinate/) | Documentation scaffolding with content cataloging and cross-module search |
60
+ | [manyfest](/utility/manyfest/) | JSON manifest for data description, validation, and address-based access |
61
+ | [quackage](/utility/quackage/) | Build tool for browser bundles, testing, and packaging |
62
+ | [choreographic](/utility/choreographic/) | Scaffolding for single-run data processing scripts |
63
+ | [ultravisor](/utility/ultravisor/) | Process supervision with scheduled tasks and LLM integration |
@@ -0,0 +1,47 @@
1
+ # Retold Quickstart Examples
2
+
3
+ Working examples for each part of the Retold stack, corresponding to the
4
+ [Getting Started](../../docs/getting-started.md) documentation.
5
+
6
+ Retold applications are assembled from a layered architecture (see
7
+ [Architecture](../../docs/architecture.md)):
8
+
9
+ ```
10
+ Layer 5 — Your Application (business logic, custom endpoints)
11
+ Layer 4 — Orator (HTTP server, middleware, static files)
12
+ Layer 3 — Meadow-Endpoints (auto-generated CRUD routes)
13
+ Layer 2 — Meadow + FoxHound + Stricture (data broker, SQL, schemas)
14
+ Layer 1 — Fable (DI, configuration, logging, UUID, expressions)
15
+
16
+ Pict — Browser MVC (views, templates, providers, application lifecycle)
17
+ Utility — Build tools, manifest management, documentation, process supervision
18
+ ```
19
+
20
+ ## Examples
21
+
22
+ | Folder | Retold Layer | Module | Description |
23
+ |--------|-------------|--------|-------------|
24
+ | [layer1](layer1/) | Layer 1 — Fable | **Fable** | Core DI, configuration, logging, service provider pattern |
25
+ | [layer2](layer2/) | Layer 2 — Meadow | **Meadow** | Data access with MySQL (CRUD, schemas, FoxHound queries) |
26
+ | [layer3](layer3/) | Layer 4 — Orator | **Orator** | REST API server with Restify |
27
+ | [layer4](layer4/) | Pict | **Pict** | Browser MVC with views, templates, and routing |
28
+ | [layer5](layer5/) | Utility | **Manyfest** | Object navigation and schema validation |
29
+
30
+ ## Running
31
+
32
+ Each example is self-contained. Enter any directory and run:
33
+
34
+ ```bash
35
+ npm install
36
+ npm start # or npm run demo for examples that need setup
37
+ ```
38
+
39
+ The Meadow example (layer2) requires a running MySQL server on localhost:3306.
40
+ Run `npm run setup` first to create the database and tables.
41
+
42
+ The Pict example (layer4) requires a build step before serving:
43
+
44
+ ```bash
45
+ npm install
46
+ npm run demo # builds then serves on http://localhost:8086
47
+ ```
@@ -0,0 +1,21 @@
1
+ # Layer 1: Fable - The Foundation
2
+
3
+ > Retold Layer 1 — Core Ecosystem: dependency injection, configuration, logging,
4
+ > UUID generation, expressions
5
+
6
+ Fable is the foundation of every Retold application. All other modules depend on
7
+ it and register as services through the Fable service provider pattern.
8
+
9
+ ## Run
10
+
11
+ ```bash
12
+ npm install
13
+ npm start
14
+ ```
15
+
16
+ ## What This Demonstrates
17
+
18
+ - Creating a Fable instance with configuration
19
+ - Logging at different levels
20
+ - UUID generation
21
+ - The service provider pattern (creating and using custom services)
@@ -0,0 +1,49 @@
1
+ const libFable = require('fable');
2
+
3
+ // 1. Create a Fable instance with configuration
4
+ let _Fable = new libFable(
5
+ {
6
+ Product: 'BookStore',
7
+ ProductVersion: '1.0.0'
8
+ });
9
+
10
+ // 2. Logging
11
+ _Fable.log.info('BookStore starting up...');
12
+ _Fable.log.info(`Product: ${_Fable.settings.Product} v${_Fable.settings.ProductVersion}`);
13
+
14
+ // 3. UUID generation
15
+ _Fable.log.info(`Generated UUID: ${_Fable.getUUID()}`);
16
+
17
+ // 4. Service Provider pattern: create a custom service
18
+ class BookService extends libFable.ServiceProviderBase
19
+ {
20
+ constructor(pFable, pOptions, pServiceHash)
21
+ {
22
+ super(pFable, pOptions, pServiceHash);
23
+ this.serviceType = 'BookService';
24
+ this._Books = [];
25
+ }
26
+
27
+ addBook(pTitle, pAuthor)
28
+ {
29
+ let tmpBook = { id: this.fable.getUUID(), title: pTitle, author: pAuthor };
30
+ this._Books.push(tmpBook);
31
+ this.fable.log.info(`Added book: "${pTitle}" by ${pAuthor}`);
32
+ return tmpBook;
33
+ }
34
+
35
+ listBooks()
36
+ {
37
+ return this._Books;
38
+ }
39
+ }
40
+
41
+ // 5. Register and use the service
42
+ _Fable.serviceManager.addServiceType('BookService', BookService);
43
+ _Fable.serviceManager.instantiateServiceProvider('BookService');
44
+
45
+ _Fable.BookService.addBook('The Hobbit', 'J.R.R. Tolkien');
46
+ _Fable.BookService.addBook('Dune', 'Frank Herbert');
47
+
48
+ _Fable.log.info(`Total books: ${_Fable.BookService.listBooks().length}`);
49
+ _Fable.log.info('Layer 1 example complete.');
@@ -0,0 +1,344 @@
1
+ {
2
+ "name": "retold-quickstart-layer1-fable",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "retold-quickstart-layer1-fable",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "fable": "^3.1.51"
12
+ }
13
+ },
14
+ "node_modules/async.eachlimit": {
15
+ "version": "0.5.2",
16
+ "resolved": "https://registry.npmjs.org/async.eachlimit/-/async.eachlimit-0.5.2.tgz",
17
+ "integrity": "sha512-emWKSFjCbXnrCJfM2NBMyriJQrdem+LrchiMQtCavBQnJ80N2C7IBhUz8vXnjYYh+aAkY0zZSofNxVYJMTDMIw==",
18
+ "license": "MIT",
19
+ "dependencies": {
20
+ "async.util.eachoflimit": "0.5.2",
21
+ "async.util.withoutindex": "0.5.2"
22
+ }
23
+ },
24
+ "node_modules/async.iterator": {
25
+ "version": "0.5.2",
26
+ "resolved": "https://registry.npmjs.org/async.iterator/-/async.iterator-0.5.2.tgz",
27
+ "integrity": "sha512-Ryg+D9tPYvcHbI3HknGfd6cgQaevwv/9lBpa3KbFrNWDcpsvc4BbpQLGpvaLNCJXM0Uzty/GDKuI2XktiIe0Ng==",
28
+ "license": "MIT"
29
+ },
30
+ "node_modules/async.util.eachoflimit": {
31
+ "version": "0.5.2",
32
+ "resolved": "https://registry.npmjs.org/async.util.eachoflimit/-/async.util.eachoflimit-0.5.2.tgz",
33
+ "integrity": "sha512-oZksH0sBW0AEOJKgBCQ79io9DZruoRBLTAea/Ik36pejR7pDpByvtXeuJsoZdPwSVslsrQcsUfucbUaiXYBnAQ==",
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "async.util.keyiterator": "0.5.2",
37
+ "async.util.noop": "0.5.2",
38
+ "async.util.once": "0.5.2",
39
+ "async.util.onlyonce": "0.5.2"
40
+ }
41
+ },
42
+ "node_modules/async.util.ensureasync": {
43
+ "version": "0.5.2",
44
+ "resolved": "https://registry.npmjs.org/async.util.ensureasync/-/async.util.ensureasync-0.5.2.tgz",
45
+ "integrity": "sha512-sQufNz4JYLHO/7ZUklaTGJtiX36gCp28McNNcMZfVYPm/wqi1pKk4xRCPr2DOZDM6KfA54zjG36jQjBU2mLzXg==",
46
+ "license": "MIT",
47
+ "dependencies": {
48
+ "async.util.restparam": "0.5.2",
49
+ "async.util.setimmediate": "0.5.2"
50
+ }
51
+ },
52
+ "node_modules/async.util.isarray": {
53
+ "version": "0.5.2",
54
+ "resolved": "https://registry.npmjs.org/async.util.isarray/-/async.util.isarray-0.5.2.tgz",
55
+ "integrity": "sha512-wbUzlrwON8RUgi+v/rhF0U99Ce8Osjcn+JP/mFNg6ymvShcobAOvE6cvLajSY5dPqKCOE1xfdhefgBif11zZgw==",
56
+ "license": "MIT"
57
+ },
58
+ "node_modules/async.util.isarraylike": {
59
+ "version": "0.5.2",
60
+ "resolved": "https://registry.npmjs.org/async.util.isarraylike/-/async.util.isarraylike-0.5.2.tgz",
61
+ "integrity": "sha512-DbFpsz3ZFNkohAW8IpGTlm8gotU32zpqe3Y2XkEA/G3XNO6rmUTKPpo7XgXUruoI+AsGi8+0zWpJHe7t1sLiAg==",
62
+ "license": "MIT",
63
+ "dependencies": {
64
+ "async.util.isarray": "0.5.2"
65
+ }
66
+ },
67
+ "node_modules/async.util.keyiterator": {
68
+ "version": "0.5.2",
69
+ "resolved": "https://registry.npmjs.org/async.util.keyiterator/-/async.util.keyiterator-0.5.2.tgz",
70
+ "integrity": "sha512-cktrETawCwgu13y3KZs2uMGFnNHc+IjKPZsavtRaoCjLELkePb2co4zrr+ghPvEqLXZIJPTKqC2HFZgJTssMVw==",
71
+ "license": "MIT",
72
+ "dependencies": {
73
+ "async.util.isarraylike": "0.5.2",
74
+ "async.util.keys": "0.5.2"
75
+ }
76
+ },
77
+ "node_modules/async.util.keys": {
78
+ "version": "0.5.2",
79
+ "resolved": "https://registry.npmjs.org/async.util.keys/-/async.util.keys-0.5.2.tgz",
80
+ "integrity": "sha512-umCOCRCRYwIC2Ho3fbuhKwIIe7OhQsVoVKGoF5GoQiGJUmjP4TG0Bmmcdpm7yW/znoIGKpnjKzVQz0niH4tfqw==",
81
+ "license": "MIT"
82
+ },
83
+ "node_modules/async.util.noop": {
84
+ "version": "0.5.2",
85
+ "resolved": "https://registry.npmjs.org/async.util.noop/-/async.util.noop-0.5.2.tgz",
86
+ "integrity": "sha512-AdwShXwE0KoskgqVJAck8zcM32nIHj3AC8ZN62ZaR5srhrY235Nw18vOJZWxcOfhxdVM0hRVKM8kMx7lcl7cCQ==",
87
+ "license": "MIT"
88
+ },
89
+ "node_modules/async.util.once": {
90
+ "version": "0.5.2",
91
+ "resolved": "https://registry.npmjs.org/async.util.once/-/async.util.once-0.5.2.tgz",
92
+ "integrity": "sha512-YQ5WPzDTt2jlblUDkq2I5RV/KiAJErJ4/0cEFhYPaZzqIuF/xDzdGvnEKe7UeuoMszsVPeajzcpKgkbwdb9MUA==",
93
+ "license": "MIT"
94
+ },
95
+ "node_modules/async.util.onlyonce": {
96
+ "version": "0.5.2",
97
+ "resolved": "https://registry.npmjs.org/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz",
98
+ "integrity": "sha512-UgQvkU9JZ+I0Cm1f56XyGXcII+J3d/5XWUuHpcevlItuA3WFSJcqZrsyAUck2FkRSD8BwYQX1zUTDp3SJMVESg==",
99
+ "license": "MIT"
100
+ },
101
+ "node_modules/async.util.restparam": {
102
+ "version": "0.5.2",
103
+ "resolved": "https://registry.npmjs.org/async.util.restparam/-/async.util.restparam-0.5.2.tgz",
104
+ "integrity": "sha512-Q9Z+zgmtMxFX5i7CnBvNOkgrL5hptztCqwarQluyNudUUk4iCmyjmsQl8MuQEjNh3gGqP5ayvDaextL1VXXgIg==",
105
+ "license": "MIT"
106
+ },
107
+ "node_modules/async.util.setimmediate": {
108
+ "version": "0.5.2",
109
+ "resolved": "https://registry.npmjs.org/async.util.setimmediate/-/async.util.setimmediate-0.5.2.tgz",
110
+ "integrity": "sha512-aCYF85ZFCQ9Xn0106GcOVx+LvFguIIzfbfRTOlQoie3G4KeSjURfA6f7CfpFAF09FNP2A1MtdjeFdvYeTGDebw==",
111
+ "license": "MIT"
112
+ },
113
+ "node_modules/async.util.withoutindex": {
114
+ "version": "0.5.2",
115
+ "resolved": "https://registry.npmjs.org/async.util.withoutindex/-/async.util.withoutindex-0.5.2.tgz",
116
+ "integrity": "sha512-CTHbQc+1kHkK6izoXIVIiYjePgmAzvXecETn/eVuzhwL9BDC3oFLNiIrr57fKwyarZyy8PedVIpQNrqgA9KzNA==",
117
+ "license": "MIT"
118
+ },
119
+ "node_modules/async.waterfall": {
120
+ "version": "0.5.2",
121
+ "resolved": "https://registry.npmjs.org/async.waterfall/-/async.waterfall-0.5.2.tgz",
122
+ "integrity": "sha512-3eC5jwgBF0/CNTAwBQYCMybqd6ResDwsdyl3+i5qf1L7fYekVR5gbMzpBca7VoZj1W0BFsHcvjW3UeJstEt2kQ==",
123
+ "license": "MIT",
124
+ "dependencies": {
125
+ "async.iterator": "0.5.2",
126
+ "async.util.ensureasync": "0.5.2",
127
+ "async.util.isarray": "0.5.2",
128
+ "async.util.noop": "0.5.2",
129
+ "async.util.once": "0.5.2",
130
+ "async.util.restparam": "0.5.2"
131
+ }
132
+ },
133
+ "node_modules/big.js": {
134
+ "version": "7.0.1",
135
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-7.0.1.tgz",
136
+ "integrity": "sha512-iFgV784tD8kq4ccF1xtNMZnXeZzVuXWWM+ERFzKQjv+A5G9HC8CY3DuV45vgzFFcW+u2tIvmF95+AzWgs6BjCg==",
137
+ "license": "MIT",
138
+ "engines": {
139
+ "node": "*"
140
+ },
141
+ "funding": {
142
+ "type": "opencollective",
143
+ "url": "https://opencollective.com/bigjs"
144
+ }
145
+ },
146
+ "node_modules/cachetrax": {
147
+ "version": "1.0.4",
148
+ "resolved": "https://registry.npmjs.org/cachetrax/-/cachetrax-1.0.4.tgz",
149
+ "integrity": "sha512-VoqtXp+tEdcbmiR0eJcdERsaBKhmdeVjpZ2jeVadDq25iM7hvZAFu+BCKMHitWzpkgb/Dw4RAouQBGnXbADPBg==",
150
+ "license": "MIT",
151
+ "dependencies": {
152
+ "fable-serviceproviderbase": "^3.0.7"
153
+ }
154
+ },
155
+ "node_modules/cookie": {
156
+ "version": "1.1.1",
157
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
158
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
159
+ "license": "MIT",
160
+ "engines": {
161
+ "node": ">=18"
162
+ },
163
+ "funding": {
164
+ "type": "opencollective",
165
+ "url": "https://opencollective.com/express"
166
+ }
167
+ },
168
+ "node_modules/data-arithmatic": {
169
+ "version": "1.0.7",
170
+ "resolved": "https://registry.npmjs.org/data-arithmatic/-/data-arithmatic-1.0.7.tgz",
171
+ "integrity": "sha512-Z1SBuORrjrlCx9AAx2Cy4yBYrsqtKEz7BzdcLWLMT/t78q3N5/4qjA+63zeMYUAvp9EsIKfQ8X0++Ls9xwaLag==",
172
+ "license": "MIT",
173
+ "dependencies": {
174
+ "fable-serviceproviderbase": "^3.0.2"
175
+ }
176
+ },
177
+ "node_modules/dayjs": {
178
+ "version": "1.11.19",
179
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz",
180
+ "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==",
181
+ "license": "MIT"
182
+ },
183
+ "node_modules/decompress-response": {
184
+ "version": "6.0.0",
185
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
186
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
187
+ "license": "MIT",
188
+ "dependencies": {
189
+ "mimic-response": "^3.1.0"
190
+ },
191
+ "engines": {
192
+ "node": ">=10"
193
+ },
194
+ "funding": {
195
+ "url": "https://github.com/sponsors/sindresorhus"
196
+ }
197
+ },
198
+ "node_modules/fable": {
199
+ "version": "3.1.53",
200
+ "resolved": "https://registry.npmjs.org/fable/-/fable-3.1.53.tgz",
201
+ "integrity": "sha512-2b7sWs1K3Bl9V8biZ5VSy36YvojanAAKvOZM7hGMg+opLLt/Pk/lIEvucz4m16Vz+C3UDLWf7WKJqdBoEj8A1w==",
202
+ "license": "MIT",
203
+ "dependencies": {
204
+ "async.eachlimit": "^0.5.2",
205
+ "async.waterfall": "^0.5.2",
206
+ "big.js": "^7.0.1",
207
+ "cachetrax": "^1.0.4",
208
+ "cookie": "^1.0.2",
209
+ "data-arithmatic": "^1.0.7",
210
+ "dayjs": "^1.11.19",
211
+ "fable-log": "^3.0.16",
212
+ "fable-serviceproviderbase": "^3.0.16",
213
+ "fable-settings": "^3.0.12",
214
+ "fable-uuid": "^3.0.11",
215
+ "manyfest": "^1.0.43",
216
+ "simple-get": "^4.0.1"
217
+ }
218
+ },
219
+ "node_modules/fable-log": {
220
+ "version": "3.0.16",
221
+ "resolved": "https://registry.npmjs.org/fable-log/-/fable-log-3.0.16.tgz",
222
+ "integrity": "sha512-o9/eIdak/iDy8Cc+Q8NeYUf7AwqYZvr3EaeeGmVd6X7+Ao/c1y5u9x5I54WZmwcYcySukmf2BEiQvS/itoliVw==",
223
+ "license": "MIT",
224
+ "dependencies": {
225
+ "fable-serviceproviderbase": "^3.0.15"
226
+ }
227
+ },
228
+ "node_modules/fable-serviceproviderbase": {
229
+ "version": "3.0.16",
230
+ "resolved": "https://registry.npmjs.org/fable-serviceproviderbase/-/fable-serviceproviderbase-3.0.16.tgz",
231
+ "integrity": "sha512-jvv1MO/xSNTInRwCFZz56ON4UNVwcOnLuLJlkfzqKXSbN9O8M6E7TYFExkM/UsG35dzDnApilz6Zmg3FvES4Cg==",
232
+ "license": "MIT"
233
+ },
234
+ "node_modules/fable-settings": {
235
+ "version": "3.0.12",
236
+ "resolved": "https://registry.npmjs.org/fable-settings/-/fable-settings-3.0.12.tgz",
237
+ "integrity": "sha512-zzvoLcsIp06vNu5dXYV5FSQD1V1APj2IaYbhj8SJ3IHmb9pUrQm63ejGEC4fEEk+jBznHHe+RH6OEwtx6plh+g==",
238
+ "license": "MIT",
239
+ "dependencies": {
240
+ "fable-serviceproviderbase": "^3.0.15",
241
+ "precedent": "^1.0.15"
242
+ }
243
+ },
244
+ "node_modules/fable-uuid": {
245
+ "version": "3.0.11",
246
+ "resolved": "https://registry.npmjs.org/fable-uuid/-/fable-uuid-3.0.11.tgz",
247
+ "integrity": "sha512-ZNFmcc2HI16J6rqiLfkShzzNgeHjbInM0Ur70tAgXlQm/jWqIpU3OFAyTesrz4dVQ5+wCxjp7PQadF7YJ0hNIw==",
248
+ "license": "MIT",
249
+ "dependencies": {
250
+ "fable-serviceproviderbase": "^3.0.15"
251
+ }
252
+ },
253
+ "node_modules/manyfest": {
254
+ "version": "1.0.44",
255
+ "resolved": "https://registry.npmjs.org/manyfest/-/manyfest-1.0.44.tgz",
256
+ "integrity": "sha512-8sI1zQ5lysMW879Lb5VtksmpOy4M2vZIl2IjIzMo5lOWu1MmLZGX/MQxdBu0Klnf4fJwscainclMYs9/P3JXUQ==",
257
+ "license": "MIT",
258
+ "dependencies": {
259
+ "fable-serviceproviderbase": "^3.0.15"
260
+ }
261
+ },
262
+ "node_modules/mimic-response": {
263
+ "version": "3.1.0",
264
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
265
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
266
+ "license": "MIT",
267
+ "engines": {
268
+ "node": ">=10"
269
+ },
270
+ "funding": {
271
+ "url": "https://github.com/sponsors/sindresorhus"
272
+ }
273
+ },
274
+ "node_modules/once": {
275
+ "version": "1.4.0",
276
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
277
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
278
+ "license": "ISC",
279
+ "dependencies": {
280
+ "wrappy": "1"
281
+ }
282
+ },
283
+ "node_modules/precedent": {
284
+ "version": "1.0.15",
285
+ "resolved": "https://registry.npmjs.org/precedent/-/precedent-1.0.15.tgz",
286
+ "integrity": "sha512-tidXY4JvTudvJ/Jmb8OzHFpX6qUSPwmS7K/BChA7xDb7eqmfHjH3AAO+IhCz3k7k+bh31YNdblSIEkYnCIYelw==",
287
+ "license": "MIT",
288
+ "bin": {
289
+ "precedent": "bin/Precedent"
290
+ }
291
+ },
292
+ "node_modules/simple-concat": {
293
+ "version": "1.0.1",
294
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
295
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
296
+ "funding": [
297
+ {
298
+ "type": "github",
299
+ "url": "https://github.com/sponsors/feross"
300
+ },
301
+ {
302
+ "type": "patreon",
303
+ "url": "https://www.patreon.com/feross"
304
+ },
305
+ {
306
+ "type": "consulting",
307
+ "url": "https://feross.org/support"
308
+ }
309
+ ],
310
+ "license": "MIT"
311
+ },
312
+ "node_modules/simple-get": {
313
+ "version": "4.0.1",
314
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
315
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
316
+ "funding": [
317
+ {
318
+ "type": "github",
319
+ "url": "https://github.com/sponsors/feross"
320
+ },
321
+ {
322
+ "type": "patreon",
323
+ "url": "https://www.patreon.com/feross"
324
+ },
325
+ {
326
+ "type": "consulting",
327
+ "url": "https://feross.org/support"
328
+ }
329
+ ],
330
+ "license": "MIT",
331
+ "dependencies": {
332
+ "decompress-response": "^6.0.0",
333
+ "once": "^1.3.1",
334
+ "simple-concat": "^1.0.0"
335
+ }
336
+ },
337
+ "node_modules/wrappy": {
338
+ "version": "1.0.2",
339
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
340
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
341
+ "license": "ISC"
342
+ }
343
+ }
344
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "retold-quickstart-layer1-fable",
3
+ "version": "1.0.0",
4
+ "description": "Retold Quickstart: Layer 1 - Fable (Core DI, Configuration, Logging)",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "start": "node index.js"
8
+ },
9
+ "dependencies": {
10
+ "fable": "^3.1.51"
11
+ }
12
+ }
@@ -0,0 +1,34 @@
1
+ # Layer 2: Meadow - Data Access
2
+
3
+ > Retold Layer 2 — Data broker / ORM: Meadow + FoxHound (query DSL) + Stricture
4
+ > (schema DDL), with pluggable database connections (MySQL, MSSQL, SQLite)
5
+
6
+ Meadow provides provider-agnostic CRUD operations with automatic audit columns,
7
+ soft deletes, and schema-driven query generation through FoxHound.
8
+
9
+ ## Prerequisites
10
+
11
+ A MySQL server running locally on port 3306 with root access.
12
+
13
+ ## Run
14
+
15
+ ```bash
16
+ npm install
17
+ npm run setup # Creates the database and table
18
+ npm start # Runs CRUD operations
19
+ ```
20
+
21
+ Or run both steps together:
22
+
23
+ ```bash
24
+ npm install
25
+ npm run demo
26
+ ```
27
+
28
+ ## What This Demonstrates
29
+
30
+ - Connecting to MySQL via the Meadow connection provider
31
+ - Defining entity schemas (Meadow schema + JSON schema)
32
+ - Full CRUD operations: Create, Read, Reads, Update, Delete
33
+ - FoxHound query builder with filters, sorting, and pagination
34
+ - Audit columns (CreateDate, UpdateDate) and soft deletes