Skip to content

Commit

Permalink
Merge branch 'withastro:main' into cloudflare
Browse files Browse the repository at this point in the history
  • Loading branch information
AirBorne04 authored Oct 18, 2022
2 parents 0d44279 + ef0c543 commit d0ad202
Show file tree
Hide file tree
Showing 17 changed files with 171 additions and 54 deletions.
5 changes: 5 additions & 0 deletions .changeset/eighty-planes-kneel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'astro': patch
---

Ensure CLI flags override function-style server config
5 changes: 5 additions & 0 deletions .changeset/gold-roses-argue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'astro': patch
---

Support spread parameters for server endpoints
5 changes: 5 additions & 0 deletions .changeset/olive-jeans-shout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'astro': patch
---

Fix types not working properly when using `moduleResolution: 'node16'`
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ scripts/memory/project/src/pages/
*.log
package-lock.json
.turbo/
.eslintcache

# ignore top-level vscode settings
/.vscode/settings.json
Expand Down
2 changes: 1 addition & 1 deletion examples/docs/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export const SITE = {

export const OPEN_GRAPH = {
image: {
src: 'https://github.com/withastro/astro/blob/main/assets/social/banner.jpg?raw=true',
src: 'https://github.com/withastro/astro/blob/main/assets/social/banner-minimal.png?raw=true',
alt:
'astro logo on a starry expanse of space,' +
' with a purple saturn-like planet floating in the right foreground',
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"test:e2e": "cd packages/astro && pnpm playwright install && pnpm run test:e2e",
"test:e2e:match": "cd packages/astro && pnpm playwright install && pnpm run test:e2e:match",
"benchmark": "pnpm --filter @benchmark/simple run build && pnpm dlx concurrently -k -s first --raw \"node packages/astro/test/benchmark/simple/server.mjs\" \"pnpm dlx autocannon -c 100 -d 30 -p 10 localhost:3002/\"",
"lint": "eslint .",
"lint": "eslint --cache .",
"version": "changeset version && pnpm install --no-frozen-lockfile && pnpm run format"
},
"workspaces": [
Expand Down
10 changes: 5 additions & 5 deletions packages/astro/astro-jsx.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ declare namespace astroHTML.JSX {
children?: Children;
}

type AstroBuiltinProps = import('./dist/@types/astro').AstroBuiltinProps;
type AstroBuiltinAttributes = import('./dist/@types/astro').AstroBuiltinAttributes;
type AstroDefineVarsAttribute = import('./dist/@types/astro').AstroDefineVarsAttribute;
type AstroScriptAttributes = import('./dist/@types/astro').AstroScriptAttributes &
type AstroBuiltinProps = import('./dist/@types/astro.js').AstroBuiltinProps;
type AstroBuiltinAttributes = import('./dist/@types/astro.js').AstroBuiltinAttributes;
type AstroDefineVarsAttribute = import('./dist/@types/astro.js').AstroDefineVarsAttribute;
type AstroScriptAttributes = import('./dist/@types/astro.js').AstroScriptAttributes &
AstroDefineVarsAttribute;
type AstroStyleAttributes = import('./dist/@types/astro').AstroStyleAttributes &
type AstroStyleAttributes = import('./dist/@types/astro.js').AstroStyleAttributes &
AstroDefineVarsAttribute;

// This is an unfortunate use of `any`, but unfortunately we can't make a type that works for every framework
Expand Down
2 changes: 1 addition & 1 deletion packages/astro/config.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
type ViteUserConfig = import('vite').UserConfig;
type AstroUserConfig = import('./dist/@types/astro').AstroUserConfig;
type AstroUserConfig = import('./dist/@types/astro.js').AstroUserConfig;

/**
* See the full Astro Configuration API Documentation
Expand Down
2 changes: 1 addition & 1 deletion packages/astro/env.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
// As such, if the typings you're trying to add should be available inside ex: React components, they should instead
// be inside `client-base.d.ts`

type Astro = import('./dist/@types/astro').AstroGlobal;
type Astro = import('./dist/@types/astro.js').AstroGlobal;

// We have to duplicate the description here because editors won't show the JSDoc comment from the imported type
// However, they will for its properties, ex: Astro.request will show the AstroGlobal.request description
Expand Down
5 changes: 4 additions & 1 deletion packages/astro/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@
"./tsconfigs/*": "./tsconfigs/*.json",
"./jsx/*": "./dist/jsx/*",
"./jsx-runtime": "./dist/jsx-runtime/index.js",
"./config": "./config.mjs",
"./config": {
"types": "./config.d.ts",
"default": "./config.mjs"
},
"./app": "./dist/core/app/index.js",
"./app/node": "./dist/core/app/node.js",
"./client/*": "./dist/runtime/client/*",
Expand Down
14 changes: 12 additions & 2 deletions packages/astro/src/core/config/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,18 @@ export function createRelativeSchema(cmd: string, fileProtocolRoot: URL) {
.default({}),
server: z.preprocess(
// preprocess
(val) =>
typeof val === 'function' ? val({ command: cmd === 'dev' ? 'dev' : 'preview' }) : val,
(val) => {
if (typeof val === 'function') {
const result = val({ command: cmd === 'dev' ? 'dev' : 'preview' });
// @ts-expect-error revive attached prop added from CLI flags
if (val.port) result.port = val.port;
// @ts-expect-error revive attached prop added from CLI flags
if (val.host) result.host = val.host;
return result;
} else {
return val;
}
},
// validate
z
.object({
Expand Down
46 changes: 28 additions & 18 deletions packages/astro/src/core/routing/manifest/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,23 +63,30 @@ function getParts(part: string, file: string) {
function getPattern(segments: RoutePart[][], addTrailingSlash: AstroConfig['trailingSlash']) {
const pathname = segments
.map((segment) => {
return segment[0].spread
? '(?:\\/(.*?))?'
: '\\/' +
segment
.map((part) => {
if (part)
return part.dynamic
? '([^/]+?)'
: part.content
.normalize()
.replace(/\?/g, '%3F')
.replace(/#/g, '%23')
.replace(/%5B/g, '[')
.replace(/%5D/g, ']')
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
})
.join('');
if (segment.length === 1 && segment[0].spread) {
return '(?:\\/(.*?))?';
} else {
return (
'\\/' +
segment
.map((part) => {
if (part.spread) {
return '(.*?)';
} else if (part.dynamic) {
return '([^/]+?)';
} else {
return part.content
.normalize()
.replace(/\?/g, '%3F')
.replace(/#/g, '%23')
.replace(/%5B/g, '[')
.replace(/%5D/g, ']')
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
})
.join('')
);
}
})
.join('');

Expand Down Expand Up @@ -117,7 +124,10 @@ function validateSegment(segment: string, file = '') {
if (countOccurrences('[', segment) !== countOccurrences(']', segment)) {
throw new Error(`Invalid route ${file} \u2014 brackets are unbalanced`);
}
if (/.+\[\.\.\.[^\]]+\]/.test(segment) || /\[\.\.\.[^\]]+\].+/.test(segment)) {
if (
(/.+\[\.\.\.[^\]]+\]/.test(segment) || /\[\.\.\.[^\]]+\].+/.test(segment)) &&
file.endsWith('.astro')
) {
throw new Error(`Invalid route ${file} \u2014 rest parameter must be a standalone segment`);
}
}
Expand Down
37 changes: 20 additions & 17 deletions packages/astro/src/core/routing/manifest/generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,26 @@ export function getRouteGenerator(
) {
const template = segments
.map((segment) => {
return segment[0].spread
? `/:${segment[0].content.slice(3)}(.*)?`
: '/' +
segment
.map((part) => {
if (part)
return part.dynamic
? `:${part.content}`
: part.content
.normalize()
.replace(/\?/g, '%3F')
.replace(/#/g, '%23')
.replace(/%5B/g, '[')
.replace(/%5D/g, ']')
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
})
.join('');
return (
'/' +
segment
.map((part) => {
if (part.spread) {
return `:${part.content.slice(3)}(.*)?`;
} else if (part.dynamic) {
return `:${part.content}`;
} else {
return part.content
.normalize()
.replace(/\?/g, '%3F')
.replace(/#/g, '%23')
.replace(/%5B/g, '[')
.replace(/%5D/g, ']')
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
})
.join('')
);
})
.join('');

Expand Down
2 changes: 2 additions & 0 deletions packages/astro/test/fixtures/astro-basic/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@ import preact from '@astrojs/preact';
// https://astro.build/config
export default defineConfig({
integrations: [preact()],
// make sure CLI flags have precedence
server: () => ({ port: 3000 })
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { APIRoute } from 'astro';

export const get: APIRoute = async ({ params }) => {
return {
body: JSON.stringify({
path: params.slug,
}),
};
};

export function getStaticPaths() {
return [{ params: { slug: 'a' } }, { params: { slug: 'b/c' } }];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { APIRoute } from 'astro';

export const get: APIRoute = async ({ params }) => {
return {
body: JSON.stringify({
foo: params.foo,
bar: params.bar,
}),
};
};

export function getStaticPaths() {
return [{ params: { foo: 'a', bar: 'b' } }];
}
60 changes: 53 additions & 7 deletions packages/astro/test/routing-priority.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,21 @@ const routes = [
url: '/empty-slug/undefined',
fourOhFour: true,
},
{
description: 'matches /api/catch/a.json to api/catch/[...slug].json.ts',
url: '/api/catch/a.json',
htmlMatch: JSON.stringify({ path: 'a' }),
},
{
description: 'matches /api/catch/b/c.json to api/catch/[...slug].json.ts',
url: '/api/catch/b/c.json',
htmlMatch: JSON.stringify({ path: 'b/c' }),
},
{
description: 'matches /api/catch/a-b.json to api/catch/[foo]-[bar].json.ts',
url: '/api/catch/a-b.json',
htmlMatch: JSON.stringify({ foo: 'a', bar: 'b' }),
},
];

function appendForwardSlash(path) {
Expand All @@ -123,9 +138,11 @@ describe('Routing priority', () => {
await fixture.build();
});

routes.forEach(({ description, url, fourOhFour, h1, p }) => {
routes.forEach(({ description, url, fourOhFour, h1, p, htmlMatch }) => {
const isEndpoint = htmlMatch && !h1 && !p;

it(description, async () => {
const htmlFile = `${appendForwardSlash(url)}index.html`;
const htmlFile = isEndpoint ? url : `${appendForwardSlash(url)}index.html`;

if (fourOhFour) {
expect(fixture.pathExists(htmlFile)).to.be.false;
Expand All @@ -135,11 +152,17 @@ describe('Routing priority', () => {
const html = await fixture.readFile(htmlFile);
const $ = cheerioLoad(html);

expect($('h1').text()).to.equal(h1);
if (h1) {
expect($('h1').text()).to.equal(h1);
}

if (p) {
expect($('p').text()).to.equal(p);
}

if (htmlMatch) {
expect(html).to.equal(htmlMatch);
}
});
});
});
Expand All @@ -160,7 +183,9 @@ describe('Routing priority', () => {
await devServer.stop();
});

routes.forEach(({ description, url, fourOhFour, h1, p }) => {
routes.forEach(({ description, url, fourOhFour, h1, p, htmlMatch }) => {
const isEndpoint = htmlMatch && !h1 && !p;

// checks URLs as written above
it(description, async () => {
const html = await fixture.fetch(url).then((res) => res.text());
Expand All @@ -171,13 +196,22 @@ describe('Routing priority', () => {
return;
}

expect($('h1').text()).to.equal(h1);
if (h1) {
expect($('h1').text()).to.equal(h1);
}

if (p) {
expect($('p').text()).to.equal(p);
}

if (htmlMatch) {
expect(html).to.equal(htmlMatch);
}
});

// skip for endpoint page test
if (isEndpoint) return;

// checks with trailing slashes, ex: '/de/' instead of '/de'
it(`${description} (trailing slash)`, async () => {
const html = await fixture.fetch(appendForwardSlash(url)).then((res) => res.text());
Expand All @@ -188,11 +222,17 @@ describe('Routing priority', () => {
return;
}

expect($('h1').text()).to.equal(h1);
if (h1) {
expect($('h1').text()).to.equal(h1);
}

if (p) {
expect($('p').text()).to.equal(p);
}

if (htmlMatch) {
expect(html).to.equal(htmlMatch);
}
});

// checks with index.html, ex: '/de/index.html' instead of '/de'
Expand All @@ -207,11 +247,17 @@ describe('Routing priority', () => {
return;
}

expect($('h1').text()).to.equal(h1);
if (h1) {
expect($('h1').text()).to.equal(h1);
}

if (p) {
expect($('p').text()).to.equal(p);
}

if (htmlMatch) {
expect(html).to.equal(htmlMatch);
}
});
});
});
Expand Down

0 comments on commit d0ad202

Please sign in to comment.