UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

350 lines 16.8 kB
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); }); });