@shopify/remix-oxygen 1.0.0-alpha.1

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.
@@ -0,0 +1,131 @@
1
+ 'use strict';
2
+
3
+ var serverRuntime = require('@remix-run/server-runtime');
4
+
5
+ // src/implementations.ts
6
+
7
+ // src/crypto.ts
8
+ var encoder = new TextEncoder();
9
+ var sign = async (value, secret) => {
10
+ const key = await createKey(secret, ["sign"]);
11
+ const data = encoder.encode(value);
12
+ const signature = await crypto.subtle.sign("HMAC", key, data);
13
+ const hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(
14
+ /=+$/,
15
+ ""
16
+ );
17
+ return value + "." + hash;
18
+ };
19
+ var unsign = async (signed, secret) => {
20
+ const index = signed.lastIndexOf(".");
21
+ const value = signed.slice(0, index);
22
+ const hash = signed.slice(index + 1);
23
+ const key = await createKey(secret, ["verify"]);
24
+ const data = encoder.encode(value);
25
+ const signature = byteStringToUint8Array(atob(hash));
26
+ const valid = await crypto.subtle.verify("HMAC", key, signature, data);
27
+ return valid ? value : false;
28
+ };
29
+ async function createKey(secret, usages) {
30
+ const key = await crypto.subtle.importKey(
31
+ "raw",
32
+ encoder.encode(secret),
33
+ { name: "HMAC", hash: "SHA-256" },
34
+ false,
35
+ usages
36
+ );
37
+ return key;
38
+ }
39
+ function byteStringToUint8Array(byteString) {
40
+ const array = new Uint8Array(byteString.length);
41
+ for (let i = 0; i < byteString.length; i++) {
42
+ array[i] = byteString.charCodeAt(i);
43
+ }
44
+ return array;
45
+ }
46
+
47
+ // src/implementations.ts
48
+ var createCookie = serverRuntime.createCookieFactory({ sign, unsign });
49
+ var createCookieSessionStorage = serverRuntime.createCookieSessionStorageFactory(createCookie);
50
+ var createSessionStorage = serverRuntime.createSessionStorageFactory(createCookie);
51
+ var createMemorySessionStorage = serverRuntime.createMemorySessionStorageFactory(createSessionStorage);
52
+ function createRequestHandler({
53
+ build,
54
+ mode,
55
+ getLoadContext,
56
+ shouldProxyAsset
57
+ }) {
58
+ const handleRequest = serverRuntime.createRequestHandler(build, mode);
59
+ return async (request) => {
60
+ const url = new URL(request.url);
61
+ if (url.pathname === "/__health") {
62
+ return new Response(null, { status: 200 });
63
+ }
64
+ if (mode === "production" && build.publicPath !== void 0 && shouldProxyAsset?.(request.url)) {
65
+ const newOriginAndPathPrefix = (build.publicPath || "").replace(
66
+ /\/build\/$/,
67
+ ""
68
+ );
69
+ return fetch(
70
+ request.url.replace(url.origin, newOriginAndPathPrefix),
71
+ request
72
+ );
73
+ }
74
+ return handleRequest(
75
+ request,
76
+ await getLoadContext?.(request)
77
+ );
78
+ };
79
+ }
80
+ function getBuyerIp(request) {
81
+ return request.headers.get("oxygen-buyer-ip") ?? void 0;
82
+ }
83
+
84
+ Object.defineProperty(exports, 'MaxPartSizeExceededError', {
85
+ enumerable: true,
86
+ get: function () { return serverRuntime.MaxPartSizeExceededError; }
87
+ });
88
+ Object.defineProperty(exports, 'createSession', {
89
+ enumerable: true,
90
+ get: function () { return serverRuntime.createSession; }
91
+ });
92
+ Object.defineProperty(exports, 'defer', {
93
+ enumerable: true,
94
+ get: function () { return serverRuntime.defer; }
95
+ });
96
+ Object.defineProperty(exports, 'isCookie', {
97
+ enumerable: true,
98
+ get: function () { return serverRuntime.isCookie; }
99
+ });
100
+ Object.defineProperty(exports, 'isSession', {
101
+ enumerable: true,
102
+ get: function () { return serverRuntime.isSession; }
103
+ });
104
+ Object.defineProperty(exports, 'json', {
105
+ enumerable: true,
106
+ get: function () { return serverRuntime.json; }
107
+ });
108
+ Object.defineProperty(exports, 'redirect', {
109
+ enumerable: true,
110
+ get: function () { return serverRuntime.redirect; }
111
+ });
112
+ Object.defineProperty(exports, 'unstable_composeUploadHandlers', {
113
+ enumerable: true,
114
+ get: function () { return serverRuntime.unstable_composeUploadHandlers; }
115
+ });
116
+ Object.defineProperty(exports, 'unstable_createMemoryUploadHandler', {
117
+ enumerable: true,
118
+ get: function () { return serverRuntime.unstable_createMemoryUploadHandler; }
119
+ });
120
+ Object.defineProperty(exports, 'unstable_parseMultipartFormData', {
121
+ enumerable: true,
122
+ get: function () { return serverRuntime.unstable_parseMultipartFormData; }
123
+ });
124
+ exports.createCookie = createCookie;
125
+ exports.createCookieSessionStorage = createCookieSessionStorage;
126
+ exports.createMemorySessionStorage = createMemorySessionStorage;
127
+ exports.createRequestHandler = createRequestHandler;
128
+ exports.createSessionStorage = createSessionStorage;
129
+ exports.getBuyerIp = getBuyerIp;
130
+ //# sourceMappingURL=out.js.map
131
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/implementations.ts","../../src/crypto.ts","../../src/server.ts","../../src/index.ts"],"names":[],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACHP,IAAM,UAAU,IAAI,YAAY;AAEzB,IAAM,OAAqB,OAAO,OAAO,WAAW;AACzD,QAAM,MAAM,MAAM,UAAU,QAAQ,CAAC,MAAM,CAAC;AAC5C,QAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,QAAM,YAAY,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,IAAI;AAC5D,QAAM,OAAO,KAAK,OAAO,aAAa,GAAG,IAAI,WAAW,SAAS,CAAC,CAAC,EAAE;AAAA,IACnE;AAAA,IACA;AAAA,EACF;AAEA,SAAO,QAAQ,MAAM;AACvB;AAEO,IAAM,SAAyB,OAAO,QAAQ,WAAW;AAC9D,QAAM,QAAQ,OAAO,YAAY,GAAG;AACpC,QAAM,QAAQ,OAAO,MAAM,GAAG,KAAK;AACnC,QAAM,OAAO,OAAO,MAAM,QAAQ,CAAC;AAEnC,QAAM,MAAM,MAAM,UAAU,QAAQ,CAAC,QAAQ,CAAC;AAC9C,QAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,QAAM,YAAY,uBAAuB,KAAK,IAAI,CAAC;AACnD,QAAM,QAAQ,MAAM,OAAO,OAAO,OAAO,QAAQ,KAAK,WAAW,IAAI;AAErE,SAAO,QAAQ,QAAQ;AACzB;AAEA,eAAe,UACb,QACA,QACoB;AACpB,QAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA,QAAQ,OAAO,MAAM;AAAA,IACrB,EAAC,MAAM,QAAQ,MAAM,UAAS;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,YAAgC;AAC9D,QAAM,QAAQ,IAAI,WAAW,WAAW,MAAM;AAE9C,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAM,KAAK,WAAW,WAAW,CAAC;AAAA,EACpC;AAEA,SAAO;AACT;;;AD3CO,IAAM,eAAe,oBAAoB,EAAC,MAAM,OAAM,CAAC;AACvD,IAAM,6BACX,kCAAkC,YAAY;AACzC,IAAM,uBAAuB,4BAA4B,YAAY;AACrE,IAAM,6BACX,kCAAkC,oBAAoB;;;AEdxD;AAAA,EACE,wBAAwB;AAAA,OAGnB;AAEA,SAAS,qBAAwC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAkBG;AACD,QAAM,gBAAgB,0BAA0B,OAAO,IAAI;AAE3D,SAAO,OAAO,YAAqB;AACjC,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAE/B,QAAI,IAAI,aAAa,aAAa;AAGhC,aAAO,IAAI,SAAS,MAAM,EAAC,QAAQ,IAAG,CAAC;AAAA,IACzC;AAEA,QACE,SAAS,gBACT,MAAM,eAAe,UACrB,mBAAmB,QAAQ,GAAG,GAC9B;AAOA,YAAM,0BAA0B,MAAM,cAAc,IAAI;AAAA,QACtD;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,QAAQ,IAAI,QAAQ,IAAI,QAAQ,sBAAsB;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACC,MAAM,iBAAiB,OAAO;AAAA,IACjC;AAAA,EACF;AACF;AAEO,SAAS,WAAW,SAAkB;AAC3C,SAAO,QAAQ,QAAQ,IAAI,iBAAiB,KAAK;AACnD;;;AC/DA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK","sourcesContent":["import {\n createCookieFactory,\n createCookieSessionStorageFactory,\n createMemorySessionStorageFactory,\n createSessionStorageFactory,\n} from '@remix-run/server-runtime';\n\nimport {sign, unsign} from './crypto';\n\nexport const createCookie = createCookieFactory({sign, unsign});\nexport const createCookieSessionStorage =\n createCookieSessionStorageFactory(createCookie);\nexport const createSessionStorage = createSessionStorageFactory(createCookie);\nexport const createMemorySessionStorage =\n createMemorySessionStorageFactory(createSessionStorage);\n","import type {SignFunction, UnsignFunction} from '@remix-run/server-runtime';\n\nconst encoder = new TextEncoder();\n\nexport const sign: SignFunction = async (value, secret) => {\n const key = await createKey(secret, ['sign']);\n const data = encoder.encode(value);\n const signature = await crypto.subtle.sign('HMAC', key, data);\n const hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(\n /=+$/,\n '',\n );\n\n return value + '.' + hash;\n};\n\nexport const unsign: UnsignFunction = async (signed, secret) => {\n const index = signed.lastIndexOf('.');\n const value = signed.slice(0, index);\n const hash = signed.slice(index + 1);\n\n const key = await createKey(secret, ['verify']);\n const data = encoder.encode(value);\n const signature = byteStringToUint8Array(atob(hash));\n const valid = await crypto.subtle.verify('HMAC', key, signature, data);\n\n return valid ? value : false;\n};\n\nasync function createKey(\n secret: string,\n usages: CryptoKey['usages'],\n): Promise<CryptoKey> {\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n {name: 'HMAC', hash: 'SHA-256'},\n false,\n usages,\n );\n\n return key;\n}\n\nfunction byteStringToUint8Array(byteString: string): Uint8Array {\n const array = new Uint8Array(byteString.length);\n\n for (let i = 0; i < byteString.length; i++) {\n array[i] = byteString.charCodeAt(i);\n }\n\n return array;\n}\n","import {\n createRequestHandler as createRemixRequestHandler,\n type AppLoadContext,\n type ServerBuild,\n} from '@remix-run/server-runtime';\n\nexport function createRequestHandler<Context = unknown>({\n build,\n mode,\n getLoadContext,\n shouldProxyAsset,\n}: {\n build: ServerBuild;\n mode?: string;\n getLoadContext?: (request: Request) => Promise<Context> | Context;\n /**\n * By default, Hydrogen will prefix all static assets with a CDN url.\n * If you need to serve static assets from the same domain or from the root,\n * then update the `shouldProxyAsset: (url: string) => boolean` function below\n * to return `true` when the url (pathname) matches your asset.\n *\n * @example\n * ```ts\n * shouldProxyAsset(url) {\n * return new URL(url).pathname === '/robots.txt';\n * }\n * ```\n */\n shouldProxyAsset?: (url: string) => boolean;\n}) {\n const handleRequest = createRemixRequestHandler(build, mode);\n\n return async (request: Request) => {\n const url = new URL(request.url);\n\n if (url.pathname === '/__health') {\n // This is temporary until Oxygen implements a way to verify deployments.\n // https://github.com/Shopify/oxygen-platform/issues/778\n return new Response(null, {status: 200});\n }\n\n if (\n mode === 'production' &&\n build.publicPath !== undefined &&\n shouldProxyAsset?.(request.url)\n ) {\n /**\n * Use the assetPrefix (publicPath) as the origin. Note that Remix expects client assets to be\n * prefixed with `/build/*`, and as such, `/build/` is included in the Oxygen-created `assetPrefix`.\n * However, we need strip out the leading `/build/` for this use case, as developers may wish to\n * serve a static asset from the root `/public` folder (one level up from `/build`).\n */\n const newOriginAndPathPrefix = (build.publicPath || '').replace(\n /\\/build\\/$/,\n '',\n );\n\n return fetch(\n request.url.replace(url.origin, newOriginAndPathPrefix),\n request,\n );\n }\n\n return handleRequest(\n request,\n (await getLoadContext?.(request)) as AppLoadContext,\n );\n };\n}\n\nexport function getBuyerIp(request: Request) {\n return request.headers.get('oxygen-buyer-ip') ?? undefined;\n}\n","export {\n createCookie,\n createCookieSessionStorage,\n createMemorySessionStorage,\n createSessionStorage,\n} from './implementations';\n\nexport {createRequestHandler, getBuyerIp} from './server';\n\nexport {\n createSession,\n isCookie,\n isSession,\n json,\n MaxPartSizeExceededError,\n redirect,\n defer,\n unstable_composeUploadHandlers,\n unstable_createMemoryUploadHandler,\n unstable_parseMultipartFormData,\n} from '@remix-run/server-runtime';\n\nexport type {\n ActionArgs,\n ActionFunction,\n AppData,\n AppLoadContext,\n Cookie,\n CookieOptions,\n CookieParseOptions,\n CookieSerializeOptions,\n CookieSignatureOptions,\n DataFunctionArgs,\n EntryContext,\n ErrorBoundaryComponent,\n HandleDataRequestFunction,\n HandleDocumentRequestFunction,\n HeadersFunction,\n HtmlLinkDescriptor,\n HtmlMetaDescriptor,\n LinkDescriptor,\n LinksFunction,\n LoaderFunction,\n LoaderArgs,\n MemoryUploadHandlerFilterArgs,\n MemoryUploadHandlerOptions,\n MetaDescriptor,\n MetaFunction,\n PageLinkDescriptor,\n RequestHandler,\n RouteComponent,\n RouteHandle,\n SerializeFrom,\n ServerBuild,\n ServerEntryModule,\n Session,\n SessionData,\n SessionIdStorageStrategy,\n SessionStorage,\n SignFunction,\n TypedResponse,\n UnsignFunction,\n UploadHandlerPart,\n UploadHandler,\n} from '@remix-run/server-runtime';\n"]}
@@ -0,0 +1,85 @@
1
+ import { createCookieFactory, createCookieSessionStorageFactory, createSessionStorageFactory, createMemorySessionStorageFactory, createRequestHandler as createRequestHandler$1 } from '@remix-run/server-runtime';
2
+ export { MaxPartSizeExceededError, createSession, defer, isCookie, isSession, json, redirect, unstable_composeUploadHandlers, unstable_createMemoryUploadHandler, unstable_parseMultipartFormData } from '@remix-run/server-runtime';
3
+
4
+ // src/implementations.ts
5
+
6
+ // src/crypto.ts
7
+ var encoder = new TextEncoder();
8
+ var sign = async (value, secret) => {
9
+ const key = await createKey(secret, ["sign"]);
10
+ const data = encoder.encode(value);
11
+ const signature = await crypto.subtle.sign("HMAC", key, data);
12
+ const hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(
13
+ /=+$/,
14
+ ""
15
+ );
16
+ return value + "." + hash;
17
+ };
18
+ var unsign = async (signed, secret) => {
19
+ const index = signed.lastIndexOf(".");
20
+ const value = signed.slice(0, index);
21
+ const hash = signed.slice(index + 1);
22
+ const key = await createKey(secret, ["verify"]);
23
+ const data = encoder.encode(value);
24
+ const signature = byteStringToUint8Array(atob(hash));
25
+ const valid = await crypto.subtle.verify("HMAC", key, signature, data);
26
+ return valid ? value : false;
27
+ };
28
+ async function createKey(secret, usages) {
29
+ const key = await crypto.subtle.importKey(
30
+ "raw",
31
+ encoder.encode(secret),
32
+ { name: "HMAC", hash: "SHA-256" },
33
+ false,
34
+ usages
35
+ );
36
+ return key;
37
+ }
38
+ function byteStringToUint8Array(byteString) {
39
+ const array = new Uint8Array(byteString.length);
40
+ for (let i = 0; i < byteString.length; i++) {
41
+ array[i] = byteString.charCodeAt(i);
42
+ }
43
+ return array;
44
+ }
45
+
46
+ // src/implementations.ts
47
+ var createCookie = createCookieFactory({ sign, unsign });
48
+ var createCookieSessionStorage = createCookieSessionStorageFactory(createCookie);
49
+ var createSessionStorage = createSessionStorageFactory(createCookie);
50
+ var createMemorySessionStorage = createMemorySessionStorageFactory(createSessionStorage);
51
+ function createRequestHandler({
52
+ build,
53
+ mode,
54
+ getLoadContext,
55
+ shouldProxyAsset
56
+ }) {
57
+ const handleRequest = createRequestHandler$1(build, mode);
58
+ return async (request) => {
59
+ const url = new URL(request.url);
60
+ if (url.pathname === "/__health") {
61
+ return new Response(null, { status: 200 });
62
+ }
63
+ if (mode === "production" && build.publicPath !== void 0 && shouldProxyAsset?.(request.url)) {
64
+ const newOriginAndPathPrefix = (build.publicPath || "").replace(
65
+ /\/build\/$/,
66
+ ""
67
+ );
68
+ return fetch(
69
+ request.url.replace(url.origin, newOriginAndPathPrefix),
70
+ request
71
+ );
72
+ }
73
+ return handleRequest(
74
+ request,
75
+ await getLoadContext?.(request)
76
+ );
77
+ };
78
+ }
79
+ function getBuyerIp(request) {
80
+ return request.headers.get("oxygen-buyer-ip") ?? void 0;
81
+ }
82
+
83
+ export { createCookie, createCookieSessionStorage, createMemorySessionStorage, createRequestHandler, createSessionStorage, getBuyerIp };
84
+ //# sourceMappingURL=out.js.map
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/implementations.ts","../../src/crypto.ts","../../src/server.ts","../../src/index.ts"],"names":[],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACHP,IAAM,UAAU,IAAI,YAAY;AAEzB,IAAM,OAAqB,OAAO,OAAO,WAAW;AACzD,QAAM,MAAM,MAAM,UAAU,QAAQ,CAAC,MAAM,CAAC;AAC5C,QAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,QAAM,YAAY,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,IAAI;AAC5D,QAAM,OAAO,KAAK,OAAO,aAAa,GAAG,IAAI,WAAW,SAAS,CAAC,CAAC,EAAE;AAAA,IACnE;AAAA,IACA;AAAA,EACF;AAEA,SAAO,QAAQ,MAAM;AACvB;AAEO,IAAM,SAAyB,OAAO,QAAQ,WAAW;AAC9D,QAAM,QAAQ,OAAO,YAAY,GAAG;AACpC,QAAM,QAAQ,OAAO,MAAM,GAAG,KAAK;AACnC,QAAM,OAAO,OAAO,MAAM,QAAQ,CAAC;AAEnC,QAAM,MAAM,MAAM,UAAU,QAAQ,CAAC,QAAQ,CAAC;AAC9C,QAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,QAAM,YAAY,uBAAuB,KAAK,IAAI,CAAC;AACnD,QAAM,QAAQ,MAAM,OAAO,OAAO,OAAO,QAAQ,KAAK,WAAW,IAAI;AAErE,SAAO,QAAQ,QAAQ;AACzB;AAEA,eAAe,UACb,QACA,QACoB;AACpB,QAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA,QAAQ,OAAO,MAAM;AAAA,IACrB,EAAC,MAAM,QAAQ,MAAM,UAAS;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,YAAgC;AAC9D,QAAM,QAAQ,IAAI,WAAW,WAAW,MAAM;AAE9C,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAM,KAAK,WAAW,WAAW,CAAC;AAAA,EACpC;AAEA,SAAO;AACT;;;AD3CO,IAAM,eAAe,oBAAoB,EAAC,MAAM,OAAM,CAAC;AACvD,IAAM,6BACX,kCAAkC,YAAY;AACzC,IAAM,uBAAuB,4BAA4B,YAAY;AACrE,IAAM,6BACX,kCAAkC,oBAAoB;;;AEdxD;AAAA,EACE,wBAAwB;AAAA,OAGnB;AAEA,SAAS,qBAAwC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAkBG;AACD,QAAM,gBAAgB,0BAA0B,OAAO,IAAI;AAE3D,SAAO,OAAO,YAAqB;AACjC,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAE/B,QAAI,IAAI,aAAa,aAAa;AAGhC,aAAO,IAAI,SAAS,MAAM,EAAC,QAAQ,IAAG,CAAC;AAAA,IACzC;AAEA,QACE,SAAS,gBACT,MAAM,eAAe,UACrB,mBAAmB,QAAQ,GAAG,GAC9B;AAOA,YAAM,0BAA0B,MAAM,cAAc,IAAI;AAAA,QACtD;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,QAAQ,IAAI,QAAQ,IAAI,QAAQ,sBAAsB;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACC,MAAM,iBAAiB,OAAO;AAAA,IACjC;AAAA,EACF;AACF;AAEO,SAAS,WAAW,SAAkB;AAC3C,SAAO,QAAQ,QAAQ,IAAI,iBAAiB,KAAK;AACnD;;;AC/DA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK","sourcesContent":["import {\n createCookieFactory,\n createCookieSessionStorageFactory,\n createMemorySessionStorageFactory,\n createSessionStorageFactory,\n} from '@remix-run/server-runtime';\n\nimport {sign, unsign} from './crypto';\n\nexport const createCookie = createCookieFactory({sign, unsign});\nexport const createCookieSessionStorage =\n createCookieSessionStorageFactory(createCookie);\nexport const createSessionStorage = createSessionStorageFactory(createCookie);\nexport const createMemorySessionStorage =\n createMemorySessionStorageFactory(createSessionStorage);\n","import type {SignFunction, UnsignFunction} from '@remix-run/server-runtime';\n\nconst encoder = new TextEncoder();\n\nexport const sign: SignFunction = async (value, secret) => {\n const key = await createKey(secret, ['sign']);\n const data = encoder.encode(value);\n const signature = await crypto.subtle.sign('HMAC', key, data);\n const hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(\n /=+$/,\n '',\n );\n\n return value + '.' + hash;\n};\n\nexport const unsign: UnsignFunction = async (signed, secret) => {\n const index = signed.lastIndexOf('.');\n const value = signed.slice(0, index);\n const hash = signed.slice(index + 1);\n\n const key = await createKey(secret, ['verify']);\n const data = encoder.encode(value);\n const signature = byteStringToUint8Array(atob(hash));\n const valid = await crypto.subtle.verify('HMAC', key, signature, data);\n\n return valid ? value : false;\n};\n\nasync function createKey(\n secret: string,\n usages: CryptoKey['usages'],\n): Promise<CryptoKey> {\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n {name: 'HMAC', hash: 'SHA-256'},\n false,\n usages,\n );\n\n return key;\n}\n\nfunction byteStringToUint8Array(byteString: string): Uint8Array {\n const array = new Uint8Array(byteString.length);\n\n for (let i = 0; i < byteString.length; i++) {\n array[i] = byteString.charCodeAt(i);\n }\n\n return array;\n}\n","import {\n createRequestHandler as createRemixRequestHandler,\n type AppLoadContext,\n type ServerBuild,\n} from '@remix-run/server-runtime';\n\nexport function createRequestHandler<Context = unknown>({\n build,\n mode,\n getLoadContext,\n shouldProxyAsset,\n}: {\n build: ServerBuild;\n mode?: string;\n getLoadContext?: (request: Request) => Promise<Context> | Context;\n /**\n * By default, Hydrogen will prefix all static assets with a CDN url.\n * If you need to serve static assets from the same domain or from the root,\n * then update the `shouldProxyAsset: (url: string) => boolean` function below\n * to return `true` when the url (pathname) matches your asset.\n *\n * @example\n * ```ts\n * shouldProxyAsset(url) {\n * return new URL(url).pathname === '/robots.txt';\n * }\n * ```\n */\n shouldProxyAsset?: (url: string) => boolean;\n}) {\n const handleRequest = createRemixRequestHandler(build, mode);\n\n return async (request: Request) => {\n const url = new URL(request.url);\n\n if (url.pathname === '/__health') {\n // This is temporary until Oxygen implements a way to verify deployments.\n // https://github.com/Shopify/oxygen-platform/issues/778\n return new Response(null, {status: 200});\n }\n\n if (\n mode === 'production' &&\n build.publicPath !== undefined &&\n shouldProxyAsset?.(request.url)\n ) {\n /**\n * Use the assetPrefix (publicPath) as the origin. Note that Remix expects client assets to be\n * prefixed with `/build/*`, and as such, `/build/` is included in the Oxygen-created `assetPrefix`.\n * However, we need strip out the leading `/build/` for this use case, as developers may wish to\n * serve a static asset from the root `/public` folder (one level up from `/build`).\n */\n const newOriginAndPathPrefix = (build.publicPath || '').replace(\n /\\/build\\/$/,\n '',\n );\n\n return fetch(\n request.url.replace(url.origin, newOriginAndPathPrefix),\n request,\n );\n }\n\n return handleRequest(\n request,\n (await getLoadContext?.(request)) as AppLoadContext,\n );\n };\n}\n\nexport function getBuyerIp(request: Request) {\n return request.headers.get('oxygen-buyer-ip') ?? undefined;\n}\n","export {\n createCookie,\n createCookieSessionStorage,\n createMemorySessionStorage,\n createSessionStorage,\n} from './implementations';\n\nexport {createRequestHandler, getBuyerIp} from './server';\n\nexport {\n createSession,\n isCookie,\n isSession,\n json,\n MaxPartSizeExceededError,\n redirect,\n defer,\n unstable_composeUploadHandlers,\n unstable_createMemoryUploadHandler,\n unstable_parseMultipartFormData,\n} from '@remix-run/server-runtime';\n\nexport type {\n ActionArgs,\n ActionFunction,\n AppData,\n AppLoadContext,\n Cookie,\n CookieOptions,\n CookieParseOptions,\n CookieSerializeOptions,\n CookieSignatureOptions,\n DataFunctionArgs,\n EntryContext,\n ErrorBoundaryComponent,\n HandleDataRequestFunction,\n HandleDocumentRequestFunction,\n HeadersFunction,\n HtmlLinkDescriptor,\n HtmlMetaDescriptor,\n LinkDescriptor,\n LinksFunction,\n LoaderFunction,\n LoaderArgs,\n MemoryUploadHandlerFilterArgs,\n MemoryUploadHandlerOptions,\n MetaDescriptor,\n MetaFunction,\n PageLinkDescriptor,\n RequestHandler,\n RouteComponent,\n RouteHandle,\n SerializeFrom,\n ServerBuild,\n ServerEntryModule,\n Session,\n SessionData,\n SessionIdStorageStrategy,\n SessionStorage,\n SignFunction,\n TypedResponse,\n UnsignFunction,\n UploadHandlerPart,\n UploadHandler,\n} from '@remix-run/server-runtime';\n"]}
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ module.exports = process.env.NODE_ENV === 'development' ? require('./development/index.cjs') : require('./production/index.cjs');
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var serverRuntime = require('@remix-run/server-runtime');
4
+
5
+ var c=new TextEncoder,p=async(e,o)=>{let t=await d(o,["sign"]),n=c.encode(e),a=await crypto.subtle.sign("HMAC",t,n),r=btoa(String.fromCharCode(...new Uint8Array(a))).replace(/=+$/,"");return e+"."+r},l=async(e,o)=>{let t=e.lastIndexOf("."),n=e.slice(0,t),a=e.slice(t+1),r=await d(o,["verify"]),i=c.encode(n),s=g(atob(a));return await crypto.subtle.verify("HMAC",r,s,i)?n:!1};async function d(e,o){return await crypto.subtle.importKey("raw",c.encode(e),{name:"HMAC",hash:"SHA-256"},!1,o)}function g(e){let o=new Uint8Array(e.length);for(let t=0;t<e.length;t++)o[t]=e.charCodeAt(t);return o}var u=serverRuntime.createCookieFactory({sign:p,unsign:l}),f=serverRuntime.createCookieSessionStorageFactory(u),y=serverRuntime.createSessionStorageFactory(u),k=serverRuntime.createMemorySessionStorageFactory(y);function F({build:e,mode:o,getLoadContext:t,shouldProxyAsset:n}){let a=serverRuntime.createRequestHandler(e,o);return async r=>{let i=new URL(r.url);if(i.pathname==="/__health")return new Response(null,{status:200});if(o==="production"&&e.publicPath!==void 0&&n?.(r.url)){let s=(e.publicPath||"").replace(/\/build\/$/,"");return fetch(r.url.replace(i.origin,s),r)}return a(r,await t?.(r))}}function H(e){return e.headers.get("oxygen-buyer-ip")??void 0}
6
+
7
+ Object.defineProperty(exports, 'MaxPartSizeExceededError', {
8
+ enumerable: true,
9
+ get: function () { return serverRuntime.MaxPartSizeExceededError; }
10
+ });
11
+ Object.defineProperty(exports, 'createSession', {
12
+ enumerable: true,
13
+ get: function () { return serverRuntime.createSession; }
14
+ });
15
+ Object.defineProperty(exports, 'defer', {
16
+ enumerable: true,
17
+ get: function () { return serverRuntime.defer; }
18
+ });
19
+ Object.defineProperty(exports, 'isCookie', {
20
+ enumerable: true,
21
+ get: function () { return serverRuntime.isCookie; }
22
+ });
23
+ Object.defineProperty(exports, 'isSession', {
24
+ enumerable: true,
25
+ get: function () { return serverRuntime.isSession; }
26
+ });
27
+ Object.defineProperty(exports, 'json', {
28
+ enumerable: true,
29
+ get: function () { return serverRuntime.json; }
30
+ });
31
+ Object.defineProperty(exports, 'redirect', {
32
+ enumerable: true,
33
+ get: function () { return serverRuntime.redirect; }
34
+ });
35
+ Object.defineProperty(exports, 'unstable_composeUploadHandlers', {
36
+ enumerable: true,
37
+ get: function () { return serverRuntime.unstable_composeUploadHandlers; }
38
+ });
39
+ Object.defineProperty(exports, 'unstable_createMemoryUploadHandler', {
40
+ enumerable: true,
41
+ get: function () { return serverRuntime.unstable_createMemoryUploadHandler; }
42
+ });
43
+ Object.defineProperty(exports, 'unstable_parseMultipartFormData', {
44
+ enumerable: true,
45
+ get: function () { return serverRuntime.unstable_parseMultipartFormData; }
46
+ });
47
+ exports.createCookie = u;
48
+ exports.createCookieSessionStorage = f;
49
+ exports.createMemorySessionStorage = k;
50
+ exports.createRequestHandler = F;
51
+ exports.createSessionStorage = y;
52
+ exports.getBuyerIp = H;
53
+ //# sourceMappingURL=out.js.map
54
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/implementations.ts","../../src/crypto.ts","../../src/server.ts","../../src/index.ts"],"names":["createCookieFactory","createCookieSessionStorageFactory","createMemorySessionStorageFactory","createSessionStorageFactory","encoder","sign","value","secret","key","createKey","data","signature","hash","unsign","signed","index","byteStringToUint8Array","usages","byteString","array","i","createCookie","createCookieSessionStorage","createSessionStorage","createMemorySessionStorage","createRemixRequestHandler","createRequestHandler","build","mode","getLoadContext","shouldProxyAsset","handleRequest","request","url","newOriginAndPathPrefix","getBuyerIp","createSession","isCookie","isSession","json","MaxPartSizeExceededError","redirect","defer","unstable_composeUploadHandlers","unstable_createMemoryUploadHandler","unstable_parseMultipartFormData"],"mappings":"AAAA,OACE,uBAAAA,EACA,qCAAAC,EACA,qCAAAC,EACA,+BAAAC,MACK,4BCHP,IAAMC,EAAU,IAAI,YAEPC,EAAqB,MAAOC,EAAOC,IAAW,CACzD,IAAMC,EAAM,MAAMC,EAAUF,EAAQ,CAAC,MAAM,CAAC,EACtCG,EAAON,EAAQ,OAAOE,CAAK,EAC3BK,EAAY,MAAM,OAAO,OAAO,KAAK,OAAQH,EAAKE,CAAI,EACtDE,EAAO,KAAK,OAAO,aAAa,GAAG,IAAI,WAAWD,CAAS,CAAC,CAAC,EAAE,QACnE,MACA,EACF,EAEA,OAAOL,EAAQ,IAAMM,CACvB,EAEaC,EAAyB,MAAOC,EAAQP,IAAW,CAC9D,IAAMQ,EAAQD,EAAO,YAAY,GAAG,EAC9BR,EAAQQ,EAAO,MAAM,EAAGC,CAAK,EAC7BH,EAAOE,EAAO,MAAMC,EAAQ,CAAC,EAE7BP,EAAM,MAAMC,EAAUF,EAAQ,CAAC,QAAQ,CAAC,EACxCG,EAAON,EAAQ,OAAOE,CAAK,EAC3BK,EAAYK,EAAuB,KAAKJ,CAAI,CAAC,EAGnD,OAFc,MAAM,OAAO,OAAO,OAAO,OAAQJ,EAAKG,EAAWD,CAAI,EAEtDJ,EAAQ,EACzB,EAEA,eAAeG,EACbF,EACAU,EACoB,CASpB,OARY,MAAM,OAAO,OAAO,UAC9B,MACAb,EAAQ,OAAOG,CAAM,EACrB,CAAC,KAAM,OAAQ,KAAM,SAAS,EAC9B,GACAU,CACF,CAGF,CAEA,SAASD,EAAuBE,EAAgC,CAC9D,IAAMC,EAAQ,IAAI,WAAWD,EAAW,MAAM,EAE9C,QAASE,EAAI,EAAGA,EAAIF,EAAW,OAAQE,IACrCD,EAAMC,GAAKF,EAAW,WAAWE,CAAC,EAGpC,OAAOD,CACT,CD3CO,IAAME,EAAerB,EAAoB,CAAC,KAAAK,EAAM,OAAAQ,CAAM,CAAC,EACjDS,EACXrB,EAAkCoB,CAAY,EACnCE,EAAuBpB,EAA4BkB,CAAY,EAC/DG,EACXtB,EAAkCqB,CAAoB,EEdxD,OACE,wBAAwBE,MAGnB,4BAEA,SAASC,EAAwC,CACtD,MAAAC,EACA,KAAAC,EACA,eAAAC,EACA,iBAAAC,CACF,EAkBG,CACD,IAAMC,EAAgBN,EAA0BE,EAAOC,CAAI,EAE3D,MAAO,OAAOI,GAAqB,CACjC,IAAMC,EAAM,IAAI,IAAID,EAAQ,GAAG,EAE/B,GAAIC,EAAI,WAAa,YAGnB,OAAO,IAAI,SAAS,KAAM,CAAC,OAAQ,GAAG,CAAC,EAGzC,GACEL,IAAS,cACTD,EAAM,aAAe,QACrBG,IAAmBE,EAAQ,GAAG,EAC9B,CAOA,IAAME,GAA0BP,EAAM,YAAc,IAAI,QACtD,aACA,EACF,EAEA,OAAO,MACLK,EAAQ,IAAI,QAAQC,EAAI,OAAQC,CAAsB,EACtDF,CACF,CACF,CAEA,OAAOD,EACLC,EACC,MAAMH,IAAiBG,CAAO,CACjC,CACF,CACF,CAEO,SAASG,EAAWH,EAAkB,CAC3C,OAAOA,EAAQ,QAAQ,IAAI,iBAAiB,GAAK,MACnD,CC/DA,OACE,iBAAAI,EACA,YAAAC,EACA,aAAAC,EACA,QAAAC,EACA,4BAAAC,EACA,YAAAC,EACA,SAAAC,EACA,kCAAAC,EACA,sCAAAC,EACA,mCAAAC,MACK","sourcesContent":["import {\n createCookieFactory,\n createCookieSessionStorageFactory,\n createMemorySessionStorageFactory,\n createSessionStorageFactory,\n} from '@remix-run/server-runtime';\n\nimport {sign, unsign} from './crypto';\n\nexport const createCookie = createCookieFactory({sign, unsign});\nexport const createCookieSessionStorage =\n createCookieSessionStorageFactory(createCookie);\nexport const createSessionStorage = createSessionStorageFactory(createCookie);\nexport const createMemorySessionStorage =\n createMemorySessionStorageFactory(createSessionStorage);\n","import type {SignFunction, UnsignFunction} from '@remix-run/server-runtime';\n\nconst encoder = new TextEncoder();\n\nexport const sign: SignFunction = async (value, secret) => {\n const key = await createKey(secret, ['sign']);\n const data = encoder.encode(value);\n const signature = await crypto.subtle.sign('HMAC', key, data);\n const hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(\n /=+$/,\n '',\n );\n\n return value + '.' + hash;\n};\n\nexport const unsign: UnsignFunction = async (signed, secret) => {\n const index = signed.lastIndexOf('.');\n const value = signed.slice(0, index);\n const hash = signed.slice(index + 1);\n\n const key = await createKey(secret, ['verify']);\n const data = encoder.encode(value);\n const signature = byteStringToUint8Array(atob(hash));\n const valid = await crypto.subtle.verify('HMAC', key, signature, data);\n\n return valid ? value : false;\n};\n\nasync function createKey(\n secret: string,\n usages: CryptoKey['usages'],\n): Promise<CryptoKey> {\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n {name: 'HMAC', hash: 'SHA-256'},\n false,\n usages,\n );\n\n return key;\n}\n\nfunction byteStringToUint8Array(byteString: string): Uint8Array {\n const array = new Uint8Array(byteString.length);\n\n for (let i = 0; i < byteString.length; i++) {\n array[i] = byteString.charCodeAt(i);\n }\n\n return array;\n}\n","import {\n createRequestHandler as createRemixRequestHandler,\n type AppLoadContext,\n type ServerBuild,\n} from '@remix-run/server-runtime';\n\nexport function createRequestHandler<Context = unknown>({\n build,\n mode,\n getLoadContext,\n shouldProxyAsset,\n}: {\n build: ServerBuild;\n mode?: string;\n getLoadContext?: (request: Request) => Promise<Context> | Context;\n /**\n * By default, Hydrogen will prefix all static assets with a CDN url.\n * If you need to serve static assets from the same domain or from the root,\n * then update the `shouldProxyAsset: (url: string) => boolean` function below\n * to return `true` when the url (pathname) matches your asset.\n *\n * @example\n * ```ts\n * shouldProxyAsset(url) {\n * return new URL(url).pathname === '/robots.txt';\n * }\n * ```\n */\n shouldProxyAsset?: (url: string) => boolean;\n}) {\n const handleRequest = createRemixRequestHandler(build, mode);\n\n return async (request: Request) => {\n const url = new URL(request.url);\n\n if (url.pathname === '/__health') {\n // This is temporary until Oxygen implements a way to verify deployments.\n // https://github.com/Shopify/oxygen-platform/issues/778\n return new Response(null, {status: 200});\n }\n\n if (\n mode === 'production' &&\n build.publicPath !== undefined &&\n shouldProxyAsset?.(request.url)\n ) {\n /**\n * Use the assetPrefix (publicPath) as the origin. Note that Remix expects client assets to be\n * prefixed with `/build/*`, and as such, `/build/` is included in the Oxygen-created `assetPrefix`.\n * However, we need strip out the leading `/build/` for this use case, as developers may wish to\n * serve a static asset from the root `/public` folder (one level up from `/build`).\n */\n const newOriginAndPathPrefix = (build.publicPath || '').replace(\n /\\/build\\/$/,\n '',\n );\n\n return fetch(\n request.url.replace(url.origin, newOriginAndPathPrefix),\n request,\n );\n }\n\n return handleRequest(\n request,\n (await getLoadContext?.(request)) as AppLoadContext,\n );\n };\n}\n\nexport function getBuyerIp(request: Request) {\n return request.headers.get('oxygen-buyer-ip') ?? undefined;\n}\n","export {\n createCookie,\n createCookieSessionStorage,\n createMemorySessionStorage,\n createSessionStorage,\n} from './implementations';\n\nexport {createRequestHandler, getBuyerIp} from './server';\n\nexport {\n createSession,\n isCookie,\n isSession,\n json,\n MaxPartSizeExceededError,\n redirect,\n defer,\n unstable_composeUploadHandlers,\n unstable_createMemoryUploadHandler,\n unstable_parseMultipartFormData,\n} from '@remix-run/server-runtime';\n\nexport type {\n ActionArgs,\n ActionFunction,\n AppData,\n AppLoadContext,\n Cookie,\n CookieOptions,\n CookieParseOptions,\n CookieSerializeOptions,\n CookieSignatureOptions,\n DataFunctionArgs,\n EntryContext,\n ErrorBoundaryComponent,\n HandleDataRequestFunction,\n HandleDocumentRequestFunction,\n HeadersFunction,\n HtmlLinkDescriptor,\n HtmlMetaDescriptor,\n LinkDescriptor,\n LinksFunction,\n LoaderFunction,\n LoaderArgs,\n MemoryUploadHandlerFilterArgs,\n MemoryUploadHandlerOptions,\n MetaDescriptor,\n MetaFunction,\n PageLinkDescriptor,\n RequestHandler,\n RouteComponent,\n RouteHandle,\n SerializeFrom,\n ServerBuild,\n ServerEntryModule,\n Session,\n SessionData,\n SessionIdStorageStrategy,\n SessionStorage,\n SignFunction,\n TypedResponse,\n UnsignFunction,\n UploadHandlerPart,\n UploadHandler,\n} from '@remix-run/server-runtime';\n"]}
@@ -0,0 +1,31 @@
1
+ import * as _remix_run_server_runtime from '@remix-run/server-runtime';
2
+ import { ServerBuild } from '@remix-run/server-runtime';
3
+ export { ActionArgs, ActionFunction, AppData, AppLoadContext, Cookie, CookieOptions, CookieParseOptions, CookieSerializeOptions, CookieSignatureOptions, DataFunctionArgs, EntryContext, ErrorBoundaryComponent, HandleDataRequestFunction, HandleDocumentRequestFunction, HeadersFunction, HtmlLinkDescriptor, HtmlMetaDescriptor, LinkDescriptor, LinksFunction, LoaderArgs, LoaderFunction, MaxPartSizeExceededError, MemoryUploadHandlerFilterArgs, MemoryUploadHandlerOptions, MetaDescriptor, MetaFunction, PageLinkDescriptor, RequestHandler, RouteComponent, RouteHandle, SerializeFrom, ServerBuild, ServerEntryModule, Session, SessionData, SessionIdStorageStrategy, SessionStorage, SignFunction, TypedResponse, UnsignFunction, UploadHandler, UploadHandlerPart, createSession, defer, isCookie, isSession, json, redirect, unstable_composeUploadHandlers, unstable_createMemoryUploadHandler, unstable_parseMultipartFormData } from '@remix-run/server-runtime';
4
+
5
+ declare const createCookie: _remix_run_server_runtime.CreateCookieFunction;
6
+ declare const createCookieSessionStorage: _remix_run_server_runtime.CreateCookieSessionStorageFunction;
7
+ declare const createSessionStorage: _remix_run_server_runtime.CreateSessionStorageFunction;
8
+ declare const createMemorySessionStorage: _remix_run_server_runtime.CreateMemorySessionStorageFunction;
9
+
10
+ declare function createRequestHandler<Context = unknown>({ build, mode, getLoadContext, shouldProxyAsset, }: {
11
+ build: ServerBuild;
12
+ mode?: string;
13
+ getLoadContext?: (request: Request) => Promise<Context> | Context;
14
+ /**
15
+ * By default, Hydrogen will prefix all static assets with a CDN url.
16
+ * If you need to serve static assets from the same domain or from the root,
17
+ * then update the `shouldProxyAsset: (url: string) => boolean` function below
18
+ * to return `true` when the url (pathname) matches your asset.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * shouldProxyAsset(url) {
23
+ * return new URL(url).pathname === '/robots.txt';
24
+ * }
25
+ * ```
26
+ */
27
+ shouldProxyAsset?: (url: string) => boolean;
28
+ }): (request: Request) => Promise<Response>;
29
+ declare function getBuyerIp(request: Request): string | undefined;
30
+
31
+ export { createCookie, createCookieSessionStorage, createMemorySessionStorage, createRequestHandler, createSessionStorage, getBuyerIp };
@@ -0,0 +1,8 @@
1
+ import { createCookieFactory, createCookieSessionStorageFactory, createSessionStorageFactory, createMemorySessionStorageFactory, createRequestHandler } from '@remix-run/server-runtime';
2
+ export { MaxPartSizeExceededError, createSession, defer, isCookie, isSession, json, redirect, unstable_composeUploadHandlers, unstable_createMemoryUploadHandler, unstable_parseMultipartFormData } from '@remix-run/server-runtime';
3
+
4
+ var c=new TextEncoder,p=async(e,o)=>{let t=await d(o,["sign"]),n=c.encode(e),a=await crypto.subtle.sign("HMAC",t,n),r=btoa(String.fromCharCode(...new Uint8Array(a))).replace(/=+$/,"");return e+"."+r},l=async(e,o)=>{let t=e.lastIndexOf("."),n=e.slice(0,t),a=e.slice(t+1),r=await d(o,["verify"]),i=c.encode(n),s=g(atob(a));return await crypto.subtle.verify("HMAC",r,s,i)?n:!1};async function d(e,o){return await crypto.subtle.importKey("raw",c.encode(e),{name:"HMAC",hash:"SHA-256"},!1,o)}function g(e){let o=new Uint8Array(e.length);for(let t=0;t<e.length;t++)o[t]=e.charCodeAt(t);return o}var u=createCookieFactory({sign:p,unsign:l}),f=createCookieSessionStorageFactory(u),y=createSessionStorageFactory(u),k=createMemorySessionStorageFactory(y);function F({build:e,mode:o,getLoadContext:t,shouldProxyAsset:n}){let a=createRequestHandler(e,o);return async r=>{let i=new URL(r.url);if(i.pathname==="/__health")return new Response(null,{status:200});if(o==="production"&&e.publicPath!==void 0&&n?.(r.url)){let s=(e.publicPath||"").replace(/\/build\/$/,"");return fetch(r.url.replace(i.origin,s),r)}return a(r,await t?.(r))}}function H(e){return e.headers.get("oxygen-buyer-ip")??void 0}
5
+
6
+ export { u as createCookie, f as createCookieSessionStorage, k as createMemorySessionStorage, F as createRequestHandler, y as createSessionStorage, H as getBuyerIp };
7
+ //# sourceMappingURL=out.js.map
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/implementations.ts","../../src/crypto.ts","../../src/server.ts","../../src/index.ts"],"names":["createCookieFactory","createCookieSessionStorageFactory","createMemorySessionStorageFactory","createSessionStorageFactory","encoder","sign","value","secret","key","createKey","data","signature","hash","unsign","signed","index","byteStringToUint8Array","usages","byteString","array","i","createCookie","createCookieSessionStorage","createSessionStorage","createMemorySessionStorage","createRemixRequestHandler","createRequestHandler","build","mode","getLoadContext","shouldProxyAsset","handleRequest","request","url","newOriginAndPathPrefix","getBuyerIp","createSession","isCookie","isSession","json","MaxPartSizeExceededError","redirect","defer","unstable_composeUploadHandlers","unstable_createMemoryUploadHandler","unstable_parseMultipartFormData"],"mappings":"AAAA,OACE,uBAAAA,EACA,qCAAAC,EACA,qCAAAC,EACA,+BAAAC,MACK,4BCHP,IAAMC,EAAU,IAAI,YAEPC,EAAqB,MAAOC,EAAOC,IAAW,CACzD,IAAMC,EAAM,MAAMC,EAAUF,EAAQ,CAAC,MAAM,CAAC,EACtCG,EAAON,EAAQ,OAAOE,CAAK,EAC3BK,EAAY,MAAM,OAAO,OAAO,KAAK,OAAQH,EAAKE,CAAI,EACtDE,EAAO,KAAK,OAAO,aAAa,GAAG,IAAI,WAAWD,CAAS,CAAC,CAAC,EAAE,QACnE,MACA,EACF,EAEA,OAAOL,EAAQ,IAAMM,CACvB,EAEaC,EAAyB,MAAOC,EAAQP,IAAW,CAC9D,IAAMQ,EAAQD,EAAO,YAAY,GAAG,EAC9BR,EAAQQ,EAAO,MAAM,EAAGC,CAAK,EAC7BH,EAAOE,EAAO,MAAMC,EAAQ,CAAC,EAE7BP,EAAM,MAAMC,EAAUF,EAAQ,CAAC,QAAQ,CAAC,EACxCG,EAAON,EAAQ,OAAOE,CAAK,EAC3BK,EAAYK,EAAuB,KAAKJ,CAAI,CAAC,EAGnD,OAFc,MAAM,OAAO,OAAO,OAAO,OAAQJ,EAAKG,EAAWD,CAAI,EAEtDJ,EAAQ,EACzB,EAEA,eAAeG,EACbF,EACAU,EACoB,CASpB,OARY,MAAM,OAAO,OAAO,UAC9B,MACAb,EAAQ,OAAOG,CAAM,EACrB,CAAC,KAAM,OAAQ,KAAM,SAAS,EAC9B,GACAU,CACF,CAGF,CAEA,SAASD,EAAuBE,EAAgC,CAC9D,IAAMC,EAAQ,IAAI,WAAWD,EAAW,MAAM,EAE9C,QAASE,EAAI,EAAGA,EAAIF,EAAW,OAAQE,IACrCD,EAAMC,GAAKF,EAAW,WAAWE,CAAC,EAGpC,OAAOD,CACT,CD3CO,IAAME,EAAerB,EAAoB,CAAC,KAAAK,EAAM,OAAAQ,CAAM,CAAC,EACjDS,EACXrB,EAAkCoB,CAAY,EACnCE,EAAuBpB,EAA4BkB,CAAY,EAC/DG,EACXtB,EAAkCqB,CAAoB,EEdxD,OACE,wBAAwBE,MAGnB,4BAEA,SAASC,EAAwC,CACtD,MAAAC,EACA,KAAAC,EACA,eAAAC,EACA,iBAAAC,CACF,EAkBG,CACD,IAAMC,EAAgBN,EAA0BE,EAAOC,CAAI,EAE3D,MAAO,OAAOI,GAAqB,CACjC,IAAMC,EAAM,IAAI,IAAID,EAAQ,GAAG,EAE/B,GAAIC,EAAI,WAAa,YAGnB,OAAO,IAAI,SAAS,KAAM,CAAC,OAAQ,GAAG,CAAC,EAGzC,GACEL,IAAS,cACTD,EAAM,aAAe,QACrBG,IAAmBE,EAAQ,GAAG,EAC9B,CAOA,IAAME,GAA0BP,EAAM,YAAc,IAAI,QACtD,aACA,EACF,EAEA,OAAO,MACLK,EAAQ,IAAI,QAAQC,EAAI,OAAQC,CAAsB,EACtDF,CACF,CACF,CAEA,OAAOD,EACLC,EACC,MAAMH,IAAiBG,CAAO,CACjC,CACF,CACF,CAEO,SAASG,EAAWH,EAAkB,CAC3C,OAAOA,EAAQ,QAAQ,IAAI,iBAAiB,GAAK,MACnD,CC/DA,OACE,iBAAAI,EACA,YAAAC,EACA,aAAAC,EACA,QAAAC,EACA,4BAAAC,EACA,YAAAC,EACA,SAAAC,EACA,kCAAAC,EACA,sCAAAC,EACA,mCAAAC,MACK","sourcesContent":["import {\n createCookieFactory,\n createCookieSessionStorageFactory,\n createMemorySessionStorageFactory,\n createSessionStorageFactory,\n} from '@remix-run/server-runtime';\n\nimport {sign, unsign} from './crypto';\n\nexport const createCookie = createCookieFactory({sign, unsign});\nexport const createCookieSessionStorage =\n createCookieSessionStorageFactory(createCookie);\nexport const createSessionStorage = createSessionStorageFactory(createCookie);\nexport const createMemorySessionStorage =\n createMemorySessionStorageFactory(createSessionStorage);\n","import type {SignFunction, UnsignFunction} from '@remix-run/server-runtime';\n\nconst encoder = new TextEncoder();\n\nexport const sign: SignFunction = async (value, secret) => {\n const key = await createKey(secret, ['sign']);\n const data = encoder.encode(value);\n const signature = await crypto.subtle.sign('HMAC', key, data);\n const hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(\n /=+$/,\n '',\n );\n\n return value + '.' + hash;\n};\n\nexport const unsign: UnsignFunction = async (signed, secret) => {\n const index = signed.lastIndexOf('.');\n const value = signed.slice(0, index);\n const hash = signed.slice(index + 1);\n\n const key = await createKey(secret, ['verify']);\n const data = encoder.encode(value);\n const signature = byteStringToUint8Array(atob(hash));\n const valid = await crypto.subtle.verify('HMAC', key, signature, data);\n\n return valid ? value : false;\n};\n\nasync function createKey(\n secret: string,\n usages: CryptoKey['usages'],\n): Promise<CryptoKey> {\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n {name: 'HMAC', hash: 'SHA-256'},\n false,\n usages,\n );\n\n return key;\n}\n\nfunction byteStringToUint8Array(byteString: string): Uint8Array {\n const array = new Uint8Array(byteString.length);\n\n for (let i = 0; i < byteString.length; i++) {\n array[i] = byteString.charCodeAt(i);\n }\n\n return array;\n}\n","import {\n createRequestHandler as createRemixRequestHandler,\n type AppLoadContext,\n type ServerBuild,\n} from '@remix-run/server-runtime';\n\nexport function createRequestHandler<Context = unknown>({\n build,\n mode,\n getLoadContext,\n shouldProxyAsset,\n}: {\n build: ServerBuild;\n mode?: string;\n getLoadContext?: (request: Request) => Promise<Context> | Context;\n /**\n * By default, Hydrogen will prefix all static assets with a CDN url.\n * If you need to serve static assets from the same domain or from the root,\n * then update the `shouldProxyAsset: (url: string) => boolean` function below\n * to return `true` when the url (pathname) matches your asset.\n *\n * @example\n * ```ts\n * shouldProxyAsset(url) {\n * return new URL(url).pathname === '/robots.txt';\n * }\n * ```\n */\n shouldProxyAsset?: (url: string) => boolean;\n}) {\n const handleRequest = createRemixRequestHandler(build, mode);\n\n return async (request: Request) => {\n const url = new URL(request.url);\n\n if (url.pathname === '/__health') {\n // This is temporary until Oxygen implements a way to verify deployments.\n // https://github.com/Shopify/oxygen-platform/issues/778\n return new Response(null, {status: 200});\n }\n\n if (\n mode === 'production' &&\n build.publicPath !== undefined &&\n shouldProxyAsset?.(request.url)\n ) {\n /**\n * Use the assetPrefix (publicPath) as the origin. Note that Remix expects client assets to be\n * prefixed with `/build/*`, and as such, `/build/` is included in the Oxygen-created `assetPrefix`.\n * However, we need strip out the leading `/build/` for this use case, as developers may wish to\n * serve a static asset from the root `/public` folder (one level up from `/build`).\n */\n const newOriginAndPathPrefix = (build.publicPath || '').replace(\n /\\/build\\/$/,\n '',\n );\n\n return fetch(\n request.url.replace(url.origin, newOriginAndPathPrefix),\n request,\n );\n }\n\n return handleRequest(\n request,\n (await getLoadContext?.(request)) as AppLoadContext,\n );\n };\n}\n\nexport function getBuyerIp(request: Request) {\n return request.headers.get('oxygen-buyer-ip') ?? undefined;\n}\n","export {\n createCookie,\n createCookieSessionStorage,\n createMemorySessionStorage,\n createSessionStorage,\n} from './implementations';\n\nexport {createRequestHandler, getBuyerIp} from './server';\n\nexport {\n createSession,\n isCookie,\n isSession,\n json,\n MaxPartSizeExceededError,\n redirect,\n defer,\n unstable_composeUploadHandlers,\n unstable_createMemoryUploadHandler,\n unstable_parseMultipartFormData,\n} from '@remix-run/server-runtime';\n\nexport type {\n ActionArgs,\n ActionFunction,\n AppData,\n AppLoadContext,\n Cookie,\n CookieOptions,\n CookieParseOptions,\n CookieSerializeOptions,\n CookieSignatureOptions,\n DataFunctionArgs,\n EntryContext,\n ErrorBoundaryComponent,\n HandleDataRequestFunction,\n HandleDocumentRequestFunction,\n HeadersFunction,\n HtmlLinkDescriptor,\n HtmlMetaDescriptor,\n LinkDescriptor,\n LinksFunction,\n LoaderFunction,\n LoaderArgs,\n MemoryUploadHandlerFilterArgs,\n MemoryUploadHandlerOptions,\n MetaDescriptor,\n MetaFunction,\n PageLinkDescriptor,\n RequestHandler,\n RouteComponent,\n RouteHandle,\n SerializeFrom,\n ServerBuild,\n ServerEntryModule,\n Session,\n SessionData,\n SessionIdStorageStrategy,\n SessionStorage,\n SignFunction,\n TypedResponse,\n UnsignFunction,\n UploadHandlerPart,\n UploadHandler,\n} from '@remix-run/server-runtime';\n"]}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@shopify/remix-oxygen",
3
+ "publishConfig": {
4
+ "access": "public",
5
+ "@shopify:registry": "https://registry.npmjs.org"
6
+ },
7
+ "type": "module",
8
+ "version": "1.0.0-alpha.1",
9
+ "main": "dist/index.cjs",
10
+ "module": "dist/production/index.js",
11
+ "types": "dist/production/index.d.ts",
12
+ "sideEffects": false,
13
+ "scripts": {
14
+ "build": "tsup --clean --config ../../tsup.config.ts",
15
+ "dev": "tsup --watch --config ../../tsup.config.ts",
16
+ "typecheck": "tsc --noEmit"
17
+ },
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/production/index.d.ts",
21
+ "module": {
22
+ "development": "./dist/development/index.js",
23
+ "default": "./dist/production/index.js"
24
+ },
25
+ "require": "./dist/index.cjs",
26
+ "import": {
27
+ "development": "./dist/development/index.js",
28
+ "default": "./dist/production/index.js"
29
+ },
30
+ "default": {
31
+ "development": "./dist/development/index.js",
32
+ "default": "./dist/production/index.js"
33
+ }
34
+ },
35
+ "./package.json": "./package.json"
36
+ },
37
+ "files": [
38
+ "dist"
39
+ ],
40
+ "dependencies": {
41
+ "@remix-run/server-runtime": "0.0.0-experimental-e18af792a"
42
+ },
43
+ "devDependencies": {
44
+ "@shopify/oxygen-workers-types": "^3.17.2"
45
+ },
46
+ "peerDependencies": {
47
+ "@shopify/oxygen-workers-types": "^3.17.2"
48
+ }
49
+ }