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` | | `--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. | | `--mainModulePath, -m` | | Absolute path to the package root from which ComponentJS module resolution should start. |
| `--loggingLevel, -l` | `"info"`| | | `--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. | | `--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. | | `--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. | | `--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", "@id": "urn:solid-server:default:variable:loggingLevel",
"@type": "Variable" "@type": "Variable"
}, },
{
"@id": "urn:solid-server:default:variable:podTemplateFolder",
"@type": "Variable"
},
{ {
"comment": "Path to the JSON file used to store configuration for dynamic pods.", "comment": "Path to the JSON file used to store configuration for dynamic pods.",
"@id": "urn:solid-server:default:variable:podConfigJson", "@id": "urn:solid-server:default:variable:podConfigJson",

View File

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

View File

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

View File

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

View File

@ -8,7 +8,7 @@ import type {
FileIdentifierMapperFactory, FileIdentifierMapperFactory,
ResourceLink, ResourceLink,
} from '../../storage/mapping/FileIdentifierMapper'; } 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 { Resource, ResourcesGenerator } from './ResourcesGenerator';
import type { TemplateEngine } from './TemplateEngine'; import type { TemplateEngine } from './TemplateEngine';
import Dict = NodeJS.Dict; import Dict = NodeJS.Dict;
@ -18,6 +18,9 @@ import Dict = NodeJS.Dict;
* The template folder structure will be kept. * The template folder structure will be kept.
* Folders will be interpreted as containers and files as documents. * 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 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 { export class TemplatedResourcesGenerator implements ResourcesGenerator {
private readonly templateFolder: string; private readonly templateFolder: string;
@ -33,7 +36,7 @@ export class TemplatedResourcesGenerator implements ResourcesGenerator {
* @param engine - Template engine for generating the resources. * @param engine - Template engine for generating the resources.
*/ */
public constructor(templateFolder: string, factory: FileIdentifierMapperFactory, engine: TemplateEngine) { public constructor(templateFolder: string, factory: FileIdentifierMapperFactory, engine: TemplateEngine) {
this.templateFolder = templateFolder; this.templateFolder = resolveAssetPath(templateFolder);
this.factory = factory; this.factory = factory;
this.engine = engine; 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:baseUrl': baseUrl,
'urn:solid-server:default:variable:port': port, 'urn:solid-server:default:variable:port': port,
'urn:solid-server:default:variable:rootFilePath': rootFilePath, 'urn:solid-server:default:variable:rootFilePath': rootFilePath,
'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../assets/templates'),
'urn:solid-server:default:variable:podConfigJson': podConfigJson, 'urn:solid-server:default:variable:podConfigJson': podConfigJson,
}; };
// Need to make sure the temp folder exists so the podConfigJson can be written to it // 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 // Create and initialize the HTTP handler and related components
const instances = await instantiateFromConfig( const instances = await instantiateFromConfig(

View File

@ -1,7 +1,6 @@
import type { Server } from 'http'; import type { Server } from 'http';
import fetch from 'cross-fetch'; import fetch from 'cross-fetch';
import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory';
import { joinFilePath } from '../../src/util/PathUtil';
import { readableToString } from '../../src/util/StreamUtil'; import { readableToString } from '../../src/util/StreamUtil';
import { instantiateFromConfig } from './Config'; 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:ServerFactory', 'server-without-auth.json', {
'urn:solid-server:default:variable:port': port, 'urn:solid-server:default:variable:port': port,
'urn:solid-server:default:variable:baseUrl': baseUrl, 'urn:solid-server:default:variable:baseUrl': baseUrl,
'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../assets/templates'),
}, },
) as HttpServerFactory; ) as HttpServerFactory;
server = factory.startServer(port); server = factory.startServer(port);

View File

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

View File

@ -3,7 +3,6 @@ import fetch from 'cross-fetch';
import type { Initializer } from '../../src/init/Initializer'; import type { Initializer } from '../../src/init/Initializer';
import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory';
import type { ResourceStore } from '../../src/storage/ResourceStore'; import type { ResourceStore } from '../../src/storage/ResourceStore';
import { joinFilePath } from '../../src/util/PathUtil';
import { getTestFolder, instantiateFromConfig, removeFolder } from './Config'; import { getTestFolder, instantiateFromConfig, removeFolder } from './Config';
const port = 6005; 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:baseUrl': baseUrl,
'urn:solid-server:default:variable:port': port, 'urn:solid-server:default:variable:port': port,
'urn:solid-server:default:variable:rootFilePath': rootFilePath, 'urn:solid-server:default:variable:rootFilePath': rootFilePath,
'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../assets/templates'),
}; };
const internalStore = await instantiateFromConfig( const internalStore = await instantiateFromConfig(
storeUrn, 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:ServerFactory', 'server-without-auth.json', {
'urn:solid-server:default:variable:port': port, 'urn:solid-server:default:variable:port': port,
'urn:solid-server:default:variable:baseUrl': 'https://example.pod/', 'urn:solid-server:default:variable:baseUrl': 'https://example.pod/',
'urn:solid-server:default:variable:podTemplateFolder': 'templates/pod',
}, },
) as HttpServerFactory; ) as HttpServerFactory;
server = factory.startServer(port); server = factory.startServer(port);

View File

@ -76,6 +76,10 @@
"BaseUrlRouterRule:_baseStore": { "BaseUrlRouterRule:_baseStore": {
"@id": "urn:solid-server:default:MemoryResourceStore" "@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:variable:store"
} }
}, },
{
"@id": "urn:solid-server:default:ResourcesGenerator",
"TemplatedResourcesGenerator:_templateFolder": "$PACKAGE_ROOT/test/assets/templates"
},
{ {
"@id": "urn:solid-server:default:variable:store", "@id": "urn:solid-server:default:variable:store",
"@type": "Variable" "@type": "Variable"

View File

@ -48,6 +48,10 @@
"PassthroughStore:_source": { "PassthroughStore:_source": {
"@id": "urn:solid-server:default:MemoryResourceStore" "@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:rootFilePath': '/var/cwd/',
'urn:solid-server:default:variable:sparqlEndpoint': undefined, 'urn:solid-server:default:variable:sparqlEndpoint': undefined,
'urn:solid-server:default:variable:loggingLevel': 'info', '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', 'urn:solid-server:default:variable:podConfigJson': '/var/cwd/pod-config.json',
}, },
}, },
@ -80,7 +79,6 @@ describe('CliRunner', (): void => {
'-m', 'module/path', '-m', 'module/path',
'-p', '4000', '-p', '4000',
'-s', 'http://localhost:5000/sparql', '-s', 'http://localhost:5000/sparql',
'-t', 'templates',
'--podConfigJson', '/different-path.json', '--podConfigJson', '/different-path.json',
], ],
}); });
@ -104,7 +102,6 @@ describe('CliRunner', (): void => {
variables: { variables: {
'urn:solid-server:default:variable:baseUrl': 'http://pod.example/', 'urn:solid-server:default:variable:baseUrl': 'http://pod.example/',
'urn:solid-server:default:variable:loggingLevel': 'debug', '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:port': 4000,
'urn:solid-server:default:variable:rootFilePath': '/root', 'urn:solid-server:default:variable:rootFilePath': '/root',
'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:5000/sparql', 'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:5000/sparql',
@ -122,7 +119,6 @@ describe('CliRunner', (): void => {
'--config', 'myconfig.json', '--config', 'myconfig.json',
'--loggingLevel', 'debug', '--loggingLevel', 'debug',
'--mainModulePath', 'module/path', '--mainModulePath', 'module/path',
'--podTemplateFolder', 'templates',
'--port', '4000', '--port', '4000',
'--rootFilePath', 'root', '--rootFilePath', 'root',
'--sparqlEndpoint', 'http://localhost:5000/sparql', '--sparqlEndpoint', 'http://localhost:5000/sparql',
@ -149,7 +145,6 @@ describe('CliRunner', (): void => {
variables: { variables: {
'urn:solid-server:default:variable:baseUrl': 'http://pod.example/', 'urn:solid-server:default:variable:baseUrl': 'http://pod.example/',
'urn:solid-server:default:variable:loggingLevel': 'debug', '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:port': 4000,
'urn:solid-server:default:variable:rootFilePath': '/var/cwd/root', 'urn:solid-server:default:variable:rootFilePath': '/var/cwd/root',
'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:5000/sparql', 'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:5000/sparql',
@ -170,7 +165,6 @@ describe('CliRunner', (): void => {
'-m', 'module/path', '-m', 'module/path',
'-p', '4000', '-p', '4000',
'-s', 'http://localhost:5000/sparql', '-s', 'http://localhost:5000/sparql',
'-t', 'templates',
'--podConfigJson', '/different-path.json', '--podConfigJson', '/different-path.json',
]; ];
@ -195,7 +189,6 @@ describe('CliRunner', (): void => {
variables: { variables: {
'urn:solid-server:default:variable:baseUrl': 'http://pod.example/', 'urn:solid-server:default:variable:baseUrl': 'http://pod.example/',
'urn:solid-server:default:variable:loggingLevel': 'debug', '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:port': 4000,
'urn:solid-server:default:variable:rootFilePath': '/root', 'urn:solid-server:default:variable:rootFilePath': '/root',
'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:5000/sparql', '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 => { describe('A TemplatedResourcesGenerator', (): void => {
const rootFilePath = 'templates/pod'; const rootFilePath = '/templates/pod';
// Using handlebars engine since it's smaller than any possible dummy // Using handlebars engine since it's smaller than any possible dummy
const generator = new TemplatedResourcesGenerator(rootFilePath, new DummyFactory(), new HandlebarsTemplateEngine()); const generator = new TemplatedResourcesGenerator(rootFilePath, new DummyFactory(), new HandlebarsTemplateEngine());
let cache: { data: any }; let cache: { data: any };