packages/@jsii/dotnet-runtime/JsiiRuntimeProvider.t.js (66 lines of code) (raw):
const fs = require('fs');
const path = require('path');
const { version } = require('./package.json');
const resources = discoverResources();
const entryPoint = 'bin/jsii-runtime.js';
process.stdout.write(`using System.CodeDom.Compiler;
using System.Reflection;
namespace Amazon.JSII.Runtime.Services
{
[GeneratedCode("${path.basename(__filename)}", "${version}")]
internal sealed class JsiiRuntimeProvider : IJsiiRuntimeProvider
{
private const string BAG_NAME = "jsii-runtime";
public JsiiRuntimeProvider(IResourceExtractor resourceExtractor)
{
// deploy embedded resources to the temp directory
var assembly = Assembly.GetExecutingAssembly();
${resources.map(extractResource).map(indent(12)).join('\n')}
}
public string JsiiRuntimePath { get; }
}
}
`);
function discoverResources(
root = path.resolve(__dirname, 'src', 'Amazon.JSII.Runtime', 'jsii-runtime'),
dir = '.',
) {
const result = [];
for (const file of fs.readdirSync(path.resolve(root, dir))) {
// Ignore dot-files
if (file.startsWith('.')) {
continue;
}
const stat = fs.statSync(path.resolve(root, dir, file));
if (stat.isDirectory()) {
result.push(...discoverResources(root, path.join(dir, file)));
continue;
}
result.push(path.join(dir, file));
}
return result;
}
function extractResource(name) {
const parts = name.split(/[\\/]/);
for (let i = 0; i < parts.length - 1; i++) {
// Replacing - with _ in directory names
parts[i] = parts[i].replace(/-/m, '_');
}
// Resource names are "."-delimited (and not "/"-delimited)
const resourceName = `Amazon.JSII.Runtime.jsii_runtime.${parts.join('.')}`;
const extract = `resourceExtractor.ExtractResource(assembly, "${resourceName}", BAG_NAME, "${name}");`;
if (name === entryPoint) {
return `JsiiRuntimePath = ${extract}`;
} else {
return extract;
}
}
function indent(count) {
const spaces = ' '.repeat(count);
return (str) =>
str
.split('\n')
.map((x) => `${spaces}${x}`)
.join('\n');
}
function quote(x) {
return `"${x}"`;
}