@qpqjs/user-script 0.3.0 → 0.5.0

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.
Files changed (83) hide show
  1. package/lib/commonjs/actionProcessor/getUserScriptBuildActionProcessor.js +6 -10
  2. package/lib/commonjs/actionProcessor/getUserScriptBuildActionProcessor.js.map +1 -1
  3. package/lib/commonjs/actionProcessor/getUserScriptBuildFromZipActionProcessor.js +7 -14
  4. package/lib/commonjs/actionProcessor/getUserScriptBuildFromZipActionProcessor.js.map +1 -1
  5. package/lib/commonjs/actionProcessor/getUserScriptBuilderActionProcessor.d.ts +3 -0
  6. package/lib/commonjs/actionProcessor/{getUserScriptBuildActionProcessors.js → getUserScriptBuilderActionProcessor.js} +5 -5
  7. package/lib/commonjs/actionProcessor/getUserScriptBuilderActionProcessor.js.map +1 -0
  8. package/lib/commonjs/actionProcessor/index.d.ts +1 -1
  9. package/lib/commonjs/actionProcessor/index.js +1 -1
  10. package/lib/commonjs/actionProcessor/index.js.map +1 -1
  11. package/lib/commonjs/actionProcessor/logic/askUserScriptCheckPublishedOutput.js +2 -2
  12. package/lib/commonjs/actionProcessor/logic/askUserScriptCheckPublishedOutput.js.map +1 -1
  13. package/lib/commonjs/actionProcessor/logic/extractUserScriptZip.js +5 -3
  14. package/lib/commonjs/actionProcessor/logic/extractUserScriptZip.js.map +1 -1
  15. package/lib/commonjs/actionProcessor/logic/isUserScriptArchiveError.d.ts +3 -0
  16. package/lib/commonjs/actionProcessor/logic/isUserScriptArchiveError.js +7 -0
  17. package/lib/commonjs/actionProcessor/logic/isUserScriptArchiveError.js.map +1 -0
  18. package/lib/commonjs/build/isUserScriptBuildError.d.ts +3 -0
  19. package/lib/commonjs/build/isUserScriptBuildError.js +7 -0
  20. package/lib/commonjs/build/isUserScriptBuildError.js.map +1 -0
  21. package/lib/commonjs/build/loadRspackModule.js +1 -0
  22. package/lib/commonjs/build/loadRspackModule.js.map +1 -1
  23. package/lib/commonjs/config/defineUserScriptBuilder.js +2 -2
  24. package/lib/commonjs/config/defineUserScriptBuilder.js.map +1 -1
  25. package/lib/esm/actionProcessor/getUserScriptBuildActionProcessor.js +7 -11
  26. package/lib/esm/actionProcessor/getUserScriptBuildActionProcessor.js.map +1 -1
  27. package/lib/esm/actionProcessor/getUserScriptBuildFromZipActionProcessor.js +8 -15
  28. package/lib/esm/actionProcessor/getUserScriptBuildFromZipActionProcessor.js.map +1 -1
  29. package/lib/esm/actionProcessor/getUserScriptBuilderActionProcessor.d.ts +3 -0
  30. package/lib/esm/actionProcessor/{getUserScriptBuildActionProcessors.js → getUserScriptBuilderActionProcessor.js} +3 -3
  31. package/lib/esm/actionProcessor/getUserScriptBuilderActionProcessor.js.map +1 -0
  32. package/lib/esm/actionProcessor/index.d.ts +1 -1
  33. package/lib/esm/actionProcessor/index.js +1 -1
  34. package/lib/esm/actionProcessor/index.js.map +1 -1
  35. package/lib/esm/actionProcessor/logic/askUserScriptCheckPublishedOutput.js +2 -2
  36. package/lib/esm/actionProcessor/logic/askUserScriptCheckPublishedOutput.js.map +1 -1
  37. package/lib/esm/actionProcessor/logic/extractUserScriptZip.js +5 -3
  38. package/lib/esm/actionProcessor/logic/extractUserScriptZip.js.map +1 -1
  39. package/lib/esm/actionProcessor/logic/isUserScriptArchiveError.d.ts +3 -0
  40. package/lib/esm/actionProcessor/logic/isUserScriptArchiveError.js +3 -0
  41. package/lib/esm/actionProcessor/logic/isUserScriptArchiveError.js.map +1 -0
  42. package/lib/esm/build/isUserScriptBuildError.d.ts +3 -0
  43. package/lib/esm/build/isUserScriptBuildError.js +3 -0
  44. package/lib/esm/build/isUserScriptBuildError.js.map +1 -0
  45. package/lib/esm/build/loadRspackModule.js +1 -0
  46. package/lib/esm/build/loadRspackModule.js.map +1 -1
  47. package/lib/esm/config/defineUserScriptBuilder.js +2 -2
  48. package/lib/esm/config/defineUserScriptBuilder.js.map +1 -1
  49. package/package.json +24 -9
  50. package/lib/commonjs/actionProcessor/getUserScriptBuildActionProcessors.d.ts +0 -3
  51. package/lib/commonjs/actionProcessor/getUserScriptBuildActionProcessors.js.map +0 -1
  52. package/lib/commonjs/build/__fixtures__/basic/src/helpers/formatSum.d.ts +0 -1
  53. package/lib/commonjs/build/__fixtures__/basic/src/helpers/formatSum.js +0 -6
  54. package/lib/commonjs/build/__fixtures__/basic/src/helpers/formatSum.js.map +0 -1
  55. package/lib/commonjs/build/__fixtures__/basic/src/main.d.ts +0 -4
  56. package/lib/commonjs/build/__fixtures__/basic/src/main.js +0 -17
  57. package/lib/commonjs/build/__fixtures__/basic/src/main.js.map +0 -1
  58. package/lib/commonjs/build/__fixtures__/builtin/src/main.d.ts +0 -1
  59. package/lib/commonjs/build/__fixtures__/builtin/src/main.js +0 -7
  60. package/lib/commonjs/build/__fixtures__/builtin/src/main.js.map +0 -1
  61. package/lib/commonjs/build/__fixtures__/noEntry/src/notMain.d.ts +0 -1
  62. package/lib/commonjs/build/__fixtures__/noEntry/src/notMain.js +0 -6
  63. package/lib/commonjs/build/__fixtures__/noEntry/src/notMain.js.map +0 -1
  64. package/lib/commonjs/build/__fixtures__/nonFunction/src/main.d.ts +0 -2
  65. package/lib/commonjs/build/__fixtures__/nonFunction/src/main.js +0 -7
  66. package/lib/commonjs/build/__fixtures__/nonFunction/src/main.js.map +0 -1
  67. package/lib/esm/actionProcessor/getUserScriptBuildActionProcessors.d.ts +0 -3
  68. package/lib/esm/actionProcessor/getUserScriptBuildActionProcessors.js.map +0 -1
  69. package/lib/esm/build/__fixtures__/basic/src/helpers/formatSum.d.ts +0 -1
  70. package/lib/esm/build/__fixtures__/basic/src/helpers/formatSum.js +0 -2
  71. package/lib/esm/build/__fixtures__/basic/src/helpers/formatSum.js.map +0 -1
  72. package/lib/esm/build/__fixtures__/basic/src/main.d.ts +0 -4
  73. package/lib/esm/build/__fixtures__/basic/src/main.js +0 -11
  74. package/lib/esm/build/__fixtures__/basic/src/main.js.map +0 -1
  75. package/lib/esm/build/__fixtures__/builtin/src/main.d.ts +0 -1
  76. package/lib/esm/build/__fixtures__/builtin/src/main.js +0 -3
  77. package/lib/esm/build/__fixtures__/builtin/src/main.js.map +0 -1
  78. package/lib/esm/build/__fixtures__/noEntry/src/notMain.d.ts +0 -1
  79. package/lib/esm/build/__fixtures__/noEntry/src/notMain.js +0 -2
  80. package/lib/esm/build/__fixtures__/noEntry/src/notMain.js.map +0 -1
  81. package/lib/esm/build/__fixtures__/nonFunction/src/main.d.ts +0 -2
  82. package/lib/esm/build/__fixtures__/nonFunction/src/main.js +0 -3
  83. package/lib/esm/build/__fixtures__/nonFunction/src/main.js.map +0 -1
@@ -12,8 +12,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getUserScriptBuildActionProcessor = void 0;
13
13
  const actionprocessor_node_1 = require("@qpqjs/actionprocessor-node");
14
14
  const core_1 = require("@qpqjs/core");
15
- const crypto_1 = require("crypto");
16
- const UserScriptBuildError_1 = require("../build/UserScriptBuildError");
17
15
  const askUserScriptCheckPublishedOutput_1 = require("./logic/askUserScriptCheckPublishedOutput");
18
16
  const askUserScriptCollectSource_1 = require("./logic/askUserScriptCollectSource");
19
17
  const askUserScriptPublishOutput_1 = require("./logic/askUserScriptPublishOutput");
@@ -21,7 +19,6 @@ const buildUserScriptInTempDir_1 = require("./logic/buildUserScriptInTempDir");
21
19
  const getUserScriptBuildErrorType_1 = require("./logic/getUserScriptBuildErrorType");
22
20
  const materialiseUserScriptSource_1 = require("./logic/materialiseUserScriptSource");
23
21
  const { errorType } = core_1.askUserScriptBuild;
24
- const getDateNow = () => new Date().toISOString();
25
22
  // Drive failures while collecting the source, re-labelled into this action's catalog; any
26
23
  // other failure passes through with its own type.
