ts-gir
Version:
generate typescript from gir
190 lines (143 loc) • 17.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
require("core-js/modules/es.symbol.description");
require("core-js/modules/es.array.filter");
require("core-js/modules/es.array.iterator");
require("core-js/modules/es.object.get-own-property-descriptors");
require("core-js/modules/es.set");
require("core-js/modules/es.string.search");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _err = _interopRequireDefault(require("err"));
var _lodash = _interopRequireDefault(require("lodash"));
var _cosmiconfig = require("cosmiconfig");
var _util = _interopRequireDefault(require("util"));
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _glob = _interopRequireDefault(require("glob"));
var _path = _interopRequireDefault(require("path"));
var _pkgDir = _interopRequireDefault(require("pkg-dir"));
var _command = require("@oclif/command");
var _bluebird = require("bluebird");
var _runtime = require("babel-plugin-ts-optchain/lib/runtime");
var _Gir = _interopRequireDefault(require("./Gir"));
var _GirJSGenerator = _interopRequireDefault(require("./GirJSGenerator"));
var _GirTSGenerator = _interopRequireDefault(require("./GirTSGenerator"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
const glob = _util.default.promisify(_glob.default);
const rootPath = _pkgDir.default.sync(process.cwd()) || process.cwd();
class TSGir extends _command.Command {
constructor(...args) {
super(...args);
this.warnings = new Set();
}
getUserConfig() {
return (0, _asyncToGenerator2.default)(function* () {
const userConfig = (0, _runtime.oc)((yield (0, _cosmiconfig.cosmiconfig)('tsgir').search(rootPath)), ["config"], {});
return _objectSpread({
importMap: {},
ignoreDuplicates: false
}, userConfig);
})();
}
runForFile(girFile) {
var _this = this;
return (0, _asyncToGenerator2.default)(function* () {
const _this$parse = _this.parse(TSGir),
flags = _this$parse.flags;
const gir = new _Gir.default();
yield gir.loadFile(girFile);
if (!gir.repository) throw new _err.default('xml not loaded');
let $namespaces = gir.repository.namespace;
if (!Array.isArray($namespaces)) $namespaces = [$namespaces];
yield (0, _bluebird.mapSeries)($namespaces,
/*#__PURE__*/
function () {
var _ref = (0, _asyncToGenerator2.default)(function* ($namespace) {
const namespaceName = $namespace['@_name'];
const userConfig = yield _this.getUserConfig();
const moduleName = flags.module || userConfig.moduleName; // console.log(`Process namespace "${namespaceName}"`);
const basename = flags.output || userConfig.output || _lodash.default.kebabCase(namespaceName);
const dir = flags.dir || userConfig.dir || '';
const path = _path.default.resolve(process.cwd(), dir, basename);
const girTSGenerator = new _GirTSGenerator.default($namespace, userConfig, {
info: _this.log,
warn: _this.handleWarn.bind(_this)
}, moduleName);
girTSGenerator.build();
const girJSGenerator = new _GirJSGenerator.default($namespace, girTSGenerator.renamed);
girJSGenerator.build();
const tsCode = girTSGenerator.generate();
const jsCode = girJSGenerator.generate();
yield _fsExtra.default.writeFile(`${path}.d.ts`, tsCode);
yield _fsExtra.default.writeFile(`${path}.js`, jsCode);
});
return function (_x) {
return _ref.apply(this, arguments);
};
}());
})();
}
run() {
var _this2 = this;
return (0, _asyncToGenerator2.default)(function* () {
const _this2$parse = _this2.parse(TSGir),
flags = _this2$parse.flags;
let inputFiles = [];
if (Array.isArray(flags.inputs)) {
inputFiles = flags.inputs;
} else {
inputFiles = yield glob(flags.inputs);
}
for (let i = 0; i < inputFiles.length; i++) {
if (inputFiles[i]) {
yield _this2.runForFile(inputFiles[i]);
}
}
})();
}
handleWarn(input) {
if (typeof input === 'string') {
if (this.warnings.has(input)) return;
this.warnings.add(input);
}
this.warn(input);
}
}
exports.default = TSGir;
TSGir.description = 'generate typescript from gir';
TSGir.flags = {
help: _command.flags.help({
char: 'h'
}),
module: _command.flags.string({
char: 'm'
}),
output: _command.flags.string({
char: 'o',
description: 'Output basename, if not set, the namespace is used'
}),
dir: _command.flags.string({
char: 'd',
description: 'Output dir'
}),
silent: _command.flags.boolean({
char: 's'
}),
verbose: _command.flags.boolean(),
version: _command.flags.version({
char: 'v'
}),
inputs: _command.flags.string({
char: 'i',
multiple: true,
required: true,
default: '/usr/share/gir-1.0/*.gir',
description: 'Paths to GIR files to generate type definitions from (with wild card support)'
})
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9UU0dpci50cyJdLCJuYW1lcyI6WyJnbG9iIiwidXRpbCIsInByb21pc2lmeSIsImdsb2JDYiIsInJvb3RQYXRoIiwicGtnRGlyIiwic3luYyIsInByb2Nlc3MiLCJjd2QiLCJUU0dpciIsIkNvbW1hbmQiLCJ3YXJuaW5ncyIsIlNldCIsImdldFVzZXJDb25maWciLCJ1c2VyQ29uZmlnIiwib2MiLCJzZWFyY2giLCJpbXBvcnRNYXAiLCJpZ25vcmVEdXBsaWNhdGVzIiwicnVuRm9yRmlsZSIsImdpckZpbGUiLCJwYXJzZSIsImZsYWdzIiwiZ2lyIiwiR2lyIiwibG9hZEZpbGUiLCJyZXBvc2l0b3J5IiwiRXJyIiwiJG5hbWVzcGFjZXMiLCJuYW1lc3BhY2UiLCJBcnJheSIsImlzQXJyYXkiLCIkbmFtZXNwYWNlIiwibmFtZXNwYWNlTmFtZSIsIm1vZHVsZU5hbWUiLCJtb2R1bGUiLCJiYXNlbmFtZSIsIm91dHB1dCIsIl8iLCJrZWJhYkNhc2UiLCJkaXIiLCJwYXRoIiwiUGF0aCIsInJlc29sdmUiLCJnaXJUU0dlbmVyYXRvciIsIkdpclRTR2VuZXJhdG9yIiwiaW5mbyIsImxvZyIsIndhcm4iLCJoYW5kbGVXYXJuIiwiYmluZCIsImJ1aWxkIiwiZ2lySlNHZW5lcmF0b3IiLCJHaXJKU0dlbmVyYXRvciIsInJlbmFtZWQiLCJ0c0NvZGUiLCJnZW5lcmF0ZSIsImpzQ29kZSIsImZzIiwid3JpdGVGaWxlIiwicnVuIiwiaW5wdXRGaWxlcyIsImlucHV0cyIsImkiLCJsZW5ndGgiLCJpbnB1dCIsImhhcyIsImFkZCIsImRlc2NyaXB0aW9uIiwiaGVscCIsImNoYXIiLCJzdHJpbmciLCJzaWxlbnQiLCJib29sZWFuIiwidmVyYm9zZSIsInZlcnNpb24iLCJtdWx0aXBsZSIsInJlcXVpcmVkIiwiZGVmYXVsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNB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ZW50IjpbImltcG9ydCBFcnIgZnJvbSAnZXJyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBjb3NtaWNvbmZpZyB9IGZyb20gJ2Nvc21pY29uZmlnJztcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBnbG9iQ2IgZnJvbSAnZ2xvYic7XG5pbXBvcnQgUGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBwa2dEaXIgZnJvbSAncGtnLWRpcic7XG5pbXBvcnQgeyBDb21tYW5kLCBmbGFncyB9IGZyb20gJ0BvY2xpZi9jb21tYW5kJztcbmltcG9ydCB7IG1hcFNlcmllcyB9IGZyb20gJ2JsdWViaXJkJztcbi8vIE5lZWRzIGJhYmVsXG5pbXBvcnQgeyBvYyB9IGZyb20gJ3RzLW9wdGNoYWluLm1hY3JvJztcbmltcG9ydCBHaXIgZnJvbSAnLi9HaXInO1xuaW1wb3J0IEdpckpTR2VuZXJhdG9yIGZyb20gJy4vR2lySlNHZW5lcmF0b3InO1xuaW1wb3J0IEdpclRTR2VuZXJhdG9yIGZyb20gJy4vR2lyVFNHZW5lcmF0b3InO1xuaW1wb3J0IHsgTmFtZXNwYWNlLCBVc2VyQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IGdsb2IgPSB1dGlsLnByb21pc2lmeShnbG9iQ2IpO1xuXG5jb25zdCByb290UGF0aCA9IHBrZ0Rpci5zeW5jKHByb2Nlc3MuY3dkKCkpIHx8IHByb2Nlc3MuY3dkKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRTR2lyIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9ICdnZW5lcmF0ZSB0eXBlc2NyaXB0IGZyb20gZ2lyJztcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgaGVscDogZmxhZ3MuaGVscCh7IGNoYXI6ICdoJyB9KSxcbiAgICBtb2R1bGU6IGZsYWdzLnN0cmluZyh7IGNoYXI6ICdtJyB9KSxcbiAgICBvdXRwdXQ6IGZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiAnbycsXG4gICAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBiYXNlbmFtZSwgaWYgbm90IHNldCwgdGhlIG5hbWVzcGFjZSBpcyB1c2VkJ1xuICAgIH0pLFxuICAgIGRpcjogZmxhZ3Muc3RyaW5nKHsgY2hhcjogJ2QnLCBkZXNjcmlwdGlvbjogJ091dHB1dCBkaXInIH0pLFxuICAgIHNpbGVudDogZmxhZ3MuYm9vbGVhbih7IGNoYXI6ICdzJyB9KSxcbiAgICB2ZXJib3NlOiBmbGFncy5ib29sZWFuKCksXG4gICAgdmVyc2lvbjogZmxhZ3MudmVyc2lvbih7IGNoYXI6ICd2JyB9KSxcbiAgICBpbnB1dHM6IGZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiAnaScsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgZGVmYXVsdDogJy91c3Ivc2hhcmUvZ2lyLTEuMC8qLmdpcicsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1BhdGhzIHRvIEdJUiBmaWxlcyB0byBnZW5lcmF0ZSB0eXBlIGRlZmluaXRpb25zIGZyb20gKHdpdGggd2lsZCBjYXJkIHN1cHBvcnQpJ1xuICAgIH0pXG4gIH07XG5cbiAgd2FybmluZ3M6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGFzeW5jIGdldFVzZXJDb25maWcoKTogUHJvbWlzZTxVc2VyQ29uZmlnPiB7XG4gICAgY29uc3QgdXNlckNvbmZpZzogUGFydGlhbDxVc2VyQ29uZmlnPiA9IG9jKFxuICAgICAgYXdhaXQgY29zbWljb25maWcoJ3RzZ2lyJykuc2VhcmNoKHJvb3RQYXRoKVxuICAgICkuY29uZmlnKHt9KTtcbiAgICByZXR1cm4ge1xuICAgICAgaW1wb3J0TWFwOiB7fSxcbiAgICAgIGlnbm9yZUR1cGxpY2F0ZXM6IGZhbHNlLFxuICAgICAgLi4udXNlckNvbmZpZ1xuICAgIH07XG4gIH1cblxuICBhc3luYyBydW5Gb3JGaWxlKGdpckZpbGU6IHN0cmluZykge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IHRoaXMucGFyc2UoVFNHaXIpO1xuICAgIGNvbnN0IGdpciA9IG5ldyBHaXIoKTtcbiAgICBhd2FpdCBnaXIubG9hZEZpbGUoZ2lyRmlsZSk7XG4gICAgaWYgKCFnaXIucmVwb3NpdG9yeSkgdGhyb3cgbmV3IEVycigneG1sIG5vdCBsb2FkZWQnKTtcbiAgICBsZXQgJG5hbWVzcGFjZXMgPSBnaXIucmVwb3NpdG9yeS5uYW1lc3BhY2U7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KCRuYW1lc3BhY2VzKSkgJG5hbWVzcGFjZXMgPSBbJG5hbWVzcGFjZXNdO1xuICAgIGF3YWl0IG1hcFNlcmllcygkbmFtZXNwYWNlcywgYXN5bmMgKCRuYW1lc3BhY2U6IE5hbWVzcGFjZSkgPT4ge1xuICAgICAgY29uc3QgbmFtZXNwYWNlTmFtZSA9ICRuYW1lc3BhY2VbJ0BfbmFtZSddO1xuICAgICAgY29uc3QgdXNlckNvbmZpZyA9IGF3YWl0IHRoaXMuZ2V0VXNlckNvbmZpZygpO1xuICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IGZsYWdzLm1vZHVsZSB8fCB1c2VyQ29uZmlnLm1vZHVsZU5hbWU7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgUHJvY2VzcyBuYW1lc3BhY2UgXCIke25hbWVzcGFjZU5hbWV9XCJgKTtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID1cbiAgICAgICAgZmxhZ3Mub3V0cHV0IHx8IHVzZXJDb25maWcub3V0cHV0IHx8IF8ua2ViYWJDYXNlKG5hbWVzcGFjZU5hbWUpO1xuICAgICAgY29uc3QgZGlyID0gZmxhZ3MuZGlyIHx8IHVzZXJDb25maWcuZGlyIHx8ICcnO1xuICAgICAgY29uc3QgcGF0aCA9IFBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBkaXIsIGJhc2VuYW1lKTtcbiAgICAgIGNvbnN0IGdpclRTR2VuZXJhdG9yID0gbmV3IEdpclRTR2VuZXJhdG9yKFxuICAgICAgICAkbmFtZXNwYWNlLFxuICAgICAgICB1c2VyQ29uZmlnLFxuICAgICAgICB7XG4gICAgICAgICAgaW5mbzogdGhpcy5sb2csXG4gICAgICAgICAgd2FybjogdGhpcy5oYW5kbGVXYXJuLmJpbmQodGhpcylcbiAgICAgICAgfSxcbiAgICAgICAgbW9kdWxlTmFtZVxuICAgICAgKTtcbiAgICAgIGdpclRTR2VuZXJhdG9yLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGdpckpTR2VuZXJhdG9yID0gbmV3IEdpckpTR2VuZXJhdG9yKFxuICAgICAgICAkbmFtZXNwYWNlLFxuICAgICAgICBnaXJUU0dlbmVyYXRvci5yZW5hbWVkXG4gICAgICApO1xuICAgICAgZ2lySlNHZW5lcmF0b3IuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHRzQ29kZSA9IGdpclRTR2VuZXJhdG9yLmdlbmVyYXRlKCk7XG4gICAgICBjb25zdCBqc0NvZGUgPSBnaXJKU0dlbmVyYXRvci5nZW5lcmF0ZSgpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke3BhdGh9LmQudHNgLCB0c0NvZGUpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke3BhdGh9LmpzYCwganNDb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJ1bigpIHtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSB0aGlzLnBhcnNlKFRTR2lyKTtcbiAgICBsZXQgaW5wdXRGaWxlcyA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZsYWdzLmlucHV0cykpIHtcbiAgICAgIGlucHV0RmlsZXMgPSBmbGFncy5pbnB1dHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0RmlsZXMgPSBhd2FpdCBnbG9iKGZsYWdzLmlucHV0cyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRGaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlucHV0RmlsZXNbaV0pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5Gb3JGaWxlKGlucHV0RmlsZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVdhcm4oaW5wdXQ6IHN0cmluZyB8IEVycm9yKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh0aGlzLndhcm5pbmdzLmhhcyhpbnB1dCkpIHJldHVybjtcbiAgICAgIHRoaXMud2FybmluZ3MuYWRkKGlucHV0KTtcbiAgICB9XG4gICAgdGhpcy53YXJuKGlucHV0KTtcbiAgfVxufVxuIl19