fable 3.1.72 → 3.1.73

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 (37) hide show
  1. package/docs/README.md +30 -6
  2. package/docs/_brand.json +18 -0
  3. package/docs/_playground.json +10 -0
  4. package/docs/_sidebar.md +2 -0
  5. package/docs/_version.json +3 -3
  6. package/docs/architecture.md +201 -39
  7. package/docs/index.html +6 -7
  8. package/docs/pict-docuserve.min.js +91 -0
  9. package/docs/pict-docuserve.min.js.map +1 -0
  10. package/docs/playground.md +38 -0
  11. package/docs/retold-catalog.json +1 -1
  12. package/docs/retold-keyword-index.json +8721 -8105
  13. package/docs/services/README.md +26 -9
  14. package/docs/services/anticipate.md +104 -40
  15. package/docs/services/csv-parser.md +63 -35
  16. package/docs/services/data-format.md +154 -49
  17. package/docs/services/data-generation.md +77 -16
  18. package/docs/services/dates.md +103 -36
  19. package/docs/services/environment-data.md +13 -2
  20. package/docs/services/expression-parser.md +280 -68
  21. package/docs/services/file-persistence.md +142 -150
  22. package/docs/services/logging.md +93 -37
  23. package/docs/services/logic.md +70 -22
  24. package/docs/services/manifest.md +114 -26
  25. package/docs/services/math.md +168 -63
  26. package/docs/services/meta-template.md +312 -158
  27. package/docs/services/object-cache.md +94 -11
  28. package/docs/services/operation.md +68 -6
  29. package/docs/services/progress-time.md +74 -13
  30. package/docs/services/progress-tracker-set.md +101 -3
  31. package/docs/services/rest-client.md +136 -104
  32. package/docs/services/settings-manager.md +133 -40
  33. package/docs/services/template.md +71 -22
  34. package/docs/services/utility.md +121 -29
  35. package/docs/services/uuid.md +58 -10
  36. package/package.json +2 -2
  37. package/.claude/settings.local.json +0 -8
@@ -5,8 +5,13 @@ The FilePersistence service provides file system operations for reading and writ
5
5
  ## Access
6
6
 
7
7
  ```javascript
8
+ const libFable = require('fable');
9
+ const fable = new libFable({ Product: 'FilePersistDemo', ProductVersion: '1.0.0' });
10
+
8
11
  // On-demand service - instantiate when needed
12
+ // (Browser implementation is a stub; full file system access requires Node.js.)
9
13
  const filePersistence = fable.instantiateServiceProvider('FilePersistence');
14
+ console.log('filePersistence:', typeof filePersistence);
10
15
  ```
11
16
 
12
17
  ## Browser vs Node.js
@@ -21,31 +26,31 @@ Fable automatically uses the appropriate implementation:
21
26
  ### Read File (Async)
22
27
 
23
28
  ```javascript
24
- filePersistence.readFile('/path/to/file.txt', 'utf8', (error, content) => {
25
- if (error) {
26
- console.error('Read error:', error);
27
- return;
28
- }
29
- console.log('Content:', content);
30
- });
29
+ // Node.js reference browser playground has no fs.
30
+ console.info("In Node.js:");
31
+ console.info(" filePersistence.readFile('/path/to/file.txt', 'utf8', (error, content) => {");
32
+ console.info(" if (error) { console.error('Read error:', error); return; }");
33
+ console.info(" console.log('Content:', content);");
34
+ console.info(" });");
31
35
  ```
32
36
 
33
37
  ### Read File Sync
34
38
 
35
39
  ```javascript
36
- const content = filePersistence.readFileSync('/path/to/file.txt', 'utf8');
40
+ // Node.js reference — browser playground has no fs.
41
+ console.info("In Node.js:");
42
+ console.info(" const content = filePersistence.readFileSync('/path/to/file.txt', 'utf8');");
37
43
  ```
38
44
 
39
45
  ### Read JSON File
40
46
 
41
47
  ```javascript
42
- filePersistence.readJSONFile('/path/to/data.json', (error, data) => {
43
- if (error) {
44
- console.error('Failed to read JSON:', error);
45
- return;
46
- }
47
- console.log('Data:', data);
48
- });
48
+ // Node.js reference browser playground has no fs.
49
+ console.info("In Node.js:");
50
+ console.info(" filePersistence.readJSONFile('/path/to/data.json', (error, data) => {");
51
+ console.info(" if (error) { console.error('Failed to read JSON:', error); return; }");
52
+ console.info(" console.log('Data:', data);");
53
+ console.info(" });");
49
54
  ```
50
55
 
51
56
  ## Writing Files
@@ -53,33 +58,32 @@ filePersistence.readJSONFile('/path/to/data.json', (error, data) => {
53
58
  ### Write File (Async)
54
59
 
55
60
  ```javascript
56
- filePersistence.writeFile('/path/to/file.txt', 'Hello, World!', 'utf8', (error) => {
57
- if (error) {
58
- console.error('Write error:', error);
59
- return;
60
- }
61
- console.log('File written successfully');
62
- });
61
+ // Node.js reference browser playground has no fs.
62
+ console.info("In Node.js:");
63
+ console.info(" filePersistence.writeFile('/path/to/file.txt', 'Hello, World!', 'utf8', (error) => {");
64
+ console.info(" if (error) { console.error('Write error:', error); return; }");
65
+ console.info(" console.log('File written successfully');");
66
+ console.info(" });");
63
67
  ```
64
68
 
65
69
  ### Write File Sync
66
70
 
67
71
  ```javascript
68
- filePersistence.writeFileSync('/path/to/file.txt', 'Hello, World!', 'utf8');
72
+ // Node.js reference browser playground has no fs.
73
+ console.info("In Node.js:");
74
+ console.info(" filePersistence.writeFileSync('/path/to/file.txt', 'Hello, World!', 'utf8');");
69
75
  ```
70
76
 
71
77
  ### Write JSON File
72
78
 
73
79
  ```javascript
74
- const data = { name: 'John', age: 30 };
75
-
76
- filePersistence.writeJSONFile('/path/to/data.json', data, (error) => {
77
- if (error) {
78
- console.error('Failed to write JSON:', error);
79
- return;
80
- }
81
- console.log('JSON written successfully');
82
- });
80
+ // Node.js reference browser playground has no fs.
81
+ console.info("In Node.js:");
82
+ console.info(" const data = { name: 'John', age: 30 };");
83
+ console.info(" filePersistence.writeJSONFile('/path/to/data.json', data, (error) => {");
84
+ console.info(" if (error) { console.error('Failed to write JSON:', error); return; }");
85
+ console.info(" console.log('JSON written successfully');");
86
+ console.info(" });");
83
87
  ```
84
88
 
85
89
  ## CSV File Operations
@@ -87,51 +91,41 @@ filePersistence.writeJSONFile('/path/to/data.json', data, (error) => {
87
91
  ### Read CSV File
88
92
 
89
93
  ```javascript
90
- filePersistence.readCSVFile('/path/to/data.csv', (error, rows) => {
91
- if (error) {
92
- console.error('Failed to read CSV:', error);
93
- return;
94
- }
95
-
96
- // rows is an array of arrays
97
- rows.forEach(row => {
98
- console.log(row.join(', '));
99
- });
100
- });
94
+ // Node.js reference browser playground has no fs.
95
+ console.info("In Node.js:");
96
+ console.info(" filePersistence.readCSVFile('/path/to/data.csv', (error, rows) => {");
97
+ console.info(" if (error) { console.error('Failed to read CSV:', error); return; }");
98
+ console.info(" // rows is an array of arrays");
99
+ console.info(" rows.forEach(row => console.log(row.join(', ')));");
100
+ console.info(" });");
101
101
  ```
102
102
 
103
103
  ### Read CSV to Objects
104
104
 
105
105
  ```javascript
106
- filePersistence.readCSVFileToObjects('/path/to/data.csv', (error, objects) => {
107
- if (error) {
108
- console.error('Failed to read CSV:', error);
109
- return;
110
- }
111
-
112
- // objects is an array of objects with headers as keys
113
- objects.forEach(obj => {
114
- console.log(obj.name, obj.age);
115
- });
116
- });
106
+ // Node.js reference browser playground has no fs.
107
+ console.info("In Node.js:");
108
+ console.info(" filePersistence.readCSVFileToObjects('/path/to/data.csv', (error, objects) => {");
109
+ console.info(" if (error) { console.error('Failed to read CSV:', error); return; }");
110
+ console.info(" // objects is an array of objects with headers as keys");
111
+ console.info(" objects.forEach(obj => console.log(obj.name, obj.age));");
112
+ console.info(" });");
117
113
  ```
118
114
 
119
115
  ### Write CSV File
120
116
 
121
117
  ```javascript
122
- const rows = [
123
- ['name', 'age', 'city'],
124
- ['John', '30', 'New York'],
125
- ['Jane', '25', 'Los Angeles']
126
- ];
127
-
128
- filePersistence.writeCSVFile('/path/to/output.csv', rows, (error) => {
129
- if (error) {
130
- console.error('Failed to write CSV:', error);
131
- return;
132
- }
133
- console.log('CSV written successfully');
134
- });
118
+ // Node.js reference — browser playground has no fs.
119
+ console.info("In Node.js:");
120
+ console.info(" const rows = [");
121
+ console.info(" ['name', 'age', 'city'],");
122
+ console.info(" ['John', '30', 'New York'],");
123
+ console.info(" ['Jane', '25', 'Los Angeles']");
124
+ console.info(" ];");
125
+ console.info(" filePersistence.writeCSVFile('/path/to/output.csv', rows, (error) => {");
126
+ console.info(" if (error) { console.error('Failed to write CSV:', error); return; }");
127
+ console.info(" console.log('CSV written successfully');");
128
+ console.info(" });");
135
129
  ```
136
130
 
137
131
  ## Directory Operations
@@ -139,43 +133,47 @@ filePersistence.writeCSVFile('/path/to/output.csv', rows, (error) => {
139
133
  ### Check if File Exists
140
134
 
141
135
  ```javascript
142
- const exists = filePersistence.fileExists('/path/to/file.txt');
136
+ // Node.js reference — browser playground has no fs.
137
+ console.info("In Node.js:");
138
+ console.info(" const exists = filePersistence.fileExists('/path/to/file.txt');");
143
139
  ```
144
140
 
145
141
  ### Check if Directory Exists
146
142
 
147
143
  ```javascript
148
- const exists = filePersistence.directoryExists('/path/to/directory');
144
+ // Node.js reference — browser playground has no fs.
145
+ console.info("In Node.js:");
146
+ console.info(" const exists = filePersistence.directoryExists('/path/to/directory');");
149
147
  ```
150
148
 
151
149
  ### Create Directory
152
150
 
153
151
  ```javascript
154
- filePersistence.createDirectory('/path/to/new/directory', (error) => {
155
- if (error) {
156
- console.error('Failed to create directory:', error);
157
- return;
158
- }
159
- console.log('Directory created');
160
- });
152
+ // Node.js reference browser playground has no fs.
153
+ console.info("In Node.js:");
154
+ console.info(" filePersistence.createDirectory('/path/to/new/directory', (error) => {");
155
+ console.info(" if (error) { console.error('Failed to create directory:', error); return; }");
156
+ console.info(" console.log('Directory created');");
157
+ console.info(" });");
161
158
  ```
162
159
 
163
160
  ### Create Directory Sync
164
161
 
165
162
  ```javascript
166
- filePersistence.createDirectorySync('/path/to/new/directory');
163
+ // Node.js reference — browser playground has no fs.
164
+ console.info("In Node.js:");
165
+ console.info(" filePersistence.createDirectorySync('/path/to/new/directory');");
167
166
  ```
168
167
 
169
168
  ### List Directory
170
169
 
171
170
  ```javascript
172
- filePersistence.listDirectory('/path/to/directory', (error, files) => {
173
- if (error) {
174
- console.error('Failed to list directory:', error);
175
- return;
176
- }
177
- files.forEach(file => console.log(file));
178
- });
171
+ // Node.js reference browser playground has no fs.
172
+ console.info("In Node.js:");
173
+ console.info(" filePersistence.listDirectory('/path/to/directory', (error, files) => {");
174
+ console.info(" if (error) { console.error('Failed to list directory:', error); return; }");
175
+ console.info(" files.forEach(file => console.log(file));");
176
+ console.info(" });");
179
177
  ```
180
178
 
181
179
  ## Use Cases
@@ -183,92 +181,86 @@ filePersistence.listDirectory('/path/to/directory', (error, files) => {
183
181
  ### Configuration Loading
184
182
 
185
183
  ```javascript
186
- function loadConfig(configPath) {
187
- const filePersistence = fable.instantiateServiceProvider('FilePersistence');
188
-
189
- return new Promise((resolve, reject) => {
190
- filePersistence.readJSONFile(configPath, (error, config) => {
191
- if (error) reject(error);
192
- else resolve(config);
193
- });
194
- });
195
- }
184
+ // Node.js reference — wraps the callback API in a Promise. Browser playground has no fs.
185
+ console.info("In Node.js:");
186
+ console.info(" function loadConfig(configPath) {");
187
+ console.info(" const filePersistence = fable.instantiateServiceProvider('FilePersistence');");
188
+ console.info(" return new Promise((resolve, reject) => {");
189
+ console.info(" filePersistence.readJSONFile(configPath, (error, config) => {");
190
+ console.info(" if (error) reject(error);");
191
+ console.info(" else resolve(config);");
192
+ console.info(" });");
193
+ console.info(" });");
194
+ console.info(" }");
196
195
  ```
197
196
 
198
197
  ### Log File Writing
199
198
 
200
199
  ```javascript
201
- function appendToLog(message) {
202
- const filePersistence = fable.instantiateServiceProvider('FilePersistence');
203
- const logPath = '/var/log/myapp/app.log';
204
- const timestamp = new Date().toISOString();
205
- const line = `${timestamp} - ${message}\n`;
206
-
207
- filePersistence.appendFile(logPath, line, 'utf8', (error) => {
208
- if (error) console.error('Failed to write log:', error);
209
- });
210
- }
200
+ // Node.js reference — browser playground has no fs.
201
+ console.info("In Node.js:");
202
+ console.info(" function appendToLog(message) {");
203
+ console.info(" const filePersistence = fable.instantiateServiceProvider('FilePersistence');");
204
+ console.info(" const logPath = '/var/log/myapp/app.log';");
205
+ console.info(" const timestamp = new Date().toISOString();");
206
+ console.info(" const line = `${timestamp} - ${message}\\n`;");
207
+ console.info(" filePersistence.appendFile(logPath, line, 'utf8', (error) => {");
208
+ console.info(" if (error) console.error('Failed to write log:', error);");
209
+ console.info(" });");
210
+ console.info(" }");
211
211
  ```
212
212
 
213
213
  ### Data Export
214
214
 
215
215
  ```javascript
216
- async function exportData(data, format, outputPath) {
217
- const filePersistence = fable.instantiateServiceProvider('FilePersistence');
218
-
219
- return new Promise((resolve, reject) => {
220
- if (format === 'json') {
221
- filePersistence.writeJSONFile(outputPath, data, (err) => {
222
- err ? reject(err) : resolve();
223
- });
224
- } else if (format === 'csv') {
225
- filePersistence.writeCSVFile(outputPath, data, (err) => {
226
- err ? reject(err) : resolve();
227
- });
228
- }
229
- });
230
- }
216
+ // Node.js reference browser playground has no fs.
217
+ console.info("In Node.js:");
218
+ console.info(" async function exportData(data, format, outputPath) {");
219
+ console.info(" const filePersistence = fable.instantiateServiceProvider('FilePersistence');");
220
+ console.info(" return new Promise((resolve, reject) => {");
221
+ console.info(" if (format === 'json') {");
222
+ console.info(" filePersistence.writeJSONFile(outputPath, data, (err) => err ? reject(err) : resolve());");
223
+ console.info(" } else if (format === 'csv') {");
224
+ console.info(" filePersistence.writeCSVFile(outputPath, data, (err) => err ? reject(err) : resolve());");
225
+ console.info(" }");
226
+ console.info(" });");
227
+ console.info(" }");
231
228
  ```
232
229
 
233
230
  ### Batch File Processing
234
231
 
235
232
  ```javascript
236
- function processFiles(directory, processor) {
237
- const filePersistence = fable.instantiateServiceProvider('FilePersistence');
238
-
239
- filePersistence.listDirectory(directory, (error, files) => {
240
- if (error) throw error;
241
-
242
- files.forEach(file => {
243
- const fullPath = `${directory}/${file}`;
244
- filePersistence.readFile(fullPath, 'utf8', (err, content) => {
245
- if (err) {
246
- console.error(`Failed to read ${file}:`, err);
247
- return;
248
- }
249
- processor(file, content);
250
- });
251
- });
252
- });
253
- }
233
+ // Node.js reference — browser playground has no fs.
234
+ console.info("In Node.js:");
235
+ console.info(" function processFiles(directory, processor) {");
236
+ console.info(" const filePersistence = fable.instantiateServiceProvider('FilePersistence');");
237
+ console.info(" filePersistence.listDirectory(directory, (error, files) => {");
238
+ console.info(" if (error) throw error;");
239
+ console.info(" files.forEach(file => {");
240
+ console.info(" const fullPath = `${directory}/${file}`;");
241
+ console.info(" filePersistence.readFile(fullPath, 'utf8', (err, content) => {");
242
+ console.info(" if (err) { console.error(`Failed to read ${file}:`, err); return; }");
243
+ console.info(" processor(file, content);");
244
+ console.info(" });");
245
+ console.info(" });");
246
+ console.info(" });");
247
+ console.info(" }");
254
248
  ```
255
249
 
256
250
  ## Error Handling
257
251
 
258
252
  ```javascript
259
- filePersistence.readFile('/nonexistent/file.txt', 'utf8', (error, content) => {
260
- if (error) {
261
- if (error.code === 'ENOENT') {
262
- console.log('File does not exist');
263
- } else if (error.code === 'EACCES') {
264
- console.log('Permission denied');
265
- } else {
266
- console.error('Unexpected error:', error);
267
- }
268
- return;
269
- }
270
- // Process content
271
- });
253
+ // Node.js reference browser playground has no fs.
254
+ console.info("In Node.js:");
255
+ console.info(" filePersistence.readFile('/nonexistent/file.txt', 'utf8', (error, content) => {");
256
+ console.info(" if (error) {");
257
+ console.info(" if (error.code === 'ENOENT') console.log('File does not exist');");
258
+ console.info(" else if (error.code === 'EACCES') console.log('Permission denied');");
259
+ console.info(" else console.error('Unexpected error:', error);");
260
+ console.info(" return;");
261
+ console.info(" }");
262
+ console.info(" // Process content");
263
+ console.info(" });");
272
264
  ```
273
265
 
274
266
  ## Notes