27
24
  const COLLECT_ERROR_TYPES = {
@@ -33,7 +30,7 @@ const COLLECT_ERROR_TYPES = {
33
30
  const getProcessBuild = (qpqConfig) => {
34
31
  return (payload, session, actionProcessors, logger, updateSession, dynamicModuleLoader, streamRegistry) => __awaiter(void 0, void 0, void 0, function* () {
35
32
  var _a;
36
- const resolveStory = (0, core_1.createNestedRuntime)(qpqConfig, session, actionProcessors, getDateNow, logger, crypto_1.randomUUID, core_1.QpqRuntimeType.EXECUTE_STORY, dynamicModuleLoader, undefined, [], streamRegistry);
33
+ const resolveStory = (0, core_1.createNestedRuntime)(qpqConfig, session, actionProcessors, core_1.getDateNow, logger, core_1.generateUuid, core_1.QpqRuntimeType.EXECUTE_STORY, dynamicModuleLoader, undefined, [], streamRegistry);
37
34
  // The source and the output both travel through the file actions, so each runtime's
38
35
  // own drive implementation serves them; only the build itself touches local disk.
39
36
  const collected = yield resolveStory(() => (0, askUserScriptCollectSource_1.askUserScriptCollectSource)(payload.drive, payload.sourceDirectory, payload.scope), []);
@@ -48,19 +45,18 @@ const getProcessBuild = (qpqConfig) => {
48
45
  built = yield (0, buildUserScriptInTempDir_1.buildUserScriptInTempDir)((projectDir) => (0, materialiseUserScriptSource_1.materialiseUserScriptSource)(projectDir, collected.result), payload.sourceMap, hostModules);
49
46
  }
50
47
  catch (error) {
51
- if (error instanceof UserScriptBuildError_1.UserScriptBuildError) {
52
- return (0, core_1.actionResultError)((0, getUserScriptBuildErrorType_1.getUserScriptBuildErrorType)(error.code, errorType), error.message);
53
- }
54
- throw error;
48
+ return (0, core_1.actionResultErrorFromCaughtError)(error, {
49
+ UserScriptBuildError: (error) => (0, core_1.actionResultError)((0, getUserScriptBuildErrorType_1.getUserScriptBuildErrorType)(error.code, errorType), error.message),
50
+ });
55
51
  }
56
52
  const published = yield resolveStory(() => (0, askUserScriptPublishOutput_1.askUserScriptPublishOutput)(payload.drive, payload.outputFilepath, built.script, payload.scope), []);
57
53
  if (published.error) {
58
- return (0, core_1.actionResultError)(published.error.errorType, published.error.errorText);
54
+ return (0, core_1.storyResultToActionResult)(published, 'UserScript Build publish');
59
55
  }
60
56
  // The output contract is judged where the script's top-level code cannot reach the host.
61
57
  const checked = yield resolveStory(() => (0, askUserScriptCheckPublishedOutput_1.askUserScriptCheckPublishedOutput)(payload.drive, payload.outputFilepath, payload.scope, errorType), []);
62
58
  if (checked.error) {
63
- return (0, core_1.actionResultError)(checked.error.errorType, checked.error.errorText);
59
+ return (0, core_1.storyResultToActionResult)(checked, 'UserScript Build check output');
64
60
  }
65
61
  return (0, core_1.actionResult)({ exports: checked.result });
66
62
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getUserScriptBuildActionProcessor.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuildActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadUserScriptHostModules } from '@qpqjs/actionprocessor-node';\nimport {\n ActionProcessorList,\n actionResult,\n actionResultError,\n askFileListDirectory,\n askFileReadTextContents,\n askUserScriptBuild,\n createActionProcessor,\n createNestedRuntime,\n DynamicModuleLoader,\n ProcessorFor,\n QPQConfig,\n QpqLogger,\n QpqRuntimeType,\n StorySession,\n StorySessionUpdater,\n StreamRegistry,\n UserScriptBuildActionPayload,\n} from '@qpqjs/core';\n\nimport { randomUUID } from 'crypto';\n\nimport { UserScriptBuildError } from '../build/UserScriptBuildError';\nimport { askUserScriptCheckPublishedOutput } from './logic/askUserScriptCheckPublishedOutput';\nimport { askUserScriptCollectSource } from './logic/askUserScriptCollectSource';\nimport { askUserScriptPublishOutput } from './logic/askUserScriptPublishOutput';\nimport { buildUserScriptInTempDir } from './logic/buildUserScriptInTempDir';\nimport { BuiltUserScript } from './logic/BuiltUserScript';\nimport { getUserScriptBuildErrorType } from './logic/getUserScriptBuildErrorType';\nimport { materialiseUserScriptSource } from './logic/materialiseUserScriptSource';\n\nconst { errorType } = askUserScriptBuild;\n\nconst getDateNow = () => new Date().toISOString();\n\n// Drive failures while collecting the source, re-labelled into this action's catalog; any\n// other failure passes through with its own type.\nconst COLLECT_ERROR_TYPES: Record<string, string> = {\n [askFileListDirectory.errorType.DirectoryNotFound]: errorType.SourceNotFound,\n [askFileListDirectory.errorType.DriveNotFound]: errorType.DriveNotFound,\n [askFileListDirectory.errorType.InvalidScope]: errorType.InvalidScope,\n [askFileReadTextContents.errorType.InvalidScope]: errorType.InvalidScope,\n};\n\nconst getProcessBuild = (qpqConfig: QPQConfig): ProcessorFor<typeof askUserScriptBuild> => {\n return async (\n payload: UserScriptBuildActionPayload,\n session: StorySession,\n actionProcessors: ActionProcessorList,\n logger: QpqLogger,\n updateSession: StorySessionUpdater,\n dynamicModuleLoader: DynamicModuleLoader,\n streamRegistry: StreamRegistry,\n ) => {\n const resolveStory = createNestedRuntime(\n qpqConfig,\n session,\n actionProcessors,\n getDateNow,\n logger,\n randomUUID,\n QpqRuntimeType.EXECUTE_STORY,\n dynamicModuleLoader,\n undefined,\n [],\n streamRegistry,\n );\n\n // The source and the output both travel through the file actions, so each runtime's\n // own drive implementation serves them; only the build itself touches local disk.\n const collected = await resolveStory(() => askUserScriptCollectSource(payload.drive, payload.sourceDirectory, payload.scope), []);\n if (collected.error) {\n return actionResultError(COLLECT_ERROR_TYPES[collected.error.errorType] ?? collected.error.errorType, collected.error.errorText);\n }\n\n // The service's own script modules, which the bundler keeps external. One that does not\n // load is the service's fault, so it throws rather than failing the build.\n const hostModules = await loadUserScriptHostModules(qpqConfig, dynamicModuleLoader);\n\n let built: BuiltUserScript;\n try {\n built = await buildUserScriptInTempDir(\n (projectDir) => materialiseUserScriptSource(projectDir, collected.result),\n payload.sourceMap,\n hostModules,\n );\n } catch (error) {\n if (error instanceof UserScriptBuildError) {\n return actionResultError(getUserScriptBuildErrorType(error.code, errorType), error.message);\n }\n throw error;\n }\n\n const published = await resolveStory(() => askUserScriptPublishOutput(payload.drive, payload.outputFilepath, built.script, payload.scope), []);\n if (published.error) {\n return actionResultError(published.error.errorType, published.error.errorText);\n }\n\n // The output contract is judged where the script's top-level code cannot reach the host.\n const checked = await resolveStory(() => askUserScriptCheckPublishedOutput(payload.drive, payload.outputFilepath, payload.scope, errorType), []);\n if (checked.error) {\n return actionResultError(checked.error.errorType, checked.error.errorText);\n }\n\n return actionResult({ exports: checked.result });\n };\n};\n\nexport const getUserScriptBuildActionProcessor = createActionProcessor(askUserScriptBuild, getProcessBuild);\n"]}
1
+ {"version":3,"file":"getUserScriptBuildActionProcessor.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuildActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadUserScriptHostModules } from '@qpqjs/actionprocessor-node';\nimport {\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n askFileListDirectory,\n askFileReadTextContents,\n askUserScriptBuild,\n createActionProcessor,\n createNestedRuntime,\n generateUuid,\n getDateNow,\n ProcessorFor,\n QPQConfig,\n QpqRuntimeType,\n storyResultToActionResult,\n} from '@qpqjs/core';\n\nimport { UserScriptBuildError } from '../build/UserScriptBuildError';\nimport { askUserScriptCheckPublishedOutput } from './logic/askUserScriptCheckPublishedOutput';\nimport { askUserScriptCollectSource } from './logic/askUserScriptCollectSource';\nimport { askUserScriptPublishOutput } from './logic/askUserScriptPublishOutput';\nimport { buildUserScriptInTempDir } from './logic/buildUserScriptInTempDir';\nimport { BuiltUserScript } from './logic/BuiltUserScript';\nimport { getUserScriptBuildErrorType } from './logic/getUserScriptBuildErrorType';\nimport { materialiseUserScriptSource } from './logic/materialiseUserScriptSource';\n\nconst { errorType } = askUserScriptBuild;\n\n// Drive failures while collecting the source, re-labelled into this action's catalog; any\n// other failure passes through with its own type.\nconst COLLECT_ERROR_TYPES: Record<string, string> = {\n [askFileListDirectory.errorType.DirectoryNotFound]: errorType.SourceNotFound,\n [askFileListDirectory.errorType.DriveNotFound]: errorType.DriveNotFound,\n [askFileListDirectory.errorType.InvalidScope]: errorType.InvalidScope,\n [askFileReadTextContents.errorType.InvalidScope]: errorType.InvalidScope,\n};\n\nconst getProcessBuild = (qpqConfig: QPQConfig): ProcessorFor<typeof askUserScriptBuild> => {\n return async (payload, session, actionProcessors, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const resolveStory = createNestedRuntime(\n qpqConfig,\n session,\n actionProcessors,\n getDateNow,\n logger,\n generateUuid,\n QpqRuntimeType.EXECUTE_STORY,\n dynamicModuleLoader,\n undefined,\n [],\n streamRegistry,\n );\n\n // The source and the output both travel through the file actions, so each runtime's\n // own drive implementation serves them; only the build itself touches local disk.\n const collected = await resolveStory(() => askUserScriptCollectSource(payload.drive, payload.sourceDirectory, payload.scope), []);\n if (collected.error) {\n return actionResultError(COLLECT_ERROR_TYPES[collected.error.errorType] ?? collected.error.errorType, collected.error.errorText);\n }\n\n // The service's own script modules, which the bundler keeps external. One that does not\n // load is the service's fault, so it throws rather than failing the build.\n const hostModules = await loadUserScriptHostModules(qpqConfig, dynamicModuleLoader);\n\n let built: BuiltUserScript;\n try {\n built = await buildUserScriptInTempDir(\n (projectDir) => materialiseUserScriptSource(projectDir, collected.result),\n payload.sourceMap,\n hostModules,\n );\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n UserScriptBuildError: (error) =>\n actionResultError(getUserScriptBuildErrorType((error as UserScriptBuildError).code, errorType), error.message),\n });\n }\n\n const published = await resolveStory(() => askUserScriptPublishOutput(payload.drive, payload.outputFilepath, built.script, payload.scope), []);\n if (published.error) {\n return storyResultToActionResult(published, 'UserScript Build publish');\n }\n\n // The output contract is judged where the script's top-level code cannot reach the host.\n const checked = await resolveStory(() => askUserScriptCheckPublishedOutput(payload.drive, payload.outputFilepath, payload.scope, errorType), []);\n if (checked.error) {\n return storyResultToActionResult(checked, 'UserScript Build check output');\n }\n\n return actionResult({ exports: checked.result });\n };\n};\n\nexport const getUserScriptBuildActionProcessor = createActionProcessor(askUserScriptBuild, getProcessBuild);\n"]}
@@ -12,17 +12,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getUserScriptBuildFromZipActionProcessor = void 0;
13
13
  const actionprocessor_node_1 = require("@qpqjs/actionprocessor-node");
14
14
  const core_1 = require("@qpqjs/core");
15
- const crypto_1 = require("crypto");
16
- const UserScriptBuildError_1 = require("../build/UserScriptBuildError");
17
15
  const askUserScriptCheckPublishedOutput_1 = require("./logic/askUserScriptCheckPublishedOutput");
18
16
  const askUserScriptPublishOutput_1 = require("./logic/askUserScriptPublishOutput");
19
17
  const buildUserScriptInTempDir_1 = require("./logic/buildUserScriptInTempDir");
20
18
  const extractUserScriptZip_1 = require("./logic/extractUserScriptZip");
21
19
  const getUserScriptBuildErrorType_1 = require("./logic/getUserScriptBuildErrorType");
22
20
  const USER_SCRIPT_SOURCE_LIMITS_1 = require("./logic/USER_SCRIPT_SOURCE_LIMITS");
23
- const UserScriptArchiveError_1 = require("./logic/UserScriptArchiveError");
24
21
  const { errorType } = core_1.askUserScriptBuildFromZip;
25
- const getDateNow = () => new Date().toISOString();
26
22
  // Drive failures while reading the zip, re-labelled into this action's catalog; any other
27
23
  // failure passes through with its own type.
28
24
  const READ_ERROR_TYPES = {
@@ -34,7 +30,7 @@ const getArchiveErrorType = (error) => errorType[error.code];
34
30
  const getProcessBuildFromZip = (qpqConfig) => {
35
31
  return (payload, session, actionProcessors, logger, updateSession, dynamicModuleLoader, streamRegistry) => __awaiter(void 0, void 0, void 0, function* () {
36
32
  var _a;
37
- const resolveStory = (0, core_1.createNestedRuntime)(qpqConfig, session, actionProcessors, getDateNow, logger, crypto_1.randomUUID, core_1.QpqRuntimeType.EXECUTE_STORY, dynamicModuleLoader, undefined, [], streamRegistry);
33
+ const resolveStory = (0, core_1.createNestedRuntime)(qpqConfig, session, actionProcessors, core_1.getDateNow, logger, core_1.generateUuid, core_1.QpqRuntimeType.EXECUTE_STORY, dynamicModuleLoader, undefined, [], streamRegistry);
38
34
  const read = yield resolveStory(() => (0, core_1.askFileReadBinaryContents)(payload.drive, payload.zipFilepath, payload.scope), []);
39
35
  if (read.error) {
40
36
  return (0, core_1.actionResultError)((_a = READ_ERROR_TYPES[read.error.errorType]) !== null && _a !== void 0 ? _a : read.error.errorType, read.error.errorText);
@@ -55,22 +51,19 @@ const getProcessBuildFromZip = (qpqConfig) => {
55
51
  }), payload.sourceMap, hostModules);
56
52
  }
57
53
  catch (error) {
58
- if (error instanceof UserScriptArchiveError_1.UserScriptArchiveError) {
59
- return (0, core_1.actionResultError)(getArchiveErrorType(error), `[${payload.drive}:${payload.zipFilepath}] ${error.message}`);
60
- }
61
- if (error instanceof UserScriptBuildError_1.UserScriptBuildError) {
62
- return (0, core_1.actionResultError)((0, getUserScriptBuildErrorType_1.getUserScriptBuildErrorType)(error.code, errorType), error.message);
63
- }
64
- throw error;
54
+ return (0, core_1.actionResultErrorFromCaughtError)(error, {
55
+ UserScriptArchiveError: (error) => (0, core_1.actionResultError)(getArchiveErrorType(error), `[${payload.drive}:${payload.zipFilepath}] ${error.message}`),
56
+ UserScriptBuildError: (error) => (0, core_1.actionResultError)((0, getUserScriptBuildErrorType_1.getUserScriptBuildErrorType)(error.code, errorType), error.message),
57
+ });
65
58
  }
66
59
  const published = yield resolveStory(() => (0, askUserScriptPublishOutput_1.askUserScriptPublishOutput)(payload.drive, payload.outputFilepath, built.script, payload.scope), []);
67
60
  if (published.error) {
68
- return (0, core_1.actionResultError)(published.error.errorType, published.error.errorText);
61
+ return (0, core_1.storyResultToActionResult)(published, 'UserScript Build publish');
69
62
  }
70
63
  // The output contract is judged where the script's top-level code cannot reach the host.
71
64
  const checked = yield resolveStory(() => (0, askUserScriptCheckPublishedOutput_1.askUserScriptCheckPublishedOutput)(payload.drive, payload.outputFilepath, payload.scope, errorType), []);
72
65
  if (checked.error) {
73
- return (0, core_1.actionResultError)(checked.error.errorType, checked.error.errorText);
66
+ return (0, core_1.storyResultToActionResult)(checked, 'UserScript Build check output');
74
67
  }
75
68
  return (0, core_1.actionResult)({ exports: checked.result });
76
69
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getUserScriptBuildFromZipActionProcessor.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuildFromZipActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadUserScriptHostModules } from '@qpqjs/actionprocessor-node';\nimport {\n ActionProcessorList,\n actionResult,\n actionResultError,\n askFileReadBinaryContents,\n askUserScriptBuildFromZip,\n createActionProcessor,\n createNestedRuntime,\n DynamicModuleLoader,\n ProcessorFor,\n QPQConfig,\n QpqLogger,\n QpqRuntimeType,\n StorySession,\n StorySessionUpdater,\n StreamRegistry,\n UserScriptBuildFromZipActionPayload,\n} from '@qpqjs/core';\n\nimport { randomUUID } from 'crypto';\n\nimport { UserScriptBuildError } from '../build/UserScriptBuildError';\nimport { askUserScriptCheckPublishedOutput } from './logic/askUserScriptCheckPublishedOutput';\nimport { askUserScriptPublishOutput } from './logic/askUserScriptPublishOutput';\nimport { buildUserScriptInTempDir } from './logic/buildUserScriptInTempDir';\nimport { BuiltUserScript } from './logic/BuiltUserScript';\nimport { extractUserScriptZip } from './logic/extractUserScriptZip';\nimport { getUserScriptBuildErrorType } from './logic/getUserScriptBuildErrorType';\nimport { USER_SCRIPT_SOURCE_LIMITS } from './logic/USER_SCRIPT_SOURCE_LIMITS';\nimport { UserScriptArchiveError } from './logic/UserScriptArchiveError';\n\nconst { errorType } = askUserScriptBuildFromZip;\n\nconst getDateNow = () => new Date().toISOString();\n\n// Drive failures while reading the zip, re-labelled into this action's catalog; any other\n// failure passes through with its own type.\nconst READ_ERROR_TYPES: Record<string, string> = {\n [askFileReadBinaryContents.errorType.FileNotFound]: errorType.SourceNotFound,\n [askFileReadBinaryContents.errorType.InvalidScope]: errorType.InvalidScope,\n};\n\n// The archive error codes are named after the action's own catalog.\nconst getArchiveErrorType = (error: UserScriptArchiveError): string => errorType[error.code];\n\nconst getProcessBuildFromZip = (qpqConfig: QPQConfig): ProcessorFor<typeof askUserScriptBuildFromZip> => {\n return async (\n payload: UserScriptBuildFromZipActionPayload,\n session: StorySession,\n actionProcessors: ActionProcessorList,\n logger: QpqLogger,\n updateSession: StorySessionUpdater,\n dynamicModuleLoader: DynamicModuleLoader,\n streamRegistry: StreamRegistry,\n ) => {\n const resolveStory = createNestedRuntime(\n qpqConfig,\n session,\n actionProcessors,\n getDateNow,\n logger,\n randomUUID,\n QpqRuntimeType.EXECUTE_STORY,\n dynamicModuleLoader,\n undefined,\n [],\n streamRegistry,\n );\n\n const read = await resolveStory(() => askFileReadBinaryContents(payload.drive, payload.zipFilepath, payload.scope), []);\n if (read.error) {\n return actionResultError(READ_ERROR_TYPES[read.error.errorType] ?? read.error.errorType, read.error.errorText);\n }\n\n // The file actions give no size without the bytes, so the zip's own cap applies to\n // what came back before anything is unpacked.\n const zip = Buffer.from(read.result.base64Data, 'base64');\n if (zip.length > USER_SCRIPT_SOURCE_LIMITS.maxBytes) {\n return actionResultError(\n errorType.SourceTooLarge,\n `[${payload.drive}:${payload.zipFilepath}] is larger than ${USER_SCRIPT_SOURCE_LIMITS.maxBytes} bytes`,\n );\n }\n\n // The service's own script modules, which the bundler keeps external. One that does not\n // load is the service's fault, so it throws rather than failing the build.\n const hostModules = await loadUserScriptHostModules(qpqConfig, dynamicModuleLoader);\n\n let built: BuiltUserScript;\n try {\n built = await buildUserScriptInTempDir(\n async (projectDir) => {\n await extractUserScriptZip(zip, projectDir);\n },\n payload.sourceMap,\n hostModules,\n );\n } catch (error) {\n if (error instanceof UserScriptArchiveError) {\n return actionResultError(getArchiveErrorType(error), `[${payload.drive}:${payload.zipFilepath}] ${error.message}`);\n }\n if (error instanceof UserScriptBuildError) {\n return actionResultError(getUserScriptBuildErrorType(error.code, errorType), error.message);\n }\n throw error;\n }\n\n const published = await resolveStory(() => askUserScriptPublishOutput(payload.drive, payload.outputFilepath, built.script, payload.scope), []);\n if (published.error) {\n return actionResultError(published.error.errorType, published.error.errorText);\n }\n\n // The output contract is judged where the script's top-level code cannot reach the host.\n const checked = await resolveStory(() => askUserScriptCheckPublishedOutput(payload.drive, payload.outputFilepath, payload.scope, errorType), []);\n if (checked.error) {\n return actionResultError(checked.error.errorType, checked.error.errorText);\n }\n\n return actionResult({ exports: checked.result });\n };\n};\n\nexport const getUserScriptBuildFromZipActionProcessor = createActionProcessor(askUserScriptBuildFromZip, getProcessBuildFromZip);\n"]}
1
+ {"version":3,"file":"getUserScriptBuildFromZipActionProcessor.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuildFromZipActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadUserScriptHostModules } from '@qpqjs/actionprocessor-node';\nimport {\n ActionProcessorList,\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n askFileReadBinaryContents,\n askUserScriptBuildFromZip,\n createActionProcessor,\n createNestedRuntime,\n DynamicModuleLoader,\n generateUuid,\n getDateNow,\n ProcessorFor,\n QPQConfig,\n QpqLogger,\n QpqRuntimeType,\n storyResultToActionResult,\n StorySession,\n StorySessionUpdater,\n StreamRegistry,\n UserScriptBuildFromZipActionPayload,\n} from '@qpqjs/core';\n\nimport { UserScriptBuildError } from '../build/UserScriptBuildError';\nimport { askUserScriptCheckPublishedOutput } from './logic/askUserScriptCheckPublishedOutput';\nimport { askUserScriptPublishOutput } from './logic/askUserScriptPublishOutput';\nimport { buildUserScriptInTempDir } from './logic/buildUserScriptInTempDir';\nimport { BuiltUserScript } from './logic/BuiltUserScript';\nimport { extractUserScriptZip } from './logic/extractUserScriptZip';\nimport { getUserScriptBuildErrorType } from './logic/getUserScriptBuildErrorType';\nimport { USER_SCRIPT_SOURCE_LIMITS } from './logic/USER_SCRIPT_SOURCE_LIMITS';\nimport { UserScriptArchiveError } from './logic/UserScriptArchiveError';\n\nconst { errorType } = askUserScriptBuildFromZip;\n\n// Drive failures while reading the zip, re-labelled into this action's catalog; any other\n// failure passes through with its own type.\nconst READ_ERROR_TYPES: Record<string, string> = {\n [askFileReadBinaryContents.errorType.FileNotFound]: errorType.SourceNotFound,\n [askFileReadBinaryContents.errorType.InvalidScope]: errorType.InvalidScope,\n};\n\n// The archive error codes are named after the action's own catalog.\nconst getArchiveErrorType = (error: UserScriptArchiveError): string => errorType[error.code];\n\nconst getProcessBuildFromZip = (qpqConfig: QPQConfig): ProcessorFor<typeof askUserScriptBuildFromZip> => {\n return async (\n payload: UserScriptBuildFromZipActionPayload,\n session: StorySession,\n actionProcessors: ActionProcessorList,\n logger: QpqLogger,\n updateSession: StorySessionUpdater,\n dynamicModuleLoader: DynamicModuleLoader,\n streamRegistry: StreamRegistry,\n ) => {\n const resolveStory = createNestedRuntime(\n qpqConfig,\n session,\n actionProcessors,\n getDateNow,\n logger,\n generateUuid,\n QpqRuntimeType.EXECUTE_STORY,\n dynamicModuleLoader,\n undefined,\n [],\n streamRegistry,\n );\n\n const read = await resolveStory(() => askFileReadBinaryContents(payload.drive, payload.zipFilepath, payload.scope), []);\n if (read.error) {\n return actionResultError(READ_ERROR_TYPES[read.error.errorType] ?? read.error.errorType, read.error.errorText);\n }\n\n // The file actions give no size without the bytes, so the zip's own cap applies to\n // what came back before anything is unpacked.\n const zip = Buffer.from(read.result.base64Data, 'base64');\n if (zip.length > USER_SCRIPT_SOURCE_LIMITS.maxBytes) {\n return actionResultError(\n errorType.SourceTooLarge,\n `[${payload.drive}:${payload.zipFilepath}] is larger than ${USER_SCRIPT_SOURCE_LIMITS.maxBytes} bytes`,\n );\n }\n\n // The service's own script modules, which the bundler keeps external. One that does not\n // load is the service's fault, so it throws rather than failing the build.\n const hostModules = await loadUserScriptHostModules(qpqConfig, dynamicModuleLoader);\n\n let built: BuiltUserScript;\n try {\n built = await buildUserScriptInTempDir(\n async (projectDir) => {\n await extractUserScriptZip(zip, projectDir);\n },\n payload.sourceMap,\n hostModules,\n );\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n UserScriptArchiveError: (error) =>\n actionResultError(getArchiveErrorType(error as UserScriptArchiveError), `[${payload.drive}:${payload.zipFilepath}] ${error.message}`),\n UserScriptBuildError: (error) =>\n actionResultError(getUserScriptBuildErrorType((error as UserScriptBuildError).code, errorType), error.message),\n });\n }\n\n const published = await resolveStory(() => askUserScriptPublishOutput(payload.drive, payload.outputFilepath, built.script, payload.scope), []);\n if (published.error) {\n return storyResultToActionResult(published, 'UserScript Build publish');\n }\n\n // The output contract is judged where the script's top-level code cannot reach the host.\n const checked = await resolveStory(() => askUserScriptCheckPublishedOutput(payload.drive, payload.outputFilepath, payload.scope, errorType), []);\n if (checked.error) {\n return storyResultToActionResult(checked, 'UserScript Build check output');\n }\n\n return actionResult({ exports: checked.result });\n };\n};\n\nexport const getUserScriptBuildFromZipActionProcessor = createActionProcessor(askUserScriptBuildFromZip, getProcessBuildFromZip);\n"]}
@@ -0,0 +1,3 @@
1
+ import { ActionProcessorListResolver } from '@qpqjs/core';
2
+ /** The composer defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */
3
+ export declare const getUserScriptBuilderActionProcessor: ActionProcessorListResolver;
@@ -9,12 +9,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.getUserScriptBuildActionProcessors = void 0;
12
+ exports.getUserScriptBuilderActionProcessor = void 0;
13
13
  const getUserScriptBuildActionProcessor_1 = require("./getUserScriptBuildActionProcessor");
14
14
  const getUserScriptBuildFromZipActionProcessor_1 = require("./getUserScriptBuildFromZipActionProcessor");
15
- /** The resolver defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */
16
- const getUserScriptBuildActionProcessors = (qpqConfig, dynamicModuleLoader) => __awaiter(void 0, void 0, void 0, function* () {
15
+ /** The composer defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */
16
+ const getUserScriptBuilderActionProcessor = (qpqConfig, dynamicModuleLoader) => __awaiter(void 0, void 0, void 0, function* () {
17
17
  return (Object.assign(Object.assign({}, (yield (0, getUserScriptBuildActionProcessor_1.getUserScriptBuildActionProcessor)(qpqConfig, dynamicModuleLoader))), (yield (0, getUserScriptBuildFromZipActionProcessor_1.getUserScriptBuildFromZipActionProcessor)(qpqConfig, dynamicModuleLoader))));
18
18
  });
19
- exports.getUserScriptBuildActionProcessors = getUserScriptBuildActionProcessors;
20
- //# sourceMappingURL=getUserScriptBuildActionProcessors.js.map
19
+ exports.getUserScriptBuilderActionProcessor = getUserScriptBuilderActionProcessor;
20
+ //# sourceMappingURL=getUserScriptBuilderActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUserScriptBuilderActionProcessor.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuilderActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,2FAAwF;AACxF,yGAAsG;AAEtG,qHAAqH;AAC9G,MAAM,mCAAmC,GAAgC,CAC9E,SAAoB,EACpB,mBAAwC,EACV,EAAE;IAAC,OAAA,iCAC9B,CAAC,MAAM,IAAA,qEAAiC,EAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC,GACzE,CAAC,MAAM,IAAA,mFAAwC,EAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC,EACnF,CAAA;EAAA,CAAC;AANU,QAAA,mCAAmC,uCAM7C","sourcesContent":["import { ActionProcessorList, ActionProcessorListResolver, DynamicModuleLoader, QPQConfig } from '@qpqjs/core';\n\nimport { getUserScriptBuildActionProcessor } from './getUserScriptBuildActionProcessor';\nimport { getUserScriptBuildFromZipActionProcessor } from './getUserScriptBuildFromZipActionProcessor';\n\n/** The composer defineUserScriptBuilder points a service at: both build actions, from a directory and from a zip. */\nexport const getUserScriptBuilderActionProcessor: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n dynamicModuleLoader: DynamicModuleLoader,\n): Promise<ActionProcessorList> => ({\n ...(await getUserScriptBuildActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getUserScriptBuildFromZipActionProcessor(qpqConfig, dynamicModuleLoader)),\n});\n"]}
@@ -1,4 +1,4 @@
1
1
  export * from './getUserScriptBuildActionProcessor';
2
- export * from './getUserScriptBuildActionProcessors';
2
+ export * from './getUserScriptBuilderActionProcessor';
3
3
  export * from './getUserScriptBuildFromZipActionProcessor';
4
4
  export * from './logic';
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./getUserScriptBuildActionProcessor"), exports);
18
- __exportStar(require("./getUserScriptBuildActionProcessors"), exports);
18
+ __exportStar(require("./getUserScriptBuilderActionProcessor"), exports);
19
19
  __exportStar(require("./getUserScriptBuildFromZipActionProcessor"), exports);
20
20
  __exportStar(require("./logic"), exports);
21
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actionProcessor/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,uEAAqD;AACrD,6EAA2D;AAC3D,0CAAwB","sourcesContent":["export * from './getUserScriptBuildActionProcessor';\nexport * from './getUserScriptBuildActionProcessors';\nexport * from './getUserScriptBuildFromZipActionProcessor';\nexport * from './logic';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actionProcessor/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,wEAAsD;AACtD,6EAA2D;AAC3D,0CAAwB","sourcesContent":["export * from './getUserScriptBuildActionProcessor';\nexport * from './getUserScriptBuilderActionProcessor';\nexport * from './getUserScriptBuildFromZipActionProcessor';\nexport * from './logic';\n"]}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.askUserScriptCheckPublishedOutput = askUserScriptCheckPublishedOutput;
4
4
  const core_1 = require("@qpqjs/core");
5
5
  const assertUserScriptExports_1 = require("../../build/assertUserScriptExports");
6
- const UserScriptBuildError_1 = require("../../build/UserScriptBuildError");
6
+ const isUserScriptBuildError_1 = require("../../build/isUserScriptBuildError");
7
7
  /**
8
8
  * The output contract for a platform build, judged inside the sandbox: the runner loads the
9
9
  * published file and reports its exports, and the rule is applied here. A load failure is the
@@ -20,7 +20,7 @@ function* askUserScriptCheckPublishedOutput(drive, filepath, scope, errorType) {
20
20
  return (0, assertUserScriptExports_1.assertUserScriptExports)(filepath, listed.result);
21
21
  }
22
22
  catch (error) {
23
- if (error instanceof UserScriptBuildError_1.UserScriptBuildError) {
23
+ if ((0, isUserScriptBuildError_1.isUserScriptBuildError)(error)) {
24
24
  const code = error.code;
25
25
  return yield* (0, core_1.askThrowError)(errorType[code], error.message);
26
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"askUserScriptCheckPublishedOutput.js","sourceRoot":"","sources":["../../../../src/actionProcessor/logic/askUserScriptCheckPublishedOutput.ts"],"names":[],"mappings":";;AAWA,8EAuBC;AAlCD,sCAA6F;AAE7F,iFAA8E;AAC9E,2EAAkG;AAGlG;;;;GAIG;AACH,QAAe,CAAC,CAAC,iCAAiC,CAChD,KAAa,EACb,QAAgB,EAChB,KAAyB,EACzB,SAAsC;IAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAA,eAAQ,EAAC,IAAA,+BAAwB,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,UAAU,GACd,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,+BAAwB,CAAC,SAAS,CAAC,cAAc;YAC5E,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,+BAAwB,CAAC,SAAS,CAAC,aAAa,CAAC;QAC9E,OAAO,KAAK,CAAC,CAAC,IAAA,oBAAa,EAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAA,iDAAuB,EAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,2CAAoB,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuF,CAAC;YAC3G,OAAO,KAAK,CAAC,CAAC,IAAA,oBAAa,EAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { askCatch, AskResponse, askThrowError, askUserScriptListExports } from '@qpqjs/core';\n\nimport { assertUserScriptExports } from '../../build/assertUserScriptExports';\nimport { UserScriptBuildError, UserScriptBuildErrorCode } from '../../build/UserScriptBuildError';\nimport { UserScriptBuildErrorCatalog } from './getUserScriptBuildErrorType';\n\n/**\n * The output contract for a platform build, judged inside the sandbox: the runner loads the\n * published file and reports its exports, and the rule is applied here. A load failure is the\n * build's fault (BuildFailed); a runner failure keeps its own type.\n */\nexport function* askUserScriptCheckPublishedOutput(\n drive: string,\n filepath: string,\n scope: string | undefined,\n errorType: UserScriptBuildErrorCatalog,\n): AskResponse<string[]> {\n const listed = yield* askCatch(askUserScriptListExports(drive, filepath, scope));\n if (!listed.success) {\n const loadFailed =\n listed.error.errorType === askUserScriptListExports.errorType.ModuleNotFound ||\n listed.error.errorType === askUserScriptListExports.errorType.ScriptInvalid;\n return yield* askThrowError(loadFailed ? errorType.BuildFailed : listed.error.errorType, listed.error.errorText);\n }\n\n try {\n return assertUserScriptExports(filepath, listed.result);\n } catch (error) {\n if (error instanceof UserScriptBuildError) {\n const code = error.code as UserScriptBuildErrorCode.NoExports | UserScriptBuildErrorCode.NonFunctionExport;\n return yield* askThrowError(errorType[code], error.message);\n }\n throw error;\n }\n}\n"]}
1
+ {"version":3,"file":"askUserScriptCheckPublishedOutput.js","sourceRoot":"","sources":["../../../../src/actionProcessor/logic/askUserScriptCheckPublishedOutput.ts"],"names":[],"mappings":";;AAYA,8EAuBC;AAnCD,sCAA6F;AAE7F,iFAA8E;AAC9E,+EAA4E;AAI5E;;;;GAIG;AACH,QAAe,CAAC,CAAC,iCAAiC,CAChD,KAAa,EACb,QAAgB,EAChB,KAAyB,EACzB,SAAsC;IAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAA,eAAQ,EAAC,IAAA,+BAAwB,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,UAAU,GACd,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,+BAAwB,CAAC,SAAS,CAAC,cAAc;YAC5E,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,+BAAwB,CAAC,SAAS,CAAC,aAAa,CAAC;QAC9E,OAAO,KAAK,CAAC,CAAC,IAAA,oBAAa,EAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAA,iDAAuB,EAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,IAAA,+CAAsB,EAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuF,CAAC;YAC3G,OAAO,KAAK,CAAC,CAAC,IAAA,oBAAa,EAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { askCatch, AskResponse, askThrowError, askUserScriptListExports } from '@qpqjs/core';\n\nimport { assertUserScriptExports } from '../../build/assertUserScriptExports';\nimport { isUserScriptBuildError } from '../../build/isUserScriptBuildError';\nimport { UserScriptBuildErrorCode } from '../../build/UserScriptBuildError';\nimport { UserScriptBuildErrorCatalog } from './getUserScriptBuildErrorType';\n\n/**\n * The output contract for a platform build, judged inside the sandbox: the runner loads the\n * published file and reports its exports, and the rule is applied here. A load failure is the\n * build's fault (BuildFailed); a runner failure keeps its own type.\n */\nexport function* askUserScriptCheckPublishedOutput(\n drive: string,\n filepath: string,\n scope: string | undefined,\n errorType: UserScriptBuildErrorCatalog,\n): AskResponse<string[]> {\n const listed = yield* askCatch(askUserScriptListExports(drive, filepath, scope));\n if (!listed.success) {\n const loadFailed =\n listed.error.errorType === askUserScriptListExports.errorType.ModuleNotFound ||\n listed.error.errorType === askUserScriptListExports.errorType.ScriptInvalid;\n return yield* askThrowError(loadFailed ? errorType.BuildFailed : listed.error.errorType, listed.error.errorText);\n }\n\n try {\n return assertUserScriptExports(filepath, listed.result);\n } catch (error) {\n if (isUserScriptBuildError(error)) {\n const code = error.code as UserScriptBuildErrorCode.NoExports | UserScriptBuildErrorCode.NonFunctionExport;\n return yield* askThrowError(errorType[code], error.message);\n }\n throw error;\n }\n}\n"]}
@@ -19,6 +19,7 @@ const promises_1 = require("node:stream/promises");
19
19
  const path_1 = __importDefault(require("path"));
20
20
  const yauzl_1 = __importDefault(require("yauzl"));
21
21
  const isSafeProjectPath_1 = require("./isSafeProjectPath");
22
+ const isUserScriptArchiveError_1 = require("./isUserScriptArchiveError");
22
23
  const USER_SCRIPT_SOURCE_LIMITS_1 = require("./USER_SCRIPT_SOURCE_LIMITS");
23
24
  const UserScriptArchiveError_1 = require("./UserScriptArchiveError");
24
25
  const REFUSED_DIRECTORY = 'node_modules';
@@ -78,7 +79,8 @@ const stripCommonFolder = (names) => {
78
79
  return 0;
79
80
  const firstSegments = new Set(names.map((name) => name.split('/')[0]));
80
81
  const allNested = names.every((name) => name.includes('/'));
81
- return firstSegments.size === 1 && allNested ? [...firstSegments][0].length + 1 : 0;
82
+ const [firstSegment] = firstSegments;
83
+ return firstSegments.size === 1 && allNested && firstSegment !== undefined ? firstSegment.length + 1 : 0;
82
84
  };
83
85
  const planEntries = (zip) => __awaiter(void 0, void 0, void 0, function* () {
84
86
  const files = [];
@@ -117,7 +119,7 @@ const extractUserScriptZip = (zip, projectDir) => __awaiter(void 0, void 0, void
117
119
  planned = yield planEntries(zip);
118
120
  }
119
121
  catch (error) {
120
- if (error instanceof UserScriptArchiveError_1.UserScriptArchiveError)
122
+ if ((0, isUserScriptArchiveError_1.isUserScriptArchiveError)(error))
121
123
  throw error;
122
124
  throw invalid(`cannot read the archive: ${error instanceof Error ? error.message : String(error)}`);
123
125
  }
@@ -138,7 +140,7 @@ const extractUserScriptZip = (zip, projectDir) => __awaiter(void 0, void 0, void
138
140
  }));
139
141
  }
140
142
  catch (error) {
141
- if (error instanceof UserScriptArchiveError_1.UserScriptArchiveError)
143
+ if ((0, isUserScriptArchiveError_1.isUserScriptArchiveError)(error))
142
144
  throw error;
143
145
  throw invalid(`cannot unpack the archive: ${error instanceof Error ? error.message : String(error)}`);
144
146
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extractUserScriptZip.js","sourceRoot":"","sources":["../../../../src/actionProcessor/logic/extractUserScriptZip.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { Readable, Transform } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport path from 'path';\nimport yauzl, { Entry, ZipFile } from 'yauzl';\n\nimport { isSafeProjectPath } from './isSafeProjectPath';\nimport { USER_SCRIPT_SOURCE_LIMITS } from './USER_SCRIPT_SOURCE_LIMITS';\nimport { UserScriptArchiveError, UserScriptArchiveErrorCode } from './UserScriptArchiveError';\n\nconst REFUSED_DIRECTORY = 'node_modules';\nconst SYMLINK_MODE = 0o120000;\nconst FILE_TYPE_MASK = 0o170000;\n\n// Unix mode lives in the high 16 bits of the external attributes; zips made on other\n// systems leave it zero, which reads as \"not a symlink\".\nconst isSymlinkEntry = (entry: Entry): boolean => ((entry.externalFileAttributes >>> 16) & FILE_TYPE_MASK) === SYMLINK_MODE;\n\n// With decodeStrings off, yauzl hands names over raw so it does not apply its own path\n// rules before ours.\nconst entryName = (entry: Entry): string => (Buffer.isBuffer(entry.fileName) ? entry.fileName.toString('utf8') : String(entry.fileName));\n\nconst isDirectoryEntry = (name: string): boolean => name.endsWith('/');\n\nconst openZip = (zip: Buffer): Promise<ZipFile> =>\n new Promise((resolve, reject) => {\n // Header sizes are never consulted: the byte cap on the inflated stream is the only\n // authority, so yauzl's own size validation is off rather than a second, trusted, rule.\n yauzl.fromBuffer(zip, { lazyEntries: true, decodeStrings: false, validateEntrySizes: false }, (error, zipFile) =>\n error ? reject(error) : resolve(zipFile),\n );\n });\n\nconst readEntries = (zipFile: ZipFile, onEntry: (entry: Entry) => Promise<void> | void): Promise<void> =>\n new Promise((resolve, reject) => {\n zipFile.on('error', reject);\n zipFile.on('end', resolve);\n zipFile.on('entry', (entry: Entry) => {\n // A rule that throws synchronously must still reject here, not escape yauzl's\n // event emitter where it would be lost and leave the zip hanging.\n Promise.resolve()\n .then(() => onEntry(entry))\n .then(\n () => zipFile.readEntry(),\n (error) => {\n zipFile.close();\n reject(error);\n },\n );\n });\n zipFile.readEntry();\n });\n\nconst openEntryStream = (zipFile: ZipFile, entry: Entry): Promise<Readable> =>\n new Promise((resolve, reject) => {\n zipFile.openReadStream(entry, (error, stream) => (error ? reject(error) : resolve(stream)));\n });\n\nconst tooLarge = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.SourceTooLarge, message);\nconst unsafe = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.UnsafeArchiveEntry, message);\nconst invalid = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.InvalidArchive, message);\n\n// Counts the bytes that really come out of the inflater and fails the pipeline the moment\n// the project cap is crossed, so a zip that lies about its sizes cannot fill the disk.\nconst createByteCap = (counter: { total: number }, onExceeded: () => Error): Transform =>\n new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n counter.total += chunk.length;\n if (counter.total > USER_SCRIPT_SOURCE_LIMITS.maxBytes) {\n callback(onExceeded());\n return;\n }\n callback(null, chunk);\n },\n });\n\ntype PlannedEntry = { entry: Entry; relativePath: string };\n\n// Accepts the project at the zip root (anything under `src/`), or wrapped in exactly one\n// top-level folder (how most tools zip a directory): when nothing is under `src/` at the\n// root, every file shares the same first segment, and none sits at the root, that segment\n// is stripped. A root `src/` always wins, so a project with only `src/` is never stripped.\nconst stripCommonFolder = (names: string[]): number => {\n if (names.length === 0 || names.some((name) => name.startsWith('src/'))) return 0;\n\n const firstSegments = new Set(names.map((name) => name.split('/')[0]));\n const allNested = names.every((name) => name.includes('/'));\n\n return firstSegments.size === 1 && allNested ? [...firstSegments][0].length + 1 : 0;\n};\n\nconst planEntries = async (zip: Buffer): Promise<PlannedEntry[]> => {\n const files: PlannedEntry[] = [];\n const zipFile = await openZip(zip);\n\n await readEntries(zipFile, (entry) => {\n const name = entryName(entry);\n if (isDirectoryEntry(name)) return;\n\n if (entry.isEncrypted()) throw invalid(`entry [${name}] is encrypted`);\n if (isSymlinkEntry(entry)) throw unsafe(`entry [${name}] is a symlink`);\n if (!isSafeProjectPath(name)) throw unsafe(`entry [${name}] is not a plain relative path inside the project`);\n if (name.split('/').includes(REFUSED_DIRECTORY)) {\n throw tooLarge(`entry [${name}] is inside a ${REFUSED_DIRECTORY} folder; dependencies are not supported in a user script yet`);\n }\n\n files.push({ entry, relativePath: name });\n if (files.length > USER_SCRIPT_SOURCE_LIMITS.maxFiles) {\n throw tooLarge(`the archive holds more than ${USER_SCRIPT_SOURCE_LIMITS.maxFiles} files`);\n }\n });\n\n const strip = stripCommonFolder(files.map((file) => file.relativePath));\n\n return files.map((file) => ({ ...file, relativePath: file.relativePath.slice(strip) }));\n};\n\n/**\n * Unpacks a user-controlled zip into the project directory under the same rules as a\n * directory build: plain relative paths only, no symlinks, no node_modules, at most\n * USER_SCRIPT_SOURCE_LIMITS files and unpacked bytes counted as they are written (the\n * sizes in the zip's headers are never trusted). Directory entries are ignored; folders\n * come from file paths. Returns the project-relative paths written.\n */\nexport const extractUserScriptZip = async (zip: Buffer, projectDir: string): Promise<string[]> => {\n let planned: PlannedEntry[];\n try {\n planned = await planEntries(zip);\n } catch (error) {\n if (error instanceof UserScriptArchiveError) throw error;\n throw invalid(`cannot read the archive: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n const counter = { total: 0 };\n const written: string[] = [];\n const zipFile = await openZip(zip);\n const plannedByEntryName = new Map(planned.map((file) => [entryName(file.entry), file.relativePath]));\n\n try {\n await readEntries(zipFile, async (entry) => {\n const relativePath = plannedByEntryName.get(entryName(entry));\n if (relativePath === undefined) return;\n\n const target = path.join(projectDir, ...relativePath.split('/'));\n fs.mkdirSync(path.dirname(target), { recursive: true });\n\n const stream = await openEntryStream(zipFile, entry);\n await pipeline(\n stream,\n createByteCap(counter, () => tooLarge(`the archive unpacks to more than ${USER_SCRIPT_SOURCE_LIMITS.maxBytes} bytes`)),\n fs.createWriteStream(target),\n );\n written.push(relativePath);\n });\n } catch (error) {\n if (error instanceof UserScriptArchiveError) throw error;\n throw invalid(`cannot unpack the archive: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return written;\n};\n"]}
1
+ {"version":3,"file":"extractUserScriptZip.js","sourceRoot":"","sources":["../../../../src/actionProcessor/logic/extractUserScriptZip.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport { Readable, Transform } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport path from 'path';\nimport yauzl, { Entry, ZipFile } from 'yauzl';\n\nimport { isSafeProjectPath } from './isSafeProjectPath';\nimport { isUserScriptArchiveError } from './isUserScriptArchiveError';\nimport { USER_SCRIPT_SOURCE_LIMITS } from './USER_SCRIPT_SOURCE_LIMITS';\nimport { UserScriptArchiveError, UserScriptArchiveErrorCode } from './UserScriptArchiveError';\n\nconst REFUSED_DIRECTORY = 'node_modules';\nconst SYMLINK_MODE = 0o120000;\nconst FILE_TYPE_MASK = 0o170000;\n\n// Unix mode lives in the high 16 bits of the external attributes; zips made on other\n// systems leave it zero, which reads as \"not a symlink\".\nconst isSymlinkEntry = (entry: Entry): boolean => ((entry.externalFileAttributes >>> 16) & FILE_TYPE_MASK) === SYMLINK_MODE;\n\n// With decodeStrings off, yauzl hands names over raw so it does not apply its own path\n// rules before ours.\nconst entryName = (entry: Entry): string => (Buffer.isBuffer(entry.fileName) ? entry.fileName.toString('utf8') : String(entry.fileName));\n\nconst isDirectoryEntry = (name: string): boolean => name.endsWith('/');\n\nconst openZip = (zip: Buffer): Promise<ZipFile> =>\n new Promise((resolve, reject) => {\n // Header sizes are never consulted: the byte cap on the inflated stream is the only\n // authority, so yauzl's own size validation is off rather than a second, trusted, rule.\n yauzl.fromBuffer(zip, { lazyEntries: true, decodeStrings: false, validateEntrySizes: false }, (error, zipFile) =>\n error ? reject(error) : resolve(zipFile),\n );\n });\n\nconst readEntries = (zipFile: ZipFile, onEntry: (entry: Entry) => Promise<void> | void): Promise<void> =>\n new Promise((resolve, reject) => {\n zipFile.on('error', reject);\n zipFile.on('end', resolve);\n zipFile.on('entry', (entry: Entry) => {\n // A rule that throws synchronously must still reject here, not escape yauzl's\n // event emitter where it would be lost and leave the zip hanging.\n Promise.resolve()\n .then(() => onEntry(entry))\n .then(\n () => zipFile.readEntry(),\n (error) => {\n zipFile.close();\n reject(error);\n },\n );\n });\n zipFile.readEntry();\n });\n\nconst openEntryStream = (zipFile: ZipFile, entry: Entry): Promise<Readable> =>\n new Promise((resolve, reject) => {\n zipFile.openReadStream(entry, (error, stream) => (error ? reject(error) : resolve(stream)));\n });\n\nconst tooLarge = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.SourceTooLarge, message);\nconst unsafe = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.UnsafeArchiveEntry, message);\nconst invalid = (message: string): UserScriptArchiveError => new UserScriptArchiveError(UserScriptArchiveErrorCode.InvalidArchive, message);\n\n// Counts the bytes that really come out of the inflater and fails the pipeline the moment\n// the project cap is crossed, so a zip that lies about its sizes cannot fill the disk.\nconst createByteCap = (counter: { total: number }, onExceeded: () => Error): Transform =>\n new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n counter.total += chunk.length;\n if (counter.total > USER_SCRIPT_SOURCE_LIMITS.maxBytes) {\n callback(onExceeded());\n return;\n }\n callback(null, chunk);\n },\n });\n\ntype PlannedEntry = { entry: Entry; relativePath: string };\n\n// Accepts the project at the zip root (anything under `src/`), or wrapped in exactly one\n// top-level folder (how most tools zip a directory): when nothing is under `src/` at the\n// root, every file shares the same first segment, and none sits at the root, that segment\n// is stripped. A root `src/` always wins, so a project with only `src/` is never stripped.\nconst stripCommonFolder = (names: string[]): number => {\n if (names.length === 0 || names.some((name) => name.startsWith('src/'))) return 0;\n\n const firstSegments = new Set(names.map((name) => name.split('/')[0]));\n const allNested = names.every((name) => name.includes('/'));\n\n const [firstSegment] = firstSegments;\n return firstSegments.size === 1 && allNested && firstSegment !== undefined ? firstSegment.length + 1 : 0;\n};\n\nconst planEntries = async (zip: Buffer): Promise<PlannedEntry[]> => {\n const files: PlannedEntry[] = [];\n const zipFile = await openZip(zip);\n\n await readEntries(zipFile, (entry) => {\n const name = entryName(entry);\n if (isDirectoryEntry(name)) return;\n\n if (entry.isEncrypted()) throw invalid(`entry [${name}] is encrypted`);\n if (isSymlinkEntry(entry)) throw unsafe(`entry [${name}] is a symlink`);\n if (!isSafeProjectPath(name)) throw unsafe(`entry [${name}] is not a plain relative path inside the project`);\n if (name.split('/').includes(REFUSED_DIRECTORY)) {\n throw tooLarge(`entry [${name}] is inside a ${REFUSED_DIRECTORY} folder; dependencies are not supported in a user script yet`);\n }\n\n files.push({ entry, relativePath: name });\n if (files.length > USER_SCRIPT_SOURCE_LIMITS.maxFiles) {\n throw tooLarge(`the archive holds more than ${USER_SCRIPT_SOURCE_LIMITS.maxFiles} files`);\n }\n });\n\n const strip = stripCommonFolder(files.map((file) => file.relativePath));\n\n return files.map((file) => ({ ...file, relativePath: file.relativePath.slice(strip) }));\n};\n\n/**\n * Unpacks a user-controlled zip into the project directory under the same rules as a\n * directory build: plain relative paths only, no symlinks, no node_modules, at most\n * USER_SCRIPT_SOURCE_LIMITS files and unpacked bytes counted as they are written (the\n * sizes in the zip's headers are never trusted). Directory entries are ignored; folders\n * come from file paths. Returns the project-relative paths written.\n */\nexport const extractUserScriptZip = async (zip: Buffer, projectDir: string): Promise<string[]> => {\n let planned: PlannedEntry[];\n try {\n planned = await planEntries(zip);\n } catch (error) {\n if (isUserScriptArchiveError(error)) throw error;\n throw invalid(`cannot read the archive: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n const counter = { total: 0 };\n const written: string[] = [];\n const zipFile = await openZip(zip);\n const plannedByEntryName = new Map(planned.map((file) => [entryName(file.entry), file.relativePath]));\n\n try {\n await readEntries(zipFile, async (entry) => {\n const relativePath = plannedByEntryName.get(entryName(entry));\n if (relativePath === undefined) return;\n\n const target = path.join(projectDir, ...relativePath.split('/'));\n fs.mkdirSync(path.dirname(target), { recursive: true });\n\n const stream = await openEntryStream(zipFile, entry);\n await pipeline(\n stream,\n createByteCap(counter, () => tooLarge(`the archive unpacks to more than ${USER_SCRIPT_SOURCE_LIMITS.maxBytes} bytes`)),\n fs.createWriteStream(target),\n );\n written.push(relativePath);\n });\n } catch (error) {\n if (isUserScriptArchiveError(error)) throw error;\n throw invalid(`cannot unpack the archive: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return written;\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import { UserScriptArchiveError } from './UserScriptArchiveError';
2
+ /** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */
3
+ export declare const isUserScriptArchiveError: (error: unknown) => error is UserScriptArchiveError;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isUserScriptArchiveError = void 0;
4
+ /** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */
5
+ const isUserScriptArchiveError = (error) => error instanceof Error && error.name === 'UserScriptArchiveError';
6
+ exports.isUserScriptArchiveError = isUserScriptArchiveError;
7
+ //# sourceMappingURL=isUserScriptArchiveError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isUserScriptArchiveError.js","sourceRoot":"","sources":["../../../../src/actionProcessor/logic/isUserScriptArchiveError.ts"],"names":[],"mappings":";;;AAEA,4HAA4H;AACrH,MAAM,wBAAwB,GAAG,CAAC,KAAc,EAAmC,EAAE,CAC1F,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB,CAAC;AADvD,QAAA,wBAAwB,4BAC+B","sourcesContent":["import { UserScriptArchiveError } from './UserScriptArchiveError';\n\n/** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */\nexport const isUserScriptArchiveError = (error: unknown): error is UserScriptArchiveError =>\n error instanceof Error && error.name === 'UserScriptArchiveError';\n"]}
@@ -0,0 +1,3 @@
1
+ import { UserScriptBuildError } from './UserScriptBuildError';
2
+ /** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */
3
+ export declare const isUserScriptBuildError: (error: unknown) => error is UserScriptBuildError;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isUserScriptBuildError = void 0;
4
+ /** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */
5
+ const isUserScriptBuildError = (error) => error instanceof Error && error.name === 'UserScriptBuildError';
6
+ exports.isUserScriptBuildError = isUserScriptBuildError;
7
+ //# sourceMappingURL=isUserScriptBuildError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isUserScriptBuildError.js","sourceRoot":"","sources":["../../../src/build/isUserScriptBuildError.ts"],"names":[],"mappings":";;;AAEA,4HAA4H;AACrH,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAiC,EAAE,CACtF,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,CAAC;AADrD,QAAA,sBAAsB,0BAC+B","sourcesContent":["import { UserScriptBuildError } from './UserScriptBuildError';\n\n/** Name-keyed, not instanceof: under npm link or module federation the error can come from another copy of this package. */\nexport const isUserScriptBuildError = (error: unknown): error is UserScriptBuildError =>\n error instanceof Error && error.name === 'UserScriptBuildError';\n"]}
@@ -29,6 +29,7 @@ const requireOrImport = () => __awaiter(void 0, void 0, void 0, function* () {
29
29
  return nodeRequire(entry);
30
30
  }
31
31
  catch (error) {
32
+ // Deliberate: an ESM-only rspack cannot be required, so the same entry is imported instead; any other failure propagates.
32
33
  if (!isRequireEsmError(error))
33
34
  throw error;
34
35
  return importByUrl((0, url_1.pathToFileURL)(entry).href);
@@ -1 +1 @@
1
- {"version":3,"file":"loadRspackModule.js","sourceRoot":"","sources":["../../../src/build/loadRspackModule.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAuC;AACvC,6BAAoC;AAOpC,sFAAsF;AACtF,+DAA+D;AAC/D,MAAM,uBAAuB,GAAG,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;AAEhF,0FAA0F;AAC1F,wFAAwF;AACxF,MAAM,cAAc,GAAG,GAAgB,EAAE,CAAC,CAAC,OAAO,uBAAuB,KAAK,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAA,sBAAa,EAAC,UAAU,CAAC,CAAC,CAAC;AAEhJ,sFAAsF;AACtF,+DAA+D;AAC/D,MAAM,WAAW,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAA2C,CAAC;AAExG,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAW,EAAE,WAAC,OAAA,uBAAuB,CAAC,QAAQ,CAAC,MAAC,KAA2B,aAA3B,KAAK,uBAAL,KAAK,CAAwB,IAAI,mCAAI,EAAE,CAAC,CAAA,EAAA,CAAC;AAElI,MAAM,eAAe,GAAG,GAAgC,EAAE;IACxD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,KAAK,CAAiB,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC;QAC3C,OAAO,WAAW,CAAC,IAAA,mBAAa,EAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,IAAI,OAA0C,CAAC;AAE/C;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,GAA0B,EAAE;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,eAAe,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AALW,QAAA,gBAAgB,oBAK3B","sourcesContent":["import { createRequire } from 'module';\nimport { pathToFileURL } from 'url';\n\nexport type RspackModule = typeof import('@rspack/core');\n\n// The bundler's escape hatch for the host's real `require`; undefined outside a bundle.\ndeclare const __non_webpack_require__: NodeRequire | undefined;\n\n// Node refuses require() of an ES module on versions before 22.12, or when the module\n// graph awaits at top level; both mean \"use import() instead\".\nconst REQUIRE_ESM_ERROR_CODES = ['ERR_REQUIRE_ESM', 'ERR_REQUIRE_ASYNC_MODULE'];\n\n// Inside a bundle `require` is the bundler's own and cannot see a layer-provided package;\n// Node's real require can, and honours NODE_PATH, which is how a lambda layer is found.\nconst getNodeRequire = (): NodeRequire => (typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : createRequire(__filename));\n\n// Built at run time so neither tsc (which rewrites a literal import() to require() in\n// CommonJS output) nor the bundler can turn it into a require.\nconst importByUrl = new Function('url', 'return import(url)') as (url: string) => Promise<RspackModule>;\n\nconst isRequireEsmError = (error: unknown): boolean => REQUIRE_ESM_ERROR_CODES.includes((error as { code?: string })?.code ?? '');\n\nconst requireOrImport = async (): Promise<RspackModule> => {\n const nodeRequire = getNodeRequire();\n const entry = nodeRequire.resolve('@rspack/core');\n\n try {\n return nodeRequire(entry) as RspackModule;\n } catch (error) {\n if (!isRequireEsmError(error)) throw error;\n return importByUrl(pathToFileURL(entry).href);\n }\n};\n\nlet loading: Promise<RspackModule> | undefined;\n\n/**\n * Loads @rspack/core, which ships as ES modules only, from CommonJS code that may be\n * bundled and running on a lambda with rspack on a layer: resolve the entry with Node's\n * require (NODE_PATH aware), require it where Node allows that, otherwise import it by\n * file URL. Loaded once per process.\n */\nexport const loadRspackModule = (): Promise<RspackModule> => {\n if (!loading) {\n loading = requireOrImport();\n }\n return loading;\n};\n"]}
1
+ {"version":3,"file":"loadRspackModule.js","sourceRoot":"","sources":["../../../src/build/loadRspackModule.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAuC;AACvC,6BAAoC;AAOpC,sFAAsF;AACtF,+DAA+D;AAC/D,MAAM,uBAAuB,GAAG,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;AAEhF,0FAA0F;AAC1F,wFAAwF;AACxF,MAAM,cAAc,GAAG,GAAgB,EAAE,CAAC,CAAC,OAAO,uBAAuB,KAAK,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAA,sBAAa,EAAC,UAAU,CAAC,CAAC,CAAC;AAEhJ,sFAAsF;AACtF,+DAA+D;AAC/D,MAAM,WAAW,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAA2C,CAAC;AAExG,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAW,EAAE,WAAC,OAAA,uBAAuB,CAAC,QAAQ,CAAC,MAAC,KAA2B,aAA3B,KAAK,uBAAL,KAAK,CAAwB,IAAI,mCAAI,EAAE,CAAC,CAAA,EAAA,CAAC;AAElI,MAAM,eAAe,GAAG,GAAgC,EAAE;IACxD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,KAAK,CAAiB,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0HAA0H;QAC1H,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC;QAC3C,OAAO,WAAW,CAAC,IAAA,mBAAa,EAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,IAAI,OAA0C,CAAC;AAE/C;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,GAA0B,EAAE;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,eAAe,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AALW,QAAA,gBAAgB,oBAK3B","sourcesContent":["import { createRequire } from 'module';\nimport { pathToFileURL } from 'url';\n\nexport type RspackModule = typeof import('@rspack/core');\n\n// The bundler's escape hatch for the host's real `require`; undefined outside a bundle.\ndeclare const __non_webpack_require__: NodeRequire | undefined;\n\n// Node refuses require() of an ES module on versions before 22.12, or when the module\n// graph awaits at top level; both mean \"use import() instead\".\nconst REQUIRE_ESM_ERROR_CODES = ['ERR_REQUIRE_ESM', 'ERR_REQUIRE_ASYNC_MODULE'];\n\n// Inside a bundle `require` is the bundler's own and cannot see a layer-provided package;\n// Node's real require can, and honours NODE_PATH, which is how a lambda layer is found.\nconst getNodeRequire = (): NodeRequire => (typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : createRequire(__filename));\n\n// Built at run time so neither tsc (which rewrites a literal import() to require() in\n// CommonJS output) nor the bundler can turn it into a require.\nconst importByUrl = new Function('url', 'return import(url)') as (url: string) => Promise<RspackModule>;\n\nconst isRequireEsmError = (error: unknown): boolean => REQUIRE_ESM_ERROR_CODES.includes((error as { code?: string })?.code ?? '');\n\nconst requireOrImport = async (): Promise<RspackModule> => {\n const nodeRequire = getNodeRequire();\n const entry = nodeRequire.resolve('@rspack/core');\n\n try {\n return nodeRequire(entry) as RspackModule;\n } catch (error) {\n // Deliberate: an ESM-only rspack cannot be required, so the same entry is imported instead; any other failure propagates.\n if (!isRequireEsmError(error)) throw error;\n return importByUrl(pathToFileURL(entry).href);\n }\n};\n\nlet loading: Promise<RspackModule> | undefined;\n\n/**\n * Loads @rspack/core, which ships as ES modules only, from CommonJS code that may be\n * bundled and running on a lambda with rspack on a layer: resolve the entry with Node's\n * require (NODE_PATH aware), require it where Node allows that, otherwise import it by\n * file URL. Loaded once per process.\n */\nexport const loadRspackModule = (): Promise<RspackModule> => {\n if (!loading) {\n loading = requireOrImport();\n }\n return loading;\n};\n"]}
@@ -9,8 +9,8 @@ const core_1 = require("@qpqjs/core");
9
9
  */
10
10
  const defineUserScriptBuilder = () => (0, core_1.defineActionProcessors)({
11
11
  basePath: __dirname,
12
- relativePath: '../actionProcessor/getUserScriptBuildActionProcessors',
13
- functionName: 'getUserScriptBuildActionProcessors',
12
+ relativePath: '../actionProcessor/getUserScriptBuilderActionProcessor',
13
+ functionName: 'getUserScriptBuilderActionProcessor',
14
14
  });
15
15
  exports.defineUserScriptBuilder = defineUserScriptBuilder;
16
16
  //# sourceMappingURL=defineUserScriptBuilder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defineUserScriptBuilder.js","sourceRoot":"","sources":["../../../src/config/defineUserScriptBuilder.ts"],"names":[],"mappings":";;;AAAA,sCAAuF;AAEvF;;;;GAIG;AACI,MAAM,uBAAuB,GAAG,GAAqC,EAAE,CAC5E,IAAA,6BAAsB,EAAC;IACrB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,uDAAuD;IACrE,YAAY,EAAE,oCAAoC;CACnD,CAAC,CAAC;AALQ,QAAA,uBAAuB,2BAK/B","sourcesContent":["import { ActionProcessorsQPQConfigSetting, defineActionProcessors } from '@qpqjs/core';\n\n/**\n * Registers the askUserScriptBuild processor on a service. Only services that call this\n * can build user scripts, and only they load rspack; on lambda they also need the layer\n * from getUserScriptBuilderApiLayer.\n */\nexport const defineUserScriptBuilder = (): ActionProcessorsQPQConfigSetting =>\n defineActionProcessors({\n basePath: __dirname,\n relativePath: '../actionProcessor/getUserScriptBuildActionProcessors',\n functionName: 'getUserScriptBuildActionProcessors',\n });\n"]}
1
+ {"version":3,"file":"defineUserScriptBuilder.js","sourceRoot":"","sources":["../../../src/config/defineUserScriptBuilder.ts"],"names":[],"mappings":";;;AAAA,sCAAuF;AAEvF;;;;GAIG;AACI,MAAM,uBAAuB,GAAG,GAAqC,EAAE,CAC5E,IAAA,6BAAsB,EAAC;IACrB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,wDAAwD;IACtE,YAAY,EAAE,qCAAqC;CACpD,CAAC,CAAC;AALQ,QAAA,uBAAuB,2BAK/B","sourcesContent":["import { ActionProcessorsQPQConfigSetting, defineActionProcessors } from '@qpqjs/core';\n\n/**\n * Registers the askUserScriptBuild processor on a service. Only services that call this\n * can build user scripts, and only they load rspack; on lambda they also need the layer\n * from getUserScriptBuilderApiLayer.\n */\nexport const defineUserScriptBuilder = (): ActionProcessorsQPQConfigSetting =>\n defineActionProcessors({\n basePath: __dirname,\n relativePath: '../actionProcessor/getUserScriptBuilderActionProcessor',\n functionName: 'getUserScriptBuilderActionProcessor',\n });\n"]}
@@ -1,7 +1,5 @@
1
1
  import { loadUserScriptHostModules } from '@qpqjs/actionprocessor-node';
2
- import { actionResult, actionResultError, askFileListDirectory, askFileReadTextContents, askUserScriptBuild, createActionProcessor, createNestedRuntime, QpqRuntimeType, } from '@qpqjs/core';
3
- import { randomUUID } from 'crypto';
4
- import { UserScriptBuildError } from '../build/UserScriptBuildError';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, askFileListDirectory, askFileReadTextContents, askUserScriptBuild, createActionProcessor, createNestedRuntime, generateUuid, getDateNow, QpqRuntimeType, storyResultToActionResult, } from '@qpqjs/core';
5
3
  import { askUserScriptCheckPublishedOutput } from './logic/askUserScriptCheckPublishedOutput';
6
4
  import { askUserScriptCollectSource } from './logic/askUserScriptCollectSource';
7
5
  import { askUserScriptPublishOutput } from './logic/askUserScriptPublishOutput';
@@ -9,7 +7,6 @@ import { buildUserScriptInTempDir } from './logic/buildUserScriptInTempDir';
9
7
  import { getUserScriptBuildErrorType } from './logic/getUserScriptBuildErrorType';
10
8
  import { materialiseUserScriptSource } from './logic/materialiseUserScriptSource';
11
9
  const { errorType } = askUserScriptBuild;
12
- const getDateNow = () => new Date().toISOString();
13
10
  // Drive failures while collecting the source, re-labelled into this action's catalog; any
14
11
  // other failure passes through with its own type.
15
12
  const COLLECT_ERROR_TYPES = {
@@ -20,7 +17,7 @@ const COLLECT_ERROR_TYPES = {
20
17
  };
21
18
  const getProcessBuild = (qpqConfig) => {
22
19
  return async (payload, session, actionProcessors, logger, updateSession, dynamicModuleLoader, streamRegistry) => {
23
- const resolveStory = createNestedRuntime(qpqConfig, session, actionProcessors, getDateNow, logger, randomUUID, QpqRuntimeType.EXECUTE_STORY, dynamicModuleLoader, undefined, [], streamRegistry);
20
+ const resolveStory = createNestedRuntime(qpqConfig, session, actionProcessors, getDateNow, logger, generateUuid, QpqRuntimeType.EXECUTE_STORY, dynamicModuleLoader, undefined, [], streamRegistry);
24
21
  // The source and the output both travel through the file actions, so each runtime's
25
22
  // own drive implementation serves them; only the build itself touches local disk.
26
23
  const collected = await resolveStory(() => askUserScriptCollectSource(payload.drive, payload.sourceDirectory, payload.scope), []);
@@ -35,19 +32,18 @@ const getProcessBuild = (qpqConfig) => {
35
32
  built = await buildUserScriptInTempDir((projectDir) => materialiseUserScriptSource(projectDir, collected.result), payload.sourceMap, hostModules);
36
33
  }
37
34
  catch (error) {
38
- if (error instanceof UserScriptBuildError) {
39
- return actionResultError(getUserScriptBuildErrorType(error.code, errorType), error.message);
40
- }
41
- throw error;
35
+ return actionResultErrorFromCaughtError(error, {
36
+ UserScriptBuildError: (error) => actionResultError(getUserScriptBuildErrorType(error.code, errorType), error.message),
37
+ });
42
38
  }
43
39
  const published = await resolveStory(() => askUserScriptPublishOutput(payload.drive, payload.outputFilepath, built.script, payload.scope), []);
44
40
  if (published.error) {
45
- return actionResultError(published.error.errorType, published.error.errorText);
41
+ return storyResultToActionResult(published, 'UserScript Build publish');
46
42
  }
47
43
  // The output contract is judged where the script's top-level code cannot reach the host.
48
44
  const checked = await resolveStory(() => askUserScriptCheckPublishedOutput(payload.drive, payload.outputFilepath, payload.scope, errorType), []);
49
45
  if (checked.error) {
50
- return actionResultError(checked.error.errorType, checked.error.errorText);
46
+ return storyResultToActionResult(checked, 'UserScript Build check output');
51
47
  }
52
48
  return actionResult({ exports: checked.result });
53
49
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getUserScriptBuildActionProcessor.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuildActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadUserScriptHostModules } from '@qpqjs/actionprocessor-node';\nimport {\n ActionProcessorList,\n actionResult,\n actionResultError,\n askFileListDirectory,\n askFileReadTextContents,\n askUserScriptBuild,\n createActionProcessor,\n createNestedRuntime,\n DynamicModuleLoader,\n ProcessorFor,\n QPQConfig,\n QpqLogger,\n QpqRuntimeType,\n StorySession,\n StorySessionUpdater,\n StreamRegistry,\n UserScriptBuildActionPayload,\n} from '@qpqjs/core';\n\nimport { randomUUID } from 'crypto';\n\nimport { UserScriptBuildError } from '../build/UserScriptBuildError';\nimport { askUserScriptCheckPublishedOutput } from './logic/askUserScriptCheckPublishedOutput';\nimport { askUserScriptCollectSource } from './logic/askUserScriptCollectSource';\nimport { askUserScriptPublishOutput } from './logic/askUserScriptPublishOutput';\nimport { buildUserScriptInTempDir } from './logic/buildUserScriptInTempDir';\nimport { BuiltUserScript } from './logic/BuiltUserScript';\nimport { getUserScriptBuildErrorType } from './logic/getUserScriptBuildErrorType';\nimport { materialiseUserScriptSource } from './logic/materialiseUserScriptSource';\n\nconst { errorType } = askUserScriptBuild;\n\nconst getDateNow = () => new Date().toISOString();\n\n// Drive failures while collecting the source, re-labelled into this action's catalog; any\n// other failure passes through with its own type.\nconst COLLECT_ERROR_TYPES: Record<string, string> = {\n [askFileListDirectory.errorType.DirectoryNotFound]: errorType.SourceNotFound,\n [askFileListDirectory.errorType.DriveNotFound]: errorType.DriveNotFound,\n [askFileListDirectory.errorType.InvalidScope]: errorType.InvalidScope,\n [askFileReadTextContents.errorType.InvalidScope]: errorType.InvalidScope,\n};\n\nconst getProcessBuild = (qpqConfig: QPQConfig): ProcessorFor<typeof askUserScriptBuild> => {\n return async (\n payload: UserScriptBuildActionPayload,\n session: StorySession,\n actionProcessors: ActionProcessorList,\n logger: QpqLogger,\n updateSession: StorySessionUpdater,\n dynamicModuleLoader: DynamicModuleLoader,\n streamRegistry: StreamRegistry,\n ) => {\n const resolveStory = createNestedRuntime(\n qpqConfig,\n session,\n actionProcessors,\n getDateNow,\n logger,\n randomUUID,\n QpqRuntimeType.EXECUTE_STORY,\n dynamicModuleLoader,\n undefined,\n [],\n streamRegistry,\n );\n\n // The source and the output both travel through the file actions, so each runtime's\n // own drive implementation serves them; only the build itself touches local disk.\n const collected = await resolveStory(() => askUserScriptCollectSource(payload.drive, payload.sourceDirectory, payload.scope), []);\n if (collected.error) {\n return actionResultError(COLLECT_ERROR_TYPES[collected.error.errorType] ?? collected.error.errorType, collected.error.errorText);\n }\n\n // The service's own script modules, which the bundler keeps external. One that does not\n // load is the service's fault, so it throws rather than failing the build.\n const hostModules = await loadUserScriptHostModules(qpqConfig, dynamicModuleLoader);\n\n let built: BuiltUserScript;\n try {\n built = await buildUserScriptInTempDir(\n (projectDir) => materialiseUserScriptSource(projectDir, collected.result),\n payload.sourceMap,\n hostModules,\n );\n } catch (error) {\n if (error instanceof UserScriptBuildError) {\n return actionResultError(getUserScriptBuildErrorType(error.code, errorType), error.message);\n }\n throw error;\n }\n\n const published = await resolveStory(() => askUserScriptPublishOutput(payload.drive, payload.outputFilepath, built.script, payload.scope), []);\n if (published.error) {\n return actionResultError(published.error.errorType, published.error.errorText);\n }\n\n // The output contract is judged where the script's top-level code cannot reach the host.\n const checked = await resolveStory(() => askUserScriptCheckPublishedOutput(payload.drive, payload.outputFilepath, payload.scope, errorType), []);\n if (checked.error) {\n return actionResultError(checked.error.errorType, checked.error.errorText);\n }\n\n return actionResult({ exports: checked.result });\n };\n};\n\nexport const getUserScriptBuildActionProcessor = createActionProcessor(askUserScriptBuild, getProcessBuild);\n"]}
1
+ {"version":3,"file":"getUserScriptBuildActionProcessor.js","sourceRoot":"","sources":["../../../src/actionProcessor/getUserScriptBuildActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gCAAgC,EAChC,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,UAAU,EAGV,cAAc,EACd,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,iCAAiC,EAAE,MAAM,2CAA2C,CAAC;AAC9F,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAElF,MAAM,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC;AAEzC,0FAA0F;AAC1F,kDAAkD;AAClD,MAAM,mBAAmB,GAA2B;IAClD,CAAC,oBAAoB,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAAC,cAAc;IAC5E,CAAC,oBAAoB,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC,aAAa;IACvE,CAAC,oBAAoB,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,YAAY;IACrE,CAAC,uBAAuB,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,YAAY;CACzE,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,SAAoB,EAA2C,EAAE;IACxF,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,EAAE;QAC9G,MAAM,YAAY,GAAG,mBAAmB,CACtC,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,YAAY,EACZ,cAAc,CAAC,aAAa,EAC5B,mBAAmB,EACnB,SAAS,EACT,EAAE,EACF,cAAc,CACf,CAAC;QAEF,oFAAoF;QACpF,kFAAkF;QAClF,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,0BAA0B,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAClI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,iBAAiB,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnI,CAAC;QAED,wFAAwF;QACxF,2EAA2E;QAC3E,MAAM,WAAW,GAAG,MAAM,yBAAyB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAEpF,IAAI,KAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,wBAAwB,CACpC,CAAC,UAAU,EAAE,EAAE,CAAC,2BAA2B,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,EACzE,OAAO,CAAC,SAAS,EACjB,WAAW,CACZ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,gCAAgC,CAAC,KAAK,EAAE;gBAC7C,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC9B,iBAAiB,CAAC,2BAA2B,CAAE,KAA8B,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;aACjH,CAAC,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,0BAA0B,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/I,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,yBAAyB,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;QAC1E,CAAC;QAED,yFAAyF;QACzF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,iCAAiC,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QACjJ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,yBAAyB,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAAG,qBAAqB,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC","sourcesContent":["import { loadUserScriptHostModules } from '@qpqjs/actionprocessor-node';\nimport {\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n askFileListDirectory,\n askFileReadTextContents,\n askUserScriptBuild,\n createActionProcessor,\n createNestedRuntime,\n generateUuid,\n getDateNow,\n ProcessorFor,\n QPQConfig,\n QpqRuntimeType,\n storyResultToActionResult,\n} from '@qpqjs/core';\n\nimport { UserScriptBuildError } from '../build/UserScriptBuildError';\nimport { askUserScriptCheckPublishedOutput } from './logic/askUserScriptCheckPublishedOutput';\nimport { askUserScriptCollectSource } from './logic/askUserScriptCollectSource';\nimport { askUserScriptPublishOutput } from './logic/askUserScriptPublishOutput';\nimport { buildUserScriptInTempDir } from './logic/buildUserScriptInTempDir';\nimport { BuiltUserScript } from './logic/BuiltUserScript';\nimport { getUserScriptBuildErrorType } from './logic/getUserScriptBuildErrorType';\nimport { materialiseUserScriptSource } from './logic/materialiseUserScriptSource';\n\nconst { errorType } = askUserScriptBuild;\n\n// Drive failures while collecting the source, re-labelled into this action's catalog; any\n// other failure passes through with its own type.\nconst COLLECT_ERROR_TYPES: Record<string, string> = {\n [askFileListDirectory.errorType.DirectoryNotFound]: errorType.SourceNotFound,\n [askFileListDirectory.errorType.DriveNotFound]: errorType.DriveNotFound,\n [askFileListDirectory.errorType.InvalidScope]: errorType.InvalidScope,\n [askFileReadTextContents.errorType.InvalidScope]: errorType.InvalidScope,\n};\n\nconst getProcessBuild = (qpqConfig: QPQConfig): ProcessorFor<typeof askUserScriptBuild> => {\n return async (payload, session, actionProcessors, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const resolveStory = createNestedRuntime(\n qpqConfig,\n session,\n actionProcessors,\n getDateNow,\n logger,\n generateUuid,\n QpqRuntimeType.EXECUTE_STORY,\n dynamicModuleLoader,\n undefined,\n [],\n streamRegistry,\n );\n\n // The source and the output both travel through the file actions, so each runtime's\n // own drive implementation serves them; only the build itself touches local disk.\n const collected = await resolveStory(() => askUserScriptCollectSource(payload.drive, payload.sourceDirectory, payload.scope), []);\n if (collected.error) {\n return actionResultError(COLLECT_ERROR_TYPES[collected.error.errorType] ?? collected.error.errorType, collected.error.errorText);\n }\n\n // The service's own script modules, which the bundler keeps external. One that does not\n // load is the service's fault, so it throws rather than failing the build.\n const hostModules = await loadUserScriptHostModules(qpqConfig, dynamicModuleLoader);\n\n let built: BuiltUserScript;\n try {\n built = await buildUserScriptInTempDir(\n (projectDir) => materialiseUserScriptSource(projectDir, collected.result),\n payload.sourceMap,\n hostModules,\n );\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n UserScriptBuildError: (error) =>\n actionResultError(getUserScriptBuildErrorType((error as UserScriptBuildError).code, errorType), error.message),\n });\n }\n\n const published = await resolveStory(() => askUserScriptPublishOutput(payload.drive, payload.outputFilepath, built.script, payload.scope), []);\n if (published.error) {\n return storyResultToActionResult(published, 'UserScript Build publish');\n }\n\n // The output contract is judged where the script's top-level code cannot reach the host.\n const checked = await resolveStory(() => askUserScriptCheckPublishedOutput(payload.drive, payload.outputFilepath, payload.scope, errorType), []);\n if (checked.error) {\n return storyResultToActionResult(checked, 'UserScript Build check output');\n }\n\n return actionResult({ exports: checked.result });\n };\n};\n\nexport const getUserScriptBuildActionProcessor = createActionProcessor(askUserScriptBuild, getProcessBuild);\n"]}