diff --git a/.eslintignore b/.eslintignore
index 4704ea2e8e..583029aa79 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -10,7 +10,6 @@ internal_exports.ts
# output files
animate/*.js
easing/*.js
-environment/*.js
internal/*.js
interpolate/*.js
motion/*.js
diff --git a/.gitignore b/.gitignore
index 1ed9ce8ec3..90ccacd05e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,7 +9,6 @@ node_modules
/animate
/easing
-/environment
/internal
/interpolate
/motion
diff --git a/environment/index.d.ts b/environment/index.d.ts
new file mode 100644
index 0000000000..01c73ad465
--- /dev/null
+++ b/environment/index.d.ts
@@ -0,0 +1 @@
+export * from '../types/runtime/environment/index';
\ No newline at end of file
diff --git a/environment/index.js b/environment/index.js
new file mode 100644
index 0000000000..bdc6a0ee30
--- /dev/null
+++ b/environment/index.js
@@ -0,0 +1,42 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+function noop() {}
+const is_browser = typeof window !== 'undefined';
+const is_iframe = is_browser && window.self !== window.top;
+const is_cors =
+ is_iframe &&
+ /*#__PURE__*/ (() => {
+ try {
+ if (window.parent) void window.parent.document;
+ return false;
+ } catch (error) {
+ return true;
+ }
+ })();
+const has_Symbol = typeof Symbol === 'function';
+/* eslint-disable no-var */
+
+const globals = is_browser ? window : typeof globalThis !== 'undefined' ? globalThis : global;
+const resolved_promise = Promise.resolve();
+
+exports.now = is_browser ? window.performance.now.bind(window.performance) : Date.now.bind(Date);
+exports.raf = is_browser ? requestAnimationFrame : noop;
+exports.framerate = 1000 / 60;
+
+/* tests only */
+const set_now = (v) => void (exports.now = v);
+const set_raf = (fn) => void (exports.raf = fn);
+const set_framerate = (v) => void (exports.framerate = v);
+
+exports.globals = globals;
+exports.has_Symbol = has_Symbol;
+exports.is_browser = is_browser;
+exports.is_cors = is_cors;
+exports.is_iframe = is_iframe;
+exports.noop = noop;
+exports.resolved_promise = resolved_promise;
+exports.set_framerate = set_framerate;
+exports.set_now = set_now;
+exports.set_raf = set_raf;
diff --git a/environment/index.mjs b/environment/index.mjs
new file mode 100644
index 0000000000..b6b4d9db0f
--- /dev/null
+++ b/environment/index.mjs
@@ -0,0 +1,29 @@
+function noop() {}
+const is_browser = typeof window !== 'undefined';
+const is_iframe = is_browser && window.self !== window.top;
+const is_cors =
+ is_iframe &&
+ /*#__PURE__*/ (() => {
+ try {
+ if (window.parent) void window.parent.document;
+ return false;
+ } catch (error) {
+ return true;
+ }
+ })();
+const has_Symbol = typeof Symbol === 'function';
+/* eslint-disable no-var */
+
+const globals = is_browser ? window : typeof globalThis !== 'undefined' ? globalThis : global;
+const resolved_promise = Promise.resolve();
+
+let now = is_browser ? window.performance.now.bind(window.performance) : Date.now.bind(Date);
+let raf = is_browser ? requestAnimationFrame : noop;
+let framerate = 1000 / 60;
+
+/* tests only */
+const set_now = (v) => void (now = v);
+const set_raf = (fn) => void (raf = fn);
+const set_framerate = (v) => void (framerate = v);
+
+export { framerate, globals, has_Symbol, is_browser, is_cors, is_iframe, noop, now, raf, resolved_promise, set_framerate, set_now, set_raf };
diff --git a/environment/package.json b/environment/package.json
new file mode 100644
index 0000000000..e106ca54ab
--- /dev/null
+++ b/environment/package.json
@@ -0,0 +1,5 @@
+{
+ "main": "./index",
+ "module": "./index.mjs",
+ "types": "./index.d.ts"
+ }
\ No newline at end of file
diff --git a/package.json b/package.json
index ebaee85997..b46221ff5b 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,6 @@
"animate",
"dev",
"easing",
- "environment",
"internal",
"interpolate",
"motion",
diff --git a/site/content/examples/08-motion/01-spring/App.svelte b/site/content/examples/08-motion/01-spring/App.svelte
index 9c6396598e..075c3edc3d 100644
--- a/site/content/examples/08-motion/01-spring/App.svelte
+++ b/site/content/examples/08-motion/01-spring/App.svelte
@@ -1,184 +1,156 @@
solve_spring(e.clientY, $velocity)}
- bind:innerWidth={canvas_width}
- bind:innerHeight={canvas_height} />
+ on:mousemove={(e) => solve_spring(e.clientY, $velocity)}
+ bind:innerWidth={canvas_width}
+ bind:innerHeight={canvas_height} />
diff --git a/src/runtime/internal/Component.ts b/src/runtime/internal/Component.ts
index 23bba43066..7f6682a0c2 100644
--- a/src/runtime/internal/Component.ts
+++ b/src/runtime/internal/Component.ts
@@ -2,7 +2,7 @@ import { add_render_callback, flush, schedule_update } from './scheduler';
import { current_component, set_current_component } from './lifecycle';
import { children, detach } from './dom';
import { transition_in } from './transitions';
-import { noop } from 'svelte/environment';
+import { noop } from './environment';
type binary = 0 | 1;
export interface Fragment {
key: string | null;
diff --git a/src/runtime/internal/animations.ts b/src/runtime/internal/animations.ts
index d88686df3d..e29d221623 100644
--- a/src/runtime/internal/animations.ts
+++ b/src/runtime/internal/animations.ts
@@ -1,5 +1,5 @@
import { run_transition } from './transitions';
-import { noop } from 'svelte/environment';
+import { noop } from './environment';
export interface AnimationConfig {
delay?: number;
diff --git a/src/runtime/internal/dev.ts b/src/runtime/internal/dev.ts
index 210779045b..c24fc3717c 100644
--- a/src/runtime/internal/dev.ts
+++ b/src/runtime/internal/dev.ts
@@ -1,5 +1,5 @@
import { custom_event, append, insert, detach, listen, attr } from './dom';
-import { has_Symbol } from 'svelte/environment';
+import { has_Symbol } from './environment';
import { SvelteComponent } from './Component';
export function add_location_dev(element, file, line, column, char) {
diff --git a/src/runtime/internal/dom.ts b/src/runtime/internal/dom.ts
index 48aebb0594..6615cc32fe 100644
--- a/src/runtime/internal/dom.ts
+++ b/src/runtime/internal/dom.ts
@@ -1,4 +1,4 @@
-import { is_cors } from 'svelte/environment';
+import { is_cors } from './environment';
export function append(target: Node, node: Node) {
target.appendChild(node);
diff --git a/src/runtime/environment/index.ts b/src/runtime/internal/environment.ts
similarity index 100%
rename from src/runtime/environment/index.ts
rename to src/runtime/internal/environment.ts
diff --git a/src/runtime/internal/index.ts b/src/runtime/internal/index.ts
index 1708bf3f80..18041ab5a5 100644
--- a/src/runtime/internal/index.ts
+++ b/src/runtime/internal/index.ts
@@ -3,6 +3,7 @@ export * from './await_block';
export * from './Component';
export * from './dev';
export * from './dom';
+export * from './environment';
export * from './keyed_each';
export * from './lifecycle';
export * from './loop';
@@ -13,6 +14,3 @@ export * from './stores';
// export * from './style_manager'
export * from './transitions';
export * from './utils';
-
-// todo: [create_module.ts line 24] allow compiler to import non internal
-export * from '../environment/index';
diff --git a/src/runtime/internal/loop.ts b/src/runtime/internal/loop.ts
index 4fe50c3d76..db8a5eee94 100644
--- a/src/runtime/internal/loop.ts
+++ b/src/runtime/internal/loop.ts
@@ -1,4 +1,4 @@
-import { now, raf, framerate, noop } from 'svelte/environment';
+import { now, raf, framerate, noop } from './environment';
type TaskCallback = (t: number) => boolean;
type TaskCanceller = () => void;
diff --git a/src/runtime/internal/scheduler.ts b/src/runtime/internal/scheduler.ts
index 18fe822b4c..615f20ef2d 100644
--- a/src/runtime/internal/scheduler.ts
+++ b/src/runtime/internal/scheduler.ts
@@ -1,5 +1,5 @@
import { set_current_component } from './lifecycle';
-import { resolved_promise, now } from 'svelte/environment';
+import { resolved_promise, now } from './environment';
import { T$$ } from './Component';
let update_scheduled = false;
diff --git a/src/runtime/internal/stores.ts b/src/runtime/internal/stores.ts
index 3dd2226efb..99602a6bad 100644
--- a/src/runtime/internal/stores.ts
+++ b/src/runtime/internal/stores.ts
@@ -1,6 +1,6 @@
import { safe_not_equal, subscribe } from './utils';
import { onEachFrame, loop } from './loop';
-import { noop } from 'svelte/environment';
+import { noop } from './environment';
type Setter = (value: T) => void;
type StopCallback = () => void;
export type StartStopNotifier = (set: Setter) => StopCallback | void;
diff --git a/src/runtime/internal/style_manager.ts b/src/runtime/internal/style_manager.ts
index 541b852585..f20205f44e 100644
--- a/src/runtime/internal/style_manager.ts
+++ b/src/runtime/internal/style_manager.ts
@@ -1,4 +1,4 @@
-import { framerate } from 'svelte/environment';
+import { framerate } from './environment';
let documents_uid = 0;
let running_animations = 0;
diff --git a/src/runtime/internal/transitions.ts b/src/runtime/internal/transitions.ts
index 6970d34439..0d12313a15 100644
--- a/src/runtime/internal/transitions.ts
+++ b/src/runtime/internal/transitions.ts
@@ -1,7 +1,7 @@
import { TransitionConfig } from '../transition';
import { Fragment } from './Component';
import { custom_event } from './dom';
-import { now, noop } from 'svelte/environment';
+import { now, noop } from './environment';
import { setFrameTimeout, setTweenTimeout } from './loop';
import { add_measure_callback } from './scheduler';
import { animate_css } from './style_manager';
diff --git a/src/runtime/internal/utils.ts b/src/runtime/internal/utils.ts
index 44a8c8962f..ecd7ed6779 100644
--- a/src/runtime/internal/utils.ts
+++ b/src/runtime/internal/utils.ts
@@ -1,4 +1,4 @@
-import { noop } from 'svelte/environment';
+import { noop } from './environment';
export const is_promise = (value: any): value is PromiseLike =>
value && typeof value === 'object' && typeof value.then === 'function';
diff --git a/test/custom-elements/index.ts b/test/custom-elements/index.ts
index 4707159fb8..15dc7c8aab 100644
--- a/test/custom-elements/index.ts
+++ b/test/custom-elements/index.ts
@@ -59,7 +59,6 @@ describe('custom-elements', function () {
const solo = /\.solo$/.test(dir);
const skip = /\.skip$/.test(dir);
const internal = path.resolve('internal/index.mjs');
- const environment = path.resolve('environment/index.mjs');
const index = path.resolve('index.mjs');
const warnings = [];
@@ -79,9 +78,6 @@ describe('custom-elements', function () {
if (importee === 'svelte') {
return index;
}
- if (importee === 'svelte/environment' || importee === '../environment') {
- return environment;
- }
},
transform(code, id) {
diff --git a/test/runtime/index.ts b/test/runtime/index.ts
index 45e38c344a..2a61abccdd 100644
--- a/test/runtime/index.ts
+++ b/test/runtime/index.ts
@@ -2,8 +2,7 @@ import { relative, resolve } from 'path';
import { readFileSync, existsSync, unlinkSync, writeFileSync, readdirSync } from 'fs';
import { rollup } from 'rollup';
import virtual from '@rollup/plugin-virtual';
-import { clear_loops, flush, SvelteComponent } from '../../internal';
-import { set_now, set_raf, set_framerate } from '../../environment';
+import { clear_loops, flush, SvelteComponent,set_now, set_raf, set_framerate } from '../../internal';
import { showOutput, loadConfig, loadSvelte, cleanRequireCache, env, setupHtmlEqual, mkdirp } from '../helpers';
import { glob } from '../tiny-glob';
import { assert } from '../test';
@@ -255,9 +254,6 @@ describe('runtime', () => {
if (importee.startsWith('svelte/')) {
return importee.replace('svelte', process.cwd()) + '/index.mjs';
}
- if (importee === '../environment') {
- return process.cwd() + '/environment/index.mjs';
- }
},
},
],