@backstage/plugin-scaffolder-backend 1.26.0-next.0 → 1.26.0-next.2
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/CHANGELOG.md +62 -0
- package/alpha/package.json +1 -1
- package/dist/ScaffolderPlugin.cjs.js +168 -0
- package/dist/ScaffolderPlugin.cjs.js.map +1 -0
- package/dist/alpha.cjs.js +7 -196
- package/dist/alpha.cjs.js.map +1 -1
- package/dist/deprecated.cjs.js +15 -0
- package/dist/deprecated.cjs.js.map +1 -0
- package/dist/index.cjs.js +57 -134
- package/dist/index.cjs.js.map +1 -1
- package/dist/lib/templating/SecureTemplater.cjs.js +169 -0
- package/dist/lib/templating/SecureTemplater.cjs.js.map +1 -0
- package/dist/lib/templating/filters.cjs.js +26 -0
- package/dist/lib/templating/filters.cjs.js.map +1 -0
- package/dist/lib/templating/helpers.cjs.js +13 -0
- package/dist/lib/templating/helpers.cjs.js.map +1 -0
- package/dist/scaffolder/actions/TemplateActionRegistry.cjs.js +30 -0
- package/dist/scaffolder/actions/TemplateActionRegistry.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/catalog/fetch.cjs.js +93 -0
- package/dist/scaffolder/actions/builtin/catalog/fetch.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/catalog/fetch.examples.cjs.js +43 -0
- package/dist/scaffolder/actions/builtin/catalog/fetch.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/catalog/register.cjs.js +142 -0
- package/dist/scaffolder/actions/builtin/catalog/register.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/catalog/register.examples.cjs.js +28 -0
- package/dist/scaffolder/actions/builtin/catalog/register.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/catalog/write.cjs.js +74 -0
- package/dist/scaffolder/actions/builtin/catalog/write.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/catalog/write.examples.cjs.js +56 -0
- package/dist/scaffolder/actions/builtin/catalog/write.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/createBuiltinActions.cjs.js +156 -0
- package/dist/scaffolder/actions/builtin/createBuiltinActions.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/debug/log.cjs.js +66 -0
- package/dist/scaffolder/actions/builtin/debug/log.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/debug/log.examples.cjs.js +58 -0
- package/dist/scaffolder/actions/builtin/debug/log.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/debug/wait.cjs.js +66 -0
- package/dist/scaffolder/actions/builtin/debug/wait.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/debug/wait.examples.cjs.js +58 -0
- package/dist/scaffolder/actions/builtin/debug/wait.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/fetch/plain.cjs.js +56 -0
- package/dist/scaffolder/actions/builtin/fetch/plain.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/fetch/plain.examples.cjs.js +44 -0
- package/dist/scaffolder/actions/builtin/fetch/plain.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/fetch/plainFile.cjs.js +56 -0
- package/dist/scaffolder/actions/builtin/fetch/plainFile.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/fetch/plainFile.examples.cjs.js +29 -0
- package/dist/scaffolder/actions/builtin/fetch/plainFile.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/fetch/template.cjs.js +241 -0
- package/dist/scaffolder/actions/builtin/fetch/template.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/fetch/template.examples.cjs.js +35 -0
- package/dist/scaffolder/actions/builtin/fetch/template.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/fetch/templateFile.cjs.js +119 -0
- package/dist/scaffolder/actions/builtin/fetch/templateFile.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/fetch/templateFile.examples.cjs.js +34 -0
- package/dist/scaffolder/actions/builtin/fetch/templateFile.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/filesystem/delete.cjs.js +54 -0
- package/dist/scaffolder/actions/builtin/filesystem/delete.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/filesystem/delete.examples.cjs.js +44 -0
- package/dist/scaffolder/actions/builtin/filesystem/delete.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/filesystem/rename.cjs.js +83 -0
- package/dist/scaffolder/actions/builtin/filesystem/rename.cjs.js.map +1 -0
- package/dist/scaffolder/actions/builtin/filesystem/rename.examples.cjs.js +48 -0
- package/dist/scaffolder/actions/builtin/filesystem/rename.examples.cjs.js.map +1 -0
- package/dist/scaffolder/actions/deprecated.cjs.js +74 -0
- package/dist/scaffolder/actions/deprecated.cjs.js.map +1 -0
- package/dist/scaffolder/dryrun/DecoratedActionsRegistry.cjs.js +57 -0
- package/dist/scaffolder/dryrun/DecoratedActionsRegistry.cjs.js.map +1 -0
- package/dist/scaffolder/dryrun/createDryRunner.cjs.js +97 -0
- package/dist/scaffolder/dryrun/createDryRunner.cjs.js.map +1 -0
- package/dist/scaffolder/tasks/DatabaseTaskStore.cjs.js +430 -0
- package/dist/scaffolder/tasks/DatabaseTaskStore.cjs.js.map +1 -0
- package/dist/scaffolder/tasks/DatabaseWorkspaceProvider.cjs.js +22 -0
- package/dist/scaffolder/tasks/DatabaseWorkspaceProvider.cjs.js.map +1 -0
- package/dist/scaffolder/tasks/NunjucksWorkflowRunner.cjs.js +545 -0
- package/dist/scaffolder/tasks/NunjucksWorkflowRunner.cjs.js.map +1 -0
- package/dist/scaffolder/tasks/StorageTaskBroker.cjs.js +318 -0
- package/dist/scaffolder/tasks/StorageTaskBroker.cjs.js.map +1 -0
- package/dist/scaffolder/tasks/TaskWorker.cjs.js +110 -0
- package/dist/scaffolder/tasks/TaskWorker.cjs.js.map +1 -0
- package/dist/scaffolder/tasks/WorkspaceService.cjs.js +50 -0
- package/dist/scaffolder/tasks/WorkspaceService.cjs.js.map +1 -0
- package/dist/scaffolder/tasks/dbUtil.cjs.js +20 -0
- package/dist/scaffolder/tasks/dbUtil.cjs.js.map +1 -0
- package/dist/scaffolder/tasks/helper.cjs.js +46 -0
- package/dist/scaffolder/tasks/helper.cjs.js.map +1 -0
- package/dist/scaffolder/tasks/logger.cjs.js +156 -0
- package/dist/scaffolder/tasks/logger.cjs.js.map +1 -0
- package/dist/scaffolder/tasks/taskRecoveryHelper.cjs.js +18 -0
- package/dist/scaffolder/tasks/taskRecoveryHelper.cjs.js.map +1 -0
- package/dist/service/conditionExports.cjs.js +26 -0
- package/dist/service/conditionExports.cjs.js.map +1 -0
- package/dist/service/helpers.cjs.js +92 -0
- package/dist/service/helpers.cjs.js.map +1 -0
- package/dist/service/router.cjs.js +640 -0
- package/dist/service/router.cjs.js.map +1 -0
- package/dist/service/rules.cjs.js +97 -0
- package/dist/service/rules.cjs.js.map +1 -0
- package/dist/util/checkPermissions.cjs.js +25 -0
- package/dist/util/checkPermissions.cjs.js.map +1 -0
- package/dist/util/metrics.cjs.js +24 -0
- package/dist/util/metrics.cjs.js.map +1 -0
- package/package.json +30 -30
- package/dist/cjs/router-CC-UhVkG.cjs.js +0 -4101
- package/dist/cjs/router-CC-UhVkG.cjs.js.map +0 -1
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Transport = require('winston-transport');
|
|
4
|
+
var winston = require('winston');
|
|
5
|
+
var tripleBeam = require('triple-beam');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var Transport__default = /*#__PURE__*/_interopDefaultCompat(Transport);
|
|
10
|
+
|
|
11
|
+
const escapeRegExp = (text) => {
|
|
12
|
+
return text.replace(/[.*+?^${}(\)|[\]\\]/g, "\\$&");
|
|
13
|
+
};
|
|
14
|
+
class BackstageLoggerTransport extends Transport__default.default {
|
|
15
|
+
constructor(backstageLogger, taskContext, stepId, opts) {
|
|
16
|
+
super(opts);
|
|
17
|
+
this.backstageLogger = backstageLogger;
|
|
18
|
+
this.taskContext = taskContext;
|
|
19
|
+
this.stepId = stepId;
|
|
20
|
+
}
|
|
21
|
+
log(info, callback) {
|
|
22
|
+
if (typeof info !== "object" || info === null) {
|
|
23
|
+
callback();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const message = info[tripleBeam.MESSAGE];
|
|
27
|
+
const level = info[tripleBeam.LEVEL];
|
|
28
|
+
const splat = info[tripleBeam.SPLAT];
|
|
29
|
+
switch (level) {
|
|
30
|
+
case "error":
|
|
31
|
+
this.backstageLogger.error(String(message), ...splat);
|
|
32
|
+
break;
|
|
33
|
+
case "warn":
|
|
34
|
+
this.backstageLogger.warn(String(message), ...splat);
|
|
35
|
+
break;
|
|
36
|
+
case "info":
|
|
37
|
+
this.backstageLogger.info(String(message), ...splat);
|
|
38
|
+
break;
|
|
39
|
+
case "debug":
|
|
40
|
+
this.backstageLogger.debug(String(message), ...splat);
|
|
41
|
+
break;
|
|
42
|
+
default:
|
|
43
|
+
this.backstageLogger.info(String(message), ...splat);
|
|
44
|
+
}
|
|
45
|
+
this.taskContext.emitLog(message, { stepId: this.stepId });
|
|
46
|
+
callback();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
class WinstonLogger {
|
|
50
|
+
#winston;
|
|
51
|
+
#addRedactions;
|
|
52
|
+
/**
|
|
53
|
+
* Creates a {@link WinstonLogger} instance.
|
|
54
|
+
*/
|
|
55
|
+
static create(options) {
|
|
56
|
+
const redacter = WinstonLogger.redacter();
|
|
57
|
+
let logger = winston.createLogger({
|
|
58
|
+
level: options.level,
|
|
59
|
+
format: winston.format.combine(options.format, redacter.format),
|
|
60
|
+
transports: options.transports ?? new winston.transports.Console()
|
|
61
|
+
});
|
|
62
|
+
if (options.meta) {
|
|
63
|
+
logger = logger.child(options.meta);
|
|
64
|
+
}
|
|
65
|
+
return new WinstonLogger(logger, redacter.add);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Creates a winston log formatter for redacting secrets.
|
|
69
|
+
*/
|
|
70
|
+
static redacter() {
|
|
71
|
+
const redactionSet = /* @__PURE__ */ new Set();
|
|
72
|
+
let redactionPattern = void 0;
|
|
73
|
+
return {
|
|
74
|
+
format: winston.format((obj) => {
|
|
75
|
+
if (!redactionPattern || !obj) {
|
|
76
|
+
return obj;
|
|
77
|
+
}
|
|
78
|
+
obj[tripleBeam.MESSAGE] = obj[tripleBeam.MESSAGE]?.replace?.(redactionPattern, "***");
|
|
79
|
+
return obj;
|
|
80
|
+
})(),
|
|
81
|
+
add(newRedactions) {
|
|
82
|
+
let added = 0;
|
|
83
|
+
for (const redactionToTrim of newRedactions) {
|
|
84
|
+
const redaction = redactionToTrim.trim();
|
|
85
|
+
if (redaction.length <= 1) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (!redactionSet.has(redaction)) {
|
|
89
|
+
redactionSet.add(redaction);
|
|
90
|
+
added += 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (added > 0) {
|
|
94
|
+
const redactions = Array.from(redactionSet).map((r) => escapeRegExp(r)).join("|");
|
|
95
|
+
redactionPattern = new RegExp(`(${redactions})`, "g");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Creates a pretty printed winston log formatter.
|
|
102
|
+
*/
|
|
103
|
+
static colorFormat() {
|
|
104
|
+
const colorizer = winston.format.colorize();
|
|
105
|
+
return winston.format.combine(
|
|
106
|
+
winston.format.timestamp(),
|
|
107
|
+
winston.format.colorize({
|
|
108
|
+
colors: {
|
|
109
|
+
timestamp: "dim",
|
|
110
|
+
prefix: "blue",
|
|
111
|
+
field: "cyan",
|
|
112
|
+
debug: "grey"
|
|
113
|
+
}
|
|
114
|
+
}),
|
|
115
|
+
winston.format.printf((info) => {
|
|
116
|
+
const { timestamp, plugin, service } = info;
|
|
117
|
+
const message = info[tripleBeam.MESSAGE];
|
|
118
|
+
const level = info[tripleBeam.LEVEL];
|
|
119
|
+
const fields = info[tripleBeam.SPLAT];
|
|
120
|
+
const prefix = plugin || service;
|
|
121
|
+
const timestampColor = colorizer.colorize("timestamp", timestamp);
|
|
122
|
+
const prefixColor = colorizer.colorize("prefix", prefix);
|
|
123
|
+
const extraFields = Object.entries(fields).map(
|
|
124
|
+
([key, value]) => `${colorizer.colorize("field", `${key}`)}=${value}`
|
|
125
|
+
).join(" ");
|
|
126
|
+
return `${timestampColor} ${prefixColor} ${level} ${message} ${extraFields}`;
|
|
127
|
+
})
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
constructor(winston, addRedactions) {
|
|
131
|
+
this.#winston = winston;
|
|
132
|
+
this.#addRedactions = addRedactions;
|
|
133
|
+
}
|
|
134
|
+
error(message, meta) {
|
|
135
|
+
this.#winston.error(message, meta);
|
|
136
|
+
}
|
|
137
|
+
warn(message, meta) {
|
|
138
|
+
this.#winston.warn(message, meta);
|
|
139
|
+
}
|
|
140
|
+
info(message, meta) {
|
|
141
|
+
this.#winston.info(message, meta);
|
|
142
|
+
}
|
|
143
|
+
debug(message, meta) {
|
|
144
|
+
this.#winston.debug(message, meta);
|
|
145
|
+
}
|
|
146
|
+
child(meta) {
|
|
147
|
+
return new WinstonLogger(this.#winston.child(meta));
|
|
148
|
+
}
|
|
149
|
+
addRedactions(redactions) {
|
|
150
|
+
this.#addRedactions?.(redactions);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
exports.BackstageLoggerTransport = BackstageLoggerTransport;
|
|
155
|
+
exports.WinstonLogger = WinstonLogger;
|
|
156
|
+
//# sourceMappingURL=logger.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.cjs.js","sources":["../../../src/scaffolder/tasks/logger.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n LoggerService,\n RootLoggerService,\n} from '@backstage/backend-plugin-api';\nimport { JsonObject } from '@backstage/types';\nimport { Format, TransformableInfo } from 'logform';\nimport Transport, { TransportStreamOptions } from 'winston-transport';\nimport { Logger, format, createLogger, transports } from 'winston';\nimport { LEVEL, MESSAGE, SPLAT } from 'triple-beam';\nimport { TaskContext } from '@backstage/plugin-scaffolder-node';\nimport _ from 'lodash';\n\n/**\n * Escapes a given string to be used inside a RegExp.\n *\n * Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n */\nconst escapeRegExp = (text: string) => {\n return text.replace(/[.*+?^${}(\\)|[\\]\\\\]/g, '\\\\$&');\n};\n\ninterface WinstonLoggerOptions {\n meta?: JsonObject;\n level: string;\n format: Format;\n transports: Transport[];\n}\n\n// This is a workaround for being able to preserve the log format of the root logger.\n// Will revisit all of this implementation once we can break the router to use only `LoggerService`.\nexport class BackstageLoggerTransport extends Transport {\n constructor(\n private readonly backstageLogger: LoggerService,\n private readonly taskContext: TaskContext,\n private readonly stepId: string,\n opts?: TransportStreamOptions,\n ) {\n super(opts);\n }\n\n log(info: TransformableInfo, callback: VoidFunction) {\n if (typeof info !== 'object' || info === null) {\n callback();\n return;\n }\n\n const message = info[MESSAGE];\n const level = info[LEVEL];\n const splat = info[SPLAT];\n\n switch (level) {\n case 'error':\n this.backstageLogger.error(String(message), ...splat);\n break;\n case 'warn':\n this.backstageLogger.warn(String(message), ...splat);\n break;\n case 'info':\n this.backstageLogger.info(String(message), ...splat);\n break;\n case 'debug':\n this.backstageLogger.debug(String(message), ...splat);\n break;\n default:\n this.backstageLogger.info(String(message), ...splat);\n }\n\n this.taskContext.emitLog(message, { stepId: this.stepId });\n callback();\n }\n}\n\nexport class WinstonLogger implements RootLoggerService {\n #winston: Logger;\n #addRedactions?: (redactions: Iterable<string>) => void;\n\n /**\n * Creates a {@link WinstonLogger} instance.\n */\n static create(options: WinstonLoggerOptions): WinstonLogger {\n const redacter = WinstonLogger.redacter();\n\n let logger = createLogger({\n level: options.level,\n format: format.combine(options.format, redacter.format),\n transports: options.transports ?? new transports.Console(),\n });\n\n if (options.meta) {\n logger = logger.child(options.meta);\n }\n\n return new WinstonLogger(logger, redacter.add);\n }\n\n /**\n * Creates a winston log formatter for redacting secrets.\n */\n static redacter(): {\n format: Format;\n add: (redactions: Iterable<string>) => void;\n } {\n const redactionSet = new Set<string>();\n\n let redactionPattern: RegExp | undefined = undefined;\n\n return {\n format: format((obj: TransformableInfo) => {\n if (!redactionPattern || !obj) {\n return obj;\n }\n\n obj[MESSAGE] = obj[MESSAGE]?.replace?.(redactionPattern, '***');\n\n return obj;\n })(),\n add(newRedactions) {\n let added = 0;\n for (const redactionToTrim of newRedactions) {\n // Trimming the string ensures that we don't accdentally get extra\n // newlines or other whitespace interfering with the redaction; this\n // can happen for example when using string literals in yaml\n const redaction = redactionToTrim.trim();\n // Exclude secrets that are empty or just one character in length. These\n // typically mean that you are running local dev or tests, or using the\n // --lax flag which sets things to just 'x'.\n if (redaction.length <= 1) {\n continue;\n }\n if (!redactionSet.has(redaction)) {\n redactionSet.add(redaction);\n added += 1;\n }\n }\n if (added > 0) {\n const redactions = Array.from(redactionSet)\n .map(r => escapeRegExp(r))\n .join('|');\n redactionPattern = new RegExp(`(${redactions})`, 'g');\n }\n },\n };\n }\n\n /**\n * Creates a pretty printed winston log formatter.\n */\n static colorFormat(): Format {\n const colorizer = format.colorize();\n\n return format.combine(\n format.timestamp(),\n format.colorize({\n colors: {\n timestamp: 'dim',\n prefix: 'blue',\n field: 'cyan',\n debug: 'grey',\n },\n }),\n format.printf((info: TransformableInfo) => {\n const { timestamp, plugin, service } = info;\n const message = info[MESSAGE];\n const level = info[LEVEL];\n const fields = info[SPLAT];\n const prefix = plugin || service;\n const timestampColor = colorizer.colorize('timestamp', timestamp);\n const prefixColor = colorizer.colorize('prefix', prefix);\n\n const extraFields = Object.entries(fields)\n .map(\n ([key, value]) =>\n `${colorizer.colorize('field', `${key}`)}=${value}`,\n )\n .join(' ');\n\n return `${timestampColor} ${prefixColor} ${level} ${message} ${extraFields}`;\n }),\n );\n }\n\n private constructor(\n winston: Logger,\n addRedactions?: (redactions: Iterable<string>) => void,\n ) {\n this.#winston = winston;\n this.#addRedactions = addRedactions;\n }\n\n error(message: string, meta?: JsonObject): void {\n this.#winston.error(message, meta);\n }\n\n warn(message: string, meta?: JsonObject): void {\n this.#winston.warn(message, meta);\n }\n\n info(message: string, meta?: JsonObject): void {\n this.#winston.info(message, meta);\n }\n\n debug(message: string, meta?: JsonObject): void {\n this.#winston.debug(message, meta);\n }\n\n child(meta: JsonObject): LoggerService {\n return new WinstonLogger(this.#winston.child(meta));\n }\n\n addRedactions(redactions: Iterable<string>) {\n this.#addRedactions?.(redactions);\n }\n}\n"],"names":["Transport","MESSAGE","LEVEL","SPLAT","createLogger","format","transports"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const trimEventsTillLastRecovery = (events) => {
|
|
4
|
+
const recoveredEventInd = events.slice().reverse().findIndex((event) => event.type === "recovered");
|
|
5
|
+
if (recoveredEventInd >= 0) {
|
|
6
|
+
const ind = events.length - recoveredEventInd - 1;
|
|
7
|
+
const { recoverStrategy } = events[ind].body;
|
|
8
|
+
if (recoverStrategy === "startOver") {
|
|
9
|
+
return {
|
|
10
|
+
events: recoveredEventInd === 0 ? [] : events.slice(ind)
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return { events };
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
exports.trimEventsTillLastRecovery = trimEventsTillLastRecovery;
|
|
18
|
+
//# sourceMappingURL=taskRecoveryHelper.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskRecoveryHelper.cjs.js","sources":["../../../src/scaffolder/tasks/taskRecoveryHelper.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SerializedTaskEvent } from '@backstage/plugin-scaffolder-node';\nimport { TaskRecoverStrategy } from '@backstage/plugin-scaffolder-common';\n\nexport const trimEventsTillLastRecovery = (\n events: SerializedTaskEvent[],\n): { events: SerializedTaskEvent[] } => {\n const recoveredEventInd = events\n .slice()\n .reverse()\n .findIndex(event => event.type === 'recovered');\n\n if (recoveredEventInd >= 0) {\n const ind = events.length - recoveredEventInd - 1;\n const { recoverStrategy } = events[ind].body as {\n recoverStrategy: TaskRecoverStrategy;\n };\n if (recoverStrategy === 'startOver') {\n return {\n events: recoveredEventInd === 0 ? [] : events.slice(ind),\n };\n }\n }\n\n return { events };\n};\n"],"names":[],"mappings":";;AAmBa,MAAA,0BAAA,GAA6B,CACxC,MACsC,KAAA;AACtC,EAAM,MAAA,iBAAA,GAAoB,MACvB,CAAA,KAAA,EACA,CAAA,OAAA,GACA,SAAU,CAAA,CAAA,KAAA,KAAS,KAAM,CAAA,IAAA,KAAS,WAAW,CAAA,CAAA;AAEhD,EAAA,IAAI,qBAAqB,CAAG,EAAA;AAC1B,IAAM,MAAA,GAAA,GAAM,MAAO,CAAA,MAAA,GAAS,iBAAoB,GAAA,CAAA,CAAA;AAChD,IAAA,MAAM,EAAE,eAAA,EAAoB,GAAA,MAAA,CAAO,GAAG,CAAE,CAAA,IAAA,CAAA;AAGxC,IAAA,IAAI,oBAAoB,WAAa,EAAA;AACnC,MAAO,OAAA;AAAA,QACL,QAAQ,iBAAsB,KAAA,CAAA,GAAI,EAAK,GAAA,MAAA,CAAO,MAAM,GAAG,CAAA;AAAA,OACzD,CAAA;AAAA,KACF;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,MAAO,EAAA,CAAA;AAClB;;;;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var alpha = require('@backstage/plugin-scaffolder-common/alpha');
|
|
4
|
+
var pluginPermissionNode = require('@backstage/plugin-permission-node');
|
|
5
|
+
var rules = require('./rules.cjs.js');
|
|
6
|
+
|
|
7
|
+
const templateConditionExports = pluginPermissionNode.createConditionExports({
|
|
8
|
+
pluginId: "scaffolder",
|
|
9
|
+
resourceType: alpha.RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,
|
|
10
|
+
rules: rules.scaffolderTemplateRules
|
|
11
|
+
});
|
|
12
|
+
const actionsConditionExports = pluginPermissionNode.createConditionExports({
|
|
13
|
+
pluginId: "scaffolder",
|
|
14
|
+
resourceType: alpha.RESOURCE_TYPE_SCAFFOLDER_ACTION,
|
|
15
|
+
rules: rules.scaffolderActionRules
|
|
16
|
+
});
|
|
17
|
+
const createScaffolderTemplateConditionalDecision = templateConditionExports.createConditionalDecision;
|
|
18
|
+
const scaffolderTemplateConditions = templateConditionExports.conditions;
|
|
19
|
+
const createScaffolderActionConditionalDecision = actionsConditionExports.createConditionalDecision;
|
|
20
|
+
const scaffolderActionConditions = actionsConditionExports.conditions;
|
|
21
|
+
|
|
22
|
+
exports.createScaffolderActionConditionalDecision = createScaffolderActionConditionalDecision;
|
|
23
|
+
exports.createScaffolderTemplateConditionalDecision = createScaffolderTemplateConditionalDecision;
|
|
24
|
+
exports.scaffolderActionConditions = scaffolderActionConditions;
|
|
25
|
+
exports.scaffolderTemplateConditions = scaffolderTemplateConditions;
|
|
26
|
+
//# sourceMappingURL=conditionExports.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditionExports.cjs.js","sources":["../../src/service/conditionExports.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,\n RESOURCE_TYPE_SCAFFOLDER_ACTION,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { createConditionExports } from '@backstage/plugin-permission-node';\nimport { scaffolderTemplateRules, scaffolderActionRules } from './rules';\n\nconst templateConditionExports = createConditionExports({\n pluginId: 'scaffolder',\n resourceType: RESOURCE_TYPE_SCAFFOLDER_TEMPLATE,\n rules: scaffolderTemplateRules,\n});\n\nconst actionsConditionExports = createConditionExports({\n pluginId: 'scaffolder',\n resourceType: RESOURCE_TYPE_SCAFFOLDER_ACTION,\n rules: scaffolderActionRules,\n});\n\n/**\n * `createScaffolderTemplateConditionalDecision` can be used when authoring policies to\n * create conditional decisions. It requires a permission of type\n * `ResourcePermission<'scaffolder-template'>` to be passed as the first parameter.\n * It's recommended that you use the provided `isResourcePermission` and\n * `isPermission` helper methods to narrow the type of the permission passed to\n * the handle method as shown below.\n *\n * ```\n * // MyAuthorizationPolicy.ts\n * ...\n * import { createScaffolderPolicyDecision } from '@backstage/plugin-scaffolder-backend';\n * import { RESOURCE_TYPE_SCAFFOLDER_TEMPLATE } from '@backstage/plugin-scaffolder-common';\n *\n * class MyAuthorizationPolicy implements PermissionPolicy {\n * async handle(request, user) {\n * ...\n *\n * if (isResourcePermission(request.permission, RESOURCE_TYPE_SCAFFOLDER_TEMPLATE)) {\n * return createScaffolderConditionalDecision(\n * request.permission,\n * { anyOf: [...insert conditions here...] }\n * );\n * }\n *\n * ...\n * }\n *\n * ```\n *\n * @alpha\n */\nexport const createScaffolderTemplateConditionalDecision =\n templateConditionExports.createConditionalDecision;\n\n/**\n * These conditions are used when creating conditional decisions for scaffolder\n * templates that are returned by authorization policies.\n *\n * @alpha\n */\nexport const scaffolderTemplateConditions = templateConditionExports.conditions;\n\n/**\n * @alpha\n */\nexport const createScaffolderActionConditionalDecision =\n actionsConditionExports.createConditionalDecision;\n\n/**\n *\n * These conditions are used when creating conditional decisions for scaffolder\n * actions that are returned by authorization policies.\n *\n * @alpha\n */\nexport const scaffolderActionConditions = actionsConditionExports.conditions;\n"],"names":["createConditionExports","RESOURCE_TYPE_SCAFFOLDER_TEMPLATE","scaffolderTemplateRules","RESOURCE_TYPE_SCAFFOLDER_ACTION","scaffolderActionRules"],"mappings":";;;;;;AAuBA,MAAM,2BAA2BA,2CAAuB,CAAA;AAAA,EACtD,QAAU,EAAA,YAAA;AAAA,EACV,YAAc,EAAAC,uCAAA;AAAA,EACd,KAAO,EAAAC,6BAAA;AACT,CAAC,CAAA,CAAA;AAED,MAAM,0BAA0BF,2CAAuB,CAAA;AAAA,EACrD,QAAU,EAAA,YAAA;AAAA,EACV,YAAc,EAAAG,qCAAA;AAAA,EACd,KAAO,EAAAC,2BAAA;AACT,CAAC,CAAA,CAAA;AAkCM,MAAM,8CACX,wBAAyB,CAAA,0BAAA;AAQpB,MAAM,+BAA+B,wBAAyB,CAAA,WAAA;AAK9D,MAAM,4CACX,uBAAwB,CAAA,0BAAA;AASnB,MAAM,6BAA6B,uBAAwB,CAAA;;;;;;;"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var catalogModel = require('@backstage/catalog-model');
|
|
4
|
+
var errors = require('@backstage/errors');
|
|
5
|
+
var fs = require('fs-extra');
|
|
6
|
+
var os = require('os');
|
|
7
|
+
|
|
8
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
11
|
+
var os__default = /*#__PURE__*/_interopDefaultCompat(os);
|
|
12
|
+
|
|
13
|
+
async function getWorkingDirectory(config, logger) {
|
|
14
|
+
if (!config.has("backend.workingDirectory")) {
|
|
15
|
+
return os__default.default.tmpdir();
|
|
16
|
+
}
|
|
17
|
+
const workingDirectory = config.getString("backend.workingDirectory");
|
|
18
|
+
try {
|
|
19
|
+
await fs__default.default.access(workingDirectory, fs__default.default.constants.F_OK | fs__default.default.constants.W_OK);
|
|
20
|
+
logger.info(`using working directory: ${workingDirectory}`);
|
|
21
|
+
} catch (err) {
|
|
22
|
+
errors.assertError(err);
|
|
23
|
+
logger.error(
|
|
24
|
+
`working directory ${workingDirectory} ${err.code === "ENOENT" ? "does not exist" : "is not writable"}`
|
|
25
|
+
);
|
|
26
|
+
throw err;
|
|
27
|
+
}
|
|
28
|
+
return workingDirectory;
|
|
29
|
+
}
|
|
30
|
+
function getEntityBaseUrl(entity) {
|
|
31
|
+
let location = entity.metadata.annotations?.[catalogModel.ANNOTATION_SOURCE_LOCATION];
|
|
32
|
+
if (!location) {
|
|
33
|
+
location = entity.metadata.annotations?.[catalogModel.ANNOTATION_LOCATION];
|
|
34
|
+
}
|
|
35
|
+
if (!location) {
|
|
36
|
+
return void 0;
|
|
37
|
+
}
|
|
38
|
+
const { type, target } = catalogModel.parseLocationRef(location);
|
|
39
|
+
if (type === "url") {
|
|
40
|
+
return target;
|
|
41
|
+
} else if (type === "file") {
|
|
42
|
+
return `file://${target}`;
|
|
43
|
+
}
|
|
44
|
+
return void 0;
|
|
45
|
+
}
|
|
46
|
+
async function findTemplate(options) {
|
|
47
|
+
const { entityRef, token, catalogApi } = options;
|
|
48
|
+
if (entityRef.kind.toLocaleLowerCase("en-US") !== "template") {
|
|
49
|
+
throw new errors.InputError(`Invalid kind, only 'Template' kind is supported`);
|
|
50
|
+
}
|
|
51
|
+
const template = await catalogApi.getEntityByRef(entityRef, { token });
|
|
52
|
+
if (!template) {
|
|
53
|
+
throw new errors.NotFoundError(
|
|
54
|
+
`Template ${catalogModel.stringifyEntityRef(entityRef)} not found`
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
return template;
|
|
58
|
+
}
|
|
59
|
+
function parseStringsParam(param, paramName) {
|
|
60
|
+
if (param === void 0) {
|
|
61
|
+
return void 0;
|
|
62
|
+
}
|
|
63
|
+
const array = [param].flat();
|
|
64
|
+
if (array.some((p) => typeof p !== "string")) {
|
|
65
|
+
throw new errors.InputError(
|
|
66
|
+
`Invalid ${paramName}, not a string or array of strings`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
return array;
|
|
70
|
+
}
|
|
71
|
+
function parseNumberParam(param, paramName) {
|
|
72
|
+
return parseStringsParam(param, paramName)?.map((val) => {
|
|
73
|
+
const ret = Number.parseInt(val, 10);
|
|
74
|
+
if (isNaN(ret)) {
|
|
75
|
+
throw new errors.InputError(
|
|
76
|
+
`Invalid ${paramName} parameter "${val}", expected a number or array of numbers`
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
return ret;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function flattenParams(...params) {
|
|
83
|
+
return [...params].flat().filter(Boolean);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
exports.findTemplate = findTemplate;
|
|
87
|
+
exports.flattenParams = flattenParams;
|
|
88
|
+
exports.getEntityBaseUrl = getEntityBaseUrl;
|
|
89
|
+
exports.getWorkingDirectory = getWorkingDirectory;
|
|
90
|
+
exports.parseNumberParam = parseNumberParam;
|
|
91
|
+
exports.parseStringsParam = parseStringsParam;
|
|
92
|
+
//# sourceMappingURL=helpers.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.cjs.js","sources":["../../src/service/helpers.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CatalogApi } from '@backstage/catalog-client';\nimport {\n ANNOTATION_LOCATION,\n ANNOTATION_SOURCE_LOCATION,\n CompoundEntityRef,\n Entity,\n parseLocationRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport { assertError, InputError, NotFoundError } from '@backstage/errors';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport fs from 'fs-extra';\nimport os from 'os';\nimport { Logger } from 'winston';\n\nexport async function getWorkingDirectory(\n config: Config,\n logger: Logger,\n): Promise<string> {\n if (!config.has('backend.workingDirectory')) {\n return os.tmpdir();\n }\n\n const workingDirectory = config.getString('backend.workingDirectory');\n try {\n // Check if working directory exists and is writable\n await fs.access(workingDirectory, fs.constants.F_OK | fs.constants.W_OK);\n logger.info(`using working directory: ${workingDirectory}`);\n } catch (err) {\n assertError(err);\n logger.error(\n `working directory ${workingDirectory} ${\n err.code === 'ENOENT' ? 'does not exist' : 'is not writable'\n }`,\n );\n throw err;\n }\n return workingDirectory;\n}\n\n/**\n * Gets the base URL of the entity location that points to the source location\n * of the entity description within a repo. If there is not source location\n * or if it has an invalid type, undefined will be returned instead.\n *\n * For file locations this will return a `file://` URL.\n */\nexport function getEntityBaseUrl(entity: Entity): string | undefined {\n let location = entity.metadata.annotations?.[ANNOTATION_SOURCE_LOCATION];\n if (!location) {\n location = entity.metadata.annotations?.[ANNOTATION_LOCATION];\n }\n if (!location) {\n return undefined;\n }\n\n const { type, target } = parseLocationRef(location);\n if (type === 'url') {\n return target;\n } else if (type === 'file') {\n return `file://${target}`;\n }\n\n // Only url and file location are handled, as we otherwise don't know if\n // what the url is pointing to makes sense to use as a baseUrl\n return undefined;\n}\n\n/**\n * Will use the provided CatalogApi to go find the given template entity with an additional token.\n * Returns the matching template, or throws a NotFoundError if no such template existed.\n */\nexport async function findTemplate(options: {\n entityRef: CompoundEntityRef;\n token?: string;\n catalogApi: CatalogApi;\n}): Promise<TemplateEntityV1beta3> {\n const { entityRef, token, catalogApi } = options;\n\n if (entityRef.kind.toLocaleLowerCase('en-US') !== 'template') {\n throw new InputError(`Invalid kind, only 'Template' kind is supported`);\n }\n\n const template = await catalogApi.getEntityByRef(entityRef, { token });\n if (!template) {\n throw new NotFoundError(\n `Template ${stringifyEntityRef(entityRef)} not found`,\n );\n }\n\n return template as TemplateEntityV1beta3;\n}\n\n/**\n * Takes a single unknown parameter and makes sure that it's a single string or\n * an array of strings, and returns as an array.\n */\nexport function parseStringsParam(\n param: unknown,\n paramName: string,\n): string[] | undefined {\n if (param === undefined) {\n return undefined;\n }\n\n const array = [param].flat();\n if (array.some(p => typeof p !== 'string')) {\n throw new InputError(\n `Invalid ${paramName}, not a string or array of strings`,\n );\n }\n\n return array as string[];\n}\n\nexport function parseNumberParam(\n param: unknown,\n paramName: string,\n): number[] | undefined {\n return parseStringsParam(param, paramName)?.map(val => {\n const ret = Number.parseInt(val, 10);\n if (isNaN(ret)) {\n throw new InputError(\n `Invalid ${paramName} parameter \"${val}\", expected a number or array of numbers`,\n );\n }\n return ret;\n });\n}\n\nexport function flattenParams<T>(...params: (undefined | T | T[])[]): T[] {\n return [...params].flat().filter(Boolean) as T[];\n}\n"],"names":["os","fs","assertError","ANNOTATION_SOURCE_LOCATION","ANNOTATION_LOCATION","parseLocationRef","InputError","NotFoundError","stringifyEntityRef"],"mappings":"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"}
|