one
Version:
One is a new React Framework that makes Vite serve both native and web.
350 lines • 16.8 kB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod));
var import_node_fs = __toESM(require("node:fs"), 1);
var import_node_os = __toESM(require("node:os"), 1);
var import_node_path = __toESM(require("node:path"), 1);
var import_vitest = require("vitest");
var import_generateBundlerConfig = require("./generateBundlerConfig.cjs");
(0, import_vitest.describe)("generateBundlerConfig", () => {
let tmpDir;
(0, import_vitest.beforeEach)(() => {
tmpDir = import_node_fs.default.mkdtempSync(import_node_path.default.join(import_node_os.default.tmpdir(), "one-gen-bundler-test-"));
});
(0, import_vitest.afterEach)(() => {
import_node_fs.default.rmSync(tmpDir, {
recursive: true,
force: true
});
});
(0, import_vitest.it)("writes both files when missing", () => {
const {
ok,
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
quiet: true
});
(0, import_vitest.expect)(ok).toBe(true);
(0, import_vitest.expect)(results.map(r => r.action)).toEqual(["wrote", "wrote"]);
const babel = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "utf8");
(0, import_vitest.expect)(babel).toContain(import_generateBundlerConfig.ONE_GENERATED_MARKER);
(0, import_vitest.expect)(babel).toContain("require('one/babel-preset')");
(0, import_vitest.expect)(babel).toContain("oneBundlerOptions");
const metro = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "metro.config.cjs"), "utf8");
(0, import_vitest.expect)(metro).toContain(import_generateBundlerConfig.ONE_GENERATED_MARKER);
(0, import_vitest.expect)(metro).toContain("require('one/metro-config')");
(0, import_vitest.expect)(metro).toContain("withOne");
});
(0, import_vitest.it)("is idempotent on second run", () => {
(0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
quiet: true
});
const before = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "utf8");
const {
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
quiet: true
});
(0, import_vitest.expect)(results.map(r => r.action)).toEqual(["kept", "kept"]);
const after = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "utf8");
(0, import_vitest.expect)(after).toBe(before);
});
(0, import_vitest.it)("refuses to overwrite a customized file without --force", () => {
import_node_fs.default.writeFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "// hand-written\nmodule.exports = { presets: [] }\n");
const {
ok,
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
quiet: true
});
const babelResult = results.find(r => r.filePath.endsWith("babel.config.cjs"));
(0, import_vitest.expect)(babelResult.action).toBe("skipped-customized");
(0, import_vitest.expect)(ok).toBe(true);
const after = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "utf8");
(0, import_vitest.expect)(after).toContain("hand-written");
});
(0, import_vitest.it)("overwrites a customized file when --force is set", () => {
import_node_fs.default.writeFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "// hand-written\nmodule.exports = { presets: [] }\n");
const {
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
force: true,
quiet: true
});
const babelResult = results.find(r => r.filePath.endsWith("babel.config.cjs"));
(0, import_vitest.expect)(babelResult.action).toBe("wrote");
const after = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "utf8");
(0, import_vitest.expect)(after).toContain(import_generateBundlerConfig.ONE_GENERATED_MARKER);
(0, import_vitest.expect)(after).not.toContain("hand-written");
});
(0, import_vitest.it)("rewrites a stale marked file", () => {
import_node_fs.default.writeFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), `// ${import_generateBundlerConfig.ONE_GENERATED_MARKER}
// old content from previous version
module.exports = {}
`);
const {
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
quiet: true
});
const babelResult = results.find(r => r.filePath.endsWith("babel.config.cjs"));
(0, import_vitest.expect)(babelResult.action).toBe("wrote");
const after = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "utf8");
(0, import_vitest.expect)(after).toContain("require('one/babel-preset')");
(0, import_vitest.expect)(after).not.toContain("old content from previous version");
});
(0, import_vitest.describe)("--check mode", () => {
(0, import_vitest.it)("exits ok when files exist and match", () => {
(0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
quiet: true
});
const {
ok,
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
check: true,
quiet: true
});
(0, import_vitest.expect)(ok).toBe(true);
(0, import_vitest.expect)(results.every(r => r.action === "kept")).toBe(true);
});
(0, import_vitest.it)("exits not-ok when files are missing", () => {
const {
ok,
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
check: true,
quiet: true
});
(0, import_vitest.expect)(ok).toBe(false);
(0, import_vitest.expect)(results.every(r => r.action === "would-write")).toBe(true);
(0, import_vitest.expect)(import_node_fs.default.existsSync(import_node_path.default.join(tmpDir, "babel.config.cjs"))).toBe(false);
});
(0, import_vitest.it)("exits not-ok when a marked file is stale", () => {
import_node_fs.default.writeFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), `// ${import_generateBundlerConfig.ONE_GENERATED_MARKER}
module.exports = {}
`);
import_node_fs.default.writeFileSync(import_node_path.default.join(tmpDir, "metro.config.cjs"), `// ${import_generateBundlerConfig.ONE_GENERATED_MARKER}
module.exports = {}
`);
const {
ok,
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
check: true,
quiet: true
});
(0, import_vitest.expect)(ok).toBe(false);
(0, import_vitest.expect)(results.every(r => r.action === "would-overwrite")).toBe(true);
});
});
(0, import_vitest.describe)("--eject mode", () => {
(0, import_vitest.it)("writes files WITHOUT the @one/generated marker", () => {
const {
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
eject: true,
quiet: true
});
(0, import_vitest.expect)(results.map(r => r.action)).toEqual(["wrote", "wrote"]);
const babel = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "utf8");
(0, import_vitest.expect)(babel).not.toContain(import_generateBundlerConfig.ONE_GENERATED_MARKER);
(0, import_vitest.expect)(babel).toContain("you own this file");
(0, import_vitest.expect)(babel).toContain("require('one/babel-preset')");
const metro = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "metro.config.cjs"), "utf8");
(0, import_vitest.expect)(metro).not.toContain(import_generateBundlerConfig.ONE_GENERATED_MARKER);
(0, import_vitest.expect)(metro).toContain("withOne");
});
(0, import_vitest.it)("subsequent auto-gen run (no --eject) treats ejected files as customized", () => {
(0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
eject: true,
quiet: true
});
const before = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "utf8");
const {
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
quiet: true
});
(0, import_vitest.expect)(results.every(r => r.action === "skipped-customized")).toBe(true);
const after = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "utf8");
(0, import_vitest.expect)(after).toBe(before);
});
});
(0, import_vitest.it)("does not clobber a non-.cjs config in the same family", () => {
import_node_fs.default.writeFileSync(import_node_path.default.join(tmpDir, "babel.config.js"), "module.exports = { presets: [] }\n");
const {
results
} = (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
quiet: true
});
const babelResult = results.find(r => r.filePath.endsWith("babel.config.js") || r.filePath.endsWith("babel.config.cjs"));
(0, import_vitest.expect)(babelResult.action).toBe("skipped-other-format");
(0, import_vitest.expect)(import_node_fs.default.existsSync(import_node_path.default.join(tmpDir, "babel.config.cjs"))).toBe(false);
});
(0, import_vitest.it)("embeds loaded One router/setup options into both config files", () => {
(0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
quiet: true,
oneOptions: {
router: {
root: "src/routes",
ignoredRouteFiles: ["**/*.native-test.*"],
linking: {
scheme: "myapp",
prefixes: ["https://example.com/app"]
}
},
setupFile: {
native: "src/setup.native.ts"
}
}
});
const babel = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "babel.config.cjs"), "utf8");
const metro = import_node_fs.default.readFileSync(import_node_path.default.join(tmpDir, "metro.config.cjs"), "utf8");
for (const file of [babel, metro]) {
(0, import_vitest.expect)(file).toContain('"routerRoot": "src/routes"');
(0, import_vitest.expect)(file).toContain('"ignoredRouteFiles"');
(0, import_vitest.expect)(file).toContain('"**/*.native-test.*"');
(0, import_vitest.expect)(file).toContain('"scheme": "myapp"');
(0, import_vitest.expect)(file).toContain('"native": "src/setup.native.ts"');
}
});
(0, import_vitest.it)("refuses to silently drop non-serializable options", () => {
(0, import_vitest.expect)(() => (0, import_generateBundlerConfig.generateBundlerConfig)({
cwd: tmpDir,
quiet: true,
oneOptions: {
router: {
linking: {
// the plugin API only accepts serializable router.linking fields
filter: () => true
}
}
}
})).toThrow(/JSON-serializable/);
});
});
(0, import_vitest.describe)("isCiEnvironment", () => {
const originalCi = process.env.CI;
const originalEasBuild = process.env.EAS_BUILD;
(0, import_vitest.afterEach)(() => {
if (originalCi === void 0) delete process.env.CI;else process.env.CI = originalCi;
if (originalEasBuild === void 0) delete process.env.EAS_BUILD;else process.env.EAS_BUILD = originalEasBuild;
});
(0, import_vitest.it)("is true when CI=true", () => {
process.env.CI = "true";
delete process.env.EAS_BUILD;
(0, import_vitest.expect)((0, import_generateBundlerConfig.isCiEnvironment)()).toBe(true);
});
(0, import_vitest.it)("is true when CI=1", () => {
process.env.CI = "1";
delete process.env.EAS_BUILD;
(0, import_vitest.expect)((0, import_generateBundlerConfig.isCiEnvironment)()).toBe(true);
});
(0, import_vitest.it)("is true when EAS_BUILD=true", () => {
delete process.env.CI;
process.env.EAS_BUILD = "true";
(0, import_vitest.expect)((0, import_generateBundlerConfig.isCiEnvironment)()).toBe(true);
});
(0, import_vitest.it)("is false when neither is set", () => {
delete process.env.CI;
delete process.env.EAS_BUILD;
(0, import_vitest.expect)((0, import_generateBundlerConfig.isCiEnvironment)()).toBe(false);
});
(0, import_vitest.it)("is false when CI=false or CI=0", () => {
delete process.env.EAS_BUILD;
process.env.CI = "false";
(0, import_vitest.expect)((0, import_generateBundlerConfig.isCiEnvironment)()).toBe(false);
process.env.CI = "0";
(0, import_vitest.expect)((0, import_generateBundlerConfig.isCiEnvironment)()).toBe(false);
});
});
(0, import_vitest.describe)("maybeGenerateBundlerConfigOnInstall", () => {
let tmpDir;
const originalCi = process.env.CI;
(0, import_vitest.beforeEach)(() => {
tmpDir = import_node_fs.default.mkdtempSync(import_node_path.default.join(import_node_os.default.tmpdir(), "one-gen-bundler-ci-test-"));
});
(0, import_vitest.afterEach)(() => {
import_node_fs.default.rmSync(tmpDir, {
recursive: true,
force: true
});
if (originalCi === void 0) delete process.env.CI;else process.env.CI = originalCi;
delete process.env.EAS_BUILD;
});
(0, import_vitest.it)("does NOT generate files when not in CI even if expo-updates is present", () => {
delete process.env.CI;
delete process.env.EAS_BUILD;
const fakeUpdates = import_node_path.default.join(tmpDir, "node_modules/expo-updates");
import_node_fs.default.mkdirSync(fakeUpdates, {
recursive: true
});
import_node_fs.default.writeFileSync(import_node_path.default.join(fakeUpdates, "package.json"), JSON.stringify({
name: "expo-updates"
}));
(0, import_generateBundlerConfig.maybeGenerateBundlerConfigOnInstall)(tmpDir);
(0, import_vitest.expect)(import_node_fs.default.existsSync(import_node_path.default.join(tmpDir, "babel.config.cjs"))).toBe(false);
(0, import_vitest.expect)(import_node_fs.default.existsSync(import_node_path.default.join(tmpDir, "metro.config.cjs"))).toBe(false);
});
(0, import_vitest.it)("does NOT generate files in CI when expo-updates is absent", () => {
process.env.CI = "true";
(0, import_generateBundlerConfig.maybeGenerateBundlerConfigOnInstall)(tmpDir);
(0, import_vitest.expect)(import_node_fs.default.existsSync(import_node_path.default.join(tmpDir, "babel.config.cjs"))).toBe(false);
(0, import_vitest.expect)(import_node_fs.default.existsSync(import_node_path.default.join(tmpDir, "metro.config.cjs"))).toBe(false);
});
(0, import_vitest.it)("generates files in CI when expo-updates is present", () => {
process.env.CI = "true";
const fakeUpdates = import_node_path.default.join(tmpDir, "node_modules/expo-updates");
import_node_fs.default.mkdirSync(fakeUpdates, {
recursive: true
});
import_node_fs.default.writeFileSync(import_node_path.default.join(fakeUpdates, "package.json"), JSON.stringify({
name: "expo-updates"
}));
const consoleInfo = import_vitest.vi.spyOn(console, "info").mockImplementation(() => {});
try {
(0, import_generateBundlerConfig.maybeGenerateBundlerConfigOnInstall)(tmpDir);
} finally {
consoleInfo.mockRestore();
}
(0, import_vitest.expect)(import_node_fs.default.existsSync(import_node_path.default.join(tmpDir, "babel.config.cjs"))).toBe(true);
(0, import_vitest.expect)(import_node_fs.default.existsSync(import_node_path.default.join(tmpDir, "metro.config.cjs"))).toBe(true);
});
});