@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.
- package/commonjs/src/models/config-yaml.model.js +58 -4
- package/commonjs/src/models/env-file.model.js +14 -1
- package/commonjs/src/models/launch-json.model.js +49 -27
- package/commonjs/src/models/package-json.model.js +64 -7
- package/commonjs/src/models/project.model.js +4 -1
- package/commonjs/src/program.js +52 -21
- package/commonjs/src/runner.js +13 -2
- package/commonjs/src/webapi/api-name.js +95 -0
- package/commonjs/src/webapi/const.js +32 -4
- package/commonjs/src/webapi/create-api.js +62 -18
- package/commonjs/src/webapi/features/auth.feature.js +56 -51
- package/commonjs/src/webapi/features/biome-format.js +6 -4
- package/commonjs/src/webapi/features/database.feature.js +125 -98
- package/commonjs/src/webapi/features/finalize.feature.js +19 -7
- package/commonjs/src/webapi/models/api-package-json.model.js +7 -5
- package/commonjs/src/webapi/models/main-source-file.model.js +12 -3
- package/commonjs/src/webapi/models/production-dockerfile.model.js +76 -36
- package/es6/src/models/config-yaml.model.js +47 -1
- package/es6/src/models/env-file.model.js +14 -1
- package/es6/src/models/launch-json.model.js +49 -27
- package/es6/src/models/package-json.model.js +62 -5
- package/es6/src/models/project.model.js +4 -1
- package/es6/src/program.js +52 -21
- package/es6/src/runner.js +13 -2
- package/es6/src/webapi/api-name.js +59 -0
- package/es6/src/webapi/const.js +18 -5
- package/es6/src/webapi/create-api.js +64 -20
- package/es6/src/webapi/features/auth.feature.js +56 -51
- package/es6/src/webapi/features/biome-format.js +6 -4
- package/es6/src/webapi/features/database.feature.js +125 -98
- package/es6/src/webapi/features/finalize.feature.js +19 -7
- package/es6/src/webapi/models/api-package-json.model.js +8 -6
- package/es6/src/webapi/models/main-source-file.model.js +12 -3
- package/es6/src/webapi/models/production-dockerfile.model.js +71 -36
- package/package.json +2 -2
- package/types/src/models/config-yaml.model.d.ts +11 -0
- package/types/src/models/env-file.model.d.ts +1 -0
- package/types/src/models/launch-json.model.d.ts +2 -0
- package/types/src/models/package-json.model.d.ts +16 -6
- package/types/src/models/project.model.d.ts +3 -0
- package/types/src/webapi/api-name.d.ts +14 -0
- package/types/src/webapi/const.d.ts +15 -5
- package/types/src/webapi/create-api.d.ts +4 -0
- package/types/src/webapi/features/biome-format.d.ts +1 -1
- package/types/src/webapi/models/api-package-json.model.d.ts +4 -3
- package/types/src/webapi/models/main-source-file.model.d.ts +6 -0
- 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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
|
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 ${
|
|
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/${
|
|
111
|
+
COPY --from=build /app/${projectDir}/package.json ./${projectDir}/package.json
|
|
64
112
|
|
|
65
113
|
EXPOSE 3000
|
|
66
|
-
|
|
67
|
-
# Entry resolved by package.json "
|
|
114
|
+
${startCmd}
|
|
115
|
+
# Entry resolved by package.json "${startScript}" → node ${startEntry}
|
|
68
116
|
`;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2xhdW5jaC1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuZXhwb3J0IGNsYXNzIExhdW5jaEpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuTEFVTkNIX0pTT047XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1wiYXBpXCJdKSB7fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdGNvbnN0IGNvbmZpZ3VyYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW1xuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkJ1aWxkXCIsXG5cdFx0XHRcdHR5cGU6IFwibm9kZVwiLFxuXHRcdFx0XHRyZXF1ZXN0OiBcImxhdW5jaFwiLFxuXHRcdFx0XHRydW50aW1lRXhlY3V0YWJsZTogXCJwbnBtXCIsXG5cdFx0XHRcdHJ1bnRpbWVBcmdzOiBbXCJidWlsZFwiXSxcblx0XHRcdFx0Y29uc29sZTogXCJpbnRlZ3JhdGVkVGVybWluYWxcIixcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogVlMgQ29kZSB2YXJpYWJsZVxuXHRcdFx0XHRjd2Q6IFwiJHt3b3Jrc3BhY2VGb2xkZXJ9XCIsXG5cdFx0XHR9LFxuXHRcdF07XG5cblx0XHRjb25zdCBmaXJzdCA9IHRoaXMuYXBpTmFtZXNbMF0gPz8gXCJhcGlcIjtcblx0XHRjb25zdCBkZWZhdWx0RGV2QXJncyA9XG5cdFx0XHRmaXJzdCA9PT0gXCJhcGlcIiAmJiB0aGlzLmFwaU5hbWVzLmxlbmd0aCA9PT0gMSA/IFtcImRldlwiXSA6IFtcInJ1blwiLCBgZGV2OiR7Zmlyc3R9YF07XG5cdFx0Y29uZmlndXJhdGlvbnMucHVzaChzZXJ2ZUNvbmZpZyhcIlNlcnZlIC8gRGV2XCIsIGRlZmF1bHREZXZBcmdzKSk7XG5cblx0XHRmb3IgKGNvbnN0IGFwaU5hbWUgb2YgdGhpcy5hcGlOYW1lcykge1xuXHRcdFx0aWYgKGFwaU5hbWUgPT09IGZpcnN0ICYmIHRoaXMuYXBpTmFtZXMubGVuZ3RoID09PSAxICYmIGFwaU5hbWUgPT09IFwiYXBpXCIpIGNvbnRpbnVlO1xuXHRcdFx0Y29uZmlndXJhdGlvbnMucHVzaChzZXJ2ZUNvbmZpZyhgU2VydmUgLyBEZXYgKCR7YXBpTmFtZX0pYCwgW1wicnVuXCIsIGBkZXY6JHthcGlOYW1lfWBdKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLnZzY29kZS9sYXVuY2guanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR2ZXJzaW9uOiBcIjAuMi4wXCIsXG5cdFx0XHRcdFx0XHRjb25maWd1cmF0aW9ucyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0Mixcblx0XHRcdFx0KSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuXG5mdW5jdGlvbiBzZXJ2ZUNvbmZpZyhuYW1lOiBzdHJpbmcsIHJ1bnRpbWVBcmdzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcblx0cmV0dXJuIHtcblx0XHRuYW1lLFxuXHRcdHR5cGU6IFwibm9kZVwiLFxuXHRcdHJlcXVlc3Q6IFwibGF1bmNoXCIsXG5cdFx0cnVudGltZUV4ZWN1dGFibGU6IFwicG5wbVwiLFxuXHRcdHJ1bnRpbWVBcmdzLFxuXHRcdGNvbnNvbGU6IFwiaW50ZWdyYXRlZFRlcm1pbmFsXCIsXG5cdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogVlMgQ29kZSB2YXJpYWJsZVxuXHRcdGN3ZDogXCIke3dvcmtzcGFjZUZvbGRlcn1cIixcblx0fTtcbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiTGF1bmNoSnNvbiIsImtleSIsIkxBVU5DSF9KU09OIiwiYXBpTmFtZXMiLCJmaWxlcyIsImNvbmZpZ3VyYXRpb25zIiwibmFtZSIsInR5cGUiLCJyZXF1ZXN0IiwicnVudGltZUV4ZWN1dGFibGUiLCJydW50aW1lQXJncyIsImNvbnNvbGUiLCJjd2QiLCJmaXJzdCIsImRlZmF1bHREZXZBcmdzIiwibGVuZ3RoIiwicHVzaCIsInNlcnZlQ29uZmlnIiwiYXBpTmFtZSIsImZpbGVQYXRoIiwiY29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2ZXJzaW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSxhQUFhO0FBRzlDLE9BQU8sTUFBTUM7O0lBQ0lDLE1BQU1GLGlCQUFpQkcsV0FBVyxDQUFDO0lBRW5ELFlBQW1CLEFBQWlCQyxXQUE4QjtRQUFDO0tBQU0sQ0FBRTthQUF2Q0EsV0FBQUE7SUFBd0M7SUFFckVDLFFBQXNCO1FBQzVCLE1BQU1DLGlCQUE0QztZQUNqRDtnQkFDQ0MsTUFBTTtnQkFDTkMsTUFBTTtnQkFDTkMsU0FBUztnQkFDVEMsbUJBQW1CO2dCQUNuQkMsYUFBYTtvQkFBQztpQkFBUTtnQkFDdEJDLFNBQVM7Z0JBQ1QseUVBQXlFO2dCQUN6RUMsS0FBSztZQUNOO1NBQ0E7UUFFRCxNQUFNQyxRQUFRLElBQUksQ0FBQ1YsUUFBUSxDQUFDLEVBQUUsSUFBSTtRQUNsQyxNQUFNVyxpQkFDTEQsVUFBVSxTQUFTLElBQUksQ0FBQ1YsUUFBUSxDQUFDWSxNQUFNLEtBQUssSUFBSTtZQUFDO1NBQU0sR0FBRztZQUFDO1lBQU8sQ0FBQyxJQUFJLEVBQUVGLE9BQU87U0FBQztRQUNsRlIsZUFBZVcsSUFBSSxDQUFDQyxZQUFZLGVBQWVIO1FBRS9DLEtBQUssTUFBTUksV0FBVyxJQUFJLENBQUNmLFFBQVEsQ0FBRTtZQUNwQyxJQUFJZSxZQUFZTCxTQUFTLElBQUksQ0FBQ1YsUUFBUSxDQUFDWSxNQUFNLEtBQUssS0FBS0csWUFBWSxPQUFPO1lBQzFFYixlQUFlVyxJQUFJLENBQUNDLFlBQVksQ0FBQyxhQUFhLEVBQUVDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7Z0JBQUM7Z0JBQU8sQ0FBQyxJQUFJLEVBQUVBLFNBQVM7YUFBQztRQUN0RjtRQUVBLE9BQU87WUFDTjtnQkFDQ0MsVUFBVTtnQkFDVkMsU0FBU0MsS0FBS0MsU0FBUyxDQUN0QjtvQkFDQ0MsU0FBUztvQkFDVGxCO2dCQUNELEdBQ0EsTUFDQTtZQUVGO1NBQ0E7SUFDRjtBQUNEO0FBRUEsU0FBU1ksWUFBWVgsSUFBWSxFQUFFSSxXQUFxQjtJQUN2RCxPQUFPO1FBQ05KO1FBQ0FDLE1BQU07UUFDTkMsU0FBUztRQUNUQyxtQkFBbUI7UUFDbkJDO1FBQ0FDLFNBQVM7UUFDVCx5RUFBeUU7UUFDekVDLEtBQUs7SUFDTjtBQUNEIn0=
|