import { it, expect } from "bun:test";
import { mkdirSync, writeFileSync } from "fs";
import { join, resolve } from "path";
function resolveFrom(from) {
return (specifier) => import.meta.resolveSync(specifier, from);
}
it("#imports", async () => {
await writePackageJSONImportsFixture();
const baz = await import.meta.resolve(
"#foo",
join(await import.meta.resolve("package-json-imports/baz"), "../"),
);
expect(baz.endsWith("foo/private-foo.js")).toBe(true);
const subpath = await import.meta.resolve(
"#foo/bar",
join(await import.meta.resolve("package-json-imports/baz"), "../"),
);
expect(subpath.endsWith("foo/private-foo.js")).toBe(true);
const react = await import.meta.resolve(
"#internal-react",
join(await import.meta.resolve("package-json-imports/baz"), "../"),
);
expect(react.endsWith("/react/index.js")).toBe(true);
// Check that #foo is not resolved to the package.json file.
try {
await import.meta.resolve("#foo");
throw new Error("Test failed");
} catch (exception) {
expect(exception instanceof ResolveError).toBe(true);
expect(exception.referrer).toBe(import.meta.path);
expect(exception.name).toBe("ResolveError");
}
// Chcek that package-json-imports/#foo doesn't work
try {
await import.meta.resolve("package-json-imports/#foo");
throw new Error("Test failed");
} catch (exception) {
expect(exception instanceof ResolveError).toBe(true);
expect(exception.referrer).toBe(import.meta.path);
expect(exception.name).toBe("ResolveError");
}
});
it("#imports with wildcard", async () => {
await writePackageJSONImportsFixture();
const run = resolveFrom(
resolve(
import.meta.dir + "/node_modules/package-json-imports/package.json",
),
);
const wildcard = resolve(
import.meta.dir + "/node_modules/package-json-imports/foo/wildcard.js",
);
expect(run("#foo/wildcard.js")).toBe(wildcard);
expect(run("#foo/extensionless/wildcard")).toBe(wildcard);
});
it("import.meta.resolve", async () => {
expect(await import.meta.resolve("./resolve.test.js")).toBe(import.meta.path);
expect(await import.meta.resolve("./resolve.test.js", import.meta.path)).toBe(
import.meta.path,
);
expect(
// optional second param can be any path, including a dir
await import.meta.resolve(
"./bun.js/resolve.test.js",
join(import.meta.path, "../"),
),
).toBe(import.meta.path);
// can be a package path
expect(
(await import.meta.resolve("react", import.meta.path)).length > 0,
).toBe(true);
// file extensions are optional
expect(await import.meta.resolve("./resolve.test")).toBe(import.meta.path);
// works with tsconfig.json "paths"
expect(await import.meta.resolve("foo/bar")).toBe(
join(import.meta.path, "../baz.js"),
);
// works with package.json "exports"
writePackageJSONExportsFixture();
expect(await import.meta.resolve("package-json-exports/baz")).toBe(
join(import.meta.path, "../node_modules/package-json-exports/foo/bar.js"),
);
// works with TypeScript compiler edgecases like:
// - If the file ends with .js and it doesn't exist, try again with .ts and .tsx
expect(await import.meta.resolve("./resolve-typescript-file.js")).toBe(
join(import.meta.path, "../resolve-typescript-file.tsx"),
);
expect(await import.meta.resolve("./resolve-typescript-file.tsx")).toBe(
join(import.meta.path, "../resolve-typescript-file.tsx"),
);
// throws a ResolveError on failure
try {
await import.meta.resolve("THIS FILE DOESNT EXIST");
throw new Error("Test failed");
} catch (exception) {
expect(exception instanceof ResolveError).toBe(true);
expect(exception.referrer).toBe(import.meta.path);
expect(exception.name).toBe("ResolveError");
}
});
// the slightly lower level API, which doesn't prefill the second param
// and expects a directory instead of a filepath
it("Bun.resolve", async () => {
expect(await Bun.resolve("./resolve.test.js", import.meta.dir)).toBe(
import.meta.path,
);
});
// synchronous
it("Bun.resolveSync", () => {
expect(Bun.resolveSync("./resolve.test.js", import.meta.dir)).toBe(
import.meta.path,
);
});
it("self-referencing imports works", async () => {
await writePackageJSONExportsFixture();
const baz = await import.meta.resolve("package-json-exports/baz");
const namespace = await import.meta.resolve(
"package-json-exports/references-baz",
);
Loader.registry.delete(baz);
Loader.registry.delete(namespace);
var a = await import(baz);
var b = await import(namespace);
expect(a.bar).toBe(1);
expect(b.bar).toBe(1);
Loader.registry.delete(baz);
Loader.registry.delete(namespace);
var a = await import("package-json-exports/baz");
var b = await import("package-json-exports/references-baz");
expect(a.bar).toBe(1);
expect(b.bar).toBe(1);
Loader.registry.delete(baz);
Loader.registry.delete(namespace);
var a = import.meta.require("package-json-exports/baz");
var b = import.meta.require("package-json-exports/references-baz");
expect(a.bar).toBe(1);
expect(b.bar).toBe(1);
Loader.registry.delete(baz);
Loader.registry.delete(namespace);
var a = import.meta.require(baz);
var b = import.meta.require(namespace);
expect(a.bar).toBe(1);
expect(b.bar).toBe(1);
// test that file:// works
Loader.registry.delete(baz);
Loader.registry.delete(namespace);
var a = import.meta.require("file://" + baz);
var b = import.meta.require("file://" + namespace);
expect(a.bar).toBe(1);
expect(b.bar).toBe(1);
});
function writePackageJSONExportsFixture() {
try {
mkdirSync(
join(import.meta.dir, "./node_modules/package-json-exports/foo"),
{
recursive: true,
},
);
} catch (exception) {}
writeFileSync(
join(import.meta.dir, "./node_modules/package-json-exports/foo/bar.js"),
"export const bar = 1;",
);
writeFileSync(
join(
import.meta.dir,
"./node_modules/package-json-exports/foo/references-baz.js",
),
"export {bar} from 'package-json-exports/baz';",
);
writeFileSync(
join(import.meta.dir, "./node_modules/package-json-exports/package.json"),
JSON.stringify(
{
name: "package-json-exports",
exports: {
"./baz": "./foo/bar.js",
"./references-baz": "./foo/references-baz.js",
},
},
null,
2,
),
);
}
function writePackageJSONImportsFixture() {
try {
mkdirSync(
join(import.meta.dir, "./node_modules/package-json-imports/foo"),
{
recursive: true,
},
);
} catch (exception) {}
writeFileSync(
join(import.meta.dir, "./node_modules/package-json-imports/foo/bar.js"),
"export const bar = 1;",
);
writeFileSync(
join(
import.meta.dir,
"./node_modules/package-json-imports/foo/wildcard.js",
),
"export const wildcard = 1;",
);
writeFileSync(
join(
import.meta.dir,
"./node_modules/package-json-imports/foo/private-foo.js",
),
"export {bar} from 'package-json-imports/#foo';",
);
writeFileSync(
join(import.meta.dir, "./node_modules/package-json-imports/package.json"),
JSON.stringify(
{
name: "package-json-imports",
exports: {
"./baz": "./foo/bar.js",
},
imports: {
"#foo/bar": "./foo/private-foo.js",
"#foo/*.js": "./foo/*.js",
"#foo/extensionless/*": "./foo/*.js",
"#foo": "./foo/private-foo.js",
"#internal-react": "react",
},
},
null,
2,
),
);
}
ow-components
feat/fonts-granular-preload
feat/fonts-retrieve-data
feat/foreign-key-migrations
feat/foreign-keys
feat/html-pages
feat/image-placeholders
feat/improve-custom-element-detection
feat/incremental-build
feat/indexes
feat/integration-kit
feat/jsx-transform
feat/legacy-markdown-flag
feat/markdoc-embeds
feat/markdown-components
feat/mdx-js-injection
feat/mdx-plugin-export
feat/minify-html
feat/next-get-env
feat/og
feat/ooo-streaming
feat/pragma
feat/preview
feat/react-19
feat/react-19-actions
feat/redirect-on-html-backup
feat/references
feat/remote-flag
feat/remove-astro-image-backup
feat/remove-studio
feat/render-with-queue
feat/reroute-ssr
feat/resolve-entrypoint
feat/router
feat/router-ii
feat/seo-components
feat/skip-sync-flag
feat/spa
feat/spa-ii
feat/squoosh
feat/standard-schema
feat/storage-studio
feat/streaming-rendering
feat/style-obj
feat/test-utils
feat/xray-improvements
fetch-astro-pages-mvp
fix-408
fix-all-pages-key
fix-beta-ref
fix-create-ref
fix-netlify-edge
fix-next-basics
fix-nullish-slot-name
fix-s-island-fallback
fix-vite-asset
fix/actions-cookies
fix/actions-pending-timeout
fix/assets-types
fix/astro-config-refresh
fix/astro-html-escape-bug
fix/build-subpaths
fix/client-only-component-css
fix/client-scripts-windows
fix/config-migration-defaults
fix/container-directives
fix/dates
fix/db-integration-with-missing-config
fix/devtoolbar-data-unset
fix/empty-slots
fix/filepath-layer
fix/frontmatter-file-url
fix/head-propagation
fix/hmr-css-deps
fix/import-ts-errors
fix/main-build-failure
fix/map-file-404-logs
fix/mdx-named-slots
fix/middleware-import
fix/multi-images
fix/nested-get-collection-call
fix/preact-package-build-failure
fix/primary-key-optional
fix/regex-flags
fix/server-headers
fix/stable-renderer-order
fix/transaction-type
fix/vue-nested
fix/webapi-dev
fork/markdoc-poc-with-md-support
fork/markdoc-poc-with-parser
format-imports-run
formatting
forward-button
framework-agnostic-astro-components
fryuni/db-pluggable-backend
fryuni/test-route-setup-hook
fryuni/tracing-hooks
hippotastic/legitimate-bat
hoisted-script-ts
host-ssr-example-2
hostfornode
image-non-node
improve-base-handling
inline-hoisted-scripts-now
jn.convert-assertions-to-query-params
latest
live-loaders
main
mandar1jn/ci-repo-check
markdoc-embed-prototyping
markdown
markdown-poc
mdx-path
mk/render-slot-template-backup
move-default-md-code-component
mt/lit-DSD
mt/lit-regen
mt/parse-DSD
mt/router_refactoring
nate/new-blog-template
netlify-1
netlify-preview
new-adapter-api
next
next-render
no-more-vite-postprocess
no-more-vite-postprocess2
old-build
plt-1006/unified-and-mdx
plt-1768-trailing-slash-object
preact-shared-signals
process-env-override
progress-log
re-export-drivers
react-fast-refresh
redirects-priority2
redirects-ssg-object
refactor-how-client-directives-work
refactor/image-internals
refactor/markdoc-renderer
refactor/rendere-queue
refactor/sitemap
refactor/ssr-size
release/0.17
release/0.18
remote-cdn-link
remove-fs-abstraction
remove-start
restart-on-lock
revert-13008-renovate/all-minor-patch
revert-lockfile
route-manifest-adapter
sarah11918-image-errors
sarah11918-patch-2
sb-tests2
seroval
server-islands-children
session-docs
single-file-build-2
slash-404-hint
slot-bug-1
solid-ecosystem-pkg
spike/app-setup
spike/autonav
spike/codehike
spike/context
spike/csr
spike/default-content
spike/incremental
spike/incremental-ii
spike/markdown-wasm
spike/render
spike/streaming
spike/svg
sqlite-test
squeal
ssr-redirect
stream-buffer
streaming
telemetry-audit-1
test/new-integrations-demo
test/new-ssr-demo
top-level-exports-integrations
ts-in-hoisted-script
ts-no-err
upd-vite-vendored
upgrade-deps
v1-beta
vercel-test
vite-fork
vscode-astro-global
vt-follow-redirects
warn-exp-flag
win
windows-tests-beta
wip-assets
wip-component-api-2
wip-docs-components
wip-docs-reference-gen
wip-fetch-cache
wip-fun-flags
wip-icons
wip-logging
wip-logging-saved
wip-mdc
wip-mdx-to-astro-js
wip-preview-command-integrations
wip-setup-content
wip-smoke
wip-speed-up-markdown
wip-stage
wip/react-19-test
Unnamed repository; edit this file 'description' to name the repository.
Age Commit message (Collapse ) Author Files Lines
* fix(#2987): relative config handling with `--config` flag
* test: fix tests
* fix: improve config test for failure case
* fix: test on windows?
* fix: test on windows?
* Fix Netlify adapter and dynamic routes
* Changeset
* `dir` now matches client output
* Updated integrations
* Changeset
* fix: solid nested hydration
* Create ten-rice-unite.md
Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
* So This works 😎
* need to add to the cli next
* Renamed Files and Export
Applied creditation to where I found the
'inspiration' for this application.
* applied `astro docs` to cli
* Trying to add to CLI,
Not working 🤷♂️
* Converted into async method,
* 🎆🎆 It works!!! 🥳🎉🥳
Embarrasing as it is I totally missed the part where logic was to be in.
* Moved `docs` cmd to `supportedCommands`
* refactor: cleanup docs command
* chore: add changeset
* chore: rename browser to open
Co-authored-by: Nate Moore <nate@skypack.dev>
* Fixed outDir
* Updated server out
* changeset
* Renamed out to tmp
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* Fixes dynamic API routes in SSR
* Adds a changeset
* fix(#2981): keeps server alive
* chore: adding changeset
* keep alive until the 'close' or 'error' event fires
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* feat: human-readable error on bad site or base
* fix: human-readable error should have 1 config option
* docs: update README
* chore: changeset
* docs: mention localhost for testing via netlify CLI
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>