@backstage/backend-defaults 0.3.0-next.2 → 0.3.0

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 (72) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/auth/package.json +6 -0
  3. package/cache/package.json +1 -1
  4. package/config.d.ts +277 -0
  5. package/database/package.json +1 -1
  6. package/discovery/package.json +1 -1
  7. package/dist/auth.cjs.js +1025 -0
  8. package/dist/auth.cjs.js.map +1 -0
  9. package/dist/auth.d.ts +14 -0
  10. package/dist/cache.cjs.js.map +1 -1
  11. package/dist/cache.d.ts +31 -37
  12. package/dist/cjs/config-BDOwXIyo.cjs.js +64 -0
  13. package/dist/cjs/config-BDOwXIyo.cjs.js.map +1 -0
  14. package/dist/cjs/createConfigSecretEnumerator-DShyoWWL.cjs.js +33 -0
  15. package/dist/cjs/createConfigSecretEnumerator-DShyoWWL.cjs.js.map +1 -0
  16. package/dist/cjs/helpers-D2f1CG0o.cjs.js +53 -0
  17. package/dist/cjs/helpers-D2f1CG0o.cjs.js.map +1 -0
  18. package/dist/database.cjs.js +59 -145
  19. package/dist/database.cjs.js.map +1 -1
  20. package/dist/database.d.ts +7 -2
  21. package/dist/discovery.cjs.js +6 -6
  22. package/dist/discovery.cjs.js.map +1 -1
  23. package/dist/discovery.d.ts +9 -1
  24. package/dist/httpAuth.cjs.js +192 -0
  25. package/dist/httpAuth.cjs.js.map +1 -0
  26. package/dist/httpAuth.d.ts +15 -0
  27. package/dist/httpRouter.cjs.js +191 -0
  28. package/dist/httpRouter.cjs.js.map +1 -0
  29. package/dist/httpRouter.d.ts +55 -0
  30. package/dist/index.cjs.js +14 -8
  31. package/dist/index.cjs.js.map +1 -1
  32. package/dist/lifecycle.cjs.js.map +1 -1
  33. package/dist/lifecycle.d.ts +5 -1
  34. package/dist/logger.cjs.js +17 -0
  35. package/dist/logger.cjs.js.map +1 -0
  36. package/dist/logger.d.ts +14 -0
  37. package/dist/permissions.cjs.js.map +1 -1
  38. package/dist/permissions.d.ts +6 -0
  39. package/dist/rootConfig.cjs.js +3 -0
  40. package/dist/rootConfig.cjs.js.map +1 -1
  41. package/dist/rootConfig.d.ts +17 -2
  42. package/dist/rootHttpRouter.cjs.js +629 -0
  43. package/dist/rootHttpRouter.cjs.js.map +1 -0
  44. package/dist/rootHttpRouter.d.ts +283 -0
  45. package/dist/rootLifecycle.cjs.js.map +1 -1
  46. package/dist/rootLifecycle.d.ts +5 -1
  47. package/dist/rootLogger.cjs.js +143 -0
  48. package/dist/rootLogger.cjs.js.map +1 -0
  49. package/dist/rootLogger.d.ts +58 -0
  50. package/dist/scheduler.cjs.js +11 -40
  51. package/dist/scheduler.cjs.js.map +1 -1
  52. package/dist/scheduler.d.ts +19 -2
  53. package/dist/urlReader.cjs.js +2932 -2
  54. package/dist/urlReader.cjs.js.map +1 -1
  55. package/dist/urlReader.d.ts +422 -4
  56. package/dist/userInfo.cjs.js +70 -0
  57. package/dist/userInfo.cjs.js.map +1 -0
  58. package/dist/userInfo.d.ts +14 -0
  59. package/httpAuth/package.json +6 -0
  60. package/httpRouter/package.json +6 -0
  61. package/lifecycle/package.json +1 -1
  62. package/logger/package.json +6 -0
  63. package/migrations/auth/20240327104803_public_keys.js +50 -0
  64. package/package.json +103 -11
  65. package/permissions/package.json +1 -1
  66. package/rootConfig/package.json +1 -1
  67. package/rootHttpRouter/package.json +6 -0
  68. package/rootLifecycle/package.json +1 -1
  69. package/rootLogger/package.json +6 -0
  70. package/scheduler/package.json +1 -1
  71. package/urlReader/package.json +1 -1
  72. package/userInfo/package.json +6 -0
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var backendCommon = require('@backstage/backend-common');
4
3
  var backendPluginApi = require('@backstage/backend-plugin-api');
5
4
  var config = require('@backstage/config');
6
5
  var errors = require('@backstage/errors');
@@ -9,39 +8,15 @@ var lodash = require('lodash');
9
8
  var limiterFactory = require('p-limit');
10
9
  var yn = require('yn');
11
10
  var backendDevUtils = require('@backstage/backend-dev-utils');
12
- var fsExtra = require('fs-extra');
13
- var path = require('path');
11
+ var fs = require('fs-extra');
12
+ var platformPath = require('path');
14
13
 
15
14
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
16
15
 
17
16
  var knexFactory__default = /*#__PURE__*/_interopDefaultCompat(knexFactory);
18
17
  var limiterFactory__default = /*#__PURE__*/_interopDefaultCompat(limiterFactory);
19
18
  var yn__default = /*#__PURE__*/_interopDefaultCompat(yn);
20
- var path__default = /*#__PURE__*/_interopDefaultCompat(path);
21
-
22
- const databaseServiceFactory = backendPluginApi.createServiceFactory({
23
- service: backendPluginApi.coreServices.database,
24
- deps: {
25
- config: backendPluginApi.coreServices.rootConfig,
26
- lifecycle: backendPluginApi.coreServices.lifecycle,
27
- pluginMetadata: backendPluginApi.coreServices.pluginMetadata
28
- },
29
- async createRootContext({ config: config$1 }) {
30
- return config$1.getOptional("backend.database") ? backendCommon.DatabaseManager.fromConfig(config$1) : backendCommon.DatabaseManager.fromConfig(
31
- new config.ConfigReader({
32
- backend: {
33
- database: { client: "better-sqlite3", connection: ":memory:" }
34
- }
35
- })
36
- );
37
- },
38
- async factory({ pluginMetadata, lifecycle }, databaseManager) {
39
- return databaseManager.forPlugin(pluginMetadata.getId(), {
40
- pluginMetadata,
41
- lifecycle
42
- });
43
- }
44
- });
19
+ var platformPath__default = /*#__PURE__*/_interopDefaultCompat(platformPath);
45
20
 
46
21
  function defaultNameOverride(name) {
47
22
  return {
@@ -174,45 +149,28 @@ async function dropMysqlDatabase(dbConfig, ...databases) {
174
149
  await admin.destroy();
175
150
  }
176
151
  }
177
- const mysqlConnector = Object.freeze({
178
- createClient: createMysqlDatabaseClient,
179
- ensureDatabaseExists: ensureMysqlDatabaseExists,
180
- createNameOverride: defaultNameOverride,
181
- parseConnectionString: parseMysqlConnectionString,
182
- dropDatabase: dropMysqlDatabase
183
- });
184
152
  function pluginPath$3(pluginId) {
185
153
  return `plugin.${pluginId}`;
186
154
  }
187
- function normalizeConnection$2(connection, client) {
155
+ function normalizeConnection$2(connection) {
188
156
  if (typeof connection === "undefined" || connection === null) {
189
157
  return {};
190
158
  }
191
- return typeof connection === "string" || connection instanceof String ? mysqlConnector.parseConnectionString(connection, client) : connection;
192
- }
193
- function createNameOverride$2(client, name) {
194
- try {
195
- return mysqlConnector.createNameOverride(name);
196
- } catch (e) {
197
- throw new errors.InputError(
198
- `Unable to create database name override for '${client}' connector`,
199
- e
200
- );
201
- }
159
+ return typeof connection === "string" || connection instanceof String ? parseMysqlConnectionString(connection) : connection;
202
160
  }
203
161
  class MysqlConnector {
204
162
  constructor(config, prefix) {
205
163
  this.config = config;
206
164
  this.prefix = prefix;
207
165
  }
208
- async getClient(pluginId, deps) {
166
+ async getClient(pluginId, _deps) {
209
167
  const pluginConfig = new config.ConfigReader(
210
168
  this.getConfigForPlugin(pluginId)
211
169
  );
212
170
  const databaseName = this.getDatabaseName(pluginId);
213
171
  if (databaseName && this.getEnsureExistsConfig(pluginId)) {
214
172
  try {
215
- await mysqlConnector.ensureDatabaseExists(pluginConfig, databaseName);
173
+ await ensureMysqlDatabaseExists(pluginConfig, databaseName);
216
174
  } catch (error) {
217
175
  throw new Error(
218
176
  `Failed to connect to the database to make sure that '${databaseName}' exists, ${error}`
@@ -229,10 +187,9 @@ class MysqlConnector {
229
187
  {},
230
188
  this.getDatabaseOverrides(pluginId)
231
189
  );
232
- const client = mysqlConnector.createClient(
190
+ const client = createMysqlDatabaseClient(
233
191
  pluginConfig,
234
- databaseClientOverrides,
235
- deps
192
+ databaseClientOverrides
236
193
  );
237
194
  return client;
238
195
  }
@@ -309,17 +266,13 @@ class MysqlConnector {
309
266
  * unless `pluginDivisionMode` is set to `schema`.
310
267
  */
311
268
  getConnectionConfig(pluginId) {
312
- const { client, overridden } = this.getClientType(pluginId);
313
- let baseConnection = normalizeConnection$2(
314
- this.config.get("connection"),
315
- this.config.getString("client")
316
- );
269
+ const { overridden } = this.getClientType(pluginId);
270
+ let baseConnection = normalizeConnection$2(this.config.get("connection"));
317
271
  if (this.getPluginDivisionModeConfig() !== "schema") {
318
272
  baseConnection = lodash.omit(baseConnection, "database");
319
273
  }
320
274
  const connection = normalizeConnection$2(
321
- this.config.getOptional(`${pluginPath$3(pluginId)}.connection`),
322
- client
275
+ this.config.getOptional(`${pluginPath$3(pluginId)}.connection`)
323
276
  );
324
277
  return {
325
278
  // include base connection if client type has not been overridden
@@ -353,7 +306,7 @@ class MysqlConnector {
353
306
  */
354
307
  getDatabaseOverrides(pluginId) {
355
308
  const databaseName = this.getDatabaseName(pluginId);
356
- return databaseName ? createNameOverride$2(this.getClientType(pluginId).client, databaseName) : {};
309
+ return databaseName ? defaultNameOverride(databaseName) : {};
357
310
  }
358
311
  }
359
312
 
@@ -475,57 +428,28 @@ async function dropPgDatabase(dbConfig, ...databases) {
475
428
  await admin.destroy();
476
429
  }
477
430
  }
478
- const pgConnector = Object.freeze({
479
- createClient: createPgDatabaseClient,
480
- ensureDatabaseExists: ensurePgDatabaseExists,
481
- ensureSchemaExists: ensurePgSchemaExists,
482
- createNameOverride: defaultNameOverride,
483
- createSchemaOverride: defaultSchemaOverride,
484
- parseConnectionString: parsePgConnectionString,
485
- dropDatabase: dropPgDatabase
486
- });
487
431
  function pluginPath$2(pluginId) {
488
432
  return `plugin.${pluginId}`;
489
433
  }
490
- function normalizeConnection$1(connection, client) {
434
+ function normalizeConnection$1(connection) {
491
435
  if (typeof connection === "undefined" || connection === null) {
492
436
  return {};
493
437
  }
494
- return typeof connection === "string" || connection instanceof String ? pgConnector.parseConnectionString(connection, client) : connection;
495
- }
496
- function createSchemaOverride(client, name) {
497
- try {
498
- return pgConnector.createSchemaOverride?.(name);
499
- } catch (e) {
500
- throw new errors.InputError(
501
- `Unable to create database schema override for '${client}' connector`,
502
- e
503
- );
504
- }
505
- }
506
- function createNameOverride$1(client, name) {
507
- try {
508
- return pgConnector.createNameOverride(name);
509
- } catch (e) {
510
- throw new errors.InputError(
511
- `Unable to create database name override for '${client}' connector`,
512
- e
513
- );
514
- }
438
+ return typeof connection === "string" || connection instanceof String ? parsePgConnectionString(connection) : connection;
515
439
  }
516
440
  class PgConnector {
517
441
  constructor(config, prefix) {
518
442
  this.config = config;
519
443
  this.prefix = prefix;
520
444
  }
521
- async getClient(pluginId, deps) {
445
+ async getClient(pluginId, _deps) {
522
446
  const pluginConfig = new config.ConfigReader(
523
447
  this.getConfigForPlugin(pluginId)
524
448
  );
525
449
  const databaseName = this.getDatabaseName(pluginId);
526
450
  if (databaseName && this.getEnsureExistsConfig(pluginId)) {
527
451
  try {
528
- await pgConnector.ensureDatabaseExists(pluginConfig, databaseName);
452
+ await ensurePgDatabaseExists(pluginConfig, databaseName);
529
453
  } catch (error) {
530
454
  throw new Error(
531
455
  `Failed to connect to the database to make sure that '${databaseName}' exists, ${error}`
@@ -534,10 +458,10 @@ class PgConnector {
534
458
  }
535
459
  let schemaOverrides;
536
460
  if (this.getPluginDivisionModeConfig() === "schema") {
537
- schemaOverrides = this.getSchemaOverrides(pluginId);
461
+ schemaOverrides = defaultSchemaOverride(pluginId);
538
462
  if (this.getEnsureSchemaExistsConfig(pluginId) || this.getEnsureExistsConfig(pluginId)) {
539
463
  try {
540
- await pgConnector.ensureSchemaExists(pluginConfig, pluginId);
464
+ await ensurePgSchemaExists(pluginConfig, pluginId);
541
465
  } catch (error) {
542
466
  throw new Error(
543
467
  `Failed to connect to the database to make sure that schema for plugin '${pluginId}' exists, ${error}`
@@ -550,10 +474,9 @@ class PgConnector {
550
474
  this.getDatabaseOverrides(pluginId),
551
475
  schemaOverrides
552
476
  );
553
- const client = pgConnector.createClient(
477
+ const client = createPgDatabaseClient(
554
478
  pluginConfig,
555
- databaseClientOverrides,
556
- deps
479
+ databaseClientOverrides
557
480
  );
558
481
  return client;
559
482
  }
@@ -640,17 +563,13 @@ class PgConnector {
640
563
  * unless `pluginDivisionMode` is set to `schema`.
641
564
  */
642
565
  getConnectionConfig(pluginId) {
643
- const { client, overridden } = this.getClientType(pluginId);
644
- let baseConnection = normalizeConnection$1(
645
- this.config.get("connection"),
646
- this.config.getString("client")
647
- );
566
+ const { overridden } = this.getClientType(pluginId);
567
+ let baseConnection = normalizeConnection$1(this.config.get("connection"));
648
568
  if (this.getPluginDivisionModeConfig() !== "schema") {
649
569
  baseConnection = lodash.omit(baseConnection, "database");
650
570
  }
651
571
  const connection = normalizeConnection$1(
652
- this.config.getOptional(`${pluginPath$2(pluginId)}.connection`),
653
- client
572
+ this.config.getOptional(`${pluginPath$2(pluginId)}.connection`)
654
573
  );
655
574
  baseConnection.application_name ||= `backstage_plugin_${pluginId}`;
656
575
  return {
@@ -677,16 +596,6 @@ class PgConnector {
677
596
  ...role && { role }
678
597
  };
679
598
  }
680
- /**
681
- * Provides a partial `Knex.Config` database schema override for a given
682
- * plugin.
683
- *
684
- * @param pluginId - Target plugin to get database schema override
685
- * @returns Partial `Knex.Config` with database schema override
686
- */
687
- getSchemaOverrides(pluginId) {
688
- return createSchemaOverride(this.getClientType(pluginId).client, pluginId);
689
- }
690
599
  /**
691
600
  * Provides a partial `Knex.Config`• database name override for a given plugin.
692
601
  *
@@ -695,7 +604,7 @@ class PgConnector {
695
604
  */
696
605
  getDatabaseOverrides(pluginId) {
697
606
  const databaseName = this.getDatabaseName(pluginId);
698
- return databaseName ? createNameOverride$1(this.getClientType(pluginId).client, databaseName) : {};
607
+ return databaseName ? defaultNameOverride(databaseName) : {};
699
608
  }
700
609
  }
701
610
 
@@ -704,8 +613,8 @@ function createSqliteDatabaseClient(dbConfig, overrides, deps) {
704
613
  const connConfig = knexConfig.connection;
705
614
  const filename = connConfig.filename ?? ":memory:";
706
615
  if (filename !== ":memory:") {
707
- const directory = path__default.default.dirname(filename);
708
- fsExtra.ensureDirSync(directory);
616
+ const directory = platformPath__default.default.dirname(filename);
617
+ fs.ensureDirSync(directory);
709
618
  }
710
619
  let database;
711
620
  if (deps && filename === ":memory:") {
@@ -773,29 +682,14 @@ function parseSqliteConnectionString(name) {
773
682
  filename: name
774
683
  };
775
684
  }
776
- const sqliteConnector = Object.freeze({
777
- createClient: createSqliteDatabaseClient,
778
- createNameOverride: createSqliteNameOverride,
779
- parseConnectionString: parseSqliteConnectionString
780
- });
781
685
  function pluginPath$1(pluginId) {
782
686
  return `plugin.${pluginId}`;
783
687
  }
784
- function normalizeConnection(connection, client) {
688
+ function normalizeConnection(connection) {
785
689
  if (typeof connection === "undefined" || connection === null) {
786
690
  return {};
787
691
  }
788
- return typeof connection === "string" || connection instanceof String ? sqliteConnector.parseConnectionString(connection, client) : connection;
789
- }
790
- function createNameOverride(client, name) {
791
- try {
792
- return sqliteConnector.createNameOverride(name);
793
- } catch (e) {
794
- throw new errors.InputError(
795
- `Unable to create database name override for '${client}' connector`,
796
- e
797
- );
798
- }
692
+ return typeof connection === "string" || connection instanceof String ? parseSqliteConnectionString(connection) : connection;
799
693
  }
800
694
  class Sqlite3Connector {
801
695
  constructor(config) {
@@ -808,14 +702,14 @@ class Sqlite3Connector {
808
702
  const pluginDivisionMode = this.getPluginDivisionModeConfig();
809
703
  if (pluginDivisionMode !== "database") {
810
704
  throw new Error(
811
- `The SQLite driver does not suppoert plugin division mode '${pluginDivisionMode}'`
705
+ `The SQLite driver does not support plugin division mode '${pluginDivisionMode}'`
812
706
  );
813
707
  }
814
708
  const databaseClientOverrides = mergeDatabaseConfig(
815
709
  {},
816
710
  this.getDatabaseOverrides(pluginId)
817
711
  );
818
- const client = sqliteConnector.createClient(
712
+ const client = createSqliteDatabaseClient(
819
713
  pluginConfig,
820
714
  databaseClientOverrides,
821
715
  deps
@@ -843,7 +737,7 @@ class Sqlite3Connector {
843
737
  return sqliteFilename;
844
738
  }
845
739
  const sqliteDirectory = connection.directory ?? ".";
846
- return path__default.default.join(sqliteDirectory, sqliteFilename ?? `${pluginId}.sqlite`);
740
+ return platformPath__default.default.join(sqliteDirectory, sqliteFilename ?? `${pluginId}.sqlite`);
847
741
  }
848
742
  /**
849
743
  * Provides the client type which should be used for a given plugin.
@@ -897,10 +791,7 @@ class Sqlite3Connector {
897
791
  */
898
792
  getConnectionConfig(pluginId) {
899
793
  const { client, overridden } = this.getClientType(pluginId);
900
- let baseConnection = normalizeConnection(
901
- this.config.get("connection"),
902
- this.config.getString("client")
903
- );
794
+ let baseConnection = normalizeConnection(this.config.get("connection"));
904
795
  if (client.includes("sqlite3") && "filename" in baseConnection && baseConnection.filename !== ":memory:") {
905
796
  throw new Error(
906
797
  "`connection.filename` is not supported for the base sqlite connection. Prefer `connection.directory` or provide a filename for the plugin connection instead."
@@ -910,8 +801,7 @@ class Sqlite3Connector {
910
801
  baseConnection = lodash.omit(baseConnection, "database");
911
802
  }
912
803
  const connection = normalizeConnection(
913
- this.config.getOptional(`${pluginPath$1(pluginId)}.connection`),
914
- client
804
+ this.config.getOptional(`${pluginPath$1(pluginId)}.connection`)
915
805
  );
916
806
  return {
917
807
  // include base connection if client type has not been overridden
@@ -945,7 +835,7 @@ class Sqlite3Connector {
945
835
  */
946
836
  getDatabaseOverrides(pluginId) {
947
837
  const databaseName = this.getDatabaseName(pluginId);
948
- return databaseName ? createNameOverride(this.getClientType(pluginId).client, databaseName) : {};
838
+ return databaseName ? createSqliteNameOverride(databaseName) : {};
949
839
  }
950
840
  }
951
841
 
@@ -1087,6 +977,30 @@ async function dropDatabase(dbConfig, ...databaseNames) {
1087
977
  }
1088
978
  }
1089
979
 
980
+ const databaseServiceFactory = backendPluginApi.createServiceFactory({
981
+ service: backendPluginApi.coreServices.database,
982
+ deps: {
983
+ config: backendPluginApi.coreServices.rootConfig,
984
+ lifecycle: backendPluginApi.coreServices.lifecycle,
985
+ pluginMetadata: backendPluginApi.coreServices.pluginMetadata
986
+ },
987
+ async createRootContext({ config: config$1 }) {
988
+ return config$1.getOptional("backend.database") ? DatabaseManager.fromConfig(config$1) : DatabaseManager.fromConfig(
989
+ new config.ConfigReader({
990
+ backend: {
991
+ database: { client: "better-sqlite3", connection: ":memory:" }
992
+ }
993
+ })
994
+ );
995
+ },
996
+ async factory({ pluginMetadata, lifecycle }, databaseManager) {
997
+ return databaseManager.forPlugin(pluginMetadata.getId(), {
998
+ pluginMetadata,
999
+ lifecycle
1000
+ });
1001
+ }
1002
+ });
1003
+
1090
1004
  exports.DatabaseManager = DatabaseManager;
1091
1005
  exports.databaseServiceFactory = databaseServiceFactory;
1092
1006
  exports.dropDatabase = dropDatabase;