@bluelibs/runner 5.0.0 → 5.1.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.
@@ -166,6 +166,9 @@ var symbolPhantomTask = Symbol.for(
166
166
  "runner.task.phantom"
167
167
  );
168
168
  var symbolResource = Symbol.for("runner.resource");
169
+ var symbolResourceForkedFrom = Symbol.for(
170
+ "runner.resourceForkedFrom"
171
+ );
169
172
  var symbolResourceWithConfig = Symbol.for(
170
173
  "runner.resourceWithConfig"
171
174
  );
@@ -898,6 +901,7 @@ __export(defs_exports, {
898
901
  symbolOptionalDependency: () => symbolOptionalDependency,
899
902
  symbolPhantomTask: () => symbolPhantomTask,
900
903
  symbolResource: () => symbolResource,
904
+ symbolResourceForkedFrom: () => symbolResourceForkedFrom,
901
905
  symbolResourceMiddleware: () => symbolResourceMiddleware,
902
906
  symbolResourceWithConfig: () => symbolResourceWithConfig,
903
907
  symbolTag: () => symbolTag,
@@ -1064,6 +1068,188 @@ function defineHook(hookDef) {
1064
1068
  }
1065
1069
  __name(defineHook, "defineHook");
1066
1070
 
1071
+ // src/definers/resourceFork.ts
1072
+ function resolveReId(forkId, options) {
1073
+ const fallback = /* @__PURE__ */ __name((id2) => `${forkId}.${id2}`, "fallback");
1074
+ const reId = options?.reId ?? fallback;
1075
+ return (id2) => {
1076
+ const next = reId(id2);
1077
+ if (typeof next !== "string" || next.length === 0) {
1078
+ throw new Error(`fork(reId) must return a non-empty string for "${id2}"`);
1079
+ }
1080
+ return next;
1081
+ };
1082
+ }
1083
+ __name(resolveReId, "resolveReId");
1084
+ function remapResourceDependenciesInObject(deps, options) {
1085
+ const remapObject = /* @__PURE__ */ __name((deps2) => {
1086
+ const out = { ...deps2 };
1087
+ for (const [key, value] of Object.entries(deps2)) {
1088
+ if (isOptional(value)) {
1089
+ const inner = value.inner;
1090
+ if (isResource(inner)) {
1091
+ const forked = options.getForkedResourceByBaseId(inner.id);
1092
+ if (forked) {
1093
+ out[key] = { ...value, inner: forked };
1094
+ }
1095
+ }
1096
+ continue;
1097
+ }
1098
+ if (isResource(value)) {
1099
+ const forked = options.getForkedResourceByBaseId(value.id);
1100
+ if (forked) {
1101
+ out[key] = forked;
1102
+ }
1103
+ }
1104
+ }
1105
+ return out;
1106
+ }, "remapObject");
1107
+ return remapObject(deps);
1108
+ }
1109
+ __name(remapResourceDependenciesInObject, "remapResourceDependenciesInObject");
1110
+ function toResourceOnlyRegisterItems(items) {
1111
+ const out = [];
1112
+ for (const item of items) {
1113
+ if (isResourceWithConfig(item)) {
1114
+ out.push({
1115
+ kind: "withConfig",
1116
+ resource: item.resource,
1117
+ config: item.config
1118
+ });
1119
+ continue;
1120
+ }
1121
+ if (isResource(item)) {
1122
+ out.push({ kind: "resource", resource: item });
1123
+ continue;
1124
+ }
1125
+ }
1126
+ return out;
1127
+ }
1128
+ __name(toResourceOnlyRegisterItems, "toResourceOnlyRegisterItems");
1129
+ function createDeepForkContext(forkId, options) {
1130
+ const reId = resolveReId(forkId, options);
1131
+ const forkedResourceByBaseId = /* @__PURE__ */ new Map();
1132
+ const ensureForked = /* @__PURE__ */ __name((base) => {
1133
+ const cached = forkedResourceByBaseId.get(base.id);
1134
+ if (cached) return cached;
1135
+ const forked = base.fork(reId(base.id), { register: "drop" });
1136
+ forkedResourceByBaseId.set(base.id, forked);
1137
+ const baseRegister = base.register;
1138
+ const ensureForkedForRegisterConfig = /* @__PURE__ */ __name((config) => {
1139
+ const items = typeof baseRegister === "function" ? baseRegister(config) : baseRegister;
1140
+ for (const candidate of toResourceOnlyRegisterItems(items)) {
1141
+ ensureForked(candidate.resource);
1142
+ }
1143
+ return items;
1144
+ }, "ensureForkedForRegisterConfig");
1145
+ const mapRegisterItems2 = /* @__PURE__ */ __name((items) => {
1146
+ const resourceItems = toResourceOnlyRegisterItems(items);
1147
+ const out = [];
1148
+ for (const candidate of resourceItems) {
1149
+ if (candidate.kind === "resource") {
1150
+ out.push(ensureForked(candidate.resource));
1151
+ continue;
1152
+ }
1153
+ out.push(ensureForked(candidate.resource).with(candidate.config));
1154
+ }
1155
+ return out;
1156
+ }, "mapRegisterItems");
1157
+ forked.register = typeof baseRegister === "function" ? (config) => {
1158
+ const items = ensureForkedForRegisterConfig(config);
1159
+ return mapRegisterItems2(items);
1160
+ } : (() => {
1161
+ ensureForkedForRegisterConfig(void 0);
1162
+ return mapRegisterItems2(baseRegister);
1163
+ })();
1164
+ const baseDependencies = base.dependencies;
1165
+ const remapDepsObject = /* @__PURE__ */ __name((deps) => remapResourceDependenciesInObject(deps, {
1166
+ getForkedResourceByBaseId: /* @__PURE__ */ __name((id2) => forkedResourceByBaseId.get(id2), "getForkedResourceByBaseId")
1167
+ }), "remapDepsObject");
1168
+ if (!baseDependencies) {
1169
+ forked.dependencies = baseDependencies;
1170
+ } else {
1171
+ forked.dependencies = (config) => {
1172
+ ensureForkedForRegisterConfig(config);
1173
+ const deps = typeof baseDependencies === "function" ? baseDependencies(config) : baseDependencies;
1174
+ return remapDepsObject(deps);
1175
+ };
1176
+ }
1177
+ return forked;
1178
+ }, "ensureForked");
1179
+ const ensureForkedForRegisterItems = /* @__PURE__ */ __name((items) => {
1180
+ for (const candidate of toResourceOnlyRegisterItems(items)) {
1181
+ ensureForked(candidate.resource);
1182
+ }
1183
+ }, "ensureForkedForRegisterItems");
1184
+ const mapRegisterItems = /* @__PURE__ */ __name((items) => {
1185
+ ensureForkedForRegisterItems(items);
1186
+ const resourceItems = toResourceOnlyRegisterItems(items);
1187
+ const out = [];
1188
+ for (const candidate of resourceItems) {
1189
+ if (candidate.kind === "resource") {
1190
+ out.push(ensureForked(candidate.resource));
1191
+ continue;
1192
+ }
1193
+ out.push(ensureForked(candidate.resource).with(candidate.config));
1194
+ }
1195
+ return out;
1196
+ }, "mapRegisterItems");
1197
+ const remapDependencies = /* @__PURE__ */ __name((dependencies) => {
1198
+ if (!dependencies) return dependencies;
1199
+ const remapObj = /* @__PURE__ */ __name((deps) => remapResourceDependenciesInObject(deps, {
1200
+ getForkedResourceByBaseId: /* @__PURE__ */ __name((id2) => forkedResourceByBaseId.get(id2), "getForkedResourceByBaseId")
1201
+ }), "remapObj");
1202
+ if (typeof dependencies === "function") {
1203
+ return (config) => remapObj(dependencies(config));
1204
+ }
1205
+ return remapObj(dependencies);
1206
+ }, "remapDependencies");
1207
+ return {
1208
+ reId,
1209
+ ensureForkedForRegisterItems,
1210
+ mapRegisterItems,
1211
+ remapDependencies,
1212
+ getForkedResourceByBaseId: /* @__PURE__ */ __name((id2) => forkedResourceByBaseId.get(id2), "getForkedResourceByBaseId")
1213
+ };
1214
+ }
1215
+ __name(createDeepForkContext, "createDeepForkContext");
1216
+ function resolveForkedRegisterAndDependencies(params) {
1217
+ const { register, dependencies, forkId, options } = params;
1218
+ const mode = options?.register ?? "keep";
1219
+ if (mode === "drop") {
1220
+ return { register: [], dependencies };
1221
+ }
1222
+ if (mode !== "deep") {
1223
+ return { register, dependencies };
1224
+ }
1225
+ if (!register) {
1226
+ return { register, dependencies };
1227
+ }
1228
+ const ctx = createDeepForkContext(forkId, options);
1229
+ if (typeof register === "function") {
1230
+ return {
1231
+ register: /* @__PURE__ */ __name((config) => {
1232
+ const baseItems = register(config);
1233
+ return ctx.mapRegisterItems(baseItems);
1234
+ }, "register"),
1235
+ dependencies: dependencies ? (config) => {
1236
+ const baseItems = register(config);
1237
+ ctx.ensureForkedForRegisterItems(baseItems);
1238
+ const baseDeps = typeof dependencies === "function" ? dependencies(config) : dependencies;
1239
+ return remapResourceDependenciesInObject(baseDeps, {
1240
+ getForkedResourceByBaseId: ctx.getForkedResourceByBaseId
1241
+ });
1242
+ } : dependencies
1243
+ };
1244
+ }
1245
+ ctx.ensureForkedForRegisterItems(register);
1246
+ return {
1247
+ register: ctx.mapRegisterItems(register),
1248
+ dependencies: ctx.remapDependencies(dependencies)
1249
+ };
1250
+ }
1251
+ __name(resolveForkedRegisterAndDependencies, "resolveForkedRegisterAndDependencies");
1252
+
1067
1253
  // src/definers/defineResource.ts
1068
1254
  function defineResource(constConfig) {
1069
1255
  const filePath = constConfig[symbolFilePath] || getCallerFile();
@@ -1109,12 +1295,25 @@ function defineResource(constConfig) {
1109
1295
  [symbolOptionalDependency]: true
1110
1296
  };
1111
1297
  },
1112
- fork(newId) {
1113
- return defineResource({
1298
+ fork(newId, options) {
1299
+ const forkedParts = resolveForkedRegisterAndDependencies({
1300
+ register: constConfig.register,
1301
+ dependencies: constConfig.dependencies,
1302
+ forkId: newId,
1303
+ options
1304
+ });
1305
+ const forked = defineResource({
1114
1306
  ...constConfig,
1115
1307
  id: newId,
1308
+ register: forkedParts.register,
1309
+ dependencies: forkedParts.dependencies,
1116
1310
  [symbolFilePath]: filePath
1117
1311
  });
1312
+ forked[symbolResourceForkedFrom] = {
1313
+ fromId: id2,
1314
+ forkedAtFilePath: getCallerFile()
1315
+ };
1316
+ return forked;
1118
1317
  }
1119
1318
  };
1120
1319
  }