@absolutejs/absolute 0.20.0-beta.26 → 0.20.0-beta.28
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.
- package/README.md +22 -1
- package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
- package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
- package/dist/build.js +14 -3
- package/dist/build.js.map +4 -4
- package/dist/cli/index.js +71 -2
- package/dist/dev/client/hmrClient.ts +23 -0
- package/dist/index.js +95 -29
- package/dist/index.js.map +7 -6
- package/dist/mobile/index.js +22 -3
- package/dist/mobile/index.js.map +4 -4
- package/dist/mobile/shellBootstrap.js +12 -0
- package/dist/src/core/devBuild.d.ts +1 -0
- package/dist/src/core/prepare.d.ts +24 -0
- package/dist/src/mobile/androidWebView.d.ts +1 -0
- package/dist/src/mobile/devDeviceAdapter.d.ts +3 -0
- package/dist/src/mobile/deviceCapabilities.d.ts +2 -0
- package/package.json +5 -4
package/dist/cli/index.js
CHANGED
|
@@ -6817,15 +6817,23 @@ var DEVICES_PACKAGE = "@absolutejs/devices", CAPACITOR_ADAPTER = "@absolutejs/de
|
|
|
6817
6817
|
return;
|
|
6818
6818
|
if (!object2(value))
|
|
6819
6819
|
throw new TypeError(`${field} must be an object.`);
|
|
6820
|
-
const {
|
|
6820
|
+
const {
|
|
6821
|
+
privacyAccessedApis,
|
|
6822
|
+
pushNotifications,
|
|
6823
|
+
systemBars,
|
|
6824
|
+
usageDescriptions
|
|
6825
|
+
} = value;
|
|
6821
6826
|
if (pushNotifications !== undefined && pushNotifications !== true)
|
|
6822
6827
|
throw new TypeError(`${field}.pushNotifications must be true.`);
|
|
6828
|
+
if (systemBars !== undefined && systemBars !== true)
|
|
6829
|
+
throw new TypeError(`${field}.systemBars must be true.`);
|
|
6823
6830
|
if (usageDescriptions !== undefined && (!Array.isArray(usageDescriptions) || !usageDescriptions.every((purpose) => typeof purpose === "string" && IOS_USAGE_DESCRIPTIONS.has(purpose))))
|
|
6824
6831
|
throw new TypeError(`${field}.usageDescriptions contains an unsupported purpose.`);
|
|
6825
6832
|
const privacy = iosPrivacyAccessedApis(privacyAccessedApis, `${field}.privacyAccessedApis`);
|
|
6826
6833
|
return {
|
|
6827
6834
|
...privacy === undefined ? {} : { privacyAccessedApis: privacy },
|
|
6828
6835
|
...pushNotifications === true ? { pushNotifications: true } : {},
|
|
6836
|
+
...systemBars === true ? { systemBars: true } : {},
|
|
6829
6837
|
...usageDescriptions === undefined ? {} : { usageDescriptions: [...usageDescriptions] }
|
|
6830
6838
|
};
|
|
6831
6839
|
}, parseProvider = (name, value) => {
|
|
@@ -6882,6 +6890,7 @@ var DEVICES_PACKAGE = "@absolutejs/devices", CAPACITOR_ADAPTER = "@absolutejs/de
|
|
|
6882
6890
|
return reasons ? [{ api, reasons: [...reasons].sort() }] : [];
|
|
6883
6891
|
}),
|
|
6884
6892
|
iosPushNotifications: plan.capabilities.some((name) => plan.providers[name]?.native?.ios?.pushNotifications === true),
|
|
6893
|
+
iosSystemBars: plan.capabilities.some((name) => plan.providers[name]?.native?.ios?.systemBars === true),
|
|
6885
6894
|
iosUsageDescriptions: [
|
|
6886
6895
|
...new Set(plan.capabilities.flatMap((name) => plan.providers[name]?.native?.ios?.usageDescriptions ?? []))
|
|
6887
6896
|
].sort()
|
|
@@ -16717,8 +16726,18 @@ ${next.slice(index)}`;
|
|
|
16717
16726
|
const path = join47(config.nativeProjectDirectory, "ios/App/App/Info.plist");
|
|
16718
16727
|
const source = await readFile12(path, "utf8");
|
|
16719
16728
|
const requirements = absoluteDeviceNativeRequirements(plan);
|
|
16720
|
-
const
|
|
16729
|
+
const existingSystemBars = source.match(/<key>UIViewControllerBasedStatusBarAppearance<\/key>\s*<(true|false)\s*\/>/u);
|
|
16730
|
+
const ownedStart = source.indexOf(START_MARKER2);
|
|
16731
|
+
const ownedEnd = source.indexOf(END_MARKER2);
|
|
16732
|
+
const ownsSystemBars = ownedStart >= 0 && ownedEnd > ownedStart && source.slice(ownedStart, ownedEnd).includes("UIViewControllerBasedStatusBarAppearance");
|
|
16733
|
+
if (requirements.iosSystemBars && existingSystemBars?.[1] === "false" && !ownsSystemBars)
|
|
16734
|
+
throw new TypeError("iOS system bars require UIViewControllerBasedStatusBarAppearance to be true.");
|
|
16735
|
+
const usageContent = requirements.iosUsageDescriptions.map((purpose) => ` <key>${IOS_KEYS[purpose]}</key>
|
|
16721
16736
|
<string>${escapeXml2(iosDescription(config.appName, purpose))}</string>`).join(`
|
|
16737
|
+
`);
|
|
16738
|
+
const systemBarsContent = requirements.iosSystemBars && (existingSystemBars === null || ownsSystemBars) ? ` <key>UIViewControllerBasedStatusBarAppearance</key>
|
|
16739
|
+
<true/>` : "";
|
|
16740
|
+
const content = [usageContent, systemBarsContent].filter(Boolean).join(`
|
|
16722
16741
|
`);
|
|
16723
16742
|
const region = content ? ` ${START_MARKER2}
|
|
16724
16743
|
${content}
|
|
@@ -17441,6 +17460,19 @@ var CDP_COMMAND_TIMEOUT_MS = 1e4, WEBVIEW_ATTACH_TIMEOUT_MS = 30000, WEBVIEW_POL
|
|
|
17441
17460
|
await mkdir11(dirname28(absolutePath), { recursive: true });
|
|
17442
17461
|
await writeFile13(absolutePath, Buffer.from(data, "base64"));
|
|
17443
17462
|
return absolutePath;
|
|
17463
|
+
},
|
|
17464
|
+
tap: async (coordinateX, coordinateY) => {
|
|
17465
|
+
if (!Number.isFinite(coordinateX) || !Number.isFinite(coordinateY) || coordinateX < 0 || coordinateY < 0) {
|
|
17466
|
+
throw new TypeError("Android WebView tap coordinates must be finite non-negative numbers.");
|
|
17467
|
+
}
|
|
17468
|
+
await connection.command("Input.dispatchTouchEvent", {
|
|
17469
|
+
touchPoints: [{ x: coordinateX, y: coordinateY }],
|
|
17470
|
+
type: "touchStart"
|
|
17471
|
+
});
|
|
17472
|
+
await connection.command("Input.dispatchTouchEvent", {
|
|
17473
|
+
touchPoints: [],
|
|
17474
|
+
type: "touchEnd"
|
|
17475
|
+
});
|
|
17444
17476
|
}
|
|
17445
17477
|
};
|
|
17446
17478
|
}, failForward = (error, options, capture, hostPort) => {
|
|
@@ -18144,6 +18176,10 @@ var init_iosTestReport = __esm(() => {
|
|
|
18144
18176
|
["DEV-01", "Record cold and warm bun dev startup timings."],
|
|
18145
18177
|
["DEV-02", "Complete route traversal, HMR, relaunch, and recovery checks."],
|
|
18146
18178
|
["CAP-01", "Complete automatic device-capability provisioning checks."],
|
|
18179
|
+
...Array.from({ length: 8 }, (_, index) => [
|
|
18180
|
+
`SYSUI-${String(index + 1).padStart(2, "0")}`,
|
|
18181
|
+
`Complete provider-neutral Keyboard and System Bars runbook check SYSUI-${String(index + 1).padStart(2, "0")}.`
|
|
18182
|
+
]),
|
|
18147
18183
|
...Array.from({ length: 8 }, (_, index) => [
|
|
18148
18184
|
`FILES-${String(index + 1).padStart(2, "0")}`,
|
|
18149
18185
|
`Complete provider-neutral Documents runbook check FILES-${String(index + 1).padStart(2, "0")}.`
|
|
@@ -18152,6 +18188,10 @@ var init_iosTestReport = __esm(() => {
|
|
|
18152
18188
|
`NOTIF-${String(index + 1).padStart(2, "0")}`,
|
|
18153
18189
|
`Complete provider-neutral Local Notifications runbook check NOTIF-${String(index + 1).padStart(2, "0")}.`
|
|
18154
18190
|
]),
|
|
18191
|
+
...Array.from({ length: 8 }, (_, index) => [
|
|
18192
|
+
`PUSH-${String(index + 1).padStart(2, "0")}`,
|
|
18193
|
+
`Complete provider-neutral Push Notifications runbook check PUSH-${String(index + 1).padStart(2, "0")}.`
|
|
18194
|
+
]),
|
|
18155
18195
|
...Array.from({ length: 14 }, (_, index) => [
|
|
18156
18196
|
`LOC-${String(index + 1).padStart(2, "0")}`,
|
|
18157
18197
|
`Complete foreground-location runbook check LOC-${String(index + 1).padStart(2, "0")} without recording exact coordinates.`
|
|
@@ -18213,6 +18253,35 @@ var init_androidTestReport = __esm(() => {
|
|
|
18213
18253
|
["DEV-01", "Record cold and warm native startup timings."],
|
|
18214
18254
|
["DEV-02", "Complete route traversal, HMR, relaunch, and recovery checks."],
|
|
18215
18255
|
["CAP-01", "Complete automatic device-capability provisioning checks."],
|
|
18256
|
+
[
|
|
18257
|
+
"SYSUI-01",
|
|
18258
|
+
"Confirm Keyboard and System Bars are provisioned automatically."
|
|
18259
|
+
],
|
|
18260
|
+
[
|
|
18261
|
+
"SYSUI-02",
|
|
18262
|
+
"Confirm the web fallback reports provider-neutral capabilities."
|
|
18263
|
+
],
|
|
18264
|
+
["SYSUI-03", "Confirm the real WebView selects the native adapters."],
|
|
18265
|
+
[
|
|
18266
|
+
"SYSUI-04",
|
|
18267
|
+
"Open and dismiss the native keyboard five times without stale state."
|
|
18268
|
+
],
|
|
18269
|
+
[
|
|
18270
|
+
"SYSUI-05",
|
|
18271
|
+
"Confirm light and dark foreground choices reach both Android system bars."
|
|
18272
|
+
],
|
|
18273
|
+
[
|
|
18274
|
+
"SYSUI-06",
|
|
18275
|
+
"Hide and restore system bars and confirm restored content remains inside the safe area."
|
|
18276
|
+
],
|
|
18277
|
+
[
|
|
18278
|
+
"SYSUI-07",
|
|
18279
|
+
"Rotate and relaunch while preserving the route and native adapters."
|
|
18280
|
+
],
|
|
18281
|
+
[
|
|
18282
|
+
"SYSUI-08",
|
|
18283
|
+
"Apply a System UI component edit through native HMR and record its timing."
|
|
18284
|
+
],
|
|
18216
18285
|
[
|
|
18217
18286
|
"FILES-01",
|
|
18218
18287
|
"Complete provider-neutral file pick, export, open, and cleanup checks."
|
|
@@ -46,6 +46,29 @@ const isStringRecord = (value: unknown): value is Record<string, string> =>
|
|
|
46
46
|
Object.values(value).every((entry) => typeof entry === 'string');
|
|
47
47
|
|
|
48
48
|
restoreAbsoluteHmrApply();
|
|
49
|
+
const nativeDeviceAdapterPath = '/__absolute/native-device-adapter.js';
|
|
50
|
+
const nativeDeviceAdapterReady =
|
|
51
|
+
absoluteHmrClientTarget() === 'web'
|
|
52
|
+
? Promise.resolve()
|
|
53
|
+
: import(nativeDeviceAdapterPath).then(() => undefined);
|
|
54
|
+
Reflect.set(
|
|
55
|
+
globalThis,
|
|
56
|
+
'__ABS_NATIVE_DEVICES_READY__',
|
|
57
|
+
nativeDeviceAdapterReady
|
|
58
|
+
);
|
|
59
|
+
Reflect.set(globalThis, '__ABS_NATIVE_DEVICES_READY_STATE__', 'loading');
|
|
60
|
+
void nativeDeviceAdapterReady.then(
|
|
61
|
+
() => {
|
|
62
|
+
Reflect.set(globalThis, '__ABS_NATIVE_DEVICES_READY_STATE__', 'ready');
|
|
63
|
+
},
|
|
64
|
+
(error) => {
|
|
65
|
+
Reflect.set(globalThis, '__ABS_NATIVE_DEVICES_READY_STATE__', 'failed');
|
|
66
|
+
console.error(
|
|
67
|
+
'[Absolute Mobile] Native device adapter failed to load:',
|
|
68
|
+
error
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
);
|
|
49
72
|
const removeNativeSyncDevtools =
|
|
50
73
|
absoluteHmrClientTarget() === 'web'
|
|
51
74
|
? () => undefined
|
package/dist/index.js
CHANGED
|
@@ -13257,15 +13257,23 @@ var DEVICES_PACKAGE = "@absolutejs/devices", CAPACITOR_ADAPTER = "@absolutejs/de
|
|
|
13257
13257
|
return;
|
|
13258
13258
|
if (!object(value))
|
|
13259
13259
|
throw new TypeError(`${field} must be an object.`);
|
|
13260
|
-
const {
|
|
13260
|
+
const {
|
|
13261
|
+
privacyAccessedApis,
|
|
13262
|
+
pushNotifications,
|
|
13263
|
+
systemBars,
|
|
13264
|
+
usageDescriptions
|
|
13265
|
+
} = value;
|
|
13261
13266
|
if (pushNotifications !== undefined && pushNotifications !== true)
|
|
13262
13267
|
throw new TypeError(`${field}.pushNotifications must be true.`);
|
|
13268
|
+
if (systemBars !== undefined && systemBars !== true)
|
|
13269
|
+
throw new TypeError(`${field}.systemBars must be true.`);
|
|
13263
13270
|
if (usageDescriptions !== undefined && (!Array.isArray(usageDescriptions) || !usageDescriptions.every((purpose) => typeof purpose === "string" && IOS_USAGE_DESCRIPTIONS.has(purpose))))
|
|
13264
13271
|
throw new TypeError(`${field}.usageDescriptions contains an unsupported purpose.`);
|
|
13265
13272
|
const privacy = iosPrivacyAccessedApis(privacyAccessedApis, `${field}.privacyAccessedApis`);
|
|
13266
13273
|
return {
|
|
13267
13274
|
...privacy === undefined ? {} : { privacyAccessedApis: privacy },
|
|
13268
13275
|
...pushNotifications === true ? { pushNotifications: true } : {},
|
|
13276
|
+
...systemBars === true ? { systemBars: true } : {},
|
|
13269
13277
|
...usageDescriptions === undefined ? {} : { usageDescriptions: [...usageDescriptions] }
|
|
13270
13278
|
};
|
|
13271
13279
|
}, parseProvider = (name, value) => {
|
|
@@ -13322,6 +13330,7 @@ var DEVICES_PACKAGE = "@absolutejs/devices", CAPACITOR_ADAPTER = "@absolutejs/de
|
|
|
13322
13330
|
return reasons ? [{ api, reasons: [...reasons].sort() }] : [];
|
|
13323
13331
|
}),
|
|
13324
13332
|
iosPushNotifications: plan.capabilities.some((name) => plan.providers[name]?.native?.ios?.pushNotifications === true),
|
|
13333
|
+
iosSystemBars: plan.capabilities.some((name) => plan.providers[name]?.native?.ios?.systemBars === true),
|
|
13325
13334
|
iosUsageDescriptions: [
|
|
13326
13335
|
...new Set(plan.capabilities.flatMap((name) => plan.providers[name]?.native?.ios?.usageDescriptions ?? []))
|
|
13327
13336
|
].sort()
|
|
@@ -29884,6 +29893,7 @@ var init_buildDepVendor = __esm(() => {
|
|
|
29884
29893
|
var exports_devBuild = {};
|
|
29885
29894
|
__export(exports_devBuild, {
|
|
29886
29895
|
devBuild: () => devBuild,
|
|
29896
|
+
collectDepVendorSourceDirs: () => collectDepVendorSourceDirs,
|
|
29887
29897
|
applyConfigChanges: () => applyConfigChanges
|
|
29888
29898
|
});
|
|
29889
29899
|
import { readdir as readdir6 } from "fs/promises";
|
|
@@ -29896,7 +29906,8 @@ var FRAMEWORK_DIR_KEYS, collectDepVendorSourceDirs = (config) => {
|
|
|
29896
29906
|
config.vueDirectory,
|
|
29897
29907
|
config.angularDirectory,
|
|
29898
29908
|
config.htmlDirectory,
|
|
29899
|
-
config.htmxDirectory
|
|
29909
|
+
config.htmxDirectory,
|
|
29910
|
+
resolve47(import.meta.dir, "../dev/client")
|
|
29900
29911
|
].filter((dir) => Boolean(dir));
|
|
29901
29912
|
return Array.from(new Set(configuredDirs));
|
|
29902
29913
|
}, parseDirectoryConfig = (source) => {
|
|
@@ -30896,6 +30907,53 @@ var init_requestInspector = __esm(() => {
|
|
|
30896
30907
|
}).as("global");
|
|
30897
30908
|
});
|
|
30898
30909
|
|
|
30910
|
+
// src/mobile/devDeviceAdapter.ts
|
|
30911
|
+
var exports_devDeviceAdapter = {};
|
|
30912
|
+
__export(exports_devDeviceAdapter, {
|
|
30913
|
+
buildAbsoluteNativeDevAdapter: () => buildAbsoluteNativeDevAdapter,
|
|
30914
|
+
absoluteNativeDevAdapterSource: () => absoluteNativeDevAdapterSource
|
|
30915
|
+
});
|
|
30916
|
+
import { mkdtemp as mkdtemp3, rm as rm15, writeFile as writeFile9 } from "fs/promises";
|
|
30917
|
+
import { join as join52 } from "path";
|
|
30918
|
+
import { tmpdir } from "os";
|
|
30919
|
+
var absoluteNativeDevAdapterSource = (projectRoot, mobile, resolveModule = (specifier) => specifier) => {
|
|
30920
|
+
const plan = resolveAbsoluteDeviceCapabilityPlan(projectRoot);
|
|
30921
|
+
const imports = plan.capabilities.map((name, index) => {
|
|
30922
|
+
const provider = plan.providers[name];
|
|
30923
|
+
if (!provider)
|
|
30924
|
+
throw new TypeError(`Missing device capability provider ${name}.`);
|
|
30925
|
+
return `import { ${provider.factory} as absoluteDeviceCapability${index} } from ${JSON.stringify(resolveModule(provider.module))};`;
|
|
30926
|
+
});
|
|
30927
|
+
const capabilities = plan.capabilities.map((name, index) => `${JSON.stringify(name)}: absoluteDeviceCapability${index}()`).join(", ");
|
|
30928
|
+
return [
|
|
30929
|
+
`import { installCapacitorDeviceAdapterIfNative } from ${JSON.stringify(resolveModule("@absolutejs/devices-capacitor"))};`,
|
|
30930
|
+
...imports,
|
|
30931
|
+
`installCapacitorDeviceAdapterIfNative({ storagePrefix: ${JSON.stringify(`absolutejs.${mobile.appId}.`)}${capabilities ? `, ${capabilities}` : ""} });`
|
|
30932
|
+
].join(`
|
|
30933
|
+
`);
|
|
30934
|
+
}, buildAbsoluteNativeDevAdapter = async (projectRoot, mobile) => {
|
|
30935
|
+
const temporaryDirectory = await mkdtemp3(join52(tmpdir(), "absolutejs-native-dev-adapter-"));
|
|
30936
|
+
const entry = join52(temporaryDirectory, "entry.ts");
|
|
30937
|
+
try {
|
|
30938
|
+
await writeFile9(entry, absoluteNativeDevAdapterSource(projectRoot, mobile, (specifier) => Bun.resolveSync(specifier, projectRoot)));
|
|
30939
|
+
const result = await Bun.build({
|
|
30940
|
+
entrypoints: [entry],
|
|
30941
|
+
format: "esm",
|
|
30942
|
+
minify: true,
|
|
30943
|
+
target: "browser"
|
|
30944
|
+
});
|
|
30945
|
+
if (!result.success || result.outputs.length !== 1) {
|
|
30946
|
+
throw new AggregateError(result.logs, "Failed to build the AbsoluteJS native development device adapter.");
|
|
30947
|
+
}
|
|
30948
|
+
return result.outputs[0]?.text() ?? "";
|
|
30949
|
+
} finally {
|
|
30950
|
+
await rm15(temporaryDirectory, { force: true, recursive: true });
|
|
30951
|
+
}
|
|
30952
|
+
};
|
|
30953
|
+
var init_devDeviceAdapter = __esm(() => {
|
|
30954
|
+
init_deviceCapabilities();
|
|
30955
|
+
});
|
|
30956
|
+
|
|
30899
30957
|
// src/core/prerender.ts
|
|
30900
30958
|
var exports_prerender = {};
|
|
30901
30959
|
__export(exports_prerender, {
|
|
@@ -30907,7 +30965,7 @@ __export(exports_prerender, {
|
|
|
30907
30965
|
PRERENDER_BYPASS_HEADER: () => PRERENDER_BYPASS_HEADER
|
|
30908
30966
|
});
|
|
30909
30967
|
import { mkdirSync as mkdirSync16, readFileSync as readFileSync34 } from "fs";
|
|
30910
|
-
import { join as
|
|
30968
|
+
import { join as join53 } from "path";
|
|
30911
30969
|
var SERVER_OUTPUT_LIMIT = 4000, STARTUP_POLL_INTERVAL_MS = 100, DEFAULT_STARTUP_TIMEOUT_MS = 30000, DEFAULT_FETCH_TIMEOUT_MS = 1e4, PRERENDER_BYPASS_HEADER = "X-Absolute-Prerender-Bypass", routeToFilename = (route) => route === "/" ? "index.html" : `${route.slice(1).replace(/\//g, "-")}.html`, writeTimestamp = async (htmlPath) => {
|
|
30912
30970
|
const metaPath = htmlPath.replace(/\.html$/, ".meta");
|
|
30913
30971
|
await Bun.write(metaPath, String(Date.now()));
|
|
@@ -30977,7 +31035,7 @@ var SERVER_OUTPUT_LIMIT = 4000, STARTUP_POLL_INTERVAL_MS = 100, DEFAULT_STARTUP_
|
|
|
30977
31035
|
if (!isCompleteHtml(html))
|
|
30978
31036
|
return false;
|
|
30979
31037
|
const fileName = routeToFilename(route);
|
|
30980
|
-
const filePath =
|
|
31038
|
+
const filePath = join53(prerenderDir, fileName);
|
|
30981
31039
|
await Bun.write(filePath, html);
|
|
30982
31040
|
await writeTimestamp(filePath);
|
|
30983
31041
|
return true;
|
|
@@ -31007,13 +31065,13 @@ var SERVER_OUTPUT_LIMIT = 4000, STARTUP_POLL_INTERVAL_MS = 100, DEFAULT_STARTUP_
|
|
|
31007
31065
|
return;
|
|
31008
31066
|
}
|
|
31009
31067
|
const fileName = routeToFilename(route);
|
|
31010
|
-
const filePath =
|
|
31068
|
+
const filePath = join53(prerenderDir, fileName);
|
|
31011
31069
|
await Bun.write(filePath, html);
|
|
31012
31070
|
await writeTimestamp(filePath);
|
|
31013
31071
|
result.routes.set(route, filePath);
|
|
31014
31072
|
log2?.(` Pre-rendered ${route} \u2192 ${fileName} (${html.length} bytes)`);
|
|
31015
31073
|
}, prerender = async (port, outDir, staticConfig, log2) => {
|
|
31016
|
-
const prerenderDir =
|
|
31074
|
+
const prerenderDir = join53(outDir, "_prerendered");
|
|
31017
31075
|
mkdirSync16(prerenderDir, { recursive: true });
|
|
31018
31076
|
const baseUrl = `http://localhost:${port}`;
|
|
31019
31077
|
let routes;
|
|
@@ -31139,7 +31197,7 @@ import {
|
|
|
31139
31197
|
watch as watch2
|
|
31140
31198
|
} from "fs";
|
|
31141
31199
|
import { createHash as createHash9 } from "crypto";
|
|
31142
|
-
import { dirname as dirname33, join as
|
|
31200
|
+
import { dirname as dirname33, join as join57, resolve as resolve50 } from "path";
|
|
31143
31201
|
var ATOMIC_RECOVERY_WINDOW_MS = 1000, RELOAD_DEBOUNCE_MS = 80, ENTRY_IMPORT_RETRY_DELAY_MS = 250, MAX_ENTRY_IMPORT_ATTEMPTS = 3, WATCH_FALLBACK_INTERVAL_MS = 250, ATOMIC_WRITE_TEMP_PATTERNS2, isAtomicWriteTemp = (filename) => filename.endsWith(".tmp") || filename.includes(".tmp.") || filename.endsWith("~") || filename.startsWith(".#") || filename.startsWith(".absolutejs-hmr-") || ATOMIC_WRITE_TEMP_PATTERNS2.some((pattern) => pattern.test(filename)), fileHash = (path) => {
|
|
31144
31202
|
try {
|
|
31145
31203
|
return createHash9("sha256").update(readFileSync38(path)).digest("hex");
|
|
@@ -31181,7 +31239,7 @@ var ATOMIC_RECOVERY_WINDOW_MS = 1000, RELOAD_DEBOUNCE_MS = 80, ENTRY_IMPORT_RETR
|
|
|
31181
31239
|
let pendingEntryCause = null;
|
|
31182
31240
|
let siblingSequence = 0;
|
|
31183
31241
|
const importFreshEntry = async (attempt = 1) => {
|
|
31184
|
-
const siblingPath =
|
|
31242
|
+
const siblingPath = join57(entryDir, `.absolutejs-hmr-${process.pid}-${siblingSequence++}.ts`);
|
|
31185
31243
|
let failure;
|
|
31186
31244
|
try {
|
|
31187
31245
|
copyFileSync4(entryPath, siblingPath);
|
|
@@ -31294,7 +31352,7 @@ var ATOMIC_RECOVERY_WINDOW_MS = 1000, RELOAD_DEBOUNCE_MS = 80, ENTRY_IMPORT_RETR
|
|
|
31294
31352
|
continue;
|
|
31295
31353
|
let st2;
|
|
31296
31354
|
try {
|
|
31297
|
-
st2 = statSync8(
|
|
31355
|
+
st2 = statSync8(join57(dir, entry.name));
|
|
31298
31356
|
} catch {
|
|
31299
31357
|
continue;
|
|
31300
31358
|
}
|
|
@@ -32163,7 +32221,7 @@ var handleHTMXPageRequest = async (pagePath, options = {}) => {
|
|
|
32163
32221
|
// src/core/prepare.ts
|
|
32164
32222
|
import { createHash as createHash8 } from "crypto";
|
|
32165
32223
|
import { existsSync as existsSync39, readdirSync as readdirSync10, readFileSync as readFileSync35 } from "fs";
|
|
32166
|
-
import { basename as basename18, join as
|
|
32224
|
+
import { basename as basename18, join as join54, relative as relative20, resolve as resolvePath4 } from "path";
|
|
32167
32225
|
import { Elysia as Elysia9, NotFound } from "elysia";
|
|
32168
32226
|
|
|
32169
32227
|
// src/plugins/openApiPlugin.ts
|
|
@@ -33565,7 +33623,7 @@ var registerIconVersioning = (buildDir) => {
|
|
|
33565
33623
|
if (cached !== undefined)
|
|
33566
33624
|
return cached;
|
|
33567
33625
|
const path = href.split("?")[0] ?? href;
|
|
33568
|
-
const filePath =
|
|
33626
|
+
const filePath = join54(buildDir, path);
|
|
33569
33627
|
let versioned = href;
|
|
33570
33628
|
if (existsSync39(filePath)) {
|
|
33571
33629
|
const hash = createHash8("sha256").update(readFileSync35(filePath)).digest("hex").slice(0, ICON_HASH_LENGTH);
|
|
@@ -33658,12 +33716,20 @@ var prepareDev = async (config, buildDir) => {
|
|
|
33658
33716
|
const { requestInspector: requestInspector2 } = await Promise.resolve().then(() => (init_requestInspector(), exports_requestInspector));
|
|
33659
33717
|
const { serverTiming } = await import("@elysia/server-timing");
|
|
33660
33718
|
const mobileAssociationPlugin = createAbsoluteMobileAssociationPlugin(config.mobile, process.cwd());
|
|
33719
|
+
const nativeMobileConfig = config.mobile;
|
|
33720
|
+
let nativeDevAdapterBundle;
|
|
33721
|
+
const getNativeDevAdapterBundle = () => nativeDevAdapterBundle ??= nativeMobileConfig ? Promise.resolve().then(() => (init_devDeviceAdapter(), exports_devDeviceAdapter)).then(({ buildAbsoluteNativeDevAdapter: buildAbsoluteNativeDevAdapter2 }) => buildAbsoluteNativeDevAdapter2(process.cwd(), nativeMobileConfig)) : Promise.resolve("export {};");
|
|
33661
33722
|
const absolutejs = new Elysia9({ name: "absolutejs-runtime" }).use(requestInspector2).use(absoluteRequestContext).use(serverTiming()).use(devtoolsJson2(buildDir, {
|
|
33662
33723
|
normalizeForWindowsContainer: config.dev?.devtools?.normalizeForWindowsContainer,
|
|
33663
33724
|
projectRoot: config.dev?.devtools?.projectRoot,
|
|
33664
33725
|
uuid: config.dev?.devtools?.uuid,
|
|
33665
33726
|
uuidCachePath: config.dev?.devtools?.uuidCachePath
|
|
33666
|
-
})).use(imageOptimizer2(config.images, buildDir)).use(mobileAssociationPlugin).
|
|
33727
|
+
})).use(imageOptimizer2(config.images, buildDir)).use(mobileAssociationPlugin).get("/__absolute/native-device-adapter.js", async () => new Response(await getNativeDevAdapterBundle(), {
|
|
33728
|
+
headers: {
|
|
33729
|
+
"Cache-Control": "no-store",
|
|
33730
|
+
"Content-Type": "text/javascript; charset=utf-8"
|
|
33731
|
+
}
|
|
33732
|
+
})).use(await mountStaticPlugin(staticPlugin, {
|
|
33667
33733
|
alwaysStatic: true,
|
|
33668
33734
|
assets: buildDir,
|
|
33669
33735
|
directive: "no-cache",
|
|
@@ -33695,13 +33761,13 @@ var loadPrerenderMap = (prerenderDir) => {
|
|
|
33695
33761
|
continue;
|
|
33696
33762
|
const name = basename18(entry, ".html");
|
|
33697
33763
|
const route = name === "index" ? "/" : `/${name}`;
|
|
33698
|
-
map.set(route,
|
|
33764
|
+
map.set(route, join54(prerenderDir, entry));
|
|
33699
33765
|
}
|
|
33700
33766
|
return map;
|
|
33701
33767
|
};
|
|
33702
33768
|
var loadMobileCompatibilityPlugin = async (buildDir) => {
|
|
33703
|
-
const root =
|
|
33704
|
-
if (!existsSync39(
|
|
33769
|
+
const root = join54(buildDir, ".absolutejs", "mobile-compatibility");
|
|
33770
|
+
if (!existsSync39(join54(root, "current.json"))) {
|
|
33705
33771
|
return new Elysia9({ name: "absolutejs-mobile-compatibility-empty" });
|
|
33706
33772
|
}
|
|
33707
33773
|
const options = await loadAbsoluteMobileMaterializedBundle(root);
|
|
@@ -33762,12 +33828,12 @@ var prepare = async (configOrPath) => {
|
|
|
33762
33828
|
setCurrentPageIslandMetadata(await loadPageIslandMetadata(config));
|
|
33763
33829
|
recordStep("load production manifest and island metadata", stepStartedAt);
|
|
33764
33830
|
stepStartedAt = performance.now();
|
|
33765
|
-
const conventionsPath =
|
|
33831
|
+
const conventionsPath = join54(buildDir, "conventions.json");
|
|
33766
33832
|
if (existsSync39(conventionsPath)) {
|
|
33767
33833
|
const conventions2 = JSON.parse(readFileSync35(conventionsPath, "utf-8"));
|
|
33768
33834
|
setConventions(conventions2);
|
|
33769
33835
|
}
|
|
33770
|
-
const spaRoutesPath =
|
|
33836
|
+
const spaRoutesPath = join54(buildDir, "spa-routes.json");
|
|
33771
33837
|
if (existsSync39(spaRoutesPath)) {
|
|
33772
33838
|
setSpaRouteManifest(JSON.parse(readFileSync35(spaRoutesPath, "utf-8")));
|
|
33773
33839
|
}
|
|
@@ -33780,7 +33846,7 @@ var prepare = async (configOrPath) => {
|
|
|
33780
33846
|
prefix: "",
|
|
33781
33847
|
staticLimit: MAX_STATIC_ROUTE_COUNT
|
|
33782
33848
|
});
|
|
33783
|
-
const generatedAssetsRoot =
|
|
33849
|
+
const generatedAssetsRoot = join54(buildDir, ".absolutejs");
|
|
33784
33850
|
const generatedAssetsPlugin = new Elysia9({
|
|
33785
33851
|
name: "absolutejs-generated-assets"
|
|
33786
33852
|
}).get("/.absolutejs/*", async ({ params, set }) => {
|
|
@@ -33818,7 +33884,7 @@ var prepare = async (configOrPath) => {
|
|
|
33818
33884
|
responseValue.headers.set("cache-control", isFingerprintedAsset(pathname) ? "public, max-age=31536000, immutable" : "public, max-age=0, must-revalidate");
|
|
33819
33885
|
});
|
|
33820
33886
|
stepStartedAt = performance.now();
|
|
33821
|
-
const prerenderDir =
|
|
33887
|
+
const prerenderDir = join54(buildDir, "_prerendered");
|
|
33822
33888
|
const prerenderMap = loadPrerenderMap(prerenderDir);
|
|
33823
33889
|
const mobileCompatibilityPlugin = await loadMobileCompatibilityPlugin(buildDir);
|
|
33824
33890
|
const mobileAssociationPlugin = createAbsoluteMobileAssociationPlugin(config.mobile, process.cwd(), { requireAll: true });
|
|
@@ -33891,10 +33957,10 @@ import {
|
|
|
33891
33957
|
readFileSync as readFileSync36,
|
|
33892
33958
|
rmSync as rmSync4
|
|
33893
33959
|
} from "fs";
|
|
33894
|
-
import { join as
|
|
33895
|
-
var CERT_DIR =
|
|
33896
|
-
var CERT_PATH =
|
|
33897
|
-
var KEY_PATH =
|
|
33960
|
+
import { join as join55 } from "path";
|
|
33961
|
+
var CERT_DIR = join55(process.cwd(), ".absolutejs");
|
|
33962
|
+
var CERT_PATH = join55(CERT_DIR, "cert.pem");
|
|
33963
|
+
var KEY_PATH = join55(CERT_DIR, "key.pem");
|
|
33898
33964
|
var CERT_VALIDITY_DAYS = 365;
|
|
33899
33965
|
var devLog = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[36m[dev]\x1B[0m ${msg}`);
|
|
33900
33966
|
var devWarn = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[33m[dev]\x1B[0m \x1B[33m${msg}\x1B[0m`);
|
|
@@ -34014,12 +34080,12 @@ import {
|
|
|
34014
34080
|
writeFileSync as writeFileSync11
|
|
34015
34081
|
} from "fs";
|
|
34016
34082
|
import { homedir as homedir2 } from "os";
|
|
34017
|
-
import { basename as basename19, join as
|
|
34083
|
+
import { basename as basename19, join as join56 } from "path";
|
|
34018
34084
|
var registeredPids = new Set;
|
|
34019
34085
|
var exitHandlerRegistered = false;
|
|
34020
|
-
var instanceFilePath = (pid) =>
|
|
34021
|
-
var instanceLogPath = (pid) =>
|
|
34022
|
-
var instanceRegistryDir = () =>
|
|
34086
|
+
var instanceFilePath = (pid) => join56(instanceRegistryDir(), `${pid}.json`);
|
|
34087
|
+
var instanceLogPath = (pid) => join56(instanceRegistryDir(), `${pid}.log`);
|
|
34088
|
+
var instanceRegistryDir = () => join56(homedir2(), ".absolutejs", "instances");
|
|
34023
34089
|
var removeInstanceFilesSync = (pid) => {
|
|
34024
34090
|
try {
|
|
34025
34091
|
unlinkSync2(instanceFilePath(pid));
|
|
@@ -34054,7 +34120,7 @@ var registerInstance = (record) => {
|
|
|
34054
34120
|
return record;
|
|
34055
34121
|
};
|
|
34056
34122
|
var resolveProjectName = (cwd2) => {
|
|
34057
|
-
const parsed = readJsonFile(
|
|
34123
|
+
const parsed = readJsonFile(join56(cwd2, "package.json"));
|
|
34058
34124
|
if (parsed !== null && typeof parsed === "object" && typeof parsed.name === "string" && parsed.name.trim().length > 0) {
|
|
34059
34125
|
return parsed.name;
|
|
34060
34126
|
}
|
|
@@ -40712,5 +40778,5 @@ export {
|
|
|
40712
40778
|
ANGULAR_INIT_TIMEOUT_MS
|
|
40713
40779
|
};
|
|
40714
40780
|
|
|
40715
|
-
//# debugId=
|
|
40781
|
+
//# debugId=AA3EE02769A805B764756E2164756E21
|
|
40716
40782
|
//# sourceMappingURL=index.js.map
|