@backstage/plugin-scaffolder-backend 1.26.2 → 1.26.3-next.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.
package/CHANGELOG.md
CHANGED
|
@@ -1,32 +1,38 @@
|
|
|
1
1
|
# @backstage/plugin-scaffolder-backend
|
|
2
2
|
|
|
3
|
-
## 1.26.
|
|
3
|
+
## 1.26.3-next.0
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
+
- 6aa5b98: Fix tasks listing with postgres
|
|
8
|
+
- 59137ff: Fix issue with token not being available because it's now non-enumerable
|
|
9
|
+
- e4f5d95: Align with type declaration of template filter/global function by supporting undefined as return value.
|
|
10
|
+
- 97ba58f: Add example template for notification sending
|
|
7
11
|
- Updated dependencies
|
|
8
|
-
- @backstage/
|
|
9
|
-
- @backstage/
|
|
10
|
-
- @backstage/
|
|
11
|
-
- @backstage/
|
|
12
|
-
- @backstage/plugin-
|
|
13
|
-
- @backstage/
|
|
14
|
-
- @backstage/
|
|
15
|
-
- @backstage/
|
|
16
|
-
- @backstage/
|
|
17
|
-
- @backstage/
|
|
18
|
-
- @backstage/plugin-
|
|
19
|
-
- @backstage/plugin-
|
|
20
|
-
- @backstage/plugin-
|
|
21
|
-
- @backstage/plugin-
|
|
22
|
-
- @backstage/plugin-scaffolder-backend-module-azure@0.2.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
12
|
+
- @backstage/plugin-auth-node@0.5.4-next.0
|
|
13
|
+
- @backstage/plugin-catalog-node@1.14.0-next.0
|
|
14
|
+
- @backstage/backend-defaults@0.5.3-next.0
|
|
15
|
+
- @backstage/catalog-client@1.8.0-next.0
|
|
16
|
+
- @backstage/backend-plugin-api@1.0.2-next.0
|
|
17
|
+
- @backstage/catalog-model@1.7.0
|
|
18
|
+
- @backstage/config@1.2.0
|
|
19
|
+
- @backstage/errors@1.2.4
|
|
20
|
+
- @backstage/integration@1.15.1
|
|
21
|
+
- @backstage/types@1.1.1
|
|
22
|
+
- @backstage/plugin-bitbucket-cloud-common@0.2.24
|
|
23
|
+
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2-next.0
|
|
24
|
+
- @backstage/plugin-permission-common@0.8.1
|
|
25
|
+
- @backstage/plugin-permission-node@0.8.5-next.0
|
|
26
|
+
- @backstage/plugin-scaffolder-backend-module-azure@0.2.2-next.0
|
|
27
|
+
- @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.2-next.0
|
|
28
|
+
- @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.2-next.0
|
|
29
|
+
- @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.2-next.0
|
|
30
|
+
- @backstage/plugin-scaffolder-backend-module-gerrit@0.2.2-next.0
|
|
31
|
+
- @backstage/plugin-scaffolder-backend-module-gitea@0.2.2-next.0
|
|
32
|
+
- @backstage/plugin-scaffolder-backend-module-github@0.5.2-next.0
|
|
33
|
+
- @backstage/plugin-scaffolder-backend-module-gitlab@0.6.1-next.0
|
|
34
|
+
- @backstage/plugin-scaffolder-common@1.5.6
|
|
35
|
+
- @backstage/plugin-scaffolder-node@0.5.1-next.0
|
|
30
36
|
|
|
31
37
|
## 1.26.0
|
|
32
38
|
|
package/alpha/package.json
CHANGED
|
@@ -36,14 +36,17 @@ const { render, renderCompat } = (() => {
|
|
|
36
36
|
});
|
|
37
37
|
compatEnv.addFilter('jsonify', compatEnv.getFilter('dump'));
|
|
38
38
|
|
|
39
|
+
const handleFunctionResult = (value) => {
|
|
40
|
+
return value === '' ? undefined : JSON.parse(value);
|
|
41
|
+
};
|
|
39
42
|
for (const name of JSON.parse(availableTemplateFilters)) {
|
|
40
|
-
env.addFilter(name, (...args) =>
|
|
43
|
+
env.addFilter(name, (...args) => handleFunctionResult(callFilter(name, args)));
|
|
41
44
|
}
|
|
42
45
|
for (const [name, value] of Object.entries(JSON.parse(availableTemplateGlobals))) {
|
|
43
46
|
env.addGlobal(name, value);
|
|
44
47
|
}
|
|
45
48
|
for (const name of JSON.parse(availableTemplateCallbacks)) {
|
|
46
|
-
env.addGlobal(name, (...args) =>
|
|
49
|
+
env.addGlobal(name, (...args) => handleFunctionResult(callGlobal(name, args)));
|
|
47
50
|
}
|
|
48
51
|
|
|
49
52
|
let uninstallCompat = undefined;
|
|
@@ -133,7 +136,8 @@ class SecureTemplater {
|
|
|
133
136
|
if (!Object.hasOwn(templateFilters, filterName)) {
|
|
134
137
|
return "";
|
|
135
138
|
}
|
|
136
|
-
|
|
139
|
+
const rz = templateFilters[filterName](...args);
|
|
140
|
+
return rz === void 0 ? "" : JSON.stringify(rz);
|
|
137
141
|
}
|
|
138
142
|
);
|
|
139
143
|
await contextGlobal.set(
|
|
@@ -146,7 +150,8 @@ class SecureTemplater {
|
|
|
146
150
|
if (typeof global !== "function") {
|
|
147
151
|
return "";
|
|
148
152
|
}
|
|
149
|
-
|
|
153
|
+
const rz = global(...args);
|
|
154
|
+
return rz === void 0 ? "" : JSON.stringify(rz);
|
|
150
155
|
}
|
|
151
156
|
);
|
|
152
157
|
await nunjucksScript.run(context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecureTemplater.cjs.js","sources":["../../../src/lib/templating/SecureTemplater.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 { Isolate } from 'isolated-vm';\nimport { resolvePackagePath } from '@backstage/backend-plugin-api';\nimport {\n TemplateFilter as _TemplateFilter,\n TemplateGlobal as _TemplateGlobal,\n} from '@backstage/plugin-scaffolder-node';\nimport fs from 'fs-extra';\nimport { JsonValue } from '@backstage/types';\nimport { getMajorNodeVersion, isNoNodeSnapshotOptionProvided } from './helpers';\n\n// language=JavaScript\nconst mkScript = (nunjucksSource: string) => `\nconst { render, renderCompat } = (() => {\n const module = {};\n const process = { env: {} };\n const require = (pkg) => { if (pkg === 'events') { return function (){}; }};\n\n ${nunjucksSource}\n\n const env = module.exports.configure({\n autoescape: false,\n ...JSON.parse(nunjucksConfigs),\n tags: {\n variableStart: '\\${{',\n variableEnd: '}}',\n },\n });\n\n const compatEnv = module.exports.configure({\n autoescape: false,\n ...JSON.parse(nunjucksConfigs),\n tags: {\n variableStart: '{{',\n variableEnd: '}}',\n },\n });\n compatEnv.addFilter('jsonify', compatEnv.getFilter('dump'));\n\n for (const name of JSON.parse(availableTemplateFilters)) {\n env.addFilter(name, (...args) => JSON.parse(callFilter(name, args)));\n }\n for (const [name, value] of Object.entries(JSON.parse(availableTemplateGlobals))) {\n env.addGlobal(name, value);\n }\n for (const name of JSON.parse(availableTemplateCallbacks)) {\n env.addGlobal(name, (...args) => JSON.parse(callGlobal(name, args)));\n }\n\n let uninstallCompat = undefined;\n\n function render(str, values) {\n try {\n if (uninstallCompat) {\n uninstallCompat();\n uninstallCompat = undefined;\n }\n return env.renderString(str, JSON.parse(values));\n } catch (error) {\n // Make sure errors don't leak anything\n throw new Error(String(error.message));\n }\n }\n\n function renderCompat(str, values) {\n try {\n if (!uninstallCompat) {\n uninstallCompat = module.exports.installJinjaCompat();\n }\n return compatEnv.renderString(str, JSON.parse(values));\n } catch (error) {\n // Make sure errors don't leak anything\n throw new Error(String(error.message));\n }\n }\n\n return { render, renderCompat };\n})();\n`;\n\n/**\n * @public\n * @deprecated Import from `@backstage/plugin-scaffolder-node` instead.\n */\nexport type TemplateFilter = _TemplateFilter;\n\n/**\n * @public\n * @deprecated Import from `@backstage/plugin-scaffolder-node` instead.\n */\nexport type TemplateGlobal = _TemplateGlobal;\n\ninterface SecureTemplaterOptions {\n /* Enables jinja compatibility and the \"jsonify\" filter */\n cookiecutterCompat?: boolean;\n /* Extra user-provided nunjucks filters */\n templateFilters?: Record<string, TemplateFilter>;\n /* Extra user-provided nunjucks globals */\n templateGlobals?: Record<string, TemplateGlobal>;\n nunjucksConfigs?: { trimBlocks?: boolean; lstripBlocks?: boolean };\n}\n\nexport type SecureTemplateRenderer = (\n template: string,\n values: unknown,\n) => string;\n\nexport class SecureTemplater {\n static async loadRenderer(options: SecureTemplaterOptions = {}) {\n const {\n cookiecutterCompat,\n templateFilters = {},\n templateGlobals = {},\n nunjucksConfigs = {},\n } = options;\n\n const nodeVersion = getMajorNodeVersion();\n if (nodeVersion >= 20 && !isNoNodeSnapshotOptionProvided()) {\n throw new Error(\n `When using Node.js version 20 or newer, the scaffolder backend plugin requires that it be started with the --no-node-snapshot option. \n Please make sure that you have NODE_OPTIONS=--no-node-snapshot in your environment.`,\n );\n }\n\n const isolate = new Isolate({ memoryLimit: 128 });\n const context = await isolate.createContext();\n const contextGlobal = context.global;\n\n const nunjucksSource = await fs.readFile(\n resolvePackagePath(\n '@backstage/plugin-scaffolder-backend',\n 'assets/nunjucks.js.txt',\n ),\n 'utf-8',\n );\n\n const nunjucksScript = await isolate.compileScript(\n mkScript(nunjucksSource),\n );\n\n await contextGlobal.set('nunjucksConfigs', JSON.stringify(nunjucksConfigs));\n\n const availableFilters = Object.keys(templateFilters);\n\n await contextGlobal.set(\n 'availableTemplateFilters',\n JSON.stringify(availableFilters),\n );\n\n const globalCallbacks = [];\n const globalValues: Record<string, unknown> = {};\n for (const [name, value] of Object.entries(templateGlobals)) {\n if (typeof value === 'function') {\n globalCallbacks.push(name);\n } else {\n globalValues[name] = value;\n }\n }\n\n await contextGlobal.set(\n 'availableTemplateGlobals',\n JSON.stringify(globalValues),\n );\n await contextGlobal.set(\n 'availableTemplateCallbacks',\n JSON.stringify(globalCallbacks),\n );\n\n await contextGlobal.set(\n 'callFilter',\n (filterName: string, args: JsonValue[]) => {\n if (!Object.hasOwn(templateFilters, filterName)) {\n return '';\n }\n return JSON.stringify(templateFilters[filterName](...args));\n },\n );\n\n await contextGlobal.set(\n 'callGlobal',\n (globalName: string, args: JsonValue[]) => {\n if (!Object.hasOwn(templateGlobals, globalName)) {\n return '';\n }\n const global = templateGlobals[globalName];\n if (typeof global !== 'function') {\n return '';\n }\n return JSON.stringify(global(...args));\n },\n );\n\n await nunjucksScript.run(context);\n\n const render: SecureTemplateRenderer = (template, values) => {\n if (!context) {\n throw new Error('SecureTemplater has not been initialized');\n }\n\n contextGlobal.setSync('templateStr', String(template));\n contextGlobal.setSync('templateValues', JSON.stringify(values));\n\n if (cookiecutterCompat) {\n return context.evalSync(`renderCompat(templateStr, templateValues)`);\n }\n\n return context.evalSync(`render(templateStr, templateValues)`);\n };\n return render;\n }\n}\n"],"names":["getMajorNodeVersion","isNoNodeSnapshotOptionProvided","Isolate","fs","resolvePackagePath"],"mappings":";;;;;;;;;;;AA2BA,MAAM,QAAA,GAAW,CAAC,cAA2B,KAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAMzC,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAyFX,MAAM,eAAgB,CAAA;AAAA,EAC3B,aAAa,YAAA,CAAa,OAAkC,GAAA,EAAI,EAAA;AAC9D,IAAM,MAAA;AAAA,MACJ,kBAAA;AAAA,MACA,kBAAkB,EAAC;AAAA,MACnB,kBAAkB,EAAC;AAAA,MACnB,kBAAkB,EAAC;AAAA,KACjB,GAAA,OAAA,CAAA;AAEJ,IAAA,MAAM,cAAcA,2BAAoB,EAAA,CAAA;AACxC,IAAA,IAAI,WAAe,IAAA,EAAA,IAAM,CAACC,sCAAA,EAAkC,EAAA;AAC1D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA;AAAA,2FAAA,CAAA;AAAA,OAEF,CAAA;AAAA,KACF;AAEA,IAAA,MAAM,UAAU,IAAIC,kBAAA,CAAQ,EAAE,WAAA,EAAa,KAAK,CAAA,CAAA;AAChD,IAAM,MAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,aAAc,EAAA,CAAA;AAC5C,IAAA,MAAM,gBAAgB,OAAQ,CAAA,MAAA,CAAA;AAE9B,IAAM,MAAA,cAAA,GAAiB,MAAMC,mBAAG,CAAA,QAAA;AAAA,MAC9BC,mCAAA;AAAA,QACE,sCAAA;AAAA,QACA,wBAAA;AAAA,OACF;AAAA,MACA,OAAA;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,cAAA,GAAiB,MAAM,OAAQ,CAAA,aAAA;AAAA,MACnC,SAAS,cAAc,CAAA;AAAA,KACzB,CAAA;AAEA,IAAA,MAAM,cAAc,GAAI,CAAA,iBAAA,EAAmB,IAAK,CAAA,SAAA,CAAU,eAAe,CAAC,CAAA,CAAA;AAE1E,IAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,IAAA,CAAK,eAAe,CAAA,CAAA;AAEpD,IAAA,MAAM,aAAc,CAAA,GAAA;AAAA,MAClB,0BAAA;AAAA,MACA,IAAA,CAAK,UAAU,gBAAgB,CAAA;AAAA,KACjC,CAAA;AAEA,IAAA,MAAM,kBAAkB,EAAC,CAAA;AACzB,IAAA,MAAM,eAAwC,EAAC,CAAA;AAC/C,IAAA,KAAA,MAAW,CAAC,IAAM,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,eAAe,CAAG,EAAA;AAC3D,MAAI,IAAA,OAAO,UAAU,UAAY,EAAA;AAC/B,QAAA,eAAA,CAAgB,KAAK,IAAI,CAAA,CAAA;AAAA,OACpB,MAAA;AACL,QAAA,YAAA,CAAa,IAAI,CAAI,GAAA,KAAA,CAAA;AAAA,OACvB;AAAA,KACF;AAEA,IAAA,MAAM,aAAc,CAAA,GAAA;AAAA,MAClB,0BAAA;AAAA,MACA,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,KAC7B,CAAA;AACA,IAAA,MAAM,aAAc,CAAA,GAAA;AAAA,MAClB,4BAAA;AAAA,MACA,IAAA,CAAK,UAAU,eAAe,CAAA;AAAA,KAChC,CAAA;AAEA,IAAA,MAAM,aAAc,CAAA,GAAA;AAAA,MAClB,YAAA;AAAA,MACA,CAAC,YAAoB,IAAsB,KAAA;AACzC,QAAA,IAAI,CAAC,MAAA,CAAO,MAAO,CAAA,eAAA,EAAiB,UAAU,CAAG,EAAA;AAC/C,UAAO,OAAA,EAAA,CAAA;AAAA,SACT;AACA,QAAA,OAAO,KAAK,SAAU,CAAA,eAAA,CAAgB,UAAU,CAAE,CAAA,GAAG,IAAI,CAAC,CAAA,CAAA;AAAA,OAC5D;AAAA,KACF,CAAA;AAEA,IAAA,MAAM,aAAc,CAAA,GAAA;AAAA,MAClB,YAAA;AAAA,MACA,CAAC,YAAoB,IAAsB,KAAA;AACzC,QAAA,IAAI,CAAC,MAAA,CAAO,MAAO,CAAA,eAAA,EAAiB,UAAU,CAAG,EAAA;AAC/C,UAAO,OAAA,EAAA,CAAA;AAAA,SACT;AACA,QAAM,MAAA,MAAA,GAAS,gBAAgB,UAAU,CAAA,CAAA;AACzC,QAAI,IAAA,OAAO,WAAW,UAAY,EAAA;AAChC,UAAO,OAAA,EAAA,CAAA;AAAA,SACT;AACA,QAAA,OAAO,IAAK,CAAA,SAAA,CAAU,MAAO,CAAA,GAAG,IAAI,CAAC,CAAA,CAAA;AAAA,OACvC;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,cAAA,CAAe,IAAI,OAAO,CAAA,CAAA;AAEhC,IAAM,MAAA,MAAA,GAAiC,CAAC,QAAA,EAAU,MAAW,KAAA;AAC3D,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAM,MAAA,IAAI,MAAM,0CAA0C,CAAA,CAAA;AAAA,OAC5D;AAEA,MAAA,aAAA,CAAc,OAAQ,CAAA,aAAA,EAAe,MAAO,CAAA,QAAQ,CAAC,CAAA,CAAA;AACrD,MAAA,aAAA,CAAc,OAAQ,CAAA,gBAAA,EAAkB,IAAK,CAAA,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA;AAE9D,MAAA,IAAI,kBAAoB,EAAA;AACtB,QAAO,OAAA,OAAA,CAAQ,SAAS,CAA2C,yCAAA,CAAA,CAAA,CAAA;AAAA,OACrE;AAEA,MAAO,OAAA,OAAA,CAAQ,SAAS,CAAqC,mCAAA,CAAA,CAAA,CAAA;AAAA,KAC/D,CAAA;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACT;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"SecureTemplater.cjs.js","sources":["../../../src/lib/templating/SecureTemplater.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 { Isolate } from 'isolated-vm';\nimport { resolvePackagePath } from '@backstage/backend-plugin-api';\nimport {\n TemplateFilter as _TemplateFilter,\n TemplateGlobal as _TemplateGlobal,\n} from '@backstage/plugin-scaffolder-node';\nimport fs from 'fs-extra';\nimport { JsonValue } from '@backstage/types';\nimport { getMajorNodeVersion, isNoNodeSnapshotOptionProvided } from './helpers';\n\n// language=JavaScript\nconst mkScript = (nunjucksSource: string) => `\nconst { render, renderCompat } = (() => {\n const module = {};\n const process = { env: {} };\n const require = (pkg) => { if (pkg === 'events') { return function (){}; }};\n\n ${nunjucksSource}\n\n const env = module.exports.configure({\n autoescape: false,\n ...JSON.parse(nunjucksConfigs),\n tags: {\n variableStart: '\\${{',\n variableEnd: '}}',\n },\n });\n\n const compatEnv = module.exports.configure({\n autoescape: false,\n ...JSON.parse(nunjucksConfigs),\n tags: {\n variableStart: '{{',\n variableEnd: '}}',\n },\n });\n compatEnv.addFilter('jsonify', compatEnv.getFilter('dump'));\n\n const handleFunctionResult = (value) => {\n return value === '' ? undefined : JSON.parse(value);\n };\n for (const name of JSON.parse(availableTemplateFilters)) {\n env.addFilter(name, (...args) => handleFunctionResult(callFilter(name, args)));\n }\n for (const [name, value] of Object.entries(JSON.parse(availableTemplateGlobals))) {\n env.addGlobal(name, value);\n }\n for (const name of JSON.parse(availableTemplateCallbacks)) {\n env.addGlobal(name, (...args) => handleFunctionResult(callGlobal(name, args)));\n }\n\n let uninstallCompat = undefined;\n\n function render(str, values) {\n try {\n if (uninstallCompat) {\n uninstallCompat();\n uninstallCompat = undefined;\n }\n return env.renderString(str, JSON.parse(values));\n } catch (error) {\n // Make sure errors don't leak anything\n throw new Error(String(error.message));\n }\n }\n\n function renderCompat(str, values) {\n try {\n if (!uninstallCompat) {\n uninstallCompat = module.exports.installJinjaCompat();\n }\n return compatEnv.renderString(str, JSON.parse(values));\n } catch (error) {\n // Make sure errors don't leak anything\n throw new Error(String(error.message));\n }\n }\n\n return { render, renderCompat };\n})();\n`;\n\n/**\n * @public\n * @deprecated Import from `@backstage/plugin-scaffolder-node` instead.\n */\nexport type TemplateFilter = _TemplateFilter;\n\n/**\n * @public\n * @deprecated Import from `@backstage/plugin-scaffolder-node` instead.\n */\nexport type TemplateGlobal = _TemplateGlobal;\n\ninterface SecureTemplaterOptions {\n /* Enables jinja compatibility and the \"jsonify\" filter */\n cookiecutterCompat?: boolean;\n /* Extra user-provided nunjucks filters */\n templateFilters?: Record<string, TemplateFilter>;\n /* Extra user-provided nunjucks globals */\n templateGlobals?: Record<string, TemplateGlobal>;\n nunjucksConfigs?: { trimBlocks?: boolean; lstripBlocks?: boolean };\n}\n\nexport type SecureTemplateRenderer = (\n template: string,\n values: unknown,\n) => string;\n\nexport class SecureTemplater {\n static async loadRenderer(options: SecureTemplaterOptions = {}) {\n const {\n cookiecutterCompat,\n templateFilters = {},\n templateGlobals = {},\n nunjucksConfigs = {},\n } = options;\n\n const nodeVersion = getMajorNodeVersion();\n if (nodeVersion >= 20 && !isNoNodeSnapshotOptionProvided()) {\n throw new Error(\n `When using Node.js version 20 or newer, the scaffolder backend plugin requires that it be started with the --no-node-snapshot option. \n Please make sure that you have NODE_OPTIONS=--no-node-snapshot in your environment.`,\n );\n }\n\n const isolate = new Isolate({ memoryLimit: 128 });\n const context = await isolate.createContext();\n const contextGlobal = context.global;\n\n const nunjucksSource = await fs.readFile(\n resolvePackagePath(\n '@backstage/plugin-scaffolder-backend',\n 'assets/nunjucks.js.txt',\n ),\n 'utf-8',\n );\n\n const nunjucksScript = await isolate.compileScript(\n mkScript(nunjucksSource),\n );\n\n await contextGlobal.set('nunjucksConfigs', JSON.stringify(nunjucksConfigs));\n\n const availableFilters = Object.keys(templateFilters);\n\n await contextGlobal.set(\n 'availableTemplateFilters',\n JSON.stringify(availableFilters),\n );\n\n const globalCallbacks = [];\n const globalValues: Record<string, unknown> = {};\n for (const [name, value] of Object.entries(templateGlobals)) {\n if (typeof value === 'function') {\n globalCallbacks.push(name);\n } else {\n globalValues[name] = value;\n }\n }\n\n await contextGlobal.set(\n 'availableTemplateGlobals',\n JSON.stringify(globalValues),\n );\n await contextGlobal.set(\n 'availableTemplateCallbacks',\n JSON.stringify(globalCallbacks),\n );\n\n await contextGlobal.set(\n 'callFilter',\n (filterName: string, args: JsonValue[]) => {\n if (!Object.hasOwn(templateFilters, filterName)) {\n return '';\n }\n const rz = templateFilters[filterName](...args);\n return rz === undefined ? '' : JSON.stringify(rz);\n },\n );\n\n await contextGlobal.set(\n 'callGlobal',\n (globalName: string, args: JsonValue[]) => {\n if (!Object.hasOwn(templateGlobals, globalName)) {\n return '';\n }\n const global = templateGlobals[globalName];\n if (typeof global !== 'function') {\n return '';\n }\n const rz = global(...args);\n return rz === undefined ? '' : JSON.stringify(rz);\n },\n );\n\n await nunjucksScript.run(context);\n\n const render: SecureTemplateRenderer = (template, values) => {\n if (!context) {\n throw new Error('SecureTemplater has not been initialized');\n }\n\n contextGlobal.setSync('templateStr', String(template));\n contextGlobal.setSync('templateValues', JSON.stringify(values));\n\n if (cookiecutterCompat) {\n return context.evalSync(`renderCompat(templateStr, templateValues)`);\n }\n\n return context.evalSync(`render(templateStr, templateValues)`);\n };\n return render;\n }\n}\n"],"names":["getMajorNodeVersion","isNoNodeSnapshotOptionProvided","Isolate","fs","resolvePackagePath"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-scaffolder-backend",
|
|
3
|
-
"version": "1.26.
|
|
3
|
+
"version": "1.26.3-next.0",
|
|
4
4
|
"description": "The Backstage backend plugin that helps you create new things",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "backend-plugin",
|
|
@@ -63,30 +63,30 @@
|
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"@backstage/backend-common": "^0.25.0",
|
|
66
|
-
"@backstage/backend-defaults": "
|
|
67
|
-
"@backstage/backend-plugin-api": "
|
|
68
|
-
"@backstage/catalog-client": "
|
|
69
|
-
"@backstage/catalog-model": "
|
|
70
|
-
"@backstage/config": "
|
|
71
|
-
"@backstage/errors": "
|
|
72
|
-
"@backstage/integration": "
|
|
73
|
-
"@backstage/plugin-auth-node": "
|
|
74
|
-
"@backstage/plugin-bitbucket-cloud-common": "
|
|
75
|
-
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "
|
|
76
|
-
"@backstage/plugin-catalog-node": "
|
|
77
|
-
"@backstage/plugin-permission-common": "
|
|
78
|
-
"@backstage/plugin-permission-node": "
|
|
79
|
-
"@backstage/plugin-scaffolder-backend-module-azure": "
|
|
80
|
-
"@backstage/plugin-scaffolder-backend-module-bitbucket": "
|
|
81
|
-
"@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "
|
|
82
|
-
"@backstage/plugin-scaffolder-backend-module-bitbucket-server": "
|
|
83
|
-
"@backstage/plugin-scaffolder-backend-module-gerrit": "
|
|
84
|
-
"@backstage/plugin-scaffolder-backend-module-gitea": "
|
|
85
|
-
"@backstage/plugin-scaffolder-backend-module-github": "
|
|
86
|
-
"@backstage/plugin-scaffolder-backend-module-gitlab": "
|
|
87
|
-
"@backstage/plugin-scaffolder-common": "
|
|
88
|
-
"@backstage/plugin-scaffolder-node": "
|
|
89
|
-
"@backstage/types": "
|
|
66
|
+
"@backstage/backend-defaults": "0.5.3-next.0",
|
|
67
|
+
"@backstage/backend-plugin-api": "1.0.2-next.0",
|
|
68
|
+
"@backstage/catalog-client": "1.8.0-next.0",
|
|
69
|
+
"@backstage/catalog-model": "1.7.0",
|
|
70
|
+
"@backstage/config": "1.2.0",
|
|
71
|
+
"@backstage/errors": "1.2.4",
|
|
72
|
+
"@backstage/integration": "1.15.1",
|
|
73
|
+
"@backstage/plugin-auth-node": "0.5.4-next.0",
|
|
74
|
+
"@backstage/plugin-bitbucket-cloud-common": "0.2.24",
|
|
75
|
+
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.2.2-next.0",
|
|
76
|
+
"@backstage/plugin-catalog-node": "1.14.0-next.0",
|
|
77
|
+
"@backstage/plugin-permission-common": "0.8.1",
|
|
78
|
+
"@backstage/plugin-permission-node": "0.8.5-next.0",
|
|
79
|
+
"@backstage/plugin-scaffolder-backend-module-azure": "0.2.2-next.0",
|
|
80
|
+
"@backstage/plugin-scaffolder-backend-module-bitbucket": "0.3.2-next.0",
|
|
81
|
+
"@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "0.2.2-next.0",
|
|
82
|
+
"@backstage/plugin-scaffolder-backend-module-bitbucket-server": "0.2.2-next.0",
|
|
83
|
+
"@backstage/plugin-scaffolder-backend-module-gerrit": "0.2.2-next.0",
|
|
84
|
+
"@backstage/plugin-scaffolder-backend-module-gitea": "0.2.2-next.0",
|
|
85
|
+
"@backstage/plugin-scaffolder-backend-module-github": "0.5.2-next.0",
|
|
86
|
+
"@backstage/plugin-scaffolder-backend-module-gitlab": "0.6.1-next.0",
|
|
87
|
+
"@backstage/plugin-scaffolder-common": "1.5.6",
|
|
88
|
+
"@backstage/plugin-scaffolder-node": "0.5.1-next.0",
|
|
89
|
+
"@backstage/types": "1.1.1",
|
|
90
90
|
"@opentelemetry/api": "^1.3.0",
|
|
91
91
|
"@types/express": "^4.17.6",
|
|
92
92
|
"@types/luxon": "^3.0.0",
|
|
@@ -116,11 +116,11 @@
|
|
|
116
116
|
"zod": "^3.22.4"
|
|
117
117
|
},
|
|
118
118
|
"devDependencies": {
|
|
119
|
-
"@backstage/backend-app-api": "
|
|
120
|
-
"@backstage/backend-defaults": "
|
|
121
|
-
"@backstage/backend-test-utils": "
|
|
122
|
-
"@backstage/cli": "
|
|
123
|
-
"@backstage/plugin-scaffolder-node-test-utils": "
|
|
119
|
+
"@backstage/backend-app-api": "1.0.2-next.0",
|
|
120
|
+
"@backstage/backend-defaults": "0.5.3-next.0",
|
|
121
|
+
"@backstage/backend-test-utils": "1.0.3-next.0",
|
|
122
|
+
"@backstage/cli": "0.29.0-next.0",
|
|
123
|
+
"@backstage/plugin-scaffolder-node-test-utils": "0.1.15-next.0",
|
|
124
124
|
"@types/fs-extra": "^11.0.0",
|
|
125
125
|
"@types/nunjucks": "^3.1.4",
|
|
126
126
|
"@types/supertest": "^2.0.8",
|