@decohere/create 0.0.1-dev.42 → 0.0.1-dev.44

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 (47) hide show
  1. package/commonjs/src/models/config-yaml.model.js +58 -4
  2. package/commonjs/src/models/env-file.model.js +14 -1
  3. package/commonjs/src/models/launch-json.model.js +49 -27
  4. package/commonjs/src/models/package-json.model.js +64 -7
  5. package/commonjs/src/models/project.model.js +4 -1
  6. package/commonjs/src/program.js +52 -21
  7. package/commonjs/src/runner.js +13 -2
  8. package/commonjs/src/webapi/api-name.js +95 -0
  9. package/commonjs/src/webapi/const.js +32 -4
  10. package/commonjs/src/webapi/create-api.js +62 -18
  11. package/commonjs/src/webapi/features/auth.feature.js +56 -51
  12. package/commonjs/src/webapi/features/biome-format.js +6 -4
  13. package/commonjs/src/webapi/features/database.feature.js +125 -98
  14. package/commonjs/src/webapi/features/finalize.feature.js +19 -7
  15. package/commonjs/src/webapi/models/api-package-json.model.js +7 -5
  16. package/commonjs/src/webapi/models/main-source-file.model.js +12 -3
  17. package/commonjs/src/webapi/models/production-dockerfile.model.js +76 -36
  18. package/es6/src/models/config-yaml.model.js +47 -1
  19. package/es6/src/models/env-file.model.js +14 -1
  20. package/es6/src/models/launch-json.model.js +49 -27
  21. package/es6/src/models/package-json.model.js +62 -5
  22. package/es6/src/models/project.model.js +4 -1
  23. package/es6/src/program.js +52 -21
  24. package/es6/src/runner.js +13 -2
  25. package/es6/src/webapi/api-name.js +59 -0
  26. package/es6/src/webapi/const.js +18 -5
  27. package/es6/src/webapi/create-api.js +64 -20
  28. package/es6/src/webapi/features/auth.feature.js +56 -51
  29. package/es6/src/webapi/features/biome-format.js +6 -4
  30. package/es6/src/webapi/features/database.feature.js +125 -98
  31. package/es6/src/webapi/features/finalize.feature.js +19 -7
  32. package/es6/src/webapi/models/api-package-json.model.js +8 -6
  33. package/es6/src/webapi/models/main-source-file.model.js +12 -3
  34. package/es6/src/webapi/models/production-dockerfile.model.js +71 -36
  35. package/package.json +2 -2
  36. package/types/src/models/config-yaml.model.d.ts +11 -0
  37. package/types/src/models/env-file.model.d.ts +1 -0
  38. package/types/src/models/launch-json.model.d.ts +2 -0
  39. package/types/src/models/package-json.model.d.ts +16 -6
  40. package/types/src/models/project.model.d.ts +3 -0
  41. package/types/src/webapi/api-name.d.ts +14 -0
  42. package/types/src/webapi/const.d.ts +15 -5
  43. package/types/src/webapi/create-api.d.ts +4 -0
  44. package/types/src/webapi/features/biome-format.d.ts +1 -1
  45. package/types/src/webapi/models/api-package-json.model.d.ts +4 -3
  46. package/types/src/webapi/models/main-source-file.model.d.ts +6 -0
  47. package/types/src/webapi/models/production-dockerfile.model.d.ts +13 -2
@@ -48,6 +48,7 @@ class MainSourceFile {
48
48
  _entities = [];
49
49
  _repositories = [];
50
50
  _services = [];
51
+ _dataSourceName;
51
52
  _typeOrmSeed;
52
53
  constructor(appName){
53
54
  this.appName = appName;
@@ -81,6 +82,13 @@ class MainSourceFile {
81
82
  this._services.push(service);
82
83
  return this;
83
84
  }
85
+ /**
86
+ * Datasource name passed to `withTypeOrm({ name })`. Must match
87
+ * `database.dataSources[].name` in config.yaml.
88
+ */ setDataSourceName(name) {
89
+ this._dataSourceName = name;
90
+ return this;
91
+ }
84
92
  /**
85
93
  * Inline seed callback body for `withTypeOrm({ seed })`.
86
94
  * Receives `dataSource` in scope. Example: `await dataSource.getRepository(User).save(...)`.
@@ -123,10 +131,11 @@ class MainSourceFile {
123
131
  if (this._entities.length > 0) {
124
132
  const entities = this._entities.map((e)=>e.className).join(", ");
125
133
  const repos = this._repositories.map((r)=>r.className).join(", ");
134
+ const named = this._dataSourceName != null ? `name: "${this._dataSourceName}", ` : "";
126
135
  if (this._typeOrmSeed) {
127
- builderCalls.push(`\t.withTypeOrm({ entities: [${entities}], repositories: [${repos}], seed: async (dataSource) => { ${this._typeOrmSeed} } })`);
136
+ builderCalls.push(`\t.withTypeOrm({ ${named}entities: [${entities}], repositories: [${repos}], seed: async (dataSource) => { ${this._typeOrmSeed} } })`);
128
137
  } else {
129
- builderCalls.push(`\t.withTypeOrm({ entities: [${entities}], repositories: [${repos}] })`);
138
+ builderCalls.push(`\t.withTypeOrm({ ${named}entities: [${entities}], repositories: [${repos}] })`);
130
139
  }
131
140
  }
132
141
  builderCalls.push(`\t.withControllers(HelloController)`);
@@ -153,4 +162,4 @@ class MainSourceFile {
153
162
  }
154
163
  }
155
164
 
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFR5cGVPcm1JbXBvcnQgPSB7IGNsYXNzTmFtZTogc3RyaW5nOyBpbXBvcnRQYXRoOiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIFNlcnZpY2VJbXBvcnQgPSBUeXBlT3JtSW1wb3J0ICYgeyBzY29wZT86IFwic2luZ2xldG9uXCIgfCBcInJlcXVlc3RcIiB9O1xuXG4vKiogVHJhY2tzIG5hbWVkIGltcG9ydHMgZnJvbSBhIHNpbmdsZSBtb2R1bGUgcGF0aCwgc3BsaXQgaW50byB2YWx1ZXMgYW5kIHR5cGVzLiAqL1xuY2xhc3MgSW1wb3J0R3JvdXAge1xuXHRwcml2YXRlIHJlYWRvbmx5IF92YWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgX3R5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdHB1YmxpYyBhZGQobmFtZTogc3RyaW5nLCB0eXBlT25seSA9IGZhbHNlKTogdGhpcyB7XG5cdFx0aWYgKHR5cGVPbmx5KSB7XG5cdFx0XHQvLyBWYWx1ZSBpbXBvcnQgYWxyZWFkeSBwcmVzZW50IOKAlCB2YWx1ZSB3aW5zLCBza2lwXG5cdFx0XHRpZiAoIXRoaXMuX3ZhbHVlcy5pbmNsdWRlcyhuYW1lKSAmJiAhdGhpcy5fdHlwZXMuaW5jbHVkZXMobmFtZSkpIHtcblx0XHRcdFx0dGhpcy5fdHlwZXMucHVzaChuYW1lKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gUHJvbW90ZTogcmVtb3ZlIGZyb20gdHlwZXMgaWYgaXQgd2FzIHByZXZpb3VzbHkgdHlwZS1vbmx5XG5cdFx0XHRjb25zdCB0eXBlSWR4ID0gdGhpcy5fdHlwZXMuaW5kZXhPZihuYW1lKTtcblx0XHRcdGlmICh0eXBlSWR4ICE9PSAtMSkgdGhpcy5fdHlwZXMuc3BsaWNlKHR5cGVJZHgsIDEpO1xuXHRcdFx0aWYgKCF0aGlzLl92YWx1ZXMuaW5jbHVkZXMobmFtZSkpIHRoaXMuX3ZhbHVlcy5wdXNoKG5hbWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyByZW5kZXIoZnJvbTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBbLi4udGhpcy5fdmFsdWVzXS5zb3J0KCk7XG5cdFx0Y29uc3QgdHlwZXMgPSBbLi4udGhpcy5fdHlwZXNdLnNvcnQoKS5tYXAoKG4pID0+IGB0eXBlICR7bn1gKTtcblx0XHRyZXR1cm4gYGltcG9ydCB7ICR7Wy4uLnZhbHVlcywgLi4udHlwZXNdLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiJHtmcm9tfVwiO2A7XG5cdH1cbn1cblxuLyoqXG4gKiBNb2RlbCBmb3IgYHByb2plY3RzL2FwaS9zcmMvbWFpbi50c2AuXG4gKlxuICogU3RhcnRzIHdpdGggdGhlIG1pbmltYWwgSFRUUCArIFlBTUwgY29uZmlnIHNldHVwLiBGZWF0dXJlcyBtdXRhdGUgdGhlIG1vZGVsXG4gKiBieSBjYWxsaW5nIGFkZFNpZGVFZmZlY3RJbXBvcnQgLyBhZGRJbXBvcnQgLyBhZGRCdWlsZGVyQ2FsbCAvIGFkZEVudGl0eSAvXG4gKiBhZGRSZXBvc2l0b3J5LiBmaWxlcygpIHJlbmRlcnMgd2hhdGV2ZXIgaGFzIGJlZW4gYWNjdW11bGF0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYWluU291cmNlRmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX3NpZGVFZmZlY3RJbXBvcnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9leHRyYUltcG9ydHMgPSBuZXcgTWFwPHN0cmluZywgSW1wb3J0R3JvdXA+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2J1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfZW50aXRpZXM6IFR5cGVPcm1JbXBvcnRbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9yZXBvc2l0b3JpZXM6IFR5cGVPcm1JbXBvcnRbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlczogU2VydmljZUltcG9ydFtdID0gW107XG5cdHByaXZhdGUgX3R5cGVPcm1TZWVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwTmFtZTogc3RyaW5nKSB7fVxuXG5cdC8qKiBBZGRzIGEgYmFyZSBzaWRlLWVmZmVjdCBpbXBvcnQsIGUuZy4gYEBkZWNvaGVyZS9jb3J0ZXgvYXV0aGAuICovXG5cdHB1YmxpYyBhZGRTaWRlRWZmZWN0SW1wb3J0KHBhdGg6IHN0cmluZyk6IHRoaXMge1xuXHRcdGlmICghdGhpcy5fc2lkZUVmZmVjdEltcG9ydHMuaW5jbHVkZXMocGF0aCkpIHRoaXMuX3NpZGVFZmZlY3RJbXBvcnRzLnB1c2gocGF0aCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQWRkcyBhIG5hbWVkIGltcG9ydCwgZS5nLiBgaW1wb3J0IHsgRm9vIH0gZnJvbSBcImJhclwiYC4gKi9cblx0cHVibGljIGFkZEltcG9ydChuYW1lOiBzdHJpbmcsIGZyb206IHN0cmluZywgdHlwZU9ubHkgPSBmYWxzZSk6IHRoaXMge1xuXHRcdGNvbnN0IGdyb3VwID0gdGhpcy5fZXh0cmFJbXBvcnRzLmdldChmcm9tKSA/PyBuZXcgSW1wb3J0R3JvdXAoKTtcblx0XHRncm91cC5hZGQobmFtZSwgdHlwZU9ubHkpO1xuXHRcdHRoaXMuX2V4dHJhSW1wb3J0cy5zZXQoZnJvbSwgZ3JvdXApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBidWlsZGVyIGNhbGwgaW5zZXJ0ZWQgYWZ0ZXIgYC53aXRoQ29uZmlndXJhdGlvbigpYCBhbmQgYmVmb3JlXG5cdCAqIGAud2l0aFNlcnZpY2VzKClgLiBQYXNzIHRoZSBjYWxsIHdpdGhvdXQgbGVhZGluZyBkb3QsIGUuZy4gYC53aXRoQXV0aCgpYC5cblx0ICovXG5cdHB1YmxpYyBhZGRCdWlsZGVyQ2FsbChjYWxsOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9idWlsZGVyQ2FsbHMucHVzaChjYWxsKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgVHlwZU9STSBlbnRpdHkg4oCUIGltcG9ydCBhbmQgZW50cnkgaW4gYHdpdGhUeXBlT3JtKHsgZW50aXRpZXMgfSlgLiAqL1xuXHRwdWJsaWMgYWRkRW50aXR5KGVudGl0eTogVHlwZU9ybUltcG9ydCk6IHRoaXMge1xuXHRcdHRoaXMuX2VudGl0aWVzLnB1c2goZW50aXR5KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgVHlwZU9STSByZXBvc2l0b3J5IOKAlCBpbXBvcnQgYW5kIGVudHJ5IGluIGB3aXRoVHlwZU9ybSh7IHJlcG9zaXRvcmllcyB9KWAuICovXG5cdHB1YmxpYyBhZGRSZXBvc2l0b3J5KHJlcG86IFR5cGVPcm1JbXBvcnQpOiB0aGlzIHtcblx0XHR0aGlzLl9yZXBvc2l0b3JpZXMucHVzaChyZXBvKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgc2VydmljZSByZWdpc3RlcmVkIGluIGAud2l0aFNlcnZpY2VzKClgLiAqL1xuXHRwdWJsaWMgYWRkU2VydmljZShzZXJ2aWNlOiBTZXJ2aWNlSW1wb3J0KTogdGhpcyB7XG5cdFx0dGhpcy5fc2VydmljZXMucHVzaChzZXJ2aWNlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmxpbmUgc2VlZCBjYWxsYmFjayBib2R5IGZvciBgd2l0aFR5cGVPcm0oeyBzZWVkIH0pYC5cblx0ICogUmVjZWl2ZXMgYGRhdGFTb3VyY2VgIGluIHNjb3BlLiBFeGFtcGxlOiBgYXdhaXQgZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFVzZXIpLnNhdmUoLi4uKWAuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHlwZU9ybVNlZWQoc2VlZEJvZHk6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3R5cGVPcm1TZWVkID0gc2VlZEJvZHk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtcblx0XHRcdCdpbXBvcnQgXCJAZGVjb2hlcmUvc2NyaWJlLXBpbm9cIjsnLFxuXHRcdFx0J2ltcG9ydCBcIkBkZWNvaGVyZS9jb3J0ZXgvaHR0cFwiOycsXG5cdFx0XTtcblxuXHRcdGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLl9zaWRlRWZmZWN0SW1wb3J0cykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgXCIke3BhdGh9XCI7YCk7XG5cdFx0fVxuXG5cdFx0aW1wb3J0cy5wdXNoKFxuXHRcdFx0J2ltcG9ydCBcIkBkZWNvaGVyZS9wcm90b2NvbFwiOycsXG5cdFx0XHQnaW1wb3J0IHsgWWFtbERhdGFTb3VyY2UgfSBmcm9tIFwiQGRlY29oZXJlL3Byb3RvY29sXCI7Jyxcblx0XHRcdCdpbXBvcnQgeyBCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9jb3J0ZXhcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IEZhc3RpZnlQcm92aWRlciB9IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4L3Byb3ZpZGVyc1wiOycsXG5cdFx0XHQnaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IFNhbXBsZVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9zYW1wbGUuc2VydmljZS5qc1wiOycsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgZSBvZiB0aGlzLl9lbnRpdGllcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke2UuY2xhc3NOYW1lfSB9IGZyb20gXCIke2UuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHIgb2YgdGhpcy5fcmVwb3NpdG9yaWVzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goYGltcG9ydCB7ICR7ci5jbGFzc05hbWV9IH0gZnJvbSBcIiR7ci5pbXBvcnRQYXRofVwiO2ApO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgcyBvZiB0aGlzLl9zZXJ2aWNlcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke3MuY2xhc3NOYW1lfSB9IGZyb20gXCIke3MuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IFtmcm9tLCBncm91cF0gb2YgdGhpcy5fZXh0cmFJbXBvcnRzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goZ3JvdXAucmVuZGVyKGZyb20pKTtcblx0XHR9XG5cblx0XHRpbXBvcnRzLnB1c2goJ2ltcG9ydCB7IEhlbGxvQ29udHJvbGxlciB9IGZyb20gXCIuL2NvbnRyb2xsZXJzL2hlbGxvLmNvbnRyb2xsZXIuanNcIjsnKTtcblxuXHRcdGNvbnN0IHNlcnZpY2VSZWdzID0gW1xuXHRcdFx0XCJjYi5yZWdpc3RlclNpbmdsZXRvbihTYW1wbGVTZXJ2aWNlKTtcIixcblx0XHRcdC4uLnRoaXMuX3NlcnZpY2VzLm1hcCgocykgPT5cblx0XHRcdFx0cy5zY29wZSA9PT0gXCJyZXF1ZXN0XCJcblx0XHRcdFx0XHQ/IGBjYi5yZWdpc3RlclJlcXVlc3RTY29wZWQoJHtzLmNsYXNzTmFtZX0pO2Bcblx0XHRcdFx0XHQ6IGBjYi5yZWdpc3RlclNpbmdsZXRvbigke3MuY2xhc3NOYW1lfSk7YCxcblx0XHRcdCksXG5cdFx0XS5qb2luKFwiIFwiKTtcblxuXHRcdGNvbnN0IGJ1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXG5cdFx0XHRgXFx0LndpdGhIdHRwUHJvdmlkZXIoRmFzdGlmeVByb3ZpZGVyKWAsXG5cdFx0XHRgXFx0LndpdGhDb25maWd1cmF0aW9uKFlhbWxEYXRhU291cmNlKWAsXG5cdFx0XHQuLi50aGlzLl9idWlsZGVyQ2FsbHMubWFwKChjKSA9PiBgXFx0JHtjfWApLFxuXHRcdFx0YFxcdC53aXRoU2VydmljZXMoKGNiKSA9PiB7ICR7c2VydmljZVJlZ3N9IH0pYCxcblx0XHRdO1xuXG5cdFx0aWYgKHRoaXMuX2VudGl0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGVudGl0aWVzID0gdGhpcy5fZW50aXRpZXMubWFwKChlKSA9PiBlLmNsYXNzTmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0Y29uc3QgcmVwb3MgPSB0aGlzLl9yZXBvc2l0b3JpZXMubWFwKChyKSA9PiByLmNsYXNzTmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0aWYgKHRoaXMuX3R5cGVPcm1TZWVkKSB7XG5cdFx0XHRcdGJ1aWxkZXJDYWxscy5wdXNoKFxuXHRcdFx0XHRcdGBcXHQud2l0aFR5cGVPcm0oeyBlbnRpdGllczogWyR7ZW50aXRpZXN9XSwgcmVwb3NpdG9yaWVzOiBbJHtyZXBvc31dLCBzZWVkOiBhc3luYyAoZGF0YVNvdXJjZSkgPT4geyAke3RoaXMuX3R5cGVPcm1TZWVkfSB9IH0pYCxcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ1aWxkZXJDYWxscy5wdXNoKFxuXHRcdFx0XHRcdGBcXHQud2l0aFR5cGVPcm0oeyBlbnRpdGllczogWyR7ZW50aXRpZXN9XSwgcmVwb3NpdG9yaWVzOiBbJHtyZXBvc31dIH0pYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRidWlsZGVyQ2FsbHMucHVzaChgXFx0LndpdGhDb250cm9sbGVycyhIZWxsb0NvbnRyb2xsZXIpYCk7XG5cblx0XHRjb25zdCBjb250ZW50ID0gW1xuXHRcdFx0Li4uaW1wb3J0cyxcblx0XHRcdFwiXCIsXG5cdFx0XHRcInNjcmliZS5leHRlbmQud2l0aFBpbm9QcmV0dHkoKTtcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRgY29uc3QgYXBwID0gYXdhaXQgQnVpbGRlci5jcmVhdGUoeyBhcHBsaWNhdGlvbk5hbWU6IFwiJHt0aGlzLmFwcE5hbWV9XCIgfSlgLFxuXHRcdFx0Li4uYnVpbGRlckNhbGxzLFxuXHRcdFx0YFxcdC5idWlsZCgpO2AsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJhd2FpdCBhcHAuc3RhcnQoeyBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCB9KTtcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRcImV4cG9ydCBkZWZhdWx0IGFwcDtcIixcblx0XHRcdFwiXCIsXG5cdFx0XS5qb2luKFwiXFxuXCIpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwic3JjL21haW4udHNcIixcblx0XHRcdFx0Y29udGVudCxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIk1haW5Tb3VyY2VGaWxlIiwiSW1wb3J0R3JvdXAiLCJfdmFsdWVzIiwiX3R5cGVzIiwiYWRkIiwibmFtZSIsInR5cGVPbmx5IiwiaW5jbHVkZXMiLCJwdXNoIiwidHlwZUlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJyZW5kZXIiLCJmcm9tIiwidmFsdWVzIiwic29ydCIsInR5cGVzIiwibWFwIiwibiIsImpvaW4iLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiTUFJTl9UUyIsIl9zaWRlRWZmZWN0SW1wb3J0cyIsIl9leHRyYUltcG9ydHMiLCJNYXAiLCJfYnVpbGRlckNhbGxzIiwiX2VudGl0aWVzIiwiX3JlcG9zaXRvcmllcyIsIl9zZXJ2aWNlcyIsIl90eXBlT3JtU2VlZCIsImFwcE5hbWUiLCJhZGRTaWRlRWZmZWN0SW1wb3J0IiwicGF0aCIsImFkZEltcG9ydCIsImdyb3VwIiwiZ2V0Iiwic2V0IiwiYWRkQnVpbGRlckNhbGwiLCJjYWxsIiwiYWRkRW50aXR5IiwiZW50aXR5IiwiYWRkUmVwb3NpdG9yeSIsInJlcG8iLCJhZGRTZXJ2aWNlIiwic2VydmljZSIsInNldFR5cGVPcm1TZWVkIiwic2VlZEJvZHkiLCJmaWxlcyIsImltcG9ydHMiLCJlIiwiY2xhc3NOYW1lIiwiaW1wb3J0UGF0aCIsInIiLCJzIiwic2VydmljZVJlZ3MiLCJzY29wZSIsImJ1aWxkZXJDYWxscyIsImMiLCJsZW5ndGgiLCJlbnRpdGllcyIsInJlcG9zIiwiY29udGVudCIsImZpbGVQYXRoIl0sIm1hcHBpbmdzIjoiOzs7OytCQXdDYUE7OztlQUFBQTs7O3VCQXhDb0I7QUFNakMsaUZBQWlGLEdBQ2pGLE1BQU1DO0lBQ1lDLFVBQW9CLEVBQUUsQ0FBQztJQUN2QkMsU0FBbUIsRUFBRSxDQUFDO0lBRWhDQyxJQUFJQyxJQUFZLEVBQUVDLFdBQVcsS0FBSyxFQUFRO1FBQ2hELElBQUlBLFVBQVU7WUFDYixrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQ0osT0FBTyxDQUFDSyxRQUFRLENBQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0ksUUFBUSxDQUFDRixPQUFPO2dCQUNoRSxJQUFJLENBQUNGLE1BQU0sQ0FBQ0ssSUFBSSxDQUFDSDtZQUNsQjtRQUNELE9BQU87WUFDTiw0REFBNEQ7WUFDNUQsTUFBTUksVUFBVSxJQUFJLENBQUNOLE1BQU0sQ0FBQ08sT0FBTyxDQUFDTDtZQUNwQyxJQUFJSSxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUNOLE1BQU0sQ0FBQ1EsTUFBTSxDQUFDRixTQUFTO1lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUNQLE9BQU8sQ0FBQ0ssUUFBUSxDQUFDRixPQUFPLElBQUksQ0FBQ0gsT0FBTyxDQUFDTSxJQUFJLENBQUNIO1FBQ3JEO1FBQ0EsT0FBTyxJQUFJO0lB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
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFR5cGVPcm1JbXBvcnQgPSB7IGNsYXNzTmFtZTogc3RyaW5nOyBpbXBvcnRQYXRoOiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIFNlcnZpY2VJbXBvcnQgPSBUeXBlT3JtSW1wb3J0ICYgeyBzY29wZT86IFwic2luZ2xldG9uXCIgfCBcInJlcXVlc3RcIiB9O1xuXG4vKiogVHJhY2tzIG5hbWVkIGltcG9ydHMgZnJvbSBhIHNpbmdsZSBtb2R1bGUgcGF0aCwgc3BsaXQgaW50byB2YWx1ZXMgYW5kIHR5cGVzLiAqL1xuY2xhc3MgSW1wb3J0R3JvdXAge1xuXHRwcml2YXRlIHJlYWRvbmx5IF92YWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgX3R5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdHB1YmxpYyBhZGQobmFtZTogc3RyaW5nLCB0eXBlT25seSA9IGZhbHNlKTogdGhpcyB7XG5cdFx0aWYgKHR5cGVPbmx5KSB7XG5cdFx0XHQvLyBWYWx1ZSBpbXBvcnQgYWxyZWFkeSBwcmVzZW50IOKAlCB2YWx1ZSB3aW5zLCBza2lwXG5cdFx0XHRpZiAoIXRoaXMuX3ZhbHVlcy5pbmNsdWRlcyhuYW1lKSAmJiAhdGhpcy5fdHlwZXMuaW5jbHVkZXMobmFtZSkpIHtcblx0XHRcdFx0dGhpcy5fdHlwZXMucHVzaChuYW1lKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gUHJvbW90ZTogcmVtb3ZlIGZyb20gdHlwZXMgaWYgaXQgd2FzIHByZXZpb3VzbHkgdHlwZS1vbmx5XG5cdFx0XHRjb25zdCB0eXBlSWR4ID0gdGhpcy5fdHlwZXMuaW5kZXhPZihuYW1lKTtcblx0XHRcdGlmICh0eXBlSWR4ICE9PSAtMSkgdGhpcy5fdHlwZXMuc3BsaWNlKHR5cGVJZHgsIDEpO1xuXHRcdFx0aWYgKCF0aGlzLl92YWx1ZXMuaW5jbHVkZXMobmFtZSkpIHRoaXMuX3ZhbHVlcy5wdXNoKG5hbWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyByZW5kZXIoZnJvbTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBbLi4udGhpcy5fdmFsdWVzXS5zb3J0KCk7XG5cdFx0Y29uc3QgdHlwZXMgPSBbLi4udGhpcy5fdHlwZXNdLnNvcnQoKS5tYXAoKG4pID0+IGB0eXBlICR7bn1gKTtcblx0XHRyZXR1cm4gYGltcG9ydCB7ICR7Wy4uLnZhbHVlcywgLi4udHlwZXNdLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiJHtmcm9tfVwiO2A7XG5cdH1cbn1cblxuLyoqXG4gKiBNb2RlbCBmb3IgYHByb2plY3RzL2FwaS9zcmMvbWFpbi50c2AuXG4gKlxuICogU3RhcnRzIHdpdGggdGhlIG1pbmltYWwgSFRUUCArIFlBTUwgY29uZmlnIHNldHVwLiBGZWF0dXJlcyBtdXRhdGUgdGhlIG1vZGVsXG4gKiBieSBjYWxsaW5nIGFkZFNpZGVFZmZlY3RJbXBvcnQgLyBhZGRJbXBvcnQgLyBhZGRCdWlsZGVyQ2FsbCAvIGFkZEVudGl0eSAvXG4gKiBhZGRSZXBvc2l0b3J5LiBmaWxlcygpIHJlbmRlcnMgd2hhdGV2ZXIgaGFzIGJlZW4gYWNjdW11bGF0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYWluU291cmNlRmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX3NpZGVFZmZlY3RJbXBvcnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9leHRyYUltcG9ydHMgPSBuZXcgTWFwPHN0cmluZywgSW1wb3J0R3JvdXA+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2J1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfZW50aXRpZXM6IFR5cGVPcm1JbXBvcnRbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9yZXBvc2l0b3JpZXM6IFR5cGVPcm1JbXBvcnRbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlczogU2VydmljZUltcG9ydFtdID0gW107XG5cdHByaXZhdGUgX2RhdGFTb3VyY2VOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgX3R5cGVPcm1TZWVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwTmFtZTogc3RyaW5nKSB7fVxuXG5cdC8qKiBBZGRzIGEgYmFyZSBzaWRlLWVmZmVjdCBpbXBvcnQsIGUuZy4gYEBkZWNvaGVyZS9jb3J0ZXgvYXV0aGAuICovXG5cdHB1YmxpYyBhZGRTaWRlRWZmZWN0SW1wb3J0KHBhdGg6IHN0cmluZyk6IHRoaXMge1xuXHRcdGlmICghdGhpcy5fc2lkZUVmZmVjdEltcG9ydHMuaW5jbHVkZXMocGF0aCkpIHRoaXMuX3NpZGVFZmZlY3RJbXBvcnRzLnB1c2gocGF0aCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQWRkcyBhIG5hbWVkIGltcG9ydCwgZS5nLiBgaW1wb3J0IHsgRm9vIH0gZnJvbSBcImJhclwiYC4gKi9cblx0cHVibGljIGFkZEltcG9ydChuYW1lOiBzdHJpbmcsIGZyb206IHN0cmluZywgdHlwZU9ubHkgPSBmYWxzZSk6IHRoaXMge1xuXHRcdGNvbnN0IGdyb3VwID0gdGhpcy5fZXh0cmFJbXBvcnRzLmdldChmcm9tKSA/PyBuZXcgSW1wb3J0R3JvdXAoKTtcblx0XHRncm91cC5hZGQobmFtZSwgdHlwZU9ubHkpO1xuXHRcdHRoaXMuX2V4dHJhSW1wb3J0cy5zZXQoZnJvbSwgZ3JvdXApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBidWlsZGVyIGNhbGwgaW5zZXJ0ZWQgYWZ0ZXIgYC53aXRoQ29uZmlndXJhdGlvbigpYCBhbmQgYmVmb3JlXG5cdCAqIGAud2l0aFNlcnZpY2VzKClgLiBQYXNzIHRoZSBjYWxsIHdpdGhvdXQgbGVhZGluZyBkb3QsIGUuZy4gYC53aXRoQXV0aCgpYC5cblx0ICovXG5cdHB1YmxpYyBhZGRCdWlsZGVyQ2FsbChjYWxsOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9idWlsZGVyQ2FsbHMucHVzaChjYWxsKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgVHlwZU9STSBlbnRpdHkg4oCUIGltcG9ydCBhbmQgZW50cnkgaW4gYHdpdGhUeXBlT3JtKHsgZW50aXRpZXMgfSlgLiAqL1xuXHRwdWJsaWMgYWRkRW50aXR5KGVudGl0eTogVHlwZU9ybUltcG9ydCk6IHRoaXMge1xuXHRcdHRoaXMuX2VudGl0aWVzLnB1c2goZW50aXR5KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgVHlwZU9STSByZXBvc2l0b3J5IOKAlCBpbXBvcnQgYW5kIGVudHJ5IGluIGB3aXRoVHlwZU9ybSh7IHJlcG9zaXRvcmllcyB9KWAuICovXG5cdHB1YmxpYyBhZGRSZXBvc2l0b3J5KHJlcG86IFR5cGVPcm1JbXBvcnQpOiB0aGlzIHtcblx0XHR0aGlzLl9yZXBvc2l0b3JpZXMucHVzaChyZXBvKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgc2VydmljZSByZWdpc3RlcmVkIGluIGAud2l0aFNlcnZpY2VzKClgLiAqL1xuXHRwdWJsaWMgYWRkU2VydmljZShzZXJ2aWNlOiBTZXJ2aWNlSW1wb3J0KTogdGhpcyB7XG5cdFx0dGhpcy5fc2VydmljZXMucHVzaChzZXJ2aWNlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBEYXRhc291cmNlIG5hbWUgcGFzc2VkIHRvIGB3aXRoVHlwZU9ybSh7IG5hbWUgfSlgLiBNdXN0IG1hdGNoXG5cdCAqIGBkYXRhYmFzZS5kYXRhU291cmNlc1tdLm5hbWVgIGluIGNvbmZpZy55YW1sLlxuXHQgKi9cblx0cHVibGljIHNldERhdGFTb3VyY2VOYW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RhdGFTb3VyY2VOYW1lID0gbmFtZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmxpbmUgc2VlZCBjYWxsYmFjayBib2R5IGZvciBgd2l0aFR5cGVPcm0oeyBzZWVkIH0pYC5cblx0ICogUmVjZWl2ZXMgYGRhdGFTb3VyY2VgIGluIHNjb3BlLiBFeGFtcGxlOiBgYXdhaXQgZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFVzZXIpLnNhdmUoLi4uKWAuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHlwZU9ybVNlZWQoc2VlZEJvZHk6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3R5cGVPcm1TZWVkID0gc2VlZEJvZHk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtcblx0XHRcdCdpbXBvcnQgXCJAZGVjb2hlcmUvc2NyaWJlLXBpbm9cIjsnLFxuXHRcdFx0J2ltcG9ydCBcIkBkZWNvaGVyZS9jb3J0ZXgvaHR0cFwiOycsXG5cdFx0XTtcblxuXHRcdGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLl9zaWRlRWZmZWN0SW1wb3J0cykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgXCIke3BhdGh9XCI7YCk7XG5cdFx0fVxuXG5cdFx0aW1wb3J0cy5wdXNoKFxuXHRcdFx0J2ltcG9ydCBcIkBkZWNvaGVyZS9wcm90b2NvbFwiOycsXG5cdFx0XHQnaW1wb3J0IHsgWWFtbERhdGFTb3VyY2UgfSBmcm9tIFwiQGRlY29oZXJlL3Byb3RvY29sXCI7Jyxcblx0XHRcdCdpbXBvcnQgeyBCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9jb3J0ZXhcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IEZhc3RpZnlQcm92aWRlciB9IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4L3Byb3ZpZGVyc1wiOycsXG5cdFx0XHQnaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IFNhbXBsZVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9zYW1wbGUuc2VydmljZS5qc1wiOycsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgZSBvZiB0aGlzLl9lbnRpdGllcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke2UuY2xhc3NOYW1lfSB9IGZyb20gXCIke2UuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHIgb2YgdGhpcy5fcmVwb3NpdG9yaWVzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goYGltcG9ydCB7ICR7ci5jbGFzc05hbWV9IH0gZnJvbSBcIiR7ci5pbXBvcnRQYXRofVwiO2ApO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgcyBvZiB0aGlzLl9zZXJ2aWNlcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke3MuY2xhc3NOYW1lfSB9IGZyb20gXCIke3MuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IFtmcm9tLCBncm91cF0gb2YgdGhpcy5fZXh0cmFJbXBvcnRzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goZ3JvdXAucmVuZGVyKGZyb20pKTtcblx0XHR9XG5cblx0XHRpbXBvcnRzLnB1c2goJ2ltcG9ydCB7IEhlbGxvQ29udHJvbGxlciB9IGZyb20gXCIuL2NvbnRyb2xsZXJzL2hlbGxvLmNvbnRyb2xsZXIuanNcIjsnKTtcblxuXHRcdGNvbnN0IHNlcnZpY2VSZWdzID0gW1xuXHRcdFx0XCJjYi5yZWdpc3RlclNpbmdsZXRvbihTYW1wbGVTZXJ2aWNlKTtcIixcblx0XHRcdC4uLnRoaXMuX3NlcnZpY2VzLm1hcCgocykgPT5cblx0XHRcdFx0cy5zY29wZSA9PT0gXCJyZXF1ZXN0XCJcblx0XHRcdFx0XHQ/IGBjYi5yZWdpc3RlclJlcXVlc3RTY29wZWQoJHtzLmNsYXNzTmFtZX0pO2Bcblx0XHRcdFx0XHQ6IGBjYi5yZWdpc3RlclNpbmdsZXRvbigke3MuY2xhc3NOYW1lfSk7YCxcblx0XHRcdCksXG5cdFx0XS5qb2luKFwiIFwiKTtcblxuXHRcdGNvbnN0IGJ1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXG5cdFx0XHRgXFx0LndpdGhIdHRwUHJvdmlkZXIoRmFzdGlmeVByb3ZpZGVyKWAsXG5cdFx0XHRgXFx0LndpdGhDb25maWd1cmF0aW9uKFlhbWxEYXRhU291cmNlKWAsXG5cdFx0XHQuLi50aGlzLl9idWlsZGVyQ2FsbHMubWFwKChjKSA9PiBgXFx0JHtjfWApLFxuXHRcdFx0YFxcdC53aXRoU2VydmljZXMoKGNiKSA9PiB7ICR7c2VydmljZVJlZ3N9IH0pYCxcblx0XHRdO1xuXG5cdFx0aWYgKHRoaXMuX2VudGl0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGVudGl0aWVzID0gdGhpcy5fZW50aXRpZXMubWFwKChlKSA9PiBlLmNsYXNzTmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0Y29uc3QgcmVwb3MgPSB0aGlzLl9yZXBvc2l0b3JpZXMubWFwKChyKSA9PiByLmNsYXNzTmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0Y29uc3QgbmFtZWQgPSB0aGlzLl9kYXRhU291cmNlTmFtZSAhPSBudWxsID8gYG5hbWU6IFwiJHt0aGlzLl9kYXRhU291cmNlTmFtZX1cIiwgYCA6IFwiXCI7XG5cdFx0XHRpZiAodGhpcy5fdHlwZU9ybVNlZWQpIHtcblx0XHRcdFx0YnVpbGRlckNhbGxzLnB1c2goXG5cdFx0XHRcdFx0YFxcdC53aXRoVHlwZU9ybSh7ICR7bmFtZWR9ZW50aXRpZXM6IFske2VudGl0aWVzfV0sIHJlcG9zaXRvcmllczogWyR7cmVwb3N9XSwgc2VlZDogYXN5bmMgKGRhdGFTb3VyY2UpID0+IHsgJHt0aGlzLl90eXBlT3JtU2VlZH0gfSB9KWAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWlsZGVyQ2FsbHMucHVzaChcblx0XHRcdFx0XHRgXFx0LndpdGhUeXBlT3JtKHsgJHtuYW1lZH1lbnRpdGllczogWyR7ZW50aXRpZXN9XSwgcmVwb3NpdG9yaWVzOiBbJHtyZXBvc31dIH0pYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRidWlsZGVyQ2FsbHMucHVzaChgXFx0LndpdGhDb250cm9sbGVycyhIZWxsb0NvbnRyb2xsZXIpYCk7XG5cblx0XHRjb25zdCBjb250ZW50ID0gW1xuXHRcdFx0Li4uaW1wb3J0cyxcblx0XHRcdFwiXCIsXG5cdFx0XHRcInNjcmliZS5leHRlbmQud2l0aFBpbm9QcmV0dHkoKTtcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRgY29uc3QgYXBwID0gYXdhaXQgQnVpbGRlci5jcmVhdGUoeyBhcHBsaWNhdGlvbk5hbWU6IFwiJHt0aGlzLmFwcE5hbWV9XCIgfSlgLFxuXHRcdFx0Li4uYnVpbGRlckNhbGxzLFxuXHRcdFx0YFxcdC5idWlsZCgpO2AsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJhd2FpdCBhcHAuc3RhcnQoeyBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCB9KTtcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRcImV4cG9ydCBkZWZhdWx0IGFwcDtcIixcblx0XHRcdFwiXCIsXG5cdFx0XS5qb2luKFwiXFxuXCIpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwic3JjL21haW4udHNcIixcblx0XHRcdFx0Y29udGVudCxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIk1haW5Tb3VyY2VGaWxlIiwiSW1wb3J0R3JvdXAiLCJfdmFsdWVzIiwiX3R5cGVzIiwiYWRkIiwibmFtZSIsInR5cGVPbmx5IiwiaW5jbHVkZXMiLCJwdXNoIiwidHlwZUlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJyZW5kZXIiLCJmcm9tIiwidmFsdWVzIiwic29ydCIsInR5cGVzIiwibWFwIiwibiIsImpvaW4iLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiTUFJTl9UUyIsIl9zaWRlRWZmZWN0SW1wb3J0cyIsIl9leHRyYUltcG9ydHMiLCJNYXAiLCJfYnVpbGRlckNhbGxzIiwiX2VudGl0aWVzIiwiX3JlcG9zaXRvcmllcyIsIl9zZXJ2aWNlcyIsIl9kYXRhU291cmNlTmFtZSIsIl90eXBlT3JtU2VlZCIsImFwcE5hbWUiLCJhZGRTaWRlRWZmZWN0SW1wb3J0IiwicGF0aCIsImFkZEltcG9ydCIsImdyb3VwIiwiZ2V0Iiwic2V0IiwiYWRkQnVpbGRlckNhbGwiLCJjYWxsIiwiYWRkRW50aXR5IiwiZW50aXR5IiwiYWRkUmVwb3NpdG9yeSIsInJlcG8iLCJhZGRTZXJ2aWNlIiwic2VydmljZSIsInNldERhdGFTb3VyY2VOYW1lIiwic2V0VHlwZU9ybVNlZWQiLCJzZWVkQm9keSIsImZpbGVzIiwiaW1wb3J0cyIsImUiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiciIsInMiLCJzZXJ2aWNlUmVncyIsInNjb3BlIiwiYnVpbGRlckNhbGxzIiwiYyIsImxlbmd0aCIsImVudGl0aWVzIiwicmVwb3MiLCJuYW1lZCIsImNvbnRlbnQiLCJmaWxlUGF0aCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkF3Q2FBOzs7ZUFBQUE7Ozt1QkF4Q29CO0FBTWpDLGlGQUFpRixHQUNqRixNQUFNQztJQUNZQyxVQUFvQixFQUFFLENBQUM7SUFDdkJDLFNBQW1CLEVBQUUsQ0FBQztJQUVoQ0Ms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
@@ -2,20 +2,68 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "WebapiProductionDockerfile", {
6
- enumerable: true,
7
- get: function() {
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get WebapiProductionDockerfile () {
8
13
  return WebapiProductionDockerfile;
14
+ },
15
+ get renderProductionDockerfile () {
16
+ return renderProductionDockerfile;
9
17
  }
10
18
  });
11
19
  const _const = require("../../models/const.js");
12
20
  const _const1 = require("../const.js");
13
21
  class WebapiProductionDockerfile {
22
+ apiNames;
23
+ options;
14
24
  key = _const.WELL_KNOWN_FILES.PRODUCTION_DOCKERFILE;
25
+ constructor(apiNames = [
26
+ _const1.DEFAULT_WEBAPI_NAME
27
+ ], options = {}){
28
+ this.apiNames = apiNames;
29
+ this.options = options;
30
+ }
15
31
  files() {
16
- const content = `# syntax=docker/dockerfile:1
32
+ const names = this.apiNames.length > 0 ? this.apiNames : [
33
+ _const1.DEFAULT_WEBAPI_NAME
34
+ ];
35
+ const first = names[0] ?? _const1.DEFAULT_WEBAPI_NAME;
36
+ const files = [];
37
+ if (!this.options.namedOnly) {
38
+ files.push({
39
+ filePath: ".dockerignore",
40
+ content: dockerignoreContent()
41
+ });
42
+ files.push({
43
+ filePath: "Dockerfile",
44
+ content: renderProductionDockerfile(first, "start")
45
+ });
46
+ }
47
+ const emitNamed = this.options.namedOnly || names.length > 1 || first !== _const1.DEFAULT_WEBAPI_NAME;
48
+ if (emitNamed) {
49
+ for (const name of names){
50
+ files.push({
51
+ filePath: `Dockerfile.${name}`,
52
+ content: renderProductionDockerfile(name, `start:${name}`)
53
+ });
54
+ }
55
+ }
56
+ return files;
57
+ }
58
+ }
59
+ function renderProductionDockerfile(apiName, startScript) {
60
+ const projectDir = (0, _const1.webapiProjectDir)(apiName);
61
+ const startCmd = startScript === "start" ? 'CMD ["pnpm", "start"]' : `CMD ["pnpm", "run", "${startScript}"]`;
62
+ const startEntry = (0, _const1.webapiReleaseEntry)(apiName);
63
+ return `# syntax=docker/dockerfile:1
17
64
  # Self-contained production image: install + forge build happen inside docker build.
18
65
  # Hosts (Railway/Fly/etc.) clone git and run \`docker build\` — they do not receive CI dist/.
66
+ # Build from the repo root: docker build -f Dockerfile${startScript === "start" ? "" : `.${apiName}`} .
19
67
  #
20
68
  # Private @decohere/* packages: pass a BuildKit secret named npm_token (npm auth token), e.g.
21
69
  # docker build --secret id=npm_token,env=NODE_AUTH_TOKEN .
@@ -29,7 +77,7 @@ COPY package.json ./
29
77
  COPY pnpm-lock.yaml* ./
30
78
  COPY tsconfig.json biome.json ./
31
79
  COPY config ./config
32
- COPY ${_const1.WEBAPI_PROJECT_DIR} ./${_const1.WEBAPI_PROJECT_DIR}
80
+ COPY ${projectDir} ./${projectDir}
33
81
 
34
82
  ARG NODE_AUTH_TOKEN=
35
83
  RUN --mount=type=secret,id=npm_token,required=false \\
@@ -60,39 +108,31 @@ COPY --from=build /app/pnpm-lock.yaml* ./
60
108
  COPY --from=build /app/config ./config
61
109
  COPY --from=build /app/dist ./dist
62
110
  COPY --from=build /app/node_modules ./node_modules
63
- COPY --from=build /app/${_const1.WEBAPI_PROJECT_DIR}/package.json ./${_const1.WEBAPI_PROJECT_DIR}/package.json
111
+ COPY --from=build /app/${projectDir}/package.json ./${projectDir}/package.json
64
112
 
65
113
  EXPOSE 3000
66
- CMD ["pnpm", "start"]
67
- # Entry resolved by package.json "start" → node ${_const1.WEBAPI_RELEASE_ENTRY}
114
+ ${startCmd}
115
+ # Entry resolved by package.json "${startScript}" → node ${startEntry}
68
116
  `;
69
- return [
70
- {
71
- filePath: "Dockerfile",
72
- content
73
- },
74
- {
75
- filePath: ".dockerignore",
76
- content: [
77
- "node_modules",
78
- "dist",
79
- ".git",
80
- ".devcontainer",
81
- ".vscode",
82
- ".github",
83
- "postman",
84
- ".postman",
85
- ".env",
86
- ".env.*",
87
- "!.env.example",
88
- "coverage",
89
- "**/*.spec.ts",
90
- "**/*.test.ts",
91
- ""
92
- ].join("\n")
93
- }
94
- ];
95
- }
117
+ }
118
+ function dockerignoreContent() {
119
+ return [
120
+ "node_modules",
121
+ "dist",
122
+ ".git",
123
+ ".devcontainer",
124
+ ".vscode",
125
+ ".github",
126
+ "postman",
127
+ ".postman",
128
+ ".env",
129
+ ".env.*",
130
+ "!.env.example",
131
+ "coverage",
132
+ "**/*.spec.ts",
133
+ "**/*.test.ts",
134
+ ""
135
+ ].join("\n");
96
136
  }
97
137
 
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9wcm9kdWN0aW9uLWRvY2tlcmZpbGUubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc291cmNlLWZpbGUuanNcIjtcbmltcG9ydCB7IFdFQkFQSV9QUk9KRUNUX0RJUiwgV0VCQVBJX1JFTEVBU0VfRU5UUlkgfSBmcm9tIFwiLi4vY29uc3QuanNcIjtcblxuLyoqXG4gKiBSZXBvLXJvb3QgcHJvZHVjdGlvbiBEb2NrZXJmaWxlIGZvciBQYWFTIChSYWlsd2F5L0ZseSkgYW5kIGxvY2FsIGBkb2NrZXIgYnVpbGRgLlxuICogUnVucyBjb252ZW50aW9uYWwgYHBucG0gcnVuIGJ1aWxkYCAvIGBwbnBtIHN0YXJ0YCBzbyBOaXhwYWNrcyBhbmQgRG9ja2VyIHNoYXJlIHNjcmlwdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJhcGlQcm9kdWN0aW9uRG9ja2VyZmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5QUk9EVUNUSU9OX0RPQ0tFUkZJTEU7XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgY29udGVudCA9IGAjIHN5bnRheD1kb2NrZXIvZG9ja2VyZmlsZToxXG4jIFNlbGYtY29udGFpbmVkIHByb2R1Y3Rpb24gaW1hZ2U6IGluc3RhbGwgKyBmb3JnZSBidWlsZCBoYXBwZW4gaW5zaWRlIGRvY2tlciBidWlsZC5cbiMgSG9zdHMgKFJhaWx3YXkvRmx5L2V0Yy4pIGNsb25lIGdpdCBhbmQgcnVuIFxcYGRvY2tlciBidWlsZFxcYCDigJQgdGhleSBkbyBub3QgcmVjZWl2ZSBDSSBkaXN0Ly5cbiNcbiMgUHJpdmF0ZSBAZGVjb2hlcmUvKiBwYWNrYWdlczogcGFzcyBhIEJ1aWxkS2l0IHNlY3JldCBuYW1lZCBucG1fdG9rZW4gKG5wbSBhdXRoIHRva2VuKSwgZS5nLlxuIyAgIGRvY2tlciBidWlsZCAtLXNlY3JldCBpZD1ucG1fdG9rZW4sZW52PU5PREVfQVVUSF9UT0tFTiAuXG4jIE9yIHNldCBOT0RFX0FVVEhfVE9LRU4gYXMgYSBidWlsZC1hcmcgb24gaG9zdHMgdGhhdCBvbmx5IHN1cHBvcnQgYnVpbGQtYXJncy5cblxuRlJPTSBub2RlOjI0LWJvb2t3b3JtIEFTIGJ1aWxkXG5XT1JLRElSIC9hcHBcblJVTiBjb3JlcGFjayBlbmFibGUgJiYgY29yZXBhY2sgcHJlcGFyZSBwbnBtQDEwIC0tYWN0aXZhdGVcblxuQ09QWSBwYWNrYWdlLmpzb24gLi9cbkNPUFkgcG5wbS1sb2NrLnlhbWwqIC4vXG5DT1BZIHRzY29uZmlnLmpzb24gYmlvbWUuanNvbiAuL1xuQ09QWSBjb25maWcgLi9jb25maWdcbkNPUFkgJHtXRUJBUElfUFJPSkVDVF9ESVJ9IC4vJHtXRUJBUElfUFJPSkVDVF9ESVJ9XG5cbkFSRyBOT0RFX0FVVEhfVE9LRU49XG5SVU4gLS1tb3VudD10eXBlPXNlY3JldCxpZD1ucG1fdG9rZW4scmVxdWlyZWQ9ZmFsc2UgXFxcXFxuXHRpZiBbIC1mIC9ydW4vc2VjcmV0cy9ucG1fdG9rZW4gXTsgdGhlbiBcXFxcXG5cdFx0VE9LRU49XCIkKGNhdCAvcnVuL3NlY3JldHMvbnBtX3Rva2VuKVwiOyBcXFxcXG5cdGVsc2UgXFxcXFxuXHRcdFRPS0VOPVwiXFwke05PREVfQVVUSF9UT0tFTn1cIjsgXFxcXFxuXHRmaTsgXFxcXFxuXHRpZiBbIC1uIFwiJFRPS0VOXCIgXTsgdGhlbiBcXFxcXG5cdFx0ZWNobyBcIi8vcmVnaXN0cnkubnBtanMub3JnLzpfYXV0aFRva2VuPVxcJHtUT0tFTn1cIiA+IC5ucG1yYzsgXFxcXFxuXHRmaTsgXFxcXFxuXHRpZiBbIC1mIHBucG0tbG9jay55YW1sIF07IHRoZW4gXFxcXFxuXHRcdHBucG0gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZTsgXFxcXFxuXHRlbHNlIFxcXFxcblx0XHRwbnBtIGluc3RhbGw7IFxcXFxcblx0Zmk7IFxcXFxcblx0cm0gLWYgLm5wbXJjXG5cblJVTiBwbnBtIHJ1biBidWlsZFxuXG5GUk9NIG5vZGU6MjQtYm9va3dvcm0tc2xpbSBBUyBydW5cbldPUktESVIgL2FwcFxuRU5WIE5PREVfRU5WPXByb2R1Y3Rpb25cblJVTiBjb3JlcGFjayBlbmFibGUgJiYgY29yZXBhY2sgcHJlcGFyZSBwbnBtQDEwIC0tYWN0aXZhdGVcblxuQ09QWSAtLWZyb209YnVpbGQgL2FwcC9wYWNrYWdlLmpzb24gLi9cbkNPUFkgLS1mcm9tPWJ1aWxkIC9hcHAvcG5wbS1sb2NrLnlhbWwqIC4vXG5DT1BZIC0tZnJvbT1idWlsZCAvYXBwL2NvbmZpZyAuL2NvbmZpZ1xuQ09QWSAtLWZyb209YnVpbGQgL2FwcC9kaXN0IC4vZGlzdFxuQ09QWSAtLWZyb209YnVpbGQgL2FwcC9ub2RlX21vZHVsZXMgLi9ub2RlX21vZHVsZXNcbkNPUFkgLS1mcm9tPWJ1aWxkIC9hcHAvJHtXRUJBUElfUFJPSkVDVF9ESVJ9L3BhY2thZ2UuanNvbiAuLyR7V0VCQVBJX1BST0pFQ1RfRElSfS9wYWNrYWdlLmpzb25cblxuRVhQT1NFIDMwMDBcbkNNRCBbXCJwbnBtXCIsIFwic3RhcnRcIl1cbiMgRW50cnkgcmVzb2x2ZWQgYnkgcGFja2FnZS5qc29uIFwic3RhcnRcIiDihpIgbm9kZSAke1dFQkFQSV9SRUxFQVNFX0VOVFJZfVxuYDtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIkRvY2tlcmZpbGVcIixcblx0XHRcdFx0Y29udGVudCxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kb2NrZXJpZ25vcmVcIixcblx0XHRcdFx0Y29udGVudDogW1xuXHRcdFx0XHRcdFwibm9kZV9tb2R1bGVzXCIsXG5cdFx0XHRcdFx0XCJkaXN0XCIsXG5cdFx0XHRcdFx0XCIuZ2l0XCIsXG5cdFx0XHRcdFx0XCIuZGV2Y29udGFpbmVyXCIsXG5cdFx0XHRcdFx0XCIudnNjb2RlXCIsXG5cdFx0XHRcdFx0XCIuZ2l0aHViXCIsXG5cdFx0XHRcdFx0XCJwb3N0bWFuXCIsXG5cdFx0XHRcdFx0XCIucG9zdG1hblwiLFxuXHRcdFx0XHRcdFwiLmVudlwiLFxuXHRcdFx0XHRcdFwiLmVudi4qXCIsXG5cdFx0XHRcdFx0XCIhLmVudi5leGFtcGxlXCIsXG5cdFx0XHRcdFx0XCJjb3ZlcmFnZVwiLFxuXHRcdFx0XHRcdFwiKiovKi5zcGVjLnRzXCIsXG5cdFx0XHRcdFx0XCIqKi8qLnRlc3QudHNcIixcblx0XHRcdFx0XHRcIlwiLFxuXHRcdFx0XHRdLmpvaW4oXCJcXG5cIiksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJXZWJhcGlQcm9kdWN0aW9uRG9ja2VyZmlsZSIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJQUk9EVUNUSU9OX0RPQ0tFUkZJTEUiLCJmaWxlcyIsImNvbnRlbnQiLCJXRUJBUElfUFJPSkVDVF9ESVIiLCJXRUJBUElfUkVMRUFTRV9FTlRSWSIsImZpbGVQYXRoIiwiam9pbiJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFRYUE7OztlQUFBQTs7O3VCQVJvQjt3QkFFd0I7QUFNbEQsTUFBTUE7SUFDSUMsTUFBTUMsdUJBQWdCLENBQUNDLHFCQUFxQixDQUFDO0lBRXREQyxRQUFzQjtRQUM1QixNQUFNQyxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7S0FnQmQsRUFBRUMsMEJBQWtCLENBQUMsR0FBRyxFQUFFQSwwQkFBa0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt1QkErQjNCLEVBQUVBLDBCQUFrQixDQUFDLGdCQUFnQixFQUFFQSwwQkFBa0IsQ0FBQzs7OztnREFJakMsRUFBRUMsNEJBQW9CLENBQUM7QUFDdkUsQ0FBQztRQUVDLE9BQU87WUFDTjtnQkFDQ0MsVUFBVTtnQkFDVkg7WUFDRDtZQUNBO2dCQUNDRyxVQUFVO2dCQUNWSCxTQUFTO29CQUNSO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBO29CQUNBO2lCQUNBLENBQUNJLElBQUksQ0FBQztZQUNSO1NBQ0E7SUFDRjtBQUNEIn0=
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9wcm9kdWN0aW9uLWRvY2tlcmZpbGUubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc291cmNlLWZpbGUuanNcIjtcbmltcG9ydCB7IERFRkFVTFRfV0VCQVBJX05BTUUsIHdlYmFwaVByb2plY3REaXIsIHdlYmFwaVJlbGVhc2VFbnRyeSB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuXG5leHBvcnQgdHlwZSBQcm9kdWN0aW9uRG9ja2VyZmlsZU9wdGlvbnMgPSB7XG5cdC8qKiBXaGVuIHRydWUsIG9ubHkgd3JpdGUgYERvY2tlcmZpbGUuPG5hbWU+YCAoZXhpc3Rpbmcgd29ya3NwYWNlIOKAlCBkbyBub3QgcmVwbGFjZSByb290IERvY2tlcmZpbGUpLiAqL1xuXHRuYW1lZE9ubHk/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBQcm9kdWN0aW9uIERvY2tlcmZpbGVzIGZvciBQYWFTIChSYWlsd2F5L0ZseSkgYW5kIGxvY2FsIGBkb2NrZXIgYnVpbGRgLlxuICpcbiAqIENvbnRleHQgaXMgYWx3YXlzIHRoZSAqKnJlcG8gcm9vdCoqIChgZG9ja2VyIGJ1aWxkIC1mIERvY2tlcmZpbGUuYmlsbGluZyAuYCkuXG4gKiBSb290IGBEb2NrZXJmaWxlYCBpcyB0aGUgZmlyc3QgQVBJIChgcG5wbSBzdGFydGApLiBFeHRyYSBvciBjdXN0b20tbmFtZWQgQVBJc1xuICogYWxzbyBnZXQgYERvY2tlcmZpbGUuPG5hbWU+YCBzbyBlYWNoIHNlcnZpY2UgY2FuIGJlIGRlcGxveWVkIG9uIGl0cyBvd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJhcGlQcm9kdWN0aW9uRG9ja2VyZmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5QUk9EVUNUSU9OX0RPQ0tFUkZJTEU7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgYXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW0RFRkFVTFRfV0VCQVBJX05BTUVdLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUHJvZHVjdGlvbkRvY2tlcmZpbGVPcHRpb25zID0ge30sXG5cdCkge31cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBuYW1lcyA9IHRoaXMuYXBpTmFtZXMubGVuZ3RoID4gMCA/IHRoaXMuYXBpTmFtZXMgOiBbREVGQVVMVF9XRUJBUElfTkFNRV07XG5cdFx0Y29uc3QgZmlyc3QgPSBuYW1lc1swXSA/PyBERUZBVUxUX1dFQkFQSV9OQU1FO1xuXHRcdGNvbnN0IGZpbGVzOiBTb3VyY2VGaWxlW10gPSBbXTtcblxuXHRcdGlmICghdGhpcy5vcHRpb25zLm5hbWVkT25seSkge1xuXHRcdFx0ZmlsZXMucHVzaCh7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kb2NrZXJpZ25vcmVcIixcblx0XHRcdFx0Y29udGVudDogZG9ja2VyaWdub3JlQ29udGVudCgpLFxuXHRcdFx0fSk7XG5cdFx0XHRmaWxlcy5wdXNoKHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiRG9ja2VyZmlsZVwiLFxuXHRcdFx0XHRjb250ZW50OiByZW5kZXJQcm9kdWN0aW9uRG9ja2VyZmlsZShmaXJzdCwgXCJzdGFydFwiKSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVtaXROYW1lZCA9XG5cdFx0XHR0aGlzLm9wdGlvbnMubmFtZWRPbmx5IHx8IG5hbWVzLmxlbmd0aCA+IDEgfHwgZmlyc3QgIT09IERFRkFVTFRfV0VCQVBJX05BTUU7XG5cdFx0aWYgKGVtaXROYW1lZCkge1xuXHRcdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRcdGZpbGVzLnB1c2goe1xuXHRcdFx0XHRcdGZpbGVQYXRoOiBgRG9ja2VyZmlsZS4ke25hbWV9YCxcblx0XHRcdFx0XHRjb250ZW50OiByZW5kZXJQcm9kdWN0aW9uRG9ja2VyZmlsZShuYW1lLCBgc3RhcnQ6JHtuYW1lfWApLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmlsZXM7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByb2R1Y3Rpb25Eb2NrZXJmaWxlKGFwaU5hbWU6IHN0cmluZywgc3RhcnRTY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHByb2plY3REaXIgPSB3ZWJhcGlQcm9qZWN0RGlyKGFwaU5hbWUpO1xuXHRjb25zdCBzdGFydENtZCA9XG5cdFx0c3RhcnRTY3JpcHQgPT09IFwic3RhcnRcIlxuXHRcdFx0PyAnQ01EIFtcInBucG1cIiwgXCJzdGFydFwiXSdcblx0XHRcdDogYENNRCBbXCJwbnBtXCIsIFwicnVuXCIsIFwiJHtzdGFydFNjcmlwdH1cIl1gO1xuXHRjb25zdCBzdGFydEVudHJ5ID0gd2ViYXBpUmVsZWFzZUVudHJ5KGFwaU5hbWUpO1xuXG5cdHJldHVybiBgIyBzeW50YXg9ZG9ja2VyL2RvY2tlcmZpbGU6MVxuIyBTZWxmLWNvbnRhaW5lZCBwcm9kdWN0aW9uIGltYWdlOiBpbnN0YWxsICsgZm9yZ2UgYnVpbGQgaGFwcGVuIGluc2lkZSBkb2NrZXIgYnVpbGQuXG4jIEhvc3RzIChSYWlsd2F5L0ZseS9ldGMuKSBjbG9uZSBnaXQgYW5kIHJ1biBcXGBkb2NrZXIgYnVpbGRcXGAg4oCUIHRoZXkgZG8gbm90IHJlY2VpdmUgQ0kgZGlzdC8uXG4jIEJ1aWxkIGZyb20gdGhlIHJlcG8gcm9vdDogZG9ja2VyIGJ1aWxkIC1mIERvY2tlcmZpbGUke3N0YXJ0U2NyaXB0ID09PSBcInN0YXJ0XCIgPyBcIlwiIDogYC4ke2FwaU5hbWV9YH0gLlxuI1xuIyBQcml2YXRlIEBkZWNvaGVyZS8qIHBhY2thZ2VzOiBwYXNzIGEgQnVpbGRLaXQgc2VjcmV0IG5hbWVkIG5wbV90b2tlbiAobnBtIGF1dGggdG9rZW4pLCBlLmcuXG4jICAgZG9ja2VyIGJ1aWxkIC0tc2VjcmV0IGlkPW5wbV90b2tlbixlbnY9Tk9ERV9BVVRIX1RPS0VOIC5cbiMgT3Igc2V0IE5PREVfQVVUSF9UT0tFTiBhcyBhIGJ1aWxkLWFyZyBvbiBob3N0cyB0aGF0IG9ubHkgc3VwcG9ydCBidWlsZC1hcmdzLlxuXG5GUk9NIG5vZGU6MjQtYm9va3dvcm0gQVMgYnVpbGRcbldPUktESVIgL2FwcFxuUlVOIGNvcmVwYWNrIGVuYWJsZSAmJiBjb3JlcGFjayBwcmVwYXJlIHBucG1AMTAgLS1hY3RpdmF0ZVxuXG5DT1BZIHBhY2thZ2UuanNvbiAuL1xuQ09QWSBwbnBtLWxvY2sueWFtbCogLi9cbkNPUFkgdHNjb25maWcuanNvbiBiaW9tZS5qc29uIC4vXG5DT1BZIGNvbmZpZyAuL2NvbmZpZ1xuQ09QWSAke3Byb2plY3REaXJ9IC4vJHtwcm9qZWN0RGlyfVxuXG5BUkcgTk9ERV9BVVRIX1RPS0VOPVxuUlVOIC0tbW91bnQ9dHlwZT1zZWNyZXQsaWQ9bnBtX3Rva2VuLHJlcXVpcmVkPWZhbHNlIFxcXFxcblx0aWYgWyAtZiAvcnVuL3NlY3JldHMvbnBtX3Rva2VuIF07IHRoZW4gXFxcXFxuXHRcdFRPS0VOPVwiJChjYXQgL3J1bi9zZWNyZXRzL25wbV90b2tlbilcIjsgXFxcXFxuXHRlbHNlIFxcXFxcblx0XHRUT0tFTj1cIlxcJHtOT0RFX0FVVEhfVE9LRU59XCI7IFxcXFxcblx0Zmk7IFxcXFxcblx0aWYgWyAtbiBcIiRUT0tFTlwiIF07IHRoZW4gXFxcXFxuXHRcdGVjaG8gXCIvL3JlZ2lzdHJ5Lm5wbWpzLm9yZy86X2F1dGhUb2tlbj1cXCR7VE9LRU59XCIgPiAubnBtcmM7IFxcXFxcblx0Zmk7IFxcXFxcblx0aWYgWyAtZiBwbnBtLWxvY2sueWFtbCBdOyB0aGVuIFxcXFxcblx0XHRwbnBtIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGU7IFxcXFxcblx0ZWxzZSBcXFxcXG5cdFx0cG5wbSBpbnN0YWxsOyBcXFxcXG5cdGZpOyBcXFxcXG5cdHJtIC1mIC5ucG1yY1xuXG5SVU4gcG5wbSBydW4gYnVpbGRcblxuRlJPTSBub2RlOjI0LWJvb2t3b3JtLXNsaW0gQVMgcnVuXG5XT1JLRElSIC9hcHBcbkVOViBOT0RFX0VOVj1wcm9kdWN0aW9uXG5SVU4gY29yZXBhY2sgZW5hYmxlICYmIGNvcmVwYWNrIHByZXBhcmUgcG5wbUAxMCAtLWFjdGl2YXRlXG5cbkNPUFkgLS1mcm9tPWJ1aWxkIC9hcHAvcGFja2FnZS5qc29uIC4vXG5DT1BZIC0tZnJvbT1idWlsZCAvYXBwL3BucG0tbG9jay55YW1sKiAuL1xuQ09QWSAtLWZyb209YnVpbGQgL2FwcC9jb25maWcgLi9jb25maWdcbkNPUFkgLS1mcm9tPWJ1aWxkIC9hcHAvZGlzdCAuL2Rpc3RcbkNPUFkgLS1mcm9tPWJ1aWxkIC9hcHAvbm9kZV9tb2R1bGVzIC4vbm9kZV9tb2R1bGVzXG5DT1BZIC0tZnJvbT1idWlsZCAvYXBwLyR7cHJvamVjdERpcn0vcGFja2FnZS5qc29uIC4vJHtwcm9qZWN0RGlyfS9wYWNrYWdlLmpzb25cblxuRVhQT1NFIDMwMDBcbiR7c3RhcnRDbWR9XG4jIEVudHJ5IHJlc29sdmVkIGJ5IHBhY2thZ2UuanNvbiBcIiR7c3RhcnRTY3JpcHR9XCIg4oaSIG5vZGUgJHtzdGFydEVudHJ5fVxuYDtcbn1cblxuZnVuY3Rpb24gZG9ja2VyaWdub3JlQ29udGVudCgpOiBzdHJpbmcge1xuXHRyZXR1cm4gW1xuXHRcdFwibm9kZV9tb2R1bGVzXCIsXG5cdFx0XCJkaXN0XCIsXG5cdFx0XCIuZ2l0XCIsXG5cdFx0XCIuZGV2Y29udGFpbmVyXCIsXG5cdFx0XCIudnNjb2RlXCIsXG5cdFx0XCIuZ2l0aHViXCIsXG5cdFx0XCJwb3N0bWFuXCIsXG5cdFx0XCIucG9zdG1hblwiLFxuXHRcdFwiLmVudlwiLFxuXHRcdFwiLmVudi4qXCIsXG5cdFx0XCIhLmVudi5leGFtcGxlXCIsXG5cdFx0XCJjb3ZlcmFnZVwiLFxuXHRcdFwiKiovKi5zcGVjLnRzXCIsXG5cdFx0XCIqKi8qLnRlc3QudHNcIixcblx0XHRcIlwiLFxuXHRdLmpvaW4oXCJcXG5cIik7XG59XG4iXSwibmFtZXMiOlsiV2ViYXBpUHJvZHVjdGlvbkRvY2tlcmZpbGUiLCJyZW5kZXJQcm9kdWN0aW9uRG9ja2VyZmlsZSIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJQUk9EVUNUSU9OX0RPQ0tFUkZJTEUiLCJhcGlOYW1lcyIsIkRFRkFVTFRfV0VCQVBJX05BTUUiLCJvcHRpb25zIiwiZmlsZXMiLCJuYW1lcyIsImxlbmd0aCIsImZpcnN0IiwibmFtZWRPbmx5IiwicHVzaCIsImZpbGVQYXRoIiwiY29udGVudCIsImRvY2tlcmlnbm9yZUNvbnRlbnQiLCJlbWl0TmFtZWQiLCJuYW1lIiwiYXBpTmFtZSIsInN0YXJ0U2NyaXB0IiwicHJvamVjdERpciIsIndlYmFwaVByb2plY3REaXIiLCJzdGFydENtZCIsInN0YXJ0RW50cnkiLCJ3ZWJhcGlSZWxlYXNlRW50cnkiLCJqb2luIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQWdCYUE7ZUFBQUE7O1FBdUNHQztlQUFBQTs7O3VCQXZEaUI7d0JBRXlDO0FBY25FLE1BQU1EOzs7SUFDSUUsTUFBTUMsdUJBQWdCLENBQUNDLHFCQUFxQixDQUFDO0lBRTdELFlBQ0MsQUFBaUJDLFdBQThCO1FBQUNDLDJCQUFtQjtLQUFDLEVBQ3BFLEFBQWlCQyxVQUF1QyxDQUFDLENBQUMsQ0FDekQ7YUFGZ0JGLFdBQUFBO2FBQ0FFLFVBQUFBO0lBQ2Y7SUFFSUMsUUFBc0I7UUFDNUIsTUFBTUMsUUFBUSxJQUFJLENBQUNKLFFBQVEsQ0FBQ0ssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDTCxRQUFRLEdBQUc7WUFBQ0MsMkJBQW1CO1NBQUM7UUFDOUUsTUFBTUssUUFBUUYsS0FBSyxDQUFDLEVBQUUsSUFBSUgsMkJBQW1CO1FBQzdDLE1BQU1FLFFBQXNCLEVBQUU7UUFFOUIsSUFBSSxDQUFDLElBQUksQ0FBQ0QsT0FBTyxDQUFDSyxTQUFTLEVBQUU7WUFDNUJKLE1BQU1LLElBQUksQ0FBQztnQkFDVkMsVUFBVTtnQkFDVkMsU0FBU0M7WUFDVjtZQUNBUixNQUFNSyxJQUFJLENBQUM7Z0JBQ1ZDLFVBQVU7Z0JBQ1ZDLFNBQVNkLDJCQUEyQlUsT0FBTztZQUM1QztRQUNEO1FBRUEsTUFBTU0sWUFDTCxJQUFJLENBQUNWLE9BQU8sQ0FBQ0ssU0FBUyxJQUFJSCxNQUFNQyxNQUFNLEdBQUcsS0FBS0MsVUFBVUwsMkJBQW1CO1FBQzVFLElBQUlXLFdBQVc7WUFDZCxLQUFLLE1BQU1DLFFBQVFULE1BQU87Z0JBQ3pCRCxNQUFNSyxJQUFJLENBQUM7b0JBQ1ZDLFVBQVUsQ0FBQyxXQUFXLEVBQUVJLE1BQU07b0JBQzlCSCxTQUFTZCwyQkFBMkJpQixNQUFNLENBQUMsTUFBTSxFQUFFQSxNQUFNO2dCQUMxRDtZQUNEO1FBQ0Q7UUFFQSxPQUFPVjtJQUNSO0FBQ0Q7QUFFTyxTQUFTUCwyQkFBMkJrQixPQUFlLEVBQUVDLFdBQW1CO0lBQzlFLE1BQU1DLGFBQWFDLElBQUFBLHdCQUFnQixFQUFDSDtJQUNwQyxNQUFNSSxXQUNMSCxnQkFBZ0IsVUFDYiwwQkFDQSxDQUFDLHFCQUFxQixFQUFFQSxZQUFZLEVBQUUsQ0FBQztJQUMzQyxNQUFNSSxhQUFhQyxJQUFBQSwwQkFBa0IsRUFBQ047SUFFdEMsT0FBTyxDQUFDOzs7c0RBRzZDLEVBQUVDLGdCQUFnQixVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUVELFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7S0FjaEcsRUFBRUUsV0FBVyxHQUFHLEVBQUVBLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dUJBK0JYLEVBQUVBLFdBQVcsZ0JBQWdCLEVBQUVBLFdBQVc7OztBQUdqRSxFQUFFRSxTQUFTO2tDQUN1QixFQUFFSCxZQUFZLFNBQVMsRUFBRUksV0FBVztBQUN0RSxDQUFDO0FBQ0Q7QUFFQSxTQUFTUjtJQUNSLE9BQU87UUFDTjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7S0FDQSxDQUFDVSxJQUFJLENBQUM7QUFDUiJ9
@@ -1,3 +1,4 @@
1
+ import { readFileSync } from "node:fs";
1
2
  /**
2
3
  * Builder for a YAML config file (e.g. config/config.yaml or config/config.dev.yaml).
3
4
  *
@@ -17,6 +18,25 @@
17
18
  this._sections.push(yaml);
18
19
  return this;
19
20
  }
21
+ /** True when a datasource with this `name:` already appears in the file. */ hasDataSource(name) {
22
+ return this._sections.join("\n").includes(`name: ${name}\n`);
23
+ }
24
+ hasDataSources() {
25
+ return this._sections.join("\n").includes("dataSources:");
26
+ }
27
+ /**
28
+ * Insert a `dataSources` list item. Used by `webapi add` so we do not write a
29
+ * second top-level `database:` key (YAML last-key-wins).
30
+ */ appendDataSource(item) {
31
+ const current = this._sections.join("\n");
32
+ this._sections.length = 0;
33
+ this._sections.push(injectYamlDataSource(current, item));
34
+ return this;
35
+ }
36
+ static fromFile(key, relativePath, absolutePath) {
37
+ const content = readFileSync(absolutePath, "utf8");
38
+ return new ConfigYaml(key, relativePath, content);
39
+ }
20
40
  files() {
21
41
  return [
22
42
  {
@@ -26,5 +46,31 @@
26
46
  ];
27
47
  }
28
48
  }
49
+ /** Insert a YAML list item under `dataSources:`; append a new `database:` block if missing. */ export function injectYamlDataSource(yaml, item) {
50
+ const block = item.replace(/\n$/, "");
51
+ if (!yaml.includes("dataSources:")) {
52
+ const prefix = yaml.trimEnd();
53
+ const section = `database:\n dataSources:\n${block}\n`;
54
+ return prefix.length > 0 ? `${prefix}\n\n${section}` : section;
55
+ }
56
+ const lines = yaml.split("\n");
57
+ const dsIndex = lines.findIndex((line)=>/^\s*dataSources:\s*$/.test(line));
58
+ if (dsIndex < 0) {
59
+ return `${yaml.trimEnd()}\n\ndatabase:\n dataSources:\n${block}\n`;
60
+ }
61
+ let insertAt = lines.length;
62
+ for(let i = dsIndex + 1; i < lines.length; i++){
63
+ if (/^[A-Za-z]/.test(lines[i] ?? "")) {
64
+ insertAt = i;
65
+ break;
66
+ }
67
+ }
68
+ const insertLines = block.split("\n");
69
+ if (insertAt < lines.length && lines[insertAt - 1] !== "") {
70
+ insertLines.push("");
71
+ }
72
+ lines.splice(insertAt, 0, ...insertLines);
73
+ return lines.join("\n");
74
+ }
29
75
 
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbmZpZy15YW1sLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgYSBZQU1MIGNvbmZpZyBmaWxlIChlLmcuIGNvbmZpZy9jb25maWcueWFtbCBvciBjb25maWcvY29uZmlnLmRldi55YW1sKS5cbiAqXG4gKiBTdGFydHMgd2l0aCBhIGJhc2Ugc2VjdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLiBGZWF0dXJlcyBjYWxsXG4gKiBgYWRkU2VjdGlvbih5YW1sKWAgZHVyaW5nIHRoZWlyIHNjYWZmb2xkIHBoYXNlIHRvIGFwcGVuZCB0aGVpciBvd24gYmxvY2suXG4gKiBgZmlsZXMoKWAgam9pbnMgYWxsIHNlY3Rpb25zIHdpdGggYSBibGFuayBsaW5lIHNlcGFyYXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZpZ1lhbWwgaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHJpdmF0ZSByZWFkb25seSBfc2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHB1YmxpYyByZWFkb25seSBrZXk6IHN0cmluZyxcblx0XHRwcml2YXRlIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmcsXG5cdFx0YmFzZUNvbnRlbnQ6IHN0cmluZyxcblx0KSB7XG5cdFx0dGhpcy5fc2VjdGlvbnMucHVzaChiYXNlQ29udGVudCk7XG5cdH1cblxuXHRwdWJsaWMgYWRkU2VjdGlvbih5YW1sOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9zZWN0aW9ucy5wdXNoKHlhbWwpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0cmV0dXJuIFt7IGZpbGVQYXRoOiB0aGlzLmZpbGVQYXRoLCBjb250ZW50OiB0aGlzLl9zZWN0aW9ucy5qb2luKFwiXFxuXCIpIH1dO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiQ29uZmlnWWFtbCIsIl9zZWN0aW9ucyIsImtleSIsImZpbGVQYXRoIiwiYmFzZUNvbnRlbnQiLCJwdXNoIiwiYWRkU2VjdGlvbiIsInlhbWwiLCJmaWxlcyIsImNvbnRlbnQiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0NBTUMsR0FDRCxPQUFPLE1BQU1BOzs7SUFDS0MsWUFBc0IsRUFBRSxDQUFDO0lBRTFDLFlBQ0MsQUFBZ0JDLEdBQVcsRUFDM0IsQUFBaUJDLFFBQWdCLEVBQ2pDQyxXQUFtQixDQUNsQjthQUhlRixNQUFBQTthQUNDQyxXQUFBQTtRQUdqQixJQUFJLENBQUNGLFNBQVMsQ0FBQ0ksSUFBSSxDQUFDRDtJQUNyQjtJQUVPRSxXQUFXQyxJQUFZLEVBQVE7UUFDckMsSUFBSSxDQUFDTixTQUFTLENBQUNJLElBQUksQ0FBQ0U7UUFDcEIsT0FBTyxJQUFJO0lBQ1o7SUFFT0MsUUFBc0I7UUFDNUIsT0FBTztZQUFDO2dCQUFFTCxVQUFVLElBQUksQ0FBQ0EsUUFBUTtnQkFBRU0sU0FBUyxJQUFJLENBQUNSLFNBQVMsQ0FBQ1MsSUFBSSxDQUFDO1lBQU07U0FBRTtJQUN6RTtBQUNEIn0=
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbmZpZy15YW1sLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG4vKipcbiAqIEJ1aWxkZXIgZm9yIGEgWUFNTCBjb25maWcgZmlsZSAoZS5nLiBjb25maWcvY29uZmlnLnlhbWwgb3IgY29uZmlnL2NvbmZpZy5kZXYueWFtbCkuXG4gKlxuICogU3RhcnRzIHdpdGggYSBiYXNlIHNlY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4gRmVhdHVyZXMgY2FsbFxuICogYGFkZFNlY3Rpb24oeWFtbClgIGR1cmluZyB0aGVpciBzY2FmZm9sZCBwaGFzZSB0byBhcHBlbmQgdGhlaXIgb3duIGJsb2NrLlxuICogYGZpbGVzKClgIGpvaW5zIGFsbCBzZWN0aW9ucyB3aXRoIGEgYmxhbmsgbGluZSBzZXBhcmF0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWdZYW1sIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3NlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHRwdWJsaWMgcmVhZG9ubHkga2V5OiBzdHJpbmcsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nLFxuXHRcdGJhc2VDb250ZW50OiBzdHJpbmcsXG5cdCkge1xuXHRcdHRoaXMuX3NlY3Rpb25zLnB1c2goYmFzZUNvbnRlbnQpO1xuXHR9XG5cblx0cHVibGljIGFkZFNlY3Rpb24oeWFtbDogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fc2VjdGlvbnMucHVzaCh5YW1sKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBUcnVlIHdoZW4gYSBkYXRhc291cmNlIHdpdGggdGhpcyBgbmFtZTpgIGFscmVhZHkgYXBwZWFycyBpbiB0aGUgZmlsZS4gKi9cblx0cHVibGljIGhhc0RhdGFTb3VyY2UobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX3NlY3Rpb25zLmpvaW4oXCJcXG5cIikuaW5jbHVkZXMoYG5hbWU6ICR7bmFtZX1cXG5gKTtcblx0fVxuXG5cdHB1YmxpYyBoYXNEYXRhU291cmNlcygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fc2VjdGlvbnMuam9pbihcIlxcblwiKS5pbmNsdWRlcyhcImRhdGFTb3VyY2VzOlwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnNlcnQgYSBgZGF0YVNvdXJjZXNgIGxpc3QgaXRlbS4gVXNlZCBieSBgd2ViYXBpIGFkZGAgc28gd2UgZG8gbm90IHdyaXRlIGFcblx0ICogc2Vjb25kIHRvcC1sZXZlbCBgZGF0YWJhc2U6YCBrZXkgKFlBTUwgbGFzdC1rZXktd2lucykuXG5cdCAqL1xuXHRwdWJsaWMgYXBwZW5kRGF0YVNvdXJjZShpdGVtOiBzdHJpbmcpOiB0aGlzIHtcblx0XHRjb25zdCBjdXJyZW50ID0gdGhpcy5fc2VjdGlvbnMuam9pbihcIlxcblwiKTtcblx0XHR0aGlzLl9zZWN0aW9ucy5sZW5ndGggPSAwO1xuXHRcdHRoaXMuX3NlY3Rpb25zLnB1c2goaW5qZWN0WWFtbERhdGFTb3VyY2UoY3VycmVudCwgaXRlbSkpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBmcm9tRmlsZShrZXk6IHN0cmluZywgcmVsYXRpdmVQYXRoOiBzdHJpbmcsIGFic29sdXRlUGF0aDogc3RyaW5nKTogQ29uZmlnWWFtbCB7XG5cdFx0Y29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgsIFwidXRmOFwiKTtcblx0XHRyZXR1cm4gbmV3IENvbmZpZ1lhbWwoa2V5LCByZWxhdGl2ZVBhdGgsIGNvbnRlbnQpO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0cmV0dXJuIFt7IGZpbGVQYXRoOiB0aGlzLmZpbGVQYXRoLCBjb250ZW50OiB0aGlzLl9zZWN0aW9ucy5qb2luKFwiXFxuXCIpIH1dO1xuXHR9XG59XG5cbi8qKiBJbnNlcnQgYSBZQU1MIGxpc3QgaXRlbSB1bmRlciBgZGF0YVNvdXJjZXM6YDsgYXBwZW5kIGEgbmV3IGBkYXRhYmFzZTpgIGJsb2NrIGlmIG1pc3NpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0WWFtbERhdGFTb3VyY2UoeWFtbDogc3RyaW5nLCBpdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBibG9jayA9IGl0ZW0ucmVwbGFjZSgvXFxuJC8sIFwiXCIpO1xuXHRpZiAoIXlhbWwuaW5jbHVkZXMoXCJkYXRhU291cmNlczpcIikpIHtcblx0XHRjb25zdCBwcmVmaXggPSB5YW1sLnRyaW1FbmQoKTtcblx0XHRjb25zdCBzZWN0aW9uID0gYGRhdGFiYXNlOlxcbiAgZGF0YVNvdXJjZXM6XFxuJHtibG9ja31cXG5gO1xuXHRcdHJldHVybiBwcmVmaXgubGVuZ3RoID4gMCA/IGAke3ByZWZpeH1cXG5cXG4ke3NlY3Rpb259YCA6IHNlY3Rpb247XG5cdH1cblx0Y29uc3QgbGluZXMgPSB5YW1sLnNwbGl0KFwiXFxuXCIpO1xuXHRjb25zdCBkc0luZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lKSA9PiAvXlxccypkYXRhU291cmNlczpcXHMqJC8udGVzdChsaW5lKSk7XG5cdGlmIChkc0luZGV4IDwgMCkge1xuXHRcdHJldHVybiBgJHt5YW1sLnRyaW1FbmQoKX1cXG5cXG5kYXRhYmFzZTpcXG4gIGRhdGFTb3VyY2VzOlxcbiR7YmxvY2t9XFxuYDtcblx0fVxuXHRsZXQgaW5zZXJ0QXQgPSBsaW5lcy5sZW5ndGg7XG5cdGZvciAobGV0IGkgPSBkc0luZGV4ICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKC9eW0EtWmEtel0vLnRlc3QobGluZXNbaV0gPz8gXCJcIikpIHtcblx0XHRcdGluc2VydEF0ID0gaTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpbnNlcnRMaW5lcyA9IGJsb2NrLnNwbGl0KFwiXFxuXCIpO1xuXHRpZiAoaW5zZXJ0QXQgPCBsaW5lcy5sZW5ndGggJiYgbGluZXNbaW5zZXJ0QXQgLSAxXSAhPT0gXCJcIikge1xuXHRcdGluc2VydExpbmVzLnB1c2goXCJcIik7XG5cdH1cblx0bGluZXMuc3BsaWNlKGluc2VydEF0LCAwLCAuLi5pbnNlcnRMaW5lcyk7XG5cdHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufVxuIl0sIm5hbWVzIjpbInJlYWRGaWxlU3luYyIsIkNvbmZpZ1lhbWwiLCJfc2VjdGlvbnMiLCJrZXkiLCJmaWxlUGF0aCIsImJhc2VDb250ZW50IiwicHVzaCIsImFkZFNlY3Rpb24iLCJ5YW1sIiwiaGFzRGF0YVNvdXJjZSIsIm5hbWUiLCJqb2luIiwiaW5jbHVkZXMiLCJoYXNEYXRhU291cmNlcyIsImFwcGVuZERhdGFTb3VyY2UiLCJpdGVtIiwiY3VycmVudCIsImxlbmd0aCIsImluamVjdFlhbWxEYXRhU291cmNlIiwiZnJvbUZpbGUiLCJyZWxhdGl2ZVBhdGgiLCJhYnNvbHV0ZVBhdGgiLCJjb250ZW50IiwiZmlsZXMiLCJibG9jayIsInJlcGxhY2UiLCJwcmVmaXgiLCJ0cmltRW5kIiwic2VjdGlvbiIsImxpbmVzIiwic3BsaXQiLCJkc0luZGV4IiwiZmluZEluZGV4IiwibGluZSIsInRlc3QiLCJpbnNlcnRBdCIsImkiLCJpbnNlcnRMaW5lcyIsInNwbGljZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUFRLFVBQVU7QUFHdkM7Ozs7OztDQU1DLEdBQ0QsT0FBTyxNQUFNQzs7O0lBQ0tDLFlBQXNCLEVBQUUsQ0FBQztJQUUxQyxZQUNDLEFBQWdCQyxHQUFXLEVBQzNCLEFB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
@@ -1,3 +1,4 @@
1
+ import { readFileSync } from "node:fs";
1
2
  import { WELL_KNOWN_FILES } from "./const.js";
2
3
  /**
3
4
  * Accumulates key=value pairs and renders them as a `.env` file.
@@ -12,6 +13,18 @@ import { WELL_KNOWN_FILES } from "./const.js";
12
13
  this._entries.set(key, value);
13
14
  return this;
14
15
  }
16
+ static fromFile(absolutePath) {
17
+ const env = new EnvFile();
18
+ const raw = readFileSync(absolutePath, "utf8");
19
+ for (const line of raw.split("\n")){
20
+ const trimmed = line.trim();
21
+ if (trimmed === "" || trimmed.startsWith("#")) continue;
22
+ const eq = line.indexOf("=");
23
+ if (eq <= 0) continue;
24
+ env.addEntry(line.slice(0, eq).trim(), line.slice(eq + 1));
25
+ }
26
+ return env;
27
+ }
15
28
  files() {
16
29
  if (this._entries.size === 0) return [];
17
30
  const body = [
@@ -27,4 +40,4 @@ import { WELL_KNOWN_FILES } from "./const.js";
27
40
  }
28
41
  }
29
42
 
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2Vudi1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuLyoqXG4gKiBBY2N1bXVsYXRlcyBrZXk9dmFsdWUgcGFpcnMgYW5kIHJlbmRlcnMgdGhlbSBhcyBhIGAuZW52YCBmaWxlLlxuICpcbiAqIFJlZ2lzdGVyIG9uY2UgaW4gdGhlIHdvcmtzcGFjZTsgZmVhdHVyZXMgY2FsbCBgYWRkRW50cnlgIGR1cmluZyB0aGVpclxuICogc2NhZmZvbGQgcGhhc2UgdG8gY29udHJpYnV0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoZSBmaW5hbCBmaWxlIGlzXG4gKiB3cml0dGVuIGF0IHJlbmRlciB0aW1lIHdoZW4gYHdvcmtzcGFjZS5zY2FmZm9sZCgpYCBpcyBjYWxsZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZGaWxlIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkVOVl9GSUxFO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX2VudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG5cdHB1YmxpYyBhZGRFbnRyeShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2VudHJpZXMuc2V0KGtleSwgdmFsdWUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0aWYgKHRoaXMuX2VudHJpZXMuc2l6ZSA9PT0gMCkgcmV0dXJuIFtdO1xuXHRcdGNvbnN0IGJvZHkgPSBbLi4udGhpcy5fZW50cmllcy5lbnRyaWVzKCldLm1hcCgoW2ssIHZdKSA9PiBgJHtrfT0ke3Z9YCkuam9pbihcIlxcblwiKTtcblx0XHRjb25zdCBjb250ZW50ID0gYCR7Ym9keX1cXG5gO1xuXHRcdHJldHVybiBbeyBmaWxlUGF0aDogXCIuZW52XCIsIGNvbnRlbnQgfV07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiRW52RmlsZSIsImtleSIsIkVOVl9GSUxFIiwiX2VudHJpZXMiLCJNYXAiLCJhZGRFbnRyeSIsInZhbHVlIiwic2V0IiwiZmlsZXMiLCJzaXplIiwiYm9keSIsImVudHJpZXMiLCJtYXAiLCJrIiwidiIsImpvaW4iLCJjb250ZW50IiwiZmlsZVBhdGgiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGdCQUFnQixRQUFRLGFBQWE7QUFHOUM7Ozs7OztDQU1DLEdBQ0QsT0FBTyxNQUFNQztJQUNJQyxNQUFNRixpQkFBaUJHLFFBQVEsQ0FBQztJQUUvQkMsV0FBVyxJQUFJQyxNQUFzQjtJQUUvQ0MsU0FBU0osR0FBVyxFQUFFSyxLQUFhLEVBQVE7UUFDakQsSUFBSSxDQUFDSCxRQUFRLENBQUNJLEdBQUcsQ0FBQ04sS0FBS0s7UUFDdkIsT0FBTyxJQUFJO0lBQ1o7SUFFT0UsUUFBc0I7UUFDNUIsSUFBSSxJQUFJLENBQUNMLFFBQVEsQ0FBQ00sSUFBSSxLQUFLLEdBQUcsT0FBTyxFQUFFO1FBQ3ZDLE1BQU1DLE9BQU87ZUFBSSxJQUFJLENBQUNQLFFBQVEsQ0FBQ1EsT0FBTztTQUFHLENBQUNDLEdBQUcsQ0FBQyxDQUFDLENBQUNDLEdBQUdDLEVBQUUsR0FBSyxHQUFHRCxFQUFFLENBQUMsRUFBRUMsR0FBRyxFQUFFQyxJQUFJLENBQUM7UUFDNUUsTUFBTUMsVUFBVSxHQUFHTixLQUFLLEVBQUUsQ0FBQztRQUMzQixPQUFPO1lBQUM7Z0JBQUVPLFVBQVU7Z0JBQVFEO1lBQVE7U0FBRTtJQUN2QztBQUNEIn0=
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2Vudi1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKlxuICogQWNjdW11bGF0ZXMga2V5PXZhbHVlIHBhaXJzIGFuZCByZW5kZXJzIHRoZW0gYXMgYSBgLmVudmAgZmlsZS5cbiAqXG4gKiBSZWdpc3RlciBvbmNlIGluIHRoZSB3b3Jrc3BhY2U7IGZlYXR1cmVzIGNhbGwgYGFkZEVudHJ5YCBkdXJpbmcgdGhlaXJcbiAqIHNjYWZmb2xkIHBoYXNlIHRvIGNvbnRyaWJ1dGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGUgZmluYWwgZmlsZSBpc1xuICogd3JpdHRlbiBhdCByZW5kZXIgdGltZSB3aGVuIGB3b3Jrc3BhY2Uuc2NhZmZvbGQoKWAgaXMgY2FsbGVkLlxuICovXG5leHBvcnQgY2xhc3MgRW52RmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5FTlZfRklMRTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9lbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuXHRwdWJsaWMgYWRkRW50cnkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9lbnRyaWVzLnNldChrZXksIHZhbHVlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZnJvbUZpbGUoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBFbnZGaWxlIHtcblx0XHRjb25zdCBlbnYgPSBuZXcgRW52RmlsZSgpO1xuXHRcdGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgsIFwidXRmOFwiKTtcblx0XHRmb3IgKGNvbnN0IGxpbmUgb2YgcmF3LnNwbGl0KFwiXFxuXCIpKSB7XG5cdFx0XHRjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cdFx0XHRpZiAodHJpbW1lZCA9PT0gXCJcIiB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoXCIjXCIpKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGVxID0gbGluZS5pbmRleE9mKFwiPVwiKTtcblx0XHRcdGlmIChlcSA8PSAwKSBjb250aW51ZTtcblx0XHRcdGVudi5hZGRFbnRyeShsaW5lLnNsaWNlKDAsIGVxKS50cmltKCksIGxpbmUuc2xpY2UoZXEgKyAxKSk7XG5cdFx0fVxuXHRcdHJldHVybiBlbnY7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRpZiAodGhpcy5fZW50cmllcy5zaXplID09PSAwKSByZXR1cm4gW107XG5cdFx0Y29uc3QgYm9keSA9IFsuLi50aGlzLl9lbnRyaWVzLmVudHJpZXMoKV0ubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKS5qb2luKFwiXFxuXCIpO1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBgJHtib2R5fVxcbmA7XG5cdFx0cmV0dXJuIFt7IGZpbGVQYXRoOiBcIi5lbnZcIiwgY29udGVudCB9XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInJlYWRGaWxlU3luYyIsIldFTExfS05PV05fRklMRVMiLCJFbnZGaWxlIiwia2V5IiwiRU5WX0ZJTEUiLCJfZW50cmllcyIsIk1hcCIsImFkZEVudHJ5IiwidmFsdWUiLCJzZXQiLCJmcm9tRmlsZSIsImFic29sdXRlUGF0aCIsImVudiIsInJhdyIsImxpbmUiLCJzcGxpdCIsInRyaW1tZWQiLCJ0cmltIiwic3RhcnRzV2l0aCIsImVxIiwiaW5kZXhPZiIsInNsaWNlIiwiZmlsZXMiLCJzaXplIiwiYm9keSIsImVudHJpZXMiLCJtYXAiLCJrIiwidiIsImpvaW4iLCJjb250ZW50IiwiZmlsZVBhdGgiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBUSxVQUFVO0FBQ3ZDLFNBQVNDLGdCQUFnQixRQUFRLGFBQWE7QUFHOUM7Ozs7OztDQU1DLEdBQ0QsT0FBTyxNQUFNQztJQUNJQyxNQUFNRixpQkFBaUJHLFFBQVEsQ0FBQztJQUUvQkMsV0FBVyxJQUFJQyxNQUFzQjtJQUUvQ0MsU0FBU0osR0FBVyxFQUFFSyxLQUFhLEVBQVE7UUFDakQsSUFBSSxDQUFDSCxRQUFRLENBQUNJLEdBQUcsQ0FBQ04sS0FBS0s7UUFDdkIsT0FBTyxJQUFJO0lBQ1o7SUFFQSxPQUFjRSxTQUFTQyxZQUFvQixFQUFXO1FBQ3JELE1BQU1DLE1BQU0sSUFBSVY7UUFDaEIsTUFBTVcsTUFBTWIsYUFBYVcsY0FBYztRQUN2QyxLQUFLLE1BQU1HLFFBQVFELElBQUlFLEtBQUssQ0FBQyxNQUFPO1lBQ25DLE1BQU1DLFVBQVVGLEtBQUtHLElBQUk7WUFDekIsSUFBSUQsWUFBWSxNQUFNQSxRQUFRRSxVQUFVLENBQUMsTUFBTTtZQUMvQyxNQUFNQyxLQUFLTCxLQUFLTSxPQUFPLENBQUM7WUFDeEIsSUFBSUQsTUFBTSxHQUFHO1lBQ2JQLElBQUlMLFFBQVEsQ0FBQ08sS0FBS08sS0FBSyxDQUFDLEdBQUdGLElBQUlGLElBQUksSUFBSUgsS0FBS08sS0FBSyxDQUFDRixLQUFLO1FBQ3hEO1FBQ0EsT0FBT1A7SUFDUjtJQUVPVSxRQUFzQjtRQUM1QixJQUFJLElBQUksQ0FBQ2pCLFFBQVEsQ0FBQ2tCLElBQUksS0FBSyxHQUFHLE9BQU8sRUFBRTtRQUN2QyxNQUFNQyxPQUFPO2VBQUksSUFBSSxDQUFDbkIsUUFBUSxDQUFDb0IsT0FBTztTQUFHLENBQUNDLEdBQUcsQ0FBQyxDQUFDLENBQUNDLEdBQUdDLEVBQUUsR0FBSyxHQUFHRCxFQUFFLENBQUMsRUFBRUMsR0FBRyxFQUFFQyxJQUFJLENBQUM7UUFDNUUsTUFBTUMsVUFBVSxHQUFHTixLQUFLLEVBQUUsQ0FBQztRQUMzQixPQUFPO1lBQUM7Z0JBQUVPLFVBQVU7Z0JBQVFEO1lBQVE7U0FBRTtJQUN2QztBQUNEIn0=
@@ -1,42 +1,64 @@
1
1
  import { WELL_KNOWN_FILES } from "./const.js";
2
2
  export class LaunchJson {
3
+ apiNames;
3
4
  key = WELL_KNOWN_FILES.LAUNCH_JSON;
5
+ constructor(apiNames = [
6
+ "api"
7
+ ]){
8
+ this.apiNames = apiNames;
9
+ }
4
10
  files() {
11
+ const configurations = [
12
+ {
13
+ name: "Build",
14
+ type: "node",
15
+ request: "launch",
16
+ runtimeExecutable: "pnpm",
17
+ runtimeArgs: [
18
+ "build"
19
+ ],
20
+ console: "integratedTerminal",
21
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code variable
22
+ cwd: "${workspaceFolder}"
23
+ }
24
+ ];
25
+ const first = this.apiNames[0] ?? "api";
26
+ const defaultDevArgs = first === "api" && this.apiNames.length === 1 ? [
27
+ "dev"
28
+ ] : [
29
+ "run",
30
+ `dev:${first}`
31
+ ];
32
+ configurations.push(serveConfig("Serve / Dev", defaultDevArgs));
33
+ for (const apiName of this.apiNames){
34
+ if (apiName === first && this.apiNames.length === 1 && apiName === "api") continue;
35
+ configurations.push(serveConfig(`Serve / Dev (${apiName})`, [
36
+ "run",
37
+ `dev:${apiName}`
38
+ ]));
39
+ }
5
40
  return [
6
41
  {
7
42
  filePath: ".vscode/launch.json",
8
43
  content: JSON.stringify({
9
44
  version: "0.2.0",
10
- configurations: [
11
- {
12
- name: "Build",
13
- type: "node",
14
- request: "launch",
15
- runtimeExecutable: "pnpm",
16
- runtimeArgs: [
17
- "build"
18
- ],
19
- console: "integratedTerminal",
20
- // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code variable
21
- cwd: "${workspaceFolder}"
22
- },
23
- {
24
- name: "Serve / Dev",
25
- type: "node",
26
- request: "launch",
27
- runtimeExecutable: "pnpm",
28
- runtimeArgs: [
29
- "dev"
30
- ],
31
- console: "integratedTerminal",
32
- // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code variable
33
- cwd: "${workspaceFolder}"
34
- }
35
- ]
45
+ configurations
36
46
  }, null, 2)
37
47
  }
38
48
  ];
39
49
  }
40
50
  }
51
+ function serveConfig(name, runtimeArgs) {
52
+ return {
53
+ name,
54
+ type: "node",
55
+ request: "launch",
56
+ runtimeExecutable: "pnpm",
57
+ runtimeArgs,
58
+ console: "integratedTerminal",
59
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code variable
60
+ cwd: "${workspaceFolder}"
61
+ };
62
+ }
41
63
 
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2xhdW5jaC1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuZXhwb3J0IGNsYXNzIExhdW5jaEpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuTEFVTkNIX0pTT047XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLnZzY29kZS9sYXVuY2guanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR2ZXJzaW9uOiBcIjAuMi4wXCIsXG5cdFx0XHRcdFx0XHRjb25maWd1cmF0aW9uczogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZTogXCJCdWlsZFwiLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwibm9kZVwiLFxuXHRcdFx0XHRcdFx0XHRcdHJlcXVlc3Q6IFwibGF1bmNoXCIsXG5cdFx0XHRcdFx0XHRcdFx0cnVudGltZUV4ZWN1dGFibGU6IFwicG5wbVwiLFxuXHRcdFx0XHRcdFx0XHRcdHJ1bnRpbWVBcmdzOiBbXCJidWlsZFwiXSxcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlOiBcImludGVncmF0ZWRUZXJtaW5hbFwiLFxuXHRcdFx0XHRcdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IFZTIENvZGUgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0XHRjd2Q6IFwiJHt3b3Jrc3BhY2VGb2xkZXJ9XCIsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lOiBcIlNlcnZlIC8gRGV2XCIsXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJub2RlXCIsXG5cdFx0XHRcdFx0XHRcdFx0cmVxdWVzdDogXCJsYXVuY2hcIixcblx0XHRcdFx0XHRcdFx0XHRydW50aW1lRXhlY3V0YWJsZTogXCJwbnBtXCIsXG5cdFx0XHRcdFx0XHRcdFx0cnVudGltZUFyZ3M6IFtcImRldlwiXSxcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlOiBcImludGVncmF0ZWRUZXJtaW5hbFwiLFxuXHRcdFx0XHRcdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IFZTIENvZGUgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0XHRjd2Q6IFwiJHt3b3Jrc3BhY2VGb2xkZXJ9XCIsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHQyLFxuXHRcdFx0XHQpLFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiV0VMTF9LTk9XTl9GSUxFUyIsIkxhdW5jaEpzb24iLCJrZXkiLCJMQVVOQ0hfSlNPTiIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsInZlcnNpb24iLCJjb25maWd1cmF0aW9ucyIsIm5hbWUiLCJ0eXBlIiwicmVxdWVzdCIsInJ1bnRpbWVFeGVjdXRhYmxlIiwicnVudGltZUFyZ3MiLCJjb25zb2xlIiwiY3dkIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSxhQUFhO0FBRzlDLE9BQU8sTUFBTUM7SUFDSUMsTUFBTUYsaUJBQWlCRyxXQUFXLENBQUM7SUFFNUNDLFFBQXNCO1FBQzVCLE9BQU87WUFDTjtnQkFDQ0MsVUFBVTtnQkFDVkMsU0FBU0MsS0FBS0MsU0FBUyxDQUN0QjtvQkFDQ0MsU0FBUztvQkFDVEMsZ0JBQWdCO3dCQUNmOzRCQUNDQyxNQUFNOzRCQUNOQyxNQUFNOzRCQUNOQyxTQUFTOzRCQUNUQyxtQkFBbUI7NEJBQ25CQyxhQUFhO2dDQUFDOzZCQUFROzRCQUN0QkMsU0FBUzs0QkFDVCx5RUFBeUU7NEJBQ3pFQyxLQUFLO3dCQUNOO3dCQUNBOzRCQUNDTixNQUFNOzRCQUNOQyxNQUFNOzRCQUNOQyxTQUFTOzRCQUNUQyxtQkFBbUI7NEJBQ25CQyxhQUFhO2dDQUFDOzZCQUFNOzRCQUNwQkMsU0FBUzs0QkFDVCx5RUFBeUU7NEJBQ3pFQyxLQUFLO3dCQUNOO3FCQUNBO2dCQUNGLEdBQ0EsTUFDQTtZQUVGO1NBQ0E7SUFDRjtBQUNEIn0=
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2xhdW5jaC1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuZXhwb3J0IGNsYXNzIExhdW5jaEpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuTEFVTkNIX0pTT047XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1wiYXBpXCJdKSB7fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdGNvbnN0IGNvbmZpZ3VyYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW1xuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkJ1aWxkXCIsXG5cdFx0XHRcdHR5cGU6IFwibm9kZVwiLFxuXHRcdFx0XHRyZXF1ZXN0OiBcImxhdW5jaFwiLFxuXHRcdFx0XHRydW50aW1lRXhlY3V0YWJsZTogXCJwbnBtXCIsXG5cdFx0XHRcdHJ1bnRpbWVBcmdzOiBbXCJidWlsZFwiXSxcblx0XHRcdFx0Y29uc29sZTogXCJpbnRlZ3JhdGVkVGVybWluYWxcIixcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogVlMgQ29kZSB2YXJpYWJsZVxuXHRcdFx0XHRjd2Q6IFwiJHt3b3Jrc3BhY2VGb2xkZXJ9XCIsXG5cdFx0XHR9LFxuXHRcdF07XG5cblx0XHRjb25zdCBmaXJzdCA9IHRoaXMuYXBpTmFtZXNbMF0gPz8gXCJhcGlcIjtcblx0XHRjb25zdCBkZWZhdWx0RGV2QXJncyA9XG5cdFx0XHRmaXJzdCA9PT0gXCJhcGlcIiAmJiB0aGlzLmFwaU5hbWVzLmxlbmd0aCA9PT0gMSA/IFtcImRldlwiXSA6IFtcInJ1blwiLCBgZGV2OiR7Zmlyc3R9YF07XG5cdFx0Y29uZmlndXJhdGlvbnMucHVzaChzZXJ2ZUNvbmZpZyhcIlNlcnZlIC8gRGV2XCIsIGRlZmF1bHREZXZBcmdzKSk7XG5cblx0XHRmb3IgKGNvbnN0IGFwaU5hbWUgb2YgdGhpcy5hcGlOYW1lcykge1xuXHRcdFx0aWYgKGFwaU5hbWUgPT09IGZpcnN0ICYmIHRoaXMuYXBpTmFtZXMubGVuZ3RoID09PSAxICYmIGFwaU5hbWUgPT09IFwiYXBpXCIpIGNvbnRpbnVlO1xuXHRcdFx0Y29uZmlndXJhdGlvbnMucHVzaChzZXJ2ZUNvbmZpZyhgU2VydmUgLyBEZXYgKCR7YXBpTmFtZX0pYCwgW1wicnVuXCIsIGBkZXY6JHthcGlOYW1lfWBdKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLnZzY29kZS9sYXVuY2guanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR2ZXJzaW9uOiBcIjAuMi4wXCIsXG5cdFx0XHRcdFx0XHRjb25maWd1cmF0aW9ucyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0Mixcblx0XHRcdFx0KSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuXG5mdW5jdGlvbiBzZXJ2ZUNvbmZpZyhuYW1lOiBzdHJpbmcsIHJ1bnRpbWVBcmdzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcblx0cmV0dXJuIHtcblx0XHRuYW1lLFxuXHRcdHR5cGU6IFwibm9kZVwiLFxuXHRcdHJlcXVlc3Q6IFwibGF1bmNoXCIsXG5cdFx0cnVudGltZUV4ZWN1dGFibGU6IFwicG5wbVwiLFxuXHRcdHJ1bnRpbWVBcmdzLFxuXHRcdGNvbnNvbGU6IFwiaW50ZWdyYXRlZFRlcm1pbmFsXCIsXG5cdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogVlMgQ29kZSB2YXJpYWJsZVxuXHRcdGN3ZDogXCIke3dvcmtzcGFjZUZvbGRlcn1cIixcblx0fTtcbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiTGF1bmNoSnNvbiIsImtleSIsIkxBVU5DSF9KU09OIiwiYXBpTmFtZXMiLCJmaWxlcyIsImNvbmZpZ3VyYXRpb25zIiwibmFtZSIsInR5cGUiLCJyZXF1ZXN0IiwicnVudGltZUV4ZWN1dGFibGUiLCJydW50aW1lQXJncyIsImNvbnNvbGUiLCJjd2QiLCJmaXJzdCIsImRlZmF1bHREZXZBcmdzIiwibGVuZ3RoIiwicHVzaCIsInNlcnZlQ29uZmlnIiwiYXBpTmFtZSIsImZpbGVQYXRoIiwiY29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2ZXJzaW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSxhQUFhO0FBRzlDLE9BQU8sTUFBTUM7O0lBQ0lDLE1BQU1GLGlCQUFpQkcsV0FBVyxDQUFDO0lBRW5ELFlBQW1CLEFBQWlCQyxXQUE4QjtRQUFDO0tBQU0sQ0FBRTthQUF2Q0EsV0FBQUE7SUFBd0M7SUFFckVDLFFBQXNCO1FBQzVCLE1BQU1DLGlCQUE0QztZQUNqRDtnQkFDQ0MsTUFBTTtnQkFDTkMsTUFBTTtnQkFDTkMsU0FBUztnQkFDVEMsbUJBQW1CO2dCQUNuQkMsYUFBYTtvQkFBQztpQkFBUTtnQkFDdEJDLFNBQVM7Z0JBQ1QseUVBQXlFO2dCQUN6RUMsS0FBSztZQUNOO1NBQ0E7UUFFRCxNQUFNQyxRQUFRLElBQUksQ0FBQ1YsUUFBUSxDQUFDLEVBQUUsSUFBSTtRQUNsQyxNQUFNVyxpQkFDTEQsVUFBVSxTQUFTLElBQUksQ0FBQ1YsUUFBUSxDQUFDWSxNQUFNLEtBQUssSUFBSTtZQUFDO1NBQU0sR0FBRztZQUFDO1lBQU8sQ0FBQyxJQUFJLEVBQUVGLE9BQU87U0FBQztRQUNsRlIsZUFBZVcsSUFBSSxDQUFDQyxZQUFZLGVBQWVIO1FBRS9DLEtBQUssTUFBTUksV0FBVyxJQUFJLENBQUNmLFFBQVEsQ0FBRTtZQUNwQyxJQUFJZSxZQUFZTCxTQUFTLElBQUksQ0FBQ1YsUUFBUSxDQUFDWSxNQUFNLEtBQUssS0FBS0csWUFBWSxPQUFPO1lBQzFFYixlQUFlVyxJQUFJLENBQUNDLFlBQVksQ0FBQyxhQUFhLEVBQUVDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7Z0JBQUM7Z0JBQU8sQ0FBQyxJQUFJLEVBQUVBLFNBQVM7YUFBQztRQUN0RjtRQUVBLE9BQU87WUFDTjtnQkFDQ0MsVUFBVTtnQkFDVkMsU0FBU0MsS0FBS0MsU0FBUyxDQUN0QjtvQkFDQ0MsU0FBUztvQkFDVGxCO2dCQUNELEdBQ0EsTUFDQTtZQUVGO1NBQ0E7SUFDRjtBQUNEO0FBRUEsU0FBU1ksWUFBWVgsSUFBWSxFQUFFSSxXQUFxQjtJQUN2RCxPQUFPO1FBQ05KO1FBQ0FDLE1BQU07UUFDTkMsU0FBUztRQUNUQyxtQkFBbUI7UUFDbkJDO1FBQ0FDLFNBQVM7UUFDVCx5RUFBeUU7UUFDekVDLEtBQUs7SUFDTjtBQUNEIn0=