1 | var fs = require('fs');
|
2 | var path = require('path');
|
3 |
|
4 |
|
5 | function 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 |
|
14 | ClientCreator.prototype.getAllApiFilenames = function getAllApiFilenames() {
|
15 | if (this._apiFileNames) {
|
16 | return this._apiFileNames;
|
17 | }
|
18 | var apiFileNames = fs.readdirSync(this._apisFolderPath);
|
19 |
|
20 | this._apiFileNames = apiFileNames.filter(function(name) {
|
21 | return name !== 'metadata.json';
|
22 | });
|
23 | return this._apiFileNames;
|
24 | };
|
25 |
|
26 | ClientCreator.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 |
|
64 | ClientCreator.prototype.customizationsExist = function customizationsExist(serviceName) {
|
65 | var customizationsFolder = this._serviceCustomizationsFolderPath;
|
66 | return fs.existsSync(path.join(customizationsFolder, serviceName + '.js'));
|
67 | };
|
68 |
|
69 | ClientCreator.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 |
|
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 |
|
94 | if (this.customizationsExist(serviceName)) {
|
95 | code += 'require(\'../lib/services/' + serviceName + '\');\n';
|
96 | }
|
97 | versionNumbers.forEach(function(version) {
|
98 |
|
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 |
|
131 | ClientCreator.prototype.tabs = function tabs(count) {
|
132 | var tab = '';
|
133 | for (var i = 0; i < count; i++) {
|
134 | tab += ' ';
|
135 | }
|
136 | return tab;
|
137 | };
|
138 |
|
139 | ClientCreator.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 |
|
157 | ClientCreator.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 |
|
178 | ClientCreator.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 |
|
192 | ClientCreator.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 |
|
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 |
|
214 | module.exports = ClientCreator;
|