@undefineds.co/xpod 0.3.23 → 0.3.25

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.
@@ -56,6 +56,7 @@ function pathNeedsEscapedFileUrl(filePath) {
56
56
  function createCssChildRuntimeConfig(options) {
57
57
  node_fs_1.default.mkdirSync(options.runtimeRoot, { recursive: true });
58
58
  const runtimeConfigPath = node_path_1.default.join(options.runtimeRoot, 'css-child-runtime.config.json');
59
+ const configImportPath = rewriteConfigForFileUrlImportsIfNeeded(node_path_1.default.resolve(options.configPath), node_path_1.default.join(options.runtimeRoot, 'config'));
59
60
  node_fs_1.default.writeFileSync(runtimeConfigPath, JSON.stringify({
60
61
  '@context': [
61
62
  'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld',
@@ -63,7 +64,7 @@ function createCssChildRuntimeConfig(options) {
63
64
  'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld',
64
65
  ],
65
66
  import: [
66
- toImportSpecifier(runtimeConfigPath, options.configPath),
67
+ toImportSpecifier(runtimeConfigPath, configImportPath),
67
68
  ],
68
69
  '@graph': [],
69
70
  }, null, 2), 'utf-8');
@@ -81,6 +82,41 @@ function createCssChildRuntimeConfig(options) {
81
82
  cwd: options.externalOidcIssuer ? options.runtimeRoot : undefined,
82
83
  };
83
84
  }
85
+ function rewriteConfigForFileUrlImportsIfNeeded(configPath, outputDir, rewritten = new Map()) {
86
+ if (!pathNeedsEscapedFileUrl(configPath)) {
87
+ return configPath;
88
+ }
89
+ const existing = rewritten.get(configPath);
90
+ if (existing) {
91
+ return existing;
92
+ }
93
+ node_fs_1.default.mkdirSync(outputDir, { recursive: true });
94
+ const outputPath = node_path_1.default.join(outputDir, node_path_1.default.basename(configPath));
95
+ rewritten.set(configPath, outputPath);
96
+ const parsed = JSON.parse(node_fs_1.default.readFileSync(configPath, 'utf-8'));
97
+ parsed.import = rewriteConfigImports(configPath, parsed.import, outputDir, rewritten);
98
+ node_fs_1.default.writeFileSync(outputPath, `${JSON.stringify(parsed, null, 2)}\n`, 'utf-8');
99
+ return outputPath;
100
+ }
101
+ function rewriteConfigImports(sourceConfigPath, imports, outputDir, rewritten) {
102
+ if (typeof imports === 'string') {
103
+ return rewriteConfigImport(sourceConfigPath, imports, outputDir, rewritten);
104
+ }
105
+ if (Array.isArray(imports)) {
106
+ return imports.map((value) => typeof value === 'string'
107
+ ? rewriteConfigImport(sourceConfigPath, value, outputDir, rewritten)
108
+ : value);
109
+ }
110
+ return imports;
111
+ }
112
+ function rewriteConfigImport(sourceConfigPath, importValue, outputDir, rewritten) {
113
+ if (!importValue.startsWith('./') && !importValue.startsWith('../')) {
114
+ return importValue;
115
+ }
116
+ const targetPath = node_path_1.default.resolve(node_path_1.default.dirname(sourceConfigPath), importValue);
117
+ const rewrittenTargetPath = rewriteConfigForFileUrlImportsIfNeeded(targetPath, outputDir, rewritten);
118
+ return (0, node_url_1.pathToFileURL)(rewrittenTargetPath).href;
119
+ }
84
120
  function buildCssArgs(options) {
85
121
  return [
86
122
  options.cssBinary,
@@ -1 +1 @@
1
- {"version":3,"file":"css-process.js","sourceRoot":"","sources":["../../src/runtime/css-process.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { oidcTokenEndpoint } from './oidc-issuer';\n\n/**\n * Build the environment for the CSS child process.\n *\n * `oidcIssuer` is an xpod shorthand value, not a CSS CLI argument.\n * The legacy CSS child process path injects it through a generated\n * Components.js config instead of CSS_* env aliases.\n */\nexport function buildCssChildEnv(\n baseUrl: string,\n cssPort: number,\n oidcIssuer?: string,\n baseEnv: NodeJS.ProcessEnv = process.env,\n): Record<string, string> {\n const env: Record<string, string> = {\n ...baseEnv,\n CSS_PORT: cssPort.toString(),\n CSS_BASE_URL: baseUrl,\n } as Record<string, string>;\n\n for (const key of Object.keys(env)) {\n if (key === 'oidcIssuer' || isExternalOidcPollutionKey(key)) {\n delete env[key];\n }\n }\n\n return env;\n}\n\nfunction isExternalOidcPollutionKey(key: string): boolean {\n const normalized = key.toUpperCase().replace(/[^A-Z0-9]/g, '');\n return normalized.includes('OIDCISSUER') ||\n normalized.includes('IDPURL') ||\n normalized.includes('IDPJWKSURL') ||\n normalized.includes('IDENTITYPROVIDERURL') ||\n normalized.includes('IDENTITYPROVIDERJWKSURL');\n}\n\nfunction toImportSpecifier(fromFilePath: string, toFilePath: string): string {\n if (pathNeedsEscapedFileUrl(fromFilePath) || pathNeedsEscapedFileUrl(toFilePath)) {\n return pathToFileURL(toFilePath).href;\n }\n\n const fromDirectory = path.dirname(fromFilePath);\n const relativePath = path.relative(fromDirectory, toFilePath).replace(/\\\\/g, '/');\n if (relativePath.startsWith('./') || relativePath.startsWith('../')) {\n return relativePath;\n }\n return `./${relativePath}`;\n}\n\nfunction pathNeedsEscapedFileUrl(filePath: string): boolean {\n return /\\s/.test(filePath);\n}\n\nexport function createCssChildRuntimeConfig(options: {\n configPath: string\n runtimeRoot: string\n externalOidcIssuer?: string\n}): { configPath: string; cwd?: string } {\n fs.mkdirSync(options.runtimeRoot, { recursive: true });\n const runtimeConfigPath = path.join(options.runtimeRoot, 'css-child-runtime.config.json');\n fs.writeFileSync(runtimeConfigPath, JSON.stringify({\n '@context': [\n 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld',\n 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld',\n 'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld',\n ],\n import: [\n toImportSpecifier(runtimeConfigPath, options.configPath),\n ],\n '@graph': [],\n }, null, 2), 'utf-8');\n\n if (options.externalOidcIssuer) {\n fs.writeFileSync(path.join(options.runtimeRoot, 'package.json'), JSON.stringify({\n private: true,\n name: 'xpod-css-runtime',\n }, null, 2), 'utf-8');\n fs.writeFileSync(path.join(options.runtimeRoot, '.community-solid-server.config.json'), JSON.stringify({\n oidcIssuer: options.externalOidcIssuer,\n }, null, 2), 'utf-8');\n }\n\n return {\n configPath: runtimeConfigPath,\n cwd: options.externalOidcIssuer ? options.runtimeRoot : undefined,\n };\n}\n\nexport function buildCssArgs(options: {\n cssBinary: string\n configPath: string\n cssModuleRoot: string\n cssPort: number\n baseUrl: string\n externalOidcIssuer?: string\n}): string[] {\n return [\n options.cssBinary,\n '-c', options.configPath,\n '-m', options.cssModuleRoot,\n '-p', options.cssPort.toString(),\n '-b', options.baseUrl,\n ];\n}\n\nexport function buildApiChildEnv(options: {\n apiPort: number\n mainPort: number\n cssPort: number\n baseUrl: string\n externalOidcIssuer?: string\n baseEnv?: NodeJS.ProcessEnv\n}): Record<string, string> {\n return {\n ...(options.baseEnv ?? process.env),\n ...(options.externalOidcIssuer ? { oidcIssuer: options.externalOidcIssuer } : {}),\n API_PORT: options.apiPort.toString(),\n XPOD_MAIN_PORT: options.mainPort.toString(),\n CSS_INTERNAL_URL: `http://localhost:${options.cssPort}`,\n CSS_BASE_URL: options.baseUrl,\n CSS_TOKEN_ENDPOINT: options.externalOidcIssuer\n ? oidcTokenEndpoint(options.externalOidcIssuer)\n : `${options.baseUrl}.oidc/token`,\n } as Record<string, string>;\n}\n"]}
1
+ {"version":3,"file":"css-process.js","sourceRoot":"","sources":["../../src/runtime/css-process.ts"],"names":[],"mappings":";;;;;AAYA,4CAmBC;AA4BD,kEAqCC;AA6DD,oCAeC;AAED,4CAmBC;AAjMD,sDAAyB;AACzB,0DAA6B;AAC7B,uCAAyC;AACzC,+CAAkD;AAElD;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,OAAe,EACf,OAAe,EACf,UAAmB,EACnB,UAA6B,OAAO,CAAC,GAAG;IAExC,MAAM,GAAG,GAA2B;QAClC,GAAG,OAAO;QACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;QAC5B,YAAY,EAAE,OAAO;KACI,CAAC;IAE5B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,GAAG,KAAK,YAAY,IAAI,0BAA0B,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5D,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,0BAA0B,CAAC,GAAW;IAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACtC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC1C,UAAU,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,iBAAiB,CAAC,YAAoB,EAAE,UAAkB;IACjE,IAAI,uBAAuB,CAAC,YAAY,CAAC,IAAI,uBAAuB,CAAC,UAAU,CAAC,EAAE,CAAC;QACjF,OAAO,IAAA,wBAAa,EAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAED,MAAM,aAAa,GAAG,mBAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,mBAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClF,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,YAAY,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAgB,2BAA2B,CAAC,OAI3C;IACC,iBAAE,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,iBAAiB,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,+BAA+B,CAAC,CAAC;IAC1F,MAAM,gBAAgB,GAAG,sCAAsC,CAC7D,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAChC,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CACzC,CAAC;IACF,iBAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC;QACjD,UAAU,EAAE;YACV,6GAA6G;YAC7G,yGAAyG;YACzG,2GAA2G;SAC5G;QACD,MAAM,EAAE;YACN,iBAAiB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;SACvD;QACD,QAAQ,EAAE,EAAE;KACb,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEtB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC/B,iBAAE,CAAC,aAAa,CAAC,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAC9E,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,kBAAkB;SACzB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACtB,iBAAE,CAAC,aAAa,CAAC,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,qCAAqC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YACrG,UAAU,EAAE,OAAO,CAAC,kBAAkB;SACvC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,OAAO;QACL,UAAU,EAAE,iBAAiB;QAC7B,GAAG,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KAClE,CAAC;AACJ,CAAC;AAED,SAAS,sCAAsC,CAC7C,UAAkB,EAClB,SAAiB,EACjB,YAAY,IAAI,GAAG,EAAkB;IAErC,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iBAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAA4B,CAAC;IAC3F,MAAM,CAAC,MAAM,GAAG,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACtF,iBAAE,CAAC,aAAa,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE9E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,oBAAoB,CAC3B,gBAAwB,EACxB,OAAgB,EAChB,SAAiB,EACjB,SAA8B;IAE9B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,mBAAmB,CAAC,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ;YACrD,CAAC,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;YACpE,CAAC,CAAC,KAAK,CAAC,CAAC;IACb,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAC1B,gBAAwB,EACxB,WAAmB,EACnB,SAAiB,EACjB,SAA8B;IAE9B,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,UAAU,GAAG,mBAAI,CAAC,OAAO,CAAC,mBAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,WAAW,CAAC,CAAC;IAC7E,MAAM,mBAAmB,GAAG,sCAAsC,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACrG,OAAO,IAAA,wBAAa,EAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,SAAgB,YAAY,CAAC,OAO5B;IACC,OAAO;QACL,OAAO,CAAC,SAAS;QACjB,IAAI,EAAE,OAAO,CAAC,UAAU;QACxB,IAAI,EAAE,OAAO,CAAC,aAAa;QAC3B,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;QAChC,IAAI,EAAE,OAAO,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAOhC;IACC,OAAO;QACL,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC;QACnC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;QACpC,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE;QAC3C,gBAAgB,EAAE,oBAAoB,OAAO,CAAC,OAAO,EAAE;QACvD,YAAY,EAAE,OAAO,CAAC,OAAO;QAC7B,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC5C,CAAC,CAAC,IAAA,+BAAiB,EAAC,OAAO,CAAC,kBAAkB,CAAC;YAC/C,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,aAAa;KACV,CAAC;AAC9B,CAAC","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { oidcTokenEndpoint } from './oidc-issuer';\n\n/**\n * Build the environment for the CSS child process.\n *\n * `oidcIssuer` is an xpod shorthand value, not a CSS CLI argument.\n * The legacy CSS child process path injects it through a generated\n * Components.js config instead of CSS_* env aliases.\n */\nexport function buildCssChildEnv(\n baseUrl: string,\n cssPort: number,\n oidcIssuer?: string,\n baseEnv: NodeJS.ProcessEnv = process.env,\n): Record<string, string> {\n const env: Record<string, string> = {\n ...baseEnv,\n CSS_PORT: cssPort.toString(),\n CSS_BASE_URL: baseUrl,\n } as Record<string, string>;\n\n for (const key of Object.keys(env)) {\n if (key === 'oidcIssuer' || isExternalOidcPollutionKey(key)) {\n delete env[key];\n }\n }\n\n return env;\n}\n\nfunction isExternalOidcPollutionKey(key: string): boolean {\n const normalized = key.toUpperCase().replace(/[^A-Z0-9]/g, '');\n return normalized.includes('OIDCISSUER') ||\n normalized.includes('IDPURL') ||\n normalized.includes('IDPJWKSURL') ||\n normalized.includes('IDENTITYPROVIDERURL') ||\n normalized.includes('IDENTITYPROVIDERJWKSURL');\n}\n\nfunction toImportSpecifier(fromFilePath: string, toFilePath: string): string {\n if (pathNeedsEscapedFileUrl(fromFilePath) || pathNeedsEscapedFileUrl(toFilePath)) {\n return pathToFileURL(toFilePath).href;\n }\n\n const fromDirectory = path.dirname(fromFilePath);\n const relativePath = path.relative(fromDirectory, toFilePath).replace(/\\\\/g, '/');\n if (relativePath.startsWith('./') || relativePath.startsWith('../')) {\n return relativePath;\n }\n return `./${relativePath}`;\n}\n\nfunction pathNeedsEscapedFileUrl(filePath: string): boolean {\n return /\\s/.test(filePath);\n}\n\nexport function createCssChildRuntimeConfig(options: {\n configPath: string\n runtimeRoot: string\n externalOidcIssuer?: string\n}): { configPath: string; cwd?: string } {\n fs.mkdirSync(options.runtimeRoot, { recursive: true });\n const runtimeConfigPath = path.join(options.runtimeRoot, 'css-child-runtime.config.json');\n const configImportPath = rewriteConfigForFileUrlImportsIfNeeded(\n path.resolve(options.configPath),\n path.join(options.runtimeRoot, 'config'),\n );\n fs.writeFileSync(runtimeConfigPath, JSON.stringify({\n '@context': [\n 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld',\n 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld',\n 'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld',\n ],\n import: [\n toImportSpecifier(runtimeConfigPath, configImportPath),\n ],\n '@graph': [],\n }, null, 2), 'utf-8');\n\n if (options.externalOidcIssuer) {\n fs.writeFileSync(path.join(options.runtimeRoot, 'package.json'), JSON.stringify({\n private: true,\n name: 'xpod-css-runtime',\n }, null, 2), 'utf-8');\n fs.writeFileSync(path.join(options.runtimeRoot, '.community-solid-server.config.json'), JSON.stringify({\n oidcIssuer: options.externalOidcIssuer,\n }, null, 2), 'utf-8');\n }\n\n return {\n configPath: runtimeConfigPath,\n cwd: options.externalOidcIssuer ? options.runtimeRoot : undefined,\n };\n}\n\nfunction rewriteConfigForFileUrlImportsIfNeeded(\n configPath: string,\n outputDir: string,\n rewritten = new Map<string, string>(),\n): string {\n if (!pathNeedsEscapedFileUrl(configPath)) {\n return configPath;\n }\n\n const existing = rewritten.get(configPath);\n if (existing) {\n return existing;\n }\n\n fs.mkdirSync(outputDir, { recursive: true });\n const outputPath = path.join(outputDir, path.basename(configPath));\n rewritten.set(configPath, outputPath);\n\n const parsed = JSON.parse(fs.readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n parsed.import = rewriteConfigImports(configPath, parsed.import, outputDir, rewritten);\n fs.writeFileSync(outputPath, `${JSON.stringify(parsed, null, 2)}\\n`, 'utf-8');\n\n return outputPath;\n}\n\nfunction rewriteConfigImports(\n sourceConfigPath: string,\n imports: unknown,\n outputDir: string,\n rewritten: Map<string, string>,\n): unknown {\n if (typeof imports === 'string') {\n return rewriteConfigImport(sourceConfigPath, imports, outputDir, rewritten);\n }\n\n if (Array.isArray(imports)) {\n return imports.map((value) => typeof value === 'string'\n ? rewriteConfigImport(sourceConfigPath, value, outputDir, rewritten)\n : value);\n }\n\n return imports;\n}\n\nfunction rewriteConfigImport(\n sourceConfigPath: string,\n importValue: string,\n outputDir: string,\n rewritten: Map<string, string>,\n): string {\n if (!importValue.startsWith('./') && !importValue.startsWith('../')) {\n return importValue;\n }\n\n const targetPath = path.resolve(path.dirname(sourceConfigPath), importValue);\n const rewrittenTargetPath = rewriteConfigForFileUrlImportsIfNeeded(targetPath, outputDir, rewritten);\n return pathToFileURL(rewrittenTargetPath).href;\n}\n\nexport function buildCssArgs(options: {\n cssBinary: string\n configPath: string\n cssModuleRoot: string\n cssPort: number\n baseUrl: string\n externalOidcIssuer?: string\n}): string[] {\n return [\n options.cssBinary,\n '-c', options.configPath,\n '-m', options.cssModuleRoot,\n '-p', options.cssPort.toString(),\n '-b', options.baseUrl,\n ];\n}\n\nexport function buildApiChildEnv(options: {\n apiPort: number\n mainPort: number\n cssPort: number\n baseUrl: string\n externalOidcIssuer?: string\n baseEnv?: NodeJS.ProcessEnv\n}): Record<string, string> {\n return {\n ...(options.baseEnv ?? process.env),\n ...(options.externalOidcIssuer ? { oidcIssuer: options.externalOidcIssuer } : {}),\n API_PORT: options.apiPort.toString(),\n XPOD_MAIN_PORT: options.mainPort.toString(),\n CSS_INTERNAL_URL: `http://localhost:${options.cssPort}`,\n CSS_BASE_URL: options.baseUrl,\n CSS_TOKEN_ENDPOINT: options.externalOidcIssuer\n ? oidcTokenEndpoint(options.externalOidcIssuer)\n : `${options.baseUrl}.oidc/token`,\n } as Record<string, string>;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@undefineds.co/xpod",
3
- "version": "0.3.23",
3
+ "version": "0.3.25",
4
4
  "description": "Xpod is an extended Community Solid Server, offering rich-feature, production-level Solid Pod and identity management.",
5
5
  "repository": "https://github.com/undefinedsco/xpod",
6
6
  "author": "developer@undefineds.co",