feat: Remove podTemplateFolder as a variable.

This is now possible due to TemplatedResourcesGenerator
accepting path strings relative to the module root.
This commit is contained in:
Joachim Van Herwegen 2021-04-15 11:55:06 +02:00
parent e9917322e3
commit 1d9b027a57
16 changed files with 21 additions and 33 deletions

View File

@ -67,7 +67,6 @@ Additional recipes for configuring and deploying the server can be found at [sol
| `--config, -c` | `"config/config-default.json"` | `config-default.json` stores all data in memory. If you would like to persist data to your filesystem, try `config-file.json` |
| `--mainModulePath, -m` | | Absolute path to the package root from which ComponentJS module resolution should start. |
| `--loggingLevel, -l` | `"info"`| |
| `--podTemplateFolder, -t` | `"templates/pod"` | Folder containing the templates used for pod provisioning. |
| `--rootFilePath, -f` | `"./"` | Folder to start the server in when using a file-based config. |
| `--sparqlEndpoint, -s` | | Endpoint to call when using a SPARQL-based config. |
| `--podConfigJson` | `"./pod-config.json"` | JSON file to store pod configuration when using a dynamic config. |

View File

@ -21,10 +21,6 @@
"@id": "urn:solid-server:default:variable:loggingLevel",
"@type": "Variable"
},
{
"@id": "urn:solid-server:default:variable:podTemplateFolder",
"@type": "Variable"
},
{
"comment": "Path to the JSON file used to store configuration for dynamic pods.",
"@id": "urn:solid-server:default:variable:podConfigJson",

View File

@ -79,9 +79,7 @@
"ConfigPodManager:_resourcesGenerator": {
"@id": "urn:solid-server:default:ResourcesGenerator",
"@type": "TemplatedResourcesGenerator",
"TemplatedResourcesGenerator:_templateFolder": {
"@id": "urn:solid-server:default:variable:podTemplateFolder"
},
"TemplatedResourcesGenerator:_templateFolder": "$PACKAGE_ROOT/templates/pod",
"TemplatedResourcesGenerator:_factory": {
"@type": "ExtensionBasedMapperFactory"
},

View File

@ -4,9 +4,7 @@
{
"@id": "urn:solid-server:default:ResourcesGenerator",
"@type": "TemplatedResourcesGenerator",
"TemplatedResourcesGenerator:_templateFolder": {
"@id": "urn:solid-server:default:variable:podTemplateFolder"
},
"TemplatedResourcesGenerator:_templateFolder": "$PACKAGE_ROOT/templates/pod",
"TemplatedResourcesGenerator:_factory": {
"@type": "ExtensionBasedMapperFactory"
},

View File

@ -58,7 +58,6 @@ export class CliRunner {
config: { type: 'string', alias: 'c' },
loggingLevel: { type: 'string', alias: 'l', default: 'info' },
mainModulePath: { type: 'string', alias: 'm' },
podTemplateFolder: { type: 'string', alias: 't' },
port: { type: 'number', alias: 'p', default: 3000 },
rootFilePath: { type: 'string', alias: 'f', default: './' },
sparqlEndpoint: { type: 'string', alias: 's' },
@ -113,8 +112,6 @@ export class CliRunner {
'urn:solid-server:default:variable:rootFilePath':
this.resolveFilePath(params.rootFilePath),
'urn:solid-server:default:variable:sparqlEndpoint': params.sparqlEndpoint,
'urn:solid-server:default:variable:podTemplateFolder':
this.resolveFilePath(params.podTemplateFolder, 'templates/pod'),
'urn:solid-server:default:variable:podConfigJson':
this.resolveFilePath(params.podConfigJson),
};

View File

@ -8,7 +8,7 @@ import type {
FileIdentifierMapperFactory,
ResourceLink,
} from '../../storage/mapping/FileIdentifierMapper';
import { joinFilePath, isContainerIdentifier } from '../../util/PathUtil';
import { joinFilePath, isContainerIdentifier, resolveAssetPath } from '../../util/PathUtil';
import type { Resource, ResourcesGenerator } from './ResourcesGenerator';
import type { TemplateEngine } from './TemplateEngine';
import Dict = NodeJS.Dict;
@ -18,6 +18,9 @@ import Dict = NodeJS.Dict;
* The template folder structure will be kept.
* Folders will be interpreted as containers and files as documents.
* A FileIdentifierMapper will be used to generate identifiers that correspond to the relative structure.
*
* A relative `templateFolder` is resolved relative to cwd,
* unless it's preceded by $PACKAGE_ROOT/, e.g. $PACKAGE_ROOT/foo/bar.
*/
export class TemplatedResourcesGenerator implements ResourcesGenerator {
private readonly templateFolder: string;
@ -33,7 +36,7 @@ export class TemplatedResourcesGenerator implements ResourcesGenerator {
* @param engine - Template engine for generating the resources.
*/
public constructor(templateFolder: string, factory: FileIdentifierMapperFactory, engine: TemplateEngine) {
this.templateFolder = templateFolder;
this.templateFolder = resolveAssetPath(templateFolder);
this.factory = factory;
this.engine = engine;
}

View File

@ -34,12 +34,11 @@ describe.each(configs)('A dynamic pod server with template config %s', (template
'urn:solid-server:default:variable:baseUrl': baseUrl,
'urn:solid-server:default:variable:port': port,
'urn:solid-server:default:variable:rootFilePath': rootFilePath,
'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../assets/templates'),
'urn:solid-server:default:variable:podConfigJson': podConfigJson,
};
// Need to make sure the temp folder exists so the podConfigJson can be written to it
mkdirSync(rootFilePath);
mkdirSync(rootFilePath, { recursive: true });
// Create and initialize the HTTP handler and related components
const instances = await instantiateFromConfig(

View File

@ -1,7 +1,6 @@
import type { Server } from 'http';
import fetch from 'cross-fetch';
import type { HttpServerFactory } from '../../src/server/HttpServerFactory';
import { joinFilePath } from '../../src/util/PathUtil';
import { readableToString } from '../../src/util/StreamUtil';
import { instantiateFromConfig } from './Config';
@ -17,7 +16,6 @@ describe('A server with a pod handler', (): void => {
'urn:solid-server:default:ServerFactory', 'server-without-auth.json', {
'urn:solid-server:default:variable:port': port,
'urn:solid-server:default:variable:baseUrl': baseUrl,
'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../assets/templates'),
},
) as HttpServerFactory;
server = factory.startServer(port);

View File

@ -2,7 +2,6 @@ import type { Server } from 'http';
import fetch from 'cross-fetch';
import type { Initializer } from '../../src/init/Initializer';
import type { HttpServerFactory } from '../../src/server/HttpServerFactory';
import { joinFilePath } from '../../src/util/PathUtil';
import { instantiateFromConfig } from './Config';
const port = 6004;
@ -19,7 +18,6 @@ describe('A Solid server', (): void => {
'urn:solid-server:test:Instances', 'server-memory.json', {
'urn:solid-server:default:variable:port': port,
'urn:solid-server:default:variable:baseUrl': baseUrl,
'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../assets/templates'),
},
) as Record<string, any>;
({ factory, initializer } = instances);

View File

@ -3,7 +3,6 @@ import fetch from 'cross-fetch';
import type { Initializer } from '../../src/init/Initializer';
import type { HttpServerFactory } from '../../src/server/HttpServerFactory';
import type { ResourceStore } from '../../src/storage/ResourceStore';
import { joinFilePath } from '../../src/util/PathUtil';
import { getTestFolder, instantiateFromConfig, removeFolder } from './Config';
const port = 6005;
@ -35,7 +34,6 @@ describe.each(stores)('A subdomain server with %s', (name, { storeUrn, teardown
'urn:solid-server:default:variable:baseUrl': baseUrl,
'urn:solid-server:default:variable:port': port,
'urn:solid-server:default:variable:rootFilePath': rootFilePath,
'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../assets/templates'),
};
const internalStore = await instantiateFromConfig(
storeUrn,

View File

@ -16,7 +16,6 @@ describe('A server with the Solid WebSockets API behind a proxy', (): void => {
'urn:solid-server:default:ServerFactory', 'server-without-auth.json', {
'urn:solid-server:default:variable:port': port,
'urn:solid-server:default:variable:baseUrl': 'https://example.pod/',
'urn:solid-server:default:variable:podTemplateFolder': 'templates/pod',
},
) as HttpServerFactory;
server = factory.startServer(port);

View File

@ -76,6 +76,10 @@
"BaseUrlRouterRule:_baseStore": {
"@id": "urn:solid-server:default:MemoryResourceStore"
}
},
{
"@id": "urn:solid-server:default:ResourcesGenerator",
"TemplatedResourcesGenerator:_templateFolder": "$PACKAGE_ROOT/test/assets/templates"
}
]
}

View File

@ -79,6 +79,10 @@
"@id": "urn:solid-server:default:variable:store"
}
},
{
"@id": "urn:solid-server:default:ResourcesGenerator",
"TemplatedResourcesGenerator:_templateFolder": "$PACKAGE_ROOT/test/assets/templates"
},
{
"@id": "urn:solid-server:default:variable:store",
"@type": "Variable"

View File

@ -48,6 +48,10 @@
"PassthroughStore:_source": {
"@id": "urn:solid-server:default:MemoryResourceStore"
}
},
{
"@id": "urn:solid-server:default:ResourcesGenerator",
"TemplatedResourcesGenerator:_templateFolder": "$PACKAGE_ROOT/test/assets/templates"
}
]
}

View File

@ -60,7 +60,6 @@ describe('CliRunner', (): void => {
'urn:solid-server:default:variable:rootFilePath': '/var/cwd/',
'urn:solid-server:default:variable:sparqlEndpoint': undefined,
'urn:solid-server:default:variable:loggingLevel': 'info',
'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../../../templates/pod'),
'urn:solid-server:default:variable:podConfigJson': '/var/cwd/pod-config.json',
},
},
@ -80,7 +79,6 @@ describe('CliRunner', (): void => {
'-m', 'module/path',
'-p', '4000',
'-s', 'http://localhost:5000/sparql',
'-t', 'templates',
'--podConfigJson', '/different-path.json',
],
});
@ -104,7 +102,6 @@ describe('CliRunner', (): void => {
variables: {
'urn:solid-server:default:variable:baseUrl': 'http://pod.example/',
'urn:solid-server:default:variable:loggingLevel': 'debug',
'urn:solid-server:default:variable:podTemplateFolder': '/var/cwd/templates',
'urn:solid-server:default:variable:port': 4000,
'urn:solid-server:default:variable:rootFilePath': '/root',
'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:5000/sparql',
@ -122,7 +119,6 @@ describe('CliRunner', (): void => {
'--config', 'myconfig.json',
'--loggingLevel', 'debug',
'--mainModulePath', 'module/path',
'--podTemplateFolder', 'templates',
'--port', '4000',
'--rootFilePath', 'root',
'--sparqlEndpoint', 'http://localhost:5000/sparql',
@ -149,7 +145,6 @@ describe('CliRunner', (): void => {
variables: {
'urn:solid-server:default:variable:baseUrl': 'http://pod.example/',
'urn:solid-server:default:variable:loggingLevel': 'debug',
'urn:solid-server:default:variable:podTemplateFolder': '/var/cwd/templates',
'urn:solid-server:default:variable:port': 4000,
'urn:solid-server:default:variable:rootFilePath': '/var/cwd/root',
'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:5000/sparql',
@ -170,7 +165,6 @@ describe('CliRunner', (): void => {
'-m', 'module/path',
'-p', '4000',
'-s', 'http://localhost:5000/sparql',
'-t', 'templates',
'--podConfigJson', '/different-path.json',
];
@ -195,7 +189,6 @@ describe('CliRunner', (): void => {
variables: {
'urn:solid-server:default:variable:baseUrl': 'http://pod.example/',
'urn:solid-server:default:variable:loggingLevel': 'debug',
'urn:solid-server:default:variable:podTemplateFolder': '/var/cwd/templates',
'urn:solid-server:default:variable:port': 4000,
'urn:solid-server:default:variable:rootFilePath': '/root',
'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:5000/sparql',

View File

@ -38,7 +38,7 @@ async function genToArray<T>(iterable: AsyncIterable<T>): Promise<T[]> {
}
describe('A TemplatedResourcesGenerator', (): void => {
const rootFilePath = 'templates/pod';
const rootFilePath = '/templates/pod';
// Using handlebars engine since it's smaller than any possible dummy
const generator = new TemplatedResourcesGenerator(rootFilePath, new DummyFactory(), new HandlebarsTemplateEngine());
let cache: { data: any };