fable 3.0.85 → 3.0.87

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 (34) hide show
  1. package/debug/Harness.js +8 -10
  2. package/package.json +4 -3
  3. package/retold-harness/bookstore-serve-api.js +2 -2
  4. package/source/Fable.js +187 -50
  5. package/source/services/Fable-Service-Anticipate.js +1 -1
  6. package/source/services/Fable-Service-DataGeneration.js +1 -1
  7. package/source/services/Fable-Service-EnvironmentData-Web.js +1 -1
  8. package/source/services/Fable-Service-EnvironmentData.js +1 -1
  9. package/source/services/Fable-Service-FilePersistence-Web.js +18 -22
  10. package/source/services/Fable-Service-FilePersistence.js +51 -23
  11. package/source/services/Fable-Service-MetaTemplate.js +1 -1
  12. package/source/services/Fable-Service-Operation-DefaultSettings.js +4 -6
  13. package/source/services/Fable-Service-Operation.js +97 -3
  14. package/source/services/Fable-Service-RestClient.js +1 -1
  15. package/source/services/Fable-Service-Template.js +1 -1
  16. package/source/services/Fable-Service-Utility.js +3 -3
  17. package/test/Anticipate_tests.js +2 -2
  18. package/test/CSVParser_tests.js +1 -1
  19. package/test/Cache_tests.js +1 -1
  20. package/test/DataGeneration_tests.js +7 -7
  21. package/test/DateManipulation_tests.js +1 -1
  22. package/test/FableOperation_tests.js +33 -4
  23. package/test/FableServiceManager_tests.js +51 -51
  24. package/test/FilePersistence_tests.js +45 -12
  25. package/test/Manifest_tests.js +1 -1
  26. package/test/MetaTemplating_tests.js +1 -1
  27. package/test/RestClient_test.js +6 -6
  28. package/dist/fable.compatible.js +0 -3354
  29. package/dist/fable.compatible.min.js +0 -12
  30. package/dist/fable.compatible.min.js.map +0 -1
  31. package/dist/fable.js +0 -3354
  32. package/dist/fable.min.js +0 -12
  33. package/dist/fable.min.js.map +0 -1
  34. package/source/Fable-ServiceManager.js +0 -164
package/debug/Harness.js CHANGED
@@ -1,5 +1,4 @@
1
- let libBookstore = require('../retold-harness/bookstore-serve-meadow-endpoint-apis-run.js');
2
- /*
1
+ //let libBookstore = require('../retold-harness/bookstore-serve-meadow-endpoint-apis-run.js');
3
2
  const libFable = require('../source/Fable.js');
4
3
 
5
4
  class SimpleService extends libFable.ServiceProviderBase
@@ -19,21 +18,21 @@ class SimpleService extends libFable.ServiceProviderBase
19
18
 
20
19
  let testFable = new libFable({"Product": "FableDebugHarness"});
21
20
 
22
- testFable.serviceManager.addServiceType('SimpleService', SimpleService);
21
+ testFable.addServiceType('SimpleService', SimpleService);
23
22
 
24
- testFable.serviceManager.instantiateServiceProvider('SimpleService', {SomeOption: true}, 'SimpleService-123');
23
+ testFable.instantiateServiceProvider('SimpleService', {SomeOption: true}, 'SimpleService-123');
25
24
 
26
25
 
27
- testFable.serviceManager.services['SimpleService']['SimpleService-123'].doSomething();
26
+ testFable.servicesMap['SimpleService']['SimpleService-123'].doSomething();
28
27
 
29
- testFable.serviceManager.services['SimpleService']['SimpleService-123'].doSomething();
28
+ testFable.SimpleService.doSomething();
30
29
 
31
- console.log(`Initialized Service ${testFable.serviceManager.services['SimpleService']['SimpleService-123'].serviceType} as UUID ${testFable.serviceManager.services['SimpleService']['SimpleService-123'].UUID} with hash ${testFable.serviceManager.services['SimpleService']['SimpleService-123'].Hash}`);
30
+ console.log(`Initialized Service ${testFable.servicesMap['SimpleService']['SimpleService-123'].serviceType} as UUID ${testFable.servicesMap['SimpleService']['SimpleService-123'].UUID} with hash ${testFable.servicesMap['SimpleService']['SimpleService-123'].Hash}`);
32
31
 
33
- testFable.serviceManager.services['SimpleService']['SimpleService-123'].doSomething();
32
+ testFable.servicesMap['SimpleService']['SimpleService-123'].doSomething();
34
33
 
35
34
  // Instantiate the RestClient Service Provider
36
- let tmpRestClient = testFable.serviceManager.instantiateServiceProvider('RestClient', {TraceLog: true}, 'RestClient-99');
35
+ let tmpRestClient = testFable.instantiateServiceProvider('RestClient', {TraceLog: true}, 'RestClient-99');
37
36
 
38
37
  // Download the wiktionary entry for dog!
39
38
  tmpRestClient.getJSON('https://en.wiktionary.org/w/api.php?action=parse&prop=wikitext&format=json&page=dog',
@@ -41,4 +40,3 @@ tmpRestClient.getJSON('https://en.wiktionary.org/w/api.php?action=parse&prop=wik
41
40
  {
42
41
  testFable.log.info('Response received!');
43
42
  });
44
- */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fable",
3
- "version": "3.0.85",
3
+ "version": "3.0.87",
4
4
  "description": "An entity behavior management and API bundling library.",
5
5
  "main": "source/Fable.js",
6
6
  "scripts": {
@@ -10,7 +10,8 @@
10
10
  "build": "npx quack build",
11
11
  "docker-dev-build": "docker build ./ -f Dockerfile_LUXURYCode -t fable-image:local",
12
12
  "docker-dev-run": "docker run -it -d --name fable-dev -p 30001:8080 -p 38086:8086 -v \"$PWD/.config:/home/coder/.config\" -v \"$PWD:/home/coder/fable\" -u \"$(id -u):$(id -g)\" -e \"DOCKER_USER=$USER\" fable-image:local",
13
- "docker-dev-shell": "docker exec -it fable-dev /bin/bash"
13
+ "docker-dev-shell": "docker exec -it fable-dev /bin/bash",
14
+ "tests": "./node_modules/mocha/bin/_mocha -u tdd --exit -R spec --grep"
14
15
  },
15
16
  "mocha": {
16
17
  "diff": true,
@@ -60,7 +61,7 @@
60
61
  "data-arithmatic": "^1.0.7",
61
62
  "dayjs": "^1.11.10",
62
63
  "fable-log": "^3.0.12",
63
- "fable-serviceproviderbase": "^3.0.10",
64
+ "fable-serviceproviderbase": "^3.0.12",
64
65
  "fable-settings": "^3.0.8",
65
66
  "fable-uuid": "^3.0.5",
66
67
  "manyfest": "^1.0.25",
@@ -3,9 +3,9 @@ const _Settings = require('./configuration-bookstore-serve-api.js');
3
3
  const libFable = require('fable');
4
4
 
5
5
  _Fable = new libFable(_Settings);
6
- _Fable.serviceManager.addServiceType('RetoldDataService', require('retold-data-service'));
6
+ _Fable.addServiceType('RetoldDataService', require('retold-data-service'));
7
7
  // The RetoldDataService defaults to process.cwd() but we want to run this from wherever.
8
- _Fable.serviceManager.instantiateServiceProvider('RetoldDataService',
8
+ _Fable.instantiateServiceProvider('RetoldDataService',
9
9
  {
10
10
  "FullMeadowSchemaPath": `${__dirname}/model/`,
11
11
  "DALMeadowSchemaPath": `${__dirname}/model/meadow/`
package/source/Fable.js CHANGED
@@ -7,57 +7,74 @@ const libFableSettings = require('fable-settings');
7
7
  const libFableUUID = require('fable-uuid');
8
8
  const libFableLog = require('fable-log');
9
9
 
10
- const libFableServiceManager = require('./Fable-ServiceManager.js');
10
+ const libFableServiceBase = require('fable-serviceproviderbase');
11
11
 
12
- class Fable
12
+ class Fable extends libFableServiceBase.CoreServiceProviderBase
13
13
  {
14
14
  constructor(pSettings)
15
15
  {
16
- // Initialization Phase 0: Set up the lowest level state (core services)
17
- // Container for the core services prototypes.
18
- // This is here so if an API consumer changes the default for a core service,
19
- // fable still runs with what was initialized.
20
- this._coreServices = {};
16
+ super(pSettings);
17
+
18
+ // Initialization Phase 0: Set up the lowest level state (fable is a utility service manager at heart)
19
+ this.serviceType = 'ServiceManager';
20
+
21
+ // An array of the types of services available
22
+ this.serviceTypes = [];
23
+ // A map of instantiated services
24
+ this.servicesMap = {};
25
+ // A map of the default instantiated service by type
26
+ this.services = {};
27
+
28
+ // A map of class constructors for services
29
+ this.serviceClasses = {};
30
+
31
+ // If we need extra service initialization capabilities
32
+ this.extraServiceInitialization = false;
33
+
34
+
35
+ // Initialization Phase 1: Set up the core utility services
36
+ // These are things like power, water, and sewage. They are required for fable to run (e.g. logging, settings, etc)
21
37
 
22
38
  // Instantiate the default Settings Manager
23
- this._coreServices.SettingsManager = new libFableSettings(pSettings);
39
+ this.SettingsManager = new libFableSettings(pSettings);
40
+ this.SettingsManager = this.SettingsManager;
24
41
  // Instantiate the UUID generator
25
- this._coreServices.UUID = new libFableUUID(this._coreServices.SettingsManager.settings);
42
+ this.UUID = new libFableUUID(this.SettingsManager.settings);
26
43
  // Instantiate the logging system
27
- this._coreServices.Logging = new libFableLog(this._coreServices.SettingsManager.settings);
28
- this._coreServices.Logging.initialize();
44
+ this.Logging = new libFableLog(this.SettingsManager.settings);
45
+ this.Logging.initialize();
29
46
 
30
- // Initialization Phase 1: Instantiate the service manager
31
- // This is the start actual bootstrapping point for fable
32
- this._coreServices.ServiceManager = new libFableServiceManager(this);
33
- this.serviceManager = this._coreServices.ServiceManager;
34
- this.serviceManager.connectFable(this);
35
- // Bootstrapping of fable into the Service Manager is complete
47
+ // Initialization Phase 1.5: Instantiate the service manager
48
+ // This is the start actual bootstrapping point for fable.
49
+ // For consistency fable is treated as a service.
50
+ this.ServiceManager = this;
51
+ this.connectFable(this);
52
+ // --> Bootstrapping of fable into the Service Manager is complete
36
53
 
37
54
  // Initialization Phase 2: Map in the default services.
38
55
  // They will then be available in the Default service provider set as well.
39
- this.serviceManager.connectPreinitServiceProviderInstance(this._coreServices.ServiceManager);
40
- this.serviceManager.connectPreinitServiceProviderInstance(this._coreServices.UUID);
41
- this.serviceManager.connectPreinitServiceProviderInstance(this._coreServices.Logging);
42
- this.serviceManager.connectPreinitServiceProviderInstance(this._coreServices.SettingsManager);
56
+ this.connectPreinitServiceProviderInstance(this.UUID);
57
+ this.connectPreinitServiceProviderInstance(this.Logging);
58
+ this.connectPreinitServiceProviderInstance(this.SettingsManager);
43
59
 
44
60
  // Initialize and instantiate the default baked-in Data Arithmatic service
45
- this.serviceManager.addAndInstantiateServiceType('EnvironmentData', require('./services/Fable-Service-EnvironmentData.js'));
46
- this.serviceManager.addServiceType('Template', require('./services/Fable-Service-Template.js'));
47
- this.serviceManager.addServiceType('MetaTemplate', require('./services/Fable-Service-MetaTemplate.js'));
48
- this.serviceManager.addServiceType('Anticipate', require('./services/Fable-Service-Anticipate.js'));
49
- this.serviceManager.addAndInstantiateServiceType('Dates', require('./services/Fable-Service-DateManipulation.js'));
50
- this.serviceManager.addAndInstantiateServiceType('DataFormat', require('./services/Fable-Service-DataFormat.js'));
51
- this.serviceManager.addAndInstantiateServiceType('DataGeneration', require('./services/Fable-Service-DataGeneration.js'));
52
- this.serviceManager.addAndInstantiateServiceType('Utility', require('./services/Fable-Service-Utility.js'));
53
- this.serviceManager.addServiceType('Operation', require('./services/Fable-Service-Operation.js'));
54
- this.serviceManager.addServiceType('RestClient', require('./services/Fable-Service-RestClient.js'));
55
- this.serviceManager.addServiceType('CSVParser', require('./services/Fable-Service-CSVParser.js'));
56
- this.serviceManager.addServiceType('Manifest', require('manyfest'));
57
- this.serviceManager.addServiceType('ObjectCache', require('cachetrax'));
58
- this.serviceManager.addServiceType('FilePersistence', require('./services/Fable-Service-FilePersistence.js'));
61
+ this.addAndInstantiateServiceType('EnvironmentData', require('./services/Fable-Service-EnvironmentData.js'));
62
+ this.addServiceType('Template', require('./services/Fable-Service-Template.js'));
63
+ this.addServiceType('MetaTemplate', require('./services/Fable-Service-MetaTemplate.js'));
64
+ this.addServiceType('Anticipate', require('./services/Fable-Service-Anticipate.js'));
65
+ this.addAndInstantiateServiceType('Dates', require('./services/Fable-Service-DateManipulation.js'));
66
+ this.addAndInstantiateServiceType('DataFormat', require('./services/Fable-Service-DataFormat.js'));
67
+ this.addAndInstantiateServiceType('DataGeneration', require('./services/Fable-Service-DataGeneration.js'));
68
+ this.addAndInstantiateServiceType('Utility', require('./services/Fable-Service-Utility.js'));
69
+ this.addServiceType('Operation', require('./services/Fable-Service-Operation.js'));
70
+ this.addServiceType('RestClient', require('./services/Fable-Service-RestClient.js'));
71
+ this.addServiceType('CSVParser', require('./services/Fable-Service-CSVParser.js'));
72
+ this.addServiceType('Manifest', require('manyfest'));
73
+ this.addServiceType('ObjectCache', require('cachetrax'));
74
+ this.addServiceType('FilePersistence', require('./services/Fable-Service-FilePersistence.js'));
59
75
  }
60
76
 
77
+ /* State Accessors */
61
78
  get isFable()
62
79
  {
63
80
  return true;
@@ -65,38 +82,158 @@ class Fable
65
82
 
66
83
  get settings()
67
84
  {
68
- return this._coreServices.SettingsManager.settings;
85
+ return this.SettingsManager.settings;
69
86
  }
70
87
 
71
88
  get settingsManager()
72
89
  {
73
- return this._coreServices.SettingsManager;
90
+ return this.SettingsManager;
74
91
  }
75
92
 
76
- get log()
93
+ // For backwards compatibility
94
+ getUUID()
77
95
  {
78
- return this._coreServices.Logging;
96
+ return this.UUID.getUUID();
79
97
  }
80
98
 
81
- get services()
99
+ /* Service Manager Methods */
100
+ addServiceType(pServiceType, pServiceClass)
82
101
  {
83
- return this._coreServices.ServiceManager.services;
102
+ if (this.servicesMap.hasOwnProperty(pServiceType))
103
+ {
104
+ // TODO: Check if any services are running?
105
+ this.log.warn(`Adding a service type [${pServiceType}] that already exists.`);
106
+ }
107
+ else
108
+ {
109
+ // Add the container for instantiated services to go in
110
+ this.servicesMap[pServiceType] = {};
111
+
112
+ // Add the type to the list of types
113
+ this.serviceTypes.push(pServiceType);
114
+ }
115
+
116
+ // Using the static member of the class is a much more reliable way to check if it is a service class than instanceof
117
+ if ((typeof(pServiceClass) == 'function') && (pServiceClass.isFableService))
118
+ {
119
+ // Add the class to the list of classes
120
+ this.serviceClasses[pServiceType] = pServiceClass;
121
+ }
122
+ else
123
+ {
124
+ // Add the base class to the list of classes
125
+ this.log.error(`Attempted to add service type [${pServiceType}] with an invalid class. Using base service class, which will not crash but won't provide meaningful services.`);
126
+ this.serviceClasses[pServiceType] = libFableServiceBase;
127
+ }
84
128
  }
85
129
 
86
- get servicesMap()
130
+ // This is for the services that are meant to run mostly single-instance so need a default at initialization
131
+ addAndInstantiateServiceType(pServiceType, pServiceClass)
87
132
  {
88
- return this._coreServices.ServiceManager.servicesMap;
133
+ this.addServiceType(pServiceType, pServiceClass);
134
+ return this.instantiateServiceProvider(pServiceType, {}, `${pServiceType}-Default`);
89
135
  }
90
136
 
91
- getUUID()
137
+ // Some services expect to be overloaded / customized class.
138
+ instantiateServiceProviderFromPrototype(pServiceType, pOptions, pCustomServiceHash, pServicePrototype)
139
+ {
140
+ // Instantiate the service
141
+ let tmpService = new pServicePrototype(this, pOptions, pCustomServiceHash);
142
+
143
+ if (this.extraServiceInitialization)
144
+ {
145
+ tmpService = this.extraServiceInitialization(tmpService);
146
+ }
147
+
148
+ // Add the service to the service map
149
+ this.servicesMap[pServiceType][tmpService.Hash] = tmpService;
150
+
151
+ // If this is the first service of this type, make it the default
152
+ if (!this.services.hasOwnProperty(pServiceType))
153
+ {
154
+ this.setDefaultServiceInstantiation(pServiceType, tmpService.Hash)
155
+ }
156
+
157
+ return tmpService;
158
+ }
159
+
160
+ instantiateServiceProvider(pServiceType, pOptions, pCustomServiceHash)
161
+ {
162
+ // Instantiate the service
163
+ let tmpService = this.instantiateServiceProviderWithoutRegistration(pServiceType, pOptions, pCustomServiceHash);
164
+
165
+ // Add the service to the service map
166
+ this.servicesMap[pServiceType][tmpService.Hash] = tmpService;
167
+
168
+ // If this is the first service of this type, make it the default
169
+ if (!this.services.hasOwnProperty(pServiceType))
170
+ {
171
+ this.setDefaultServiceInstantiation(pServiceType, tmpService.Hash)
172
+ }
173
+
174
+ return tmpService;
175
+ }
176
+
177
+ // Create a service provider but don't register it to live forever in fable.services
178
+ instantiateServiceProviderWithoutRegistration(pServiceType, pOptions, pCustomServiceHash)
179
+ {
180
+ // Instantiate the service
181
+ let tmpService = new this.serviceClasses[pServiceType](this, pOptions, pCustomServiceHash);
182
+ if (this.extraServiceInitialization)
183
+ {
184
+ tmpService = this.extraServiceInitialization(tmpService);
185
+ }
186
+ return tmpService;
187
+ }
188
+
189
+ // Connect an initialized service provider that came before Fable was initialized
190
+ connectPreinitServiceProviderInstance(pServiceInstance)
92
191
  {
93
- return this._coreServices.UUID.getUUID();
192
+ let tmpServiceType = pServiceInstance.serviceType;
193
+ let tmpServiceHash = pServiceInstance.Hash;
194
+
195
+ // The service should already be instantiated, so just connect it to fable
196
+ pServiceInstance.connectFable(this);
197
+
198
+ // Add the service type to the map if it isn't there yet
199
+ if (!this.servicesMap.hasOwnProperty(tmpServiceType))
200
+ {
201
+ // If the core service hasn't registered itself yet, create the service container for it.
202
+ // This means you couldn't register another with this type unless it was later registered with a constructor class.
203
+ this.servicesMap[tmpServiceType] = {};
204
+ }
205
+ // Add the service to the service map
206
+ this.servicesMap[tmpServiceType][tmpServiceHash] = pServiceInstance;
207
+
208
+ // If this is the first service of this type, make it the default
209
+ if (!this.services.hasOwnProperty(tmpServiceType))
210
+ {
211
+ this.setDefaultServiceInstantiation(tmpServiceType, tmpServiceHash, false);
212
+ }
213
+
214
+ return pServiceInstance;
94
215
  }
95
216
 
96
- get fable()
217
+ setDefaultServiceInstantiation(pServiceType, pServiceHash, pOverwriteService)
97
218
  {
98
- return this;
99
- };
219
+ // Overwrite services by default, unless told not to
220
+ let tmpOverwriteService = (typeof(pOverwriteService) === 'undefined') ? true : pOverwriteService;
221
+ // Make sure the service exists
222
+ if (this.servicesMap[pServiceType].hasOwnProperty(pServiceHash))
223
+ {
224
+ if (!this.hasOwnProperty(pServiceType) || tmpOverwriteService)
225
+ {
226
+ this[pServiceType] = this.servicesMap[pServiceType][pServiceHash];
227
+ }
228
+ if (!this.services.hasOwnProperty(pServiceType) || tmpOverwriteService)
229
+ {
230
+ this.services[pServiceType] = this.servicesMap[pServiceType][pServiceHash];
231
+ }
232
+ return true;
233
+ }
234
+
235
+ return false;
236
+ }
100
237
  }
101
238
 
102
239
  // This is for backwards compatibility
@@ -109,7 +246,7 @@ module.exports = Fable;
109
246
  module.exports.new = autoConstruct;
110
247
 
111
248
  module.exports.LogProviderBase = libFableLog.LogProviderBase;
112
- module.exports.ServiceProviderBase = libFableServiceManager.ServiceProviderBase;
113
- module.exports.CoreServiceProviderBase = libFableServiceManager.CoreServiceProviderBase;
249
+ module.exports.ServiceProviderBase = libFableServiceBase;
250
+ module.exports.CoreServiceProviderBase = libFableServiceBase.CoreServiceProviderBase;
114
251
 
115
252
  module.exports.precedent = libFableSettings.precedent;
@@ -1,4 +1,4 @@
1
- const libFableServiceBase = require('../Fable-ServiceManager.js').ServiceProviderBase;
1
+ const libFableServiceBase = require('fable-serviceproviderbase');
2
2
 
3
3
  class FableServiceAnticipate extends libFableServiceBase
4
4
  {
@@ -1,4 +1,4 @@
1
- const libFableServiceBase = require('../Fable-ServiceManager.js').ServiceProviderBase;
1
+ const libFableServiceBase = require('fable-serviceproviderbase');
2
2
 
3
3
  class FableServiceDataGeneration extends libFableServiceBase
4
4
  {
@@ -1,4 +1,4 @@
1
- const libFableServiceBase = require('../Fable-ServiceManager.js').ServiceProviderBase;
1
+ const libFableServiceBase = require('fable-serviceproviderbase');
2
2
 
3
3
  class FableServiceEnvironmentData extends libFableServiceBase
4
4
  {
@@ -1,4 +1,4 @@
1
- const libFableServiceBase = require('../Fable-ServiceManager.js').ServiceProviderBase;
1
+ const libFableServiceBase = require('fable-serviceproviderbase');
2
2
 
3
3
  class FableServiceEnvironmentData extends libFableServiceBase
4
4
  {
@@ -1,37 +1,33 @@
1
- const libFableServiceBase = require('../Fable-ServiceManager.js').ServiceProviderBase;
1
+ const libFableServiceBase = require('fable-serviceproviderbase');
2
2
  //const libLokiDB = require('@lokidb/loki');
3
3
 
4
4
  class FableServiceFilePersistence extends libFableServiceBase
5
5
  {
6
6
  constructor(pFable, pOptions, pServiceHash)
7
7
  {
8
- super(pFable, pOptions, pServiceHash);
8
+ super(pFable, pOptions, pServiceHash);
9
9
 
10
- this.serviceType = 'FilePersistence';
11
-
12
- if (!this.options.hasOwnProperty('Mode'))
13
- {
14
- this.options.Mode = parseInt('0777', 8) & ~process.umask();
15
- }
10
+ this.serviceType = 'FilePersistence';
16
11
  }
17
12
 
18
- existsSync(pPath)
19
- {
20
- //return libFS.existsSync(pPath);
21
- return false;
22
- }
13
+ existsSync(pPath)
14
+ {
15
+ //return libFS.existsSync(pPath);
16
+ console.log('I SHOULD BE IN YOUR BUILD YO');
17
+ return false;
18
+ }
23
19
 
24
- exists(pPath, fCallback)
25
- {
26
- let tmpFileExists = this.existsSync(pPath);;
20
+ exists(pPath, fCallback)
21
+ {
22
+ let tmpFileExists = this.existsSync(pPath);;
27
23
 
28
- return fCallback(null, tmpFileExists);
29
- }
24
+ return fCallback(null, tmpFileExists);
25
+ }
30
26
 
31
- makeFolderRecursive (pParameters, fCallback)
32
- {
33
- return fCallback();
34
- }
27
+ makeFolderRecursive(pParameters, fCallback)
28
+ {
29
+ return fCallback();
30
+ }
35
31
  }
36
32
 
37
33
  module.exports = FableServiceFilePersistence;
@@ -1,7 +1,8 @@
1
- const libFableServiceBase = require('../Fable-ServiceManager.js').ServiceProviderBase;
1
+ const libFableServiceBase = require('fable-serviceproviderbase');
2
2
 
3
3
  const libFS = require('fs');
4
4
  const libPath = require('path');
5
+ const libReadline = require('readline');
5
6
 
6
7
 
7
8
  class FableServiceFilePersistence extends libFableServiceBase
@@ -17,8 +18,9 @@ class FableServiceFilePersistence extends libFableServiceBase
17
18
  this.options.Mode = parseInt('0777', 8) & ~process.umask();
18
19
  }
19
20
 
20
- this.currentInputFolder = `/tmp`;
21
- this.currentOutputFolder = `/tmp`;
21
+ this.libFS = libFS;
22
+ this.libPath = libPath;
23
+ this.libReadline = libReadline;
22
24
  }
23
25
 
24
26
  joinPath(...pPathArray)
@@ -38,12 +40,6 @@ class FableServiceFilePersistence extends libFableServiceBase
38
40
  return fCallback(null, tmpFileExists);
39
41
  }
40
42
 
41
- writeFileSync(pFileName, pFileContent, pOptions)
42
- {
43
- let tmpOptions = (typeof(pOptions) === 'undefined') ? 'utf8' : pOptions;
44
- return libFS.writeFileSync(pFileName, pFileContent, tmpOptions);
45
- }
46
-
47
43
  appendFileSync(pFileName, pAppendContent, pOptions)
48
44
  {
49
45
  let tmpOptions = (typeof(pOptions) === 'undefined') ? 'utf8' : pOptions;
@@ -60,6 +56,24 @@ class FableServiceFilePersistence extends libFableServiceBase
60
56
  return libFS.rmdirSync(pFileName);
61
57
  }
62
58
 
59
+ readFileSync(pFilePath, pOptions)
60
+ {
61
+ let tmpOptions = (typeof(pOptions) === 'undefined') ? 'utf8' : pOptions;
62
+ return libFS.readFileSync(pFilePath, tmpOptions);
63
+ }
64
+
65
+ readFile(pFilePath, pOptions, fCallback)
66
+ {
67
+ let tmpOptions = (typeof(pOptions) === 'undefined') ? 'utf8' : pOptions;
68
+ return libFS.readFile(pFilePath, tmpOptions, fCallback);
69
+ }
70
+
71
+ writeFileSync(pFileName, pFileContent, pOptions)
72
+ {
73
+ let tmpOptions = (typeof(pOptions) === 'undefined') ? 'utf8' : pOptions;
74
+ return libFS.writeFileSync(pFileName, pFileContent, tmpOptions);
75
+ }
76
+
63
77
  writeFileSyncFromObject(pFileName, pObject)
64
78
  {
65
79
  return this.writeFileSync(pFileName, JSON.stringify(pObject, null, 4));
@@ -81,26 +95,40 @@ class FableServiceFilePersistence extends libFableServiceBase
81
95
  }
82
96
  }
83
97
 
84
- // Default folder behaviors
85
-
86
- getDefaultOutputPath(pFileName)
98
+ writeFile(pFileName, pFileContent, pOptions, fCallback)
87
99
  {
88
- return libPath.join(this.currentOutputFolder, pFileName);
100
+ let tmpOptions = (typeof(pOptions) === 'undefined') ? 'utf8' : pOptions;
101
+ return libFS.writeFile(pFileName, pFileContent, tmpOptions, fCallback);
89
102
  }
90
103
 
91
- dataFolderWriteSync(pFileName, pFileContent)
104
+ lineReaderFactory(pFilePath, fOnLine, fOnComplete, fOnError)
92
105
  {
93
- return this.writeFileSync(this.getDefaultOutputPath(pFileName), pFileContent);
94
- }
106
+ let tmpLineReader = {};
95
107
 
96
- dataFolderWriteSyncFromObject(pFileName, pObject)
97
- {
98
- return this.writeFileSyncFromObject(this.getDefaultOutputPath(pFileName), pObject);
99
- }
108
+ if (typeof(pFilePath) != 'string')
109
+ {
110
+ return false;
111
+ }
100
112
 
101
- dataFolderWriteSyncFromArray(pFileName, pFileArray)
102
- {
103
- return this.writeFileSyncFromArray(this.getDefaultOutputPath(pFileName), pFileArray);
113
+ tmpLineReader.filePath = pFilePath;
114
+
115
+ tmpLineReader.fileStream = libFS.createReadStream(tmpLineReader.filePath);
116
+
117
+ tmpLineReader.reader = libReadline.createInterface({ input: tmpLineReader.fileStream, crlfDelay: Infinity });
118
+
119
+ if (typeof(fOnError) === 'function')
120
+ {
121
+ tmpLineReader.reader.on('error', fOnError);
122
+ }
123
+
124
+ tmpLineReader.reader.on('line', (typeof(fOnLine) === 'function') ? fOnLine : () => {});
125
+
126
+ if (typeof(fOnComplete) === 'function')
127
+ {
128
+ tmpLineReader.reader.on('close', fOnComplete);
129
+ }
130
+
131
+ return tmpLineReader;
104
132
  }
105
133
 
106
134
  // Folder management
@@ -1,4 +1,4 @@
1
- const libFableServiceBase = require('../Fable-ServiceManager.js').ServiceProviderBase;
1
+ const libFableServiceBase = require('fable-serviceproviderbase');
2
2
 
3
3
  /**
4
4
  * Precedent Meta-Templating
@@ -4,7 +4,7 @@ module.exports = (
4
4
  "UUID": false,
5
5
  "Hash": false,
6
6
 
7
- "Title": "",
7
+ "Name": "",
8
8
  "Summary": "",
9
9
 
10
10
  "Version": 0
@@ -15,12 +15,10 @@ module.exports = (
15
15
  "CompletionProgress": 0,
16
16
  "CompletionTimeElapsed": 0,
17
17
 
18
- "Steps": 1,
19
- "StepsCompleted": 0,
20
-
21
- "StartTime": 0,
22
- "EndTime": 0
18
+ "TimeStart": 0,
19
+ "TimeEnd": 0
23
20
  },
21
+ "Steps": [],
24
22
  "Errors": [],
25
23
  "Log": []
26
24
  }