diff --git a/README.md b/README.md index 10c32b89f..ea2cc3567 100644 --- a/README.md +++ b/README.md @@ -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. | diff --git a/config/presets/cli-params.json b/config/presets/cli-params.json index 7039e891b..689ec3726 100644 --- a/config/presets/cli-params.json +++ b/config/presets/cli-params.json @@ -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", diff --git a/config/presets/pod-dynamic.json b/config/presets/pod-dynamic.json index 5153d9b24..5fbd3b909 100644 --- a/config/presets/pod-dynamic.json +++ b/config/presets/pod-dynamic.json @@ -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" }, diff --git a/config/presets/pod-management.json b/config/presets/pod-management.json index 83b72b42a..769c90966 100644 --- a/config/presets/pod-management.json +++ b/config/presets/pod-management.json @@ -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" }, diff --git a/src/init/CliRunner.ts b/src/init/CliRunner.ts index 4f504aafa..dc0599288 100644 --- a/src/init/CliRunner.ts +++ b/src/init/CliRunner.ts @@ -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), }; diff --git a/src/pods/generate/TemplatedResourcesGenerator.ts b/src/pods/generate/TemplatedResourcesGenerator.ts index 9237679ad..446b44321 100644 --- a/src/pods/generate/TemplatedResourcesGenerator.ts +++ b/src/pods/generate/TemplatedResourcesGenerator.ts @@ -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; } diff --git a/test/integration/DynamicPods.test.ts b/test/integration/DynamicPods.test.ts index 361786f99..b8edc408e 100644 --- a/test/integration/DynamicPods.test.ts +++ b/test/integration/DynamicPods.test.ts @@ -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( diff --git a/test/integration/PodCreation.test.ts b/test/integration/PodCreation.test.ts index 281bf4e8c..6aba97e74 100644 --- a/test/integration/PodCreation.test.ts +++ b/test/integration/PodCreation.test.ts @@ -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); diff --git a/test/integration/ServerFetch.test.ts b/test/integration/ServerFetch.test.ts index 3daa07b0a..452fd3ffd 100644 --- a/test/integration/ServerFetch.test.ts +++ b/test/integration/ServerFetch.test.ts @@ -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; ({ factory, initializer } = instances); diff --git a/test/integration/Subdomains.test.ts b/test/integration/Subdomains.test.ts index 06dd88b4e..28469faca 100644 --- a/test/integration/Subdomains.test.ts +++ b/test/integration/Subdomains.test.ts @@ -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, diff --git a/test/integration/WebSocketsProtocol.test.ts b/test/integration/WebSocketsProtocol.test.ts index 51307b219..504f59fed 100644 --- a/test/integration/WebSocketsProtocol.test.ts +++ b/test/integration/WebSocketsProtocol.test.ts @@ -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); diff --git a/test/integration/config/server-dynamic-unsafe.json b/test/integration/config/server-dynamic-unsafe.json index dbfe40f21..f754d41bb 100644 --- a/test/integration/config/server-dynamic-unsafe.json +++ b/test/integration/config/server-dynamic-unsafe.json @@ -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" } ] } diff --git a/test/integration/config/server-subdomains-unsafe.json b/test/integration/config/server-subdomains-unsafe.json index 3c41c74dc..16bb74433 100644 --- a/test/integration/config/server-subdomains-unsafe.json +++ b/test/integration/config/server-subdomains-unsafe.json @@ -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" diff --git a/test/integration/config/server-without-auth.json b/test/integration/config/server-without-auth.json index abcffb8a5..60e8f5912 100644 --- a/test/integration/config/server-without-auth.json +++ b/test/integration/config/server-without-auth.json @@ -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" } ] } diff --git a/test/unit/init/CliRunner.test.ts b/test/unit/init/CliRunner.test.ts index 8c057e395..bbb57145a 100644 --- a/test/unit/init/CliRunner.test.ts +++ b/test/unit/init/CliRunner.test.ts @@ -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', diff --git a/test/unit/pods/generate/TemplatedResourcesGenerator.test.ts b/test/unit/pods/generate/TemplatedResourcesGenerator.test.ts index 7b4c92bab..490feb10b 100644 --- a/test/unit/pods/generate/TemplatedResourcesGenerator.test.ts +++ b/test/unit/pods/generate/TemplatedResourcesGenerator.test.ts @@ -38,7 +38,7 @@ async function genToArray(iterable: AsyncIterable): Promise { } 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 };