UNPKG

7.71 kBJavaScriptView Raw
1var fs = require('fs');
2var path = require('path');
3
4// Generate service clients
5function ClientCreator() {
6 this._metadata = require('../apis/metadata');
7 this._apisFolderPath = path.join(__dirname, '..', 'apis');
8 this._clientFolderPath = path.join(__dirname, '..', 'clients');
9 this._serviceCustomizationsFolderPath = path.join(__dirname, '..', 'lib', 'services');
10 this._packageJsonPath = path.join(__dirname, '..', 'package.json');
11 this._apiFileNames = null;
12}
13
14ClientCreator.prototype.getAllApiFilenames = function getAllApiFilenames() {
15 if (this._apiFileNames) {
16 return this._apiFileNames;
17 }
18 var apiFileNames = fs.readdirSync(this._apisFolderPath);
19 // filter out metadata
20 this._apiFileNames = apiFileNames.filter(function(name) {
21 return name !== 'metadata.json';
22 });
23 return this._apiFileNames;
24};
25
26ClientCreator.prototype.getAllApiFilenamesForService = function getAllApiFilenamesForService(modelName) {
27 var serviceRegex = new RegExp('(^' + modelName + '-([\\d]{4}-[\\d]{2}-[\\d]{2})\\.([\\w]+))\\.json$');
28 var modelRegex = /(([\d]{4}-[\d]{2}-[\d]{2})\.([\w]+))\.json$/;
29
30 var models = {};
31 var versions = {};
32 this.getAllApiFilenames().filter(function(name) {
33 return name.search(serviceRegex) === 0;
34 }).forEach(function(name) {
35 var matches = name.match(serviceRegex);
36 if (!matches) {
37 return;
38 }
39 var model = matches[1];
40 var version = matches[2];
41 var modelType = matches[3];
42 if (!versions.hasOwnProperty(version)) {
43 versions[version] = {};
44 }
45 var versionInfo = versions[version];
46 switch (modelType) {
47 case 'min':
48 versionInfo.api = model;
49 break;
50 case 'paginators':
51 versionInfo.paginators = model;
52 break;
53 case 'waiters2':
54 versionInfo.waiters = model;
55 break;
56 default:
57 return;
58 }
59 });
60 models.versions = versions;
61 return models;
62};
63
64ClientCreator.prototype.customizationsExist = function customizationsExist(serviceName) {
65 var customizationsFolder = this._serviceCustomizationsFolderPath;
66 return fs.existsSync(path.join(customizationsFolder, serviceName + '.js'));
67};
68
69ClientCreator.prototype.generateClientFileSource = function generateClientFileSource(serviceMetadata, specifiedVersion) {
70 var clientFolderPath = this._clientFolderPath;
71 var className = serviceMetadata.name;
72 var serviceName = className.toLowerCase();
73 var modelName = serviceMetadata.prefix || serviceName;
74 specifiedVersion = specifiedVersion || '*';
75
76 // get models for the service
77 var models = this.getAllApiFilenamesForService(modelName);
78
79 var modelVersions = models && models.versions;
80 if (!modelVersions) {
81 throw new Error('Unable to get models for ' + modelName);
82 }
83 var obsoleteVersions = serviceMetadata.versions || [];
84 var versionNumbers = Object.keys(modelVersions);
85 var tab = ' ';
86 var code = '';
87 code += 'require(\'../lib/node_loader\');\n';
88 code += 'var AWS = require(\'../lib/core\');\n';
89 code += 'var Service = AWS.Service;\n';
90 code += 'var apiLoader = AWS.apiLoader;\n\n';
91 code += 'apiLoader.services[\'' + serviceName +'\'] = {};\n';
92 code += 'AWS.' + className + ' = Service.defineService(\'' + serviceName + '\', [\'' + [].concat(obsoleteVersions, versionNumbers).sort().join('\', \'') + '\']);\n';
93 // pull in service customizations
94 if (this.customizationsExist(serviceName)) {
95 code += 'require(\'../lib/services/' + serviceName + '\');\n';
96 }
97 versionNumbers.forEach(function(version) {
98 // check version
99 if (specifiedVersion !== '*' && specifiedVersion !== version) {
100 return;
101 }
102 var versionInfo = modelVersions[version];
103 if (!versionInfo.hasOwnProperty('api')) {
104 throw new Error('No API model for ' + serviceName + '-' + version);
105 }
106 code += 'Object.defineProperty(apiLoader.services[\'' + serviceName +'\'], \'' + version + '\', {\n';
107 code += tab + 'get: function get() {\n';
108 code += tab + tab + 'var model = require(\'../apis/' + versionInfo.api + '.json\');\n';
109 if (versionInfo.hasOwnProperty('paginators')) {
110 code += tab + tab + 'model.paginators = require(\'../apis/' + versionInfo.paginators + '.json\').pagination;\n';
111 }
112 if (versionInfo.hasOwnProperty('waiters')) {
113 code += tab + tab + 'model.waiters = require(\'../apis/' + versionInfo.waiters + '.json\').waiters;\n';
114 }
115 code += tab + tab + 'return model;\n';
116 code += tab + '},\n';
117 code += tab + 'enumerable: true,\n';
118 code += tab + 'configurable: true\n';
119 code += '});\n';
120 });
121
122 code += '\n';
123 code += 'module.exports = AWS.' + className + ';\n';
124 return {
125 code: code,
126 path: path.join(clientFolderPath, serviceName + '.js'),
127 service: serviceName,
128 };
129};
130
131ClientCreator.prototype.tabs = function tabs(count) {
132 var tab = '';
133 for (var i = 0; i < count; i++) {
134 tab += ' ';
135 }
136 return tab;
137};
138
139ClientCreator.prototype.generateDefinePropertySource = function generateDefinePropertySource(objName, serviceName, className) {
140 var tabs = this.tabs;
141 var code = '';
142 code += 'var ' + serviceName + ' = null;\n';
143 code += 'Object.defineProperty(' + objName + ', \'' + className + '\', {\n';
144 code += tabs(1) + 'get: function get() {\n';
145 code += tabs(2) + 'return ' + serviceName + ' || require(\'./' + serviceName + '\');\n';
146 code += tabs(1) + '},\n';
147 code += tabs(1) + 'set: function set(svc) {\n';
148 code += tabs(2) + serviceName + ' = svc;\n';
149 code += tabs(1) + '},\n';
150 code += tabs(1) + 'enumerable: true,\n';
151 code += tabs(1) + 'configurable: true\n';
152 code += '});\n';
153
154 return code;
155};
156
157ClientCreator.prototype.generateAllServicesSource = function generateAllServicesSource(services, fileName) {
158 var metadata = this._metadata;
159 var self = this;
160 var code = '';
161 code += 'require(\'../lib/node_loader\');\n';
162 code += 'module.exports = {\n';
163
164 services.forEach(function(service, idx) {
165 var className = metadata[service].name;
166 var tab = ' ';
167 var isLast = idx === services.length - 1;
168 code += self.tabs(1) + className + ': require(\'./' + service + '\')' + (isLast ? '' : ',') + '\n';
169 });
170 code += '};';
171 return {
172 code: code,
173 path: path.join(this._clientFolderPath, fileName + '.js'),
174 service: fileName
175 };
176};
177
178ClientCreator.prototype.getDefaultServices = function getDefaultServices() {
179 var metadata = this._metadata;
180 var services = [];
181 for (var key in metadata) {
182 if (!metadata.hasOwnProperty(key)) {
183 continue;
184 }
185 var className = metadata[key].name;
186 var serviceName = className.toLowerCase();
187 services.push(serviceName);
188 }
189 return services;
190};
191
192ClientCreator.prototype.writeClientServices = function writeClientServices() {
193 var metadata = this._metadata;
194 var services = [];
195 var corsServices = [];
196 for (var key in metadata) {
197 if (!metadata.hasOwnProperty(key)) {
198 continue;
199 }
200 var clientInfo = this.generateClientFileSource(metadata[key]);
201 fs.writeFileSync(clientInfo.path, clientInfo.code);
202 services.push(clientInfo.service);
203 // check if service supports CORS
204 if (metadata[key].cors === true) {
205 corsServices.push(clientInfo.service);
206 }
207 }
208 var allClientInfo = this.generateAllServicesSource(services, 'all');
209 fs.writeFileSync(allClientInfo.path, allClientInfo.code);
210 var browserClientInfo = this.generateAllServicesSource(corsServices, 'browser_default');
211 fs.writeFileSync(browserClientInfo.path, browserClientInfo.code);
212};
213
214module.exports = ClientCreator